From be876ae1d2c60b34408caeba7b46c23882d4532d Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 13 Nov 2012 06:07:40 -0800 Subject: [PATCH 0001/1535] Initial commit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..b536cf9e3 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +bitkeylib-python +================ + +Client side implementation of bitkey device \ No newline at end of file From 99d892e7592a8f20ff0b73fd078bf42e5a780bbc Mon Sep 17 00:00:00 2001 From: slush Date: Tue, 13 Nov 2012 14:09:39 +0000 Subject: [PATCH 0002/1535] Initial commit --- __init__.py | 0 bitkey_proto/__init__.py | 0 bitkey_proto/bitkey.proto | 147 ++++++++++++++++++++++++++++++++++++++ bitkey_proto/build.sh | 5 ++ bitkey_proto/mapping.py | 51 +++++++++++++ test.py | 70 ++++++++++++++++++ transport.py | 62 ++++++++++++++++ transport_pipe.py | 54 ++++++++++++++ transport_serial.py | 35 +++++++++ 9 files changed, 424 insertions(+) create mode 100644 __init__.py create mode 100644 bitkey_proto/__init__.py create mode 100644 bitkey_proto/bitkey.proto create mode 100755 bitkey_proto/build.sh create mode 100644 bitkey_proto/mapping.py create mode 100755 test.py create mode 100644 transport.py create mode 100644 transport_pipe.py create mode 100644 transport_serial.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/bitkey_proto/__init__.py b/bitkey_proto/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/bitkey_proto/bitkey.proto b/bitkey_proto/bitkey.proto new file mode 100644 index 000000000..212661ddc --- /dev/null +++ b/bitkey_proto/bitkey.proto @@ -0,0 +1,147 @@ +enum Algorithm { + BIP32 = 0; + ELECTRUM = 1; +} + +enum ScriptType { + PAYTOADDRESS = 0; + PAYTOSCRIPTHASH = 1; +} + +// Response: None or Features +message Initialize { +} + +message Features { + optional string version = 1; + optional bool otp = 2; + optional bool pin = 3; + optional bool spv = 4; + repeated Algorithm algo = 5; +} + +// Description: Test if another side is still alive. +// Response: None or Success +message Ping { +} + +// Description: Response message for previous request with given id. +message Success { + optional string message = 1; +} + +// Description: Response message for previous request with given id. +message Failure { + optional int32 code = 1; + optional string message = 2; +} + +// Response: UUID or Failure +message GetUUID { +} + +message UUID { + required bytes UUID = 1; +} + +message OtpRequest { + optional string message = 1; +} + +message OtpAck { + required string otp = 1; +} + +message OtpCancel { +} + +message PinRequest { + optional string message = 1; +} + +message PinAck { + required string pin = 1; +} + +message PinCancel { +} + +// Response: OtpRequest, Entropy, Failure +message GetEntropy { + required uint32 size = 1; +} + +message Entropy { + required bytes entropy = 1; +} + +// Response: MasterPublicKey, Failure +message GetMasterPublicKey { + required Algorithm algo = 1 [default=BIP32]; +} + +message MasterPublicKey { + required bytes key = 1; +} + +// Response: Success, OtpRequest, Failure +message LoadDevice { + required string seed = 1; + optional bool otp = 2 [default=true]; + optional string pin = 3; + optional bool spv = 4 [default=true]; +} + +// Response: Success, OtpRequest, PinRequest, Failure +message ResetDevice { +} + +message TxOutput { + required string address = 1; + repeated uint32 address_n = 2; + required uint64 amount = 3; + required ScriptType script_type = 4; + repeated bytes script_args = 5; +} + +// Response: Success, SignedInput, Failure +message TxInput { + repeated uint32 address_n = 1; + required uint64 amount = 2; + required bytes prev_hash = 3; + required uint32 prev_index = 4; + optional bytes script_sig = 5; +} + +// Response: SignedTx, Success, OtpRequest, PinRequest, Failure +message SignTx { + required Algorithm algo = 1 [default=BIP32]; + optional bool stream = 2; // enable streaming + required uint64 fee = 3; + repeated TxOutput outputs = 4; + repeated TxInput inputs = 5; + optional uint32 inputs_count = 6; // for streaming + optional bytes random = 7; +} + +message SignedTx { + repeated bytes signature = 1; +} + +/* +inputs = [] # list of TxInput +for i in inputs: + for x in inputs: + send(x) + + signature = send(SignInput(i)) +*/ + +// Response: SignedInput, Failure +message SignInput { + required TxInput input = 1; +} + +message SignedInput { + required bytes signature = 1; +} \ No newline at end of file diff --git a/bitkey_proto/build.sh b/bitkey_proto/build.sh new file mode 100755 index 000000000..b96dd453e --- /dev/null +++ b/bitkey_proto/build.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +cd `dirname $0` + +protoc --python_out=. bitkey.proto diff --git a/bitkey_proto/mapping.py b/bitkey_proto/mapping.py new file mode 100644 index 000000000..bf6eee87c --- /dev/null +++ b/bitkey_proto/mapping.py @@ -0,0 +1,51 @@ +import bitkey_pb2 as proto + +map_type_to_class = { + 0: proto.Initialize, + 1: proto.Ping, + 2: proto.Success, + 3: proto.Failure, + 4: proto.GetUUID, + 5: proto.UUID, + 6: proto.OtpRequest, + 7: proto.OtpAck, + 8: proto.OtpCancel, + 9: proto.GetEntropy, + 10: proto.Entropy, + 11: proto.GetMasterPublicKey, + 12: proto.MasterPublicKey, + 13: proto.LoadDevice, + 14: proto.ResetDevice, + 15: proto.SignTx, + 16: proto.SignedTx, + 17: proto.Features, + 18: proto.PinRequest, + 19: proto.PinAck, + 20: proto.PinCancel, +} + +map_class_to_type = {} + +def get_type(msg): + return map_class_to_type[msg.__class__] + +def get_class(t): + return map_type_to_class[t] + +def build_index(): + for k, v in map_type_to_class.items(): + map_class_to_type[v] = k + +def check_missing(): + from google.protobuf import reflection + + types = [ proto.__dict__[item] for item in dir(proto) + if issubclass(proto.__dict__[item].__class__, reflection.GeneratedProtocolMessageType) ] + + missing = list(set(types) - set(map_type_to_class.values())) + + if len(missing): + raise Exception("Following protobuf messages are not defined in mapping: %s" % missing) + +check_missing() +build_index() diff --git a/test.py b/test.py new file mode 100755 index 000000000..3b5be2b4f --- /dev/null +++ b/test.py @@ -0,0 +1,70 @@ +#!/usr/bin/python + +import time + +from transport_pipe import PipeTransport +from transport_serial import SerialTransport +from bitkey_proto import bitkey_pb2 as proto + +def pprint(msg): + return "<%s>:\n%s" % (msg.__class__.__name__, msg) + +def call(msg, tries=3): + print '----------------------' + print "Sending", pprint(msg) + d.write(msg) + resp = d.read() + + if isinstance(resp, proto.OtpRequest): + if resp.message: + print "Message:", resp.message + otp = raw_input("OTP required: ") + d.write(proto.OtpAck(otp=otp)) + resp = d.read() + + if isinstance(resp, proto.PinRequest): + if resp.message: + print "Message:", resp.message + pin = raw_input("PIN required: ") + d.write(proto.PinAck(pin=pin)) + resp = d.read() + + if isinstance(resp, proto.Failure) and resp.code in (3, 6): + if tries <= 1 and resp.code == 3: + raise Exception("OTP is invalid, too many retries") + if tries <= 1 and resp.code == 6: + raise Exception("PIN is invalid, too many retries") + + # Invalid OTP or PIN, try again + if resp.code == 3: + print "OTP is invalid, let's try again..." + elif resp.code == 6: + print "PIN is invalid, let's try again..." + + return call(msg, tries-1) + + if isinstance(resp, proto.Failure): + raise Exception(resp.code, resp.message) + + print "Received", pprint(resp) + return resp + +d = PipeTransport('../../bitkey-python/device.socket', is_device=False) +#d = SerialTransport('../../bitkey-python/COM9') + +#start = time.time() + +#for x in range(1000): + +call(proto.Initialize()) +call(proto.Ping()) +call(proto.GetUUID()) +#call(proto.GetEntropy(size=10)) +#call(proto.LoadDevice(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', +# otp=True, pin='1234', spv=True)) + +#call(proto.ResetDevice()) +call(proto.GetMasterPublicKey(algo=proto.ELECTRUM)) +#call(proto.ResetDevice()) + +#print 10000 / (time.time() - start) diff --git a/transport.py b/transport.py new file mode 100644 index 000000000..5bc83f8ce --- /dev/null +++ b/transport.py @@ -0,0 +1,62 @@ +import struct +from bitkey_proto import bitkey_pb2 as proto +from bitkey_proto import mapping + +class Transport(object): + def __init__(self, device, *args, **kwargs): + self.device = device + self._open() + + def _open(self): + raise NotImplemented + + def _close(self): + raise NotImplemented + + def _write(self, msg): + raise NotImplemented + + def _read(self): + raise NotImplemented + + def close(self): + self._close() + + def write(self, msg): + ser = msg.SerializeToString() + header = struct.pack(">HL", mapping.get_type(msg), len(ser)) + self._write("##%s%s" % (header, ser)) + + def read(self): + (msg_type, data) = self._read() + inst = mapping.get_class(msg_type)() + inst.ParseFromString(data) + return inst + + def _read_headers(self, read_f): + # Try to read headers until some sane value are detected + is_ok = False + while not is_ok: + + # Align cursor to the beginning of the header ("##") + c = read_f.read(1) + while c != '#': + if c == '': + # timeout + raise Exception("Timed out while waiting for the magic character") + print "Warning: Aligning to magic characters" + c = read_f.read(1) + + if read_f.read(1) != "#": + # Second character must be # to be valid header + raise Exception("Second magic character is broken") + + # Now we're most likely on the beginning of the header + try: + headerlen = struct.calcsize(">HL") + (msg_type, datalen) = struct.unpack(">HL", read_f.read(headerlen)) + break + except: + raise Exception("Cannot parse header length") + + return (msg_type, datalen) \ No newline at end of file diff --git a/transport_pipe.py b/transport_pipe.py new file mode 100644 index 000000000..2ca139498 --- /dev/null +++ b/transport_pipe.py @@ -0,0 +1,54 @@ +'''TransportFake implements fake wire transport over local named pipe. +Use this transport for talking with bitkey simulator.''' + +import os + +from transport import Transport + +class PipeTransport(Transport): + def __init__(self, device, is_device, *args, **kwargs): + self.is_device = is_device # Set True if act as device + + super(PipeTransport, self).__init__(device, *args, **kwargs) + + def _open(self): + if self.is_device: + self.filename_read = self.device+'.to' + self.filename_write = self.device+'.from' + + os.mkfifo(self.filename_read, 0600) + os.mkfifo(self.filename_write, 0600) + else: + self.filename_read = self.device+'.from' + self.filename_write = self.device+'.to' + + if not os.path.exists(self.filename_write): + raise Exception("Not connected") + + self.write_fd = os.open(self.filename_write, os.O_RDWR)#|os.O_NONBLOCK) + self.write_f = os.fdopen(self.write_fd, 'w+') + + self.read_fd = os.open(self.filename_read, os.O_RDWR)#|os.O_NONBLOCK) + self.read_f = os.fdopen(self.read_fd, 'rb') + + def _close(self): + self.read_f.close() + self.write_f.close() + os.unlink(self.filename_read) + os.unlink(self.filename_write) + + def _write(self, msg): + try: + self.write_f.write(msg) + self.write_f.flush() + except OSError: + print "Error while writing to socket" + raise + + def _read(self): + try: + (msg_type, datalen) = self._read_headers(self.read_f) + return (msg_type, self.read_f.read(datalen)) + except IOError: + print "Failed to read from device" + raise \ No newline at end of file diff --git a/transport_serial.py b/transport_serial.py new file mode 100644 index 000000000..8820096e3 --- /dev/null +++ b/transport_serial.py @@ -0,0 +1,35 @@ +'''SerialTransport implements wire transport over serial port.''' + +# Local serial port loopback: socat PTY,link=COM8 PTY,link=COM9 + +import serial + +from transport import Transport + +class SerialTransport(Transport): + def __init__(self, device, *args, **kwargs): + self.serial = None + super(SerialTransport, self).__init__(device, *args, **kwargs) + + def _open(self): + self.serial = serial.Serial(self.device, 115200, timeout=10, writeTimeout=10) + + def _close(self): + self.serial.close() + self.serial = None + + def _write(self, msg): + try: + self.serial.write(msg) + self.serial.flush() + except serial.SerialException: + print "Error while writing to socket" + raise + + def _read(self): + try: + (msg_type, datalen) = self._read_headers(self.serial) + return (msg_type, self.serial.read(datalen)) + except serial.SerialException: + print "Failed to read from device" + raise \ No newline at end of file From d4d2e0449c4c988242f69552ac12c7023be6239f Mon Sep 17 00:00:00 2001 From: slush Date: Tue, 13 Nov 2012 14:10:40 +0000 Subject: [PATCH 0003/1535] Fixed mapping --- bitkey_proto/mapping.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bitkey_proto/mapping.py b/bitkey_proto/mapping.py index bf6eee87c..de225b5be 100644 --- a/bitkey_proto/mapping.py +++ b/bitkey_proto/mapping.py @@ -22,6 +22,10 @@ map_type_to_class = { 18: proto.PinRequest, 19: proto.PinAck, 20: proto.PinCancel, + 21: proto.SignInput, + 22: proto.SignedInput, + 23: proto.TxInput, + 24: proto.TxOutput, } map_class_to_type = {} From b2b3abc7ed71285a6805e3cb9fd7910075b817ae Mon Sep 17 00:00:00 2001 From: slush Date: Tue, 13 Nov 2012 16:06:40 +0000 Subject: [PATCH 0004/1535] protobuf specs changes --- bitkey_proto/bitkey.proto | 9 ++++++++- bitkey_proto/mapping.py | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/bitkey_proto/bitkey.proto b/bitkey_proto/bitkey.proto index 212661ddc..2390fe692 100644 --- a/bitkey_proto/bitkey.proto +++ b/bitkey_proto/bitkey.proto @@ -17,12 +17,14 @@ message Features { optional bool otp = 2; optional bool pin = 3; optional bool spv = 4; - repeated Algorithm algo = 5; + optional uint64 maxfee_kb = 5; + repeated Algorithm algo = 6; } // Description: Test if another side is still alive. // Response: None or Success message Ping { + optional string message = 1; } // Description: Response message for previous request with given id. @@ -75,6 +77,11 @@ message Entropy { required bytes entropy = 1; } +// Response: Success, OtpRequest, PinRequest, Failure +message SetMaxFeeKb { + required uint64 maxfee_kb= 1; +} + // Response: MasterPublicKey, Failure message GetMasterPublicKey { required Algorithm algo = 1 [default=BIP32]; diff --git a/bitkey_proto/mapping.py b/bitkey_proto/mapping.py index de225b5be..4400954e2 100644 --- a/bitkey_proto/mapping.py +++ b/bitkey_proto/mapping.py @@ -26,6 +26,7 @@ map_type_to_class = { 22: proto.SignedInput, 23: proto.TxInput, 24: proto.TxOutput, + 25: proto.SetMaxFeeKb, } map_class_to_type = {} From 541ebe37f5dea9a3c52a02975d651ebeb76ebb34 Mon Sep 17 00:00:00 2001 From: slush Date: Tue, 13 Nov 2012 16:07:11 +0000 Subject: [PATCH 0005/1535] Client library for talking with bitkey device --- client.py | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 client.py diff --git a/client.py b/client.py new file mode 100644 index 000000000..ea9bded16 --- /dev/null +++ b/client.py @@ -0,0 +1,138 @@ +import os + +from bitkey_proto import bitkey_pb2 as proto +from transport_pipe import PipeTransport + +def show_message(message): + print "MESSAGE FROM DEVICE:", message + +def show_input(input_text, message=None): + if message: + print "QUESTION FROM DEVICE:", message + return raw_input(input_text) + +class BitkeyClient(object): + + def __init__(self, path, message_func=show_message, input_func=show_input, debug=False): + self.master_public_key = None + self.path = path + self.connected = False + self.device = None + + self.message_func = message_func + self.input_func = input_func + self.debug = debug + + def open(self): + self.device = PipeTransport(self.path, False) + self.features = self.call(proto.Initialize()) + self.UUID = self.call(proto.GetUUID()) + + def close(self): + if self.device: + self.device.close() + self.device = None + + def _pprint(self, msg): + return "<%s>:\n%s" % (msg.__class__.__name__, msg) + + def call(self, msg, tries=3): + if self.debug: + print '----------------------' + print "Sending", self._pprint(msg) + + self.device.write(msg) + resp = self.device.read() + + if isinstance(resp, proto.OtpRequest): + otp = self.input_func("OTP required: ", resp.message) + self.device.write(proto.OtpAck(otp=otp)) + resp = self.device.read() + + if isinstance(resp, proto.PinRequest): + pin = self.input_func("PIN required: ", resp.message) + self.device.write(proto.PinAck(pin=pin)) + resp = self.device.read() + + if isinstance(resp, proto.Failure): + self.message_func(resp.message) + + if resp.code == 3: + if tries <= 1: + raise Exception("OTP is invalid, too many retries") + self.message_func("OTP is invalid, let's try again...") + + elif resp.code == 4: + raise Exception("Action cancelled by user") + + elif resp.code == 6: + if tries <= 1: + raise Exception("PIN is invalid, too many retries") + self.message_func("PIN is invalid, let's try again...") + + return self.call(msg, tries-1) + + if isinstance(resp, proto.Failure): + raise Exception(resp.code, resp.message) + + if self.debug: + print "Received", self._pprint(resp) + + return resp + + def sign_tx(self, algo, inputs, outputs, fee): + ''' + inputs: list of TxInput + outputs: list of TxOutput + ''' + + tx = proto.SignTx() + tx.algo = algo # Choose BIP32 or ELECTRUM way for deterministic keys + tx.random = os.urandom(256) # Provide additional entropy to the device + + for addr, amount in outputs: + if addr in self.addresses: + addr_n = self.addresses.index(addr) + else: + addr_n = None + + fee -= amount + output = tx.outputs.add() + output.address=addr + output.address_n.append(addr_n) + output.amount=amount + output.script_type=proto.PAYTOADDRESS + + print "FEE", fee + #print inputs2, outputs2 + + tx.fee = fee + print "PBDATA", tx.SerializeToString().encode('hex') + + ################# + ################# + ################# + + signatures = [('add550d6ba9ab7e01d37e17658f98b6e901208d241f24b08197b5e20dfa7f29f095ae01acbfa5c4281704a64053dcb80e9b089ecbe09f5871d67725803e36edd', '3045022100dced96eeb43836bc95676879eac303eabf39802e513f4379a517475c259da12502201fd36c90ecd91a32b2ca8fed2e1755a7f2a89c2d520eb0da10147802bc7ca217')] + + s_inputs = [] + for i in range(len(inputs)): + addr, v, p_hash, p_pos, p_scriptPubKey, _, _ = inputs[i] + pubkey = signatures[i][0].decode('hex') + sig = signatures[i][1].decode('hex') + s_inputs.append((addr, v, p_hash, p_pos, p_scriptPubKey, pubkey, sig)) + + return s_inputs + ''' + s_inputs = [] + for i in range(len(inputs)): + addr, v, p_hash, p_pos, p_scriptPubKey, _, _ = inputs[i] + private_key = ecdsa.SigningKey.from_string( self.get_private_key(addr, password), curve = SECP256k1 ) + public_key = private_key.get_verifying_key() + pubkey = public_key.to_string() + tx = filter( raw_tx( inputs, outputs, for_sig = i ) ) + sig = private_key.sign_digest( Hash( tx.decode('hex') ), sigencode = ecdsa.util.sigencode_der ) + assert public_key.verify_digest( sig, Hash( tx.decode('hex') ), sigdecode = ecdsa.util.sigdecode_der) + s_inputs.append( (addr, v, p_hash, p_pos, p_scriptPubKey, pubkey, sig) ) + return s_inputs + ''' From 437d88db1bb288334975ce9ba88d8b3671646e10 Mon Sep 17 00:00:00 2001 From: slush Date: Tue, 13 Nov 2012 16:07:53 +0000 Subject: [PATCH 0006/1535] Drop pipe only when acting as a device --- transport_pipe.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/transport_pipe.py b/transport_pipe.py index 2ca139498..21abdd6df 100644 --- a/transport_pipe.py +++ b/transport_pipe.py @@ -34,8 +34,9 @@ class PipeTransport(Transport): def _close(self): self.read_f.close() self.write_f.close() - os.unlink(self.filename_read) - os.unlink(self.filename_write) + if self.is_device: + os.unlink(self.filename_read) + os.unlink(self.filename_write) def _write(self, msg): try: From fdd090b67e69622969b44ea874fe9633319f80bd Mon Sep 17 00:00:00 2001 From: slush Date: Tue, 13 Nov 2012 16:08:12 +0000 Subject: [PATCH 0007/1535] test uses BitkeyClient --- test.py | 53 ++++++++++------------------------------------------- 1 file changed, 10 insertions(+), 43 deletions(-) diff --git a/test.py b/test.py index 3b5be2b4f..7c2488bb8 100755 --- a/test.py +++ b/test.py @@ -6,50 +6,16 @@ from transport_pipe import PipeTransport from transport_serial import SerialTransport from bitkey_proto import bitkey_pb2 as proto -def pprint(msg): - return "<%s>:\n%s" % (msg.__class__.__name__, msg) +from client import BitkeyClient -def call(msg, tries=3): - print '----------------------' - print "Sending", pprint(msg) - d.write(msg) - resp = d.read() - - if isinstance(resp, proto.OtpRequest): - if resp.message: - print "Message:", resp.message - otp = raw_input("OTP required: ") - d.write(proto.OtpAck(otp=otp)) - resp = d.read() +bitkey = BitkeyClient('../bitkey-python/device.socket', debug=True) +bitkey.open() +bitkey.call(proto.Ping(message='ahoj!')) +bitkey.call(proto.SetMaxFeeKb(maxfee_kb=200000)) +bitkey.close() - if isinstance(resp, proto.PinRequest): - if resp.message: - print "Message:", resp.message - pin = raw_input("PIN required: ") - d.write(proto.PinAck(pin=pin)) - resp = d.read() - - if isinstance(resp, proto.Failure) and resp.code in (3, 6): - if tries <= 1 and resp.code == 3: - raise Exception("OTP is invalid, too many retries") - if tries <= 1 and resp.code == 6: - raise Exception("PIN is invalid, too many retries") - - # Invalid OTP or PIN, try again - if resp.code == 3: - print "OTP is invalid, let's try again..." - elif resp.code == 6: - print "PIN is invalid, let's try again..." - - return call(msg, tries-1) - - if isinstance(resp, proto.Failure): - raise Exception(resp.code, resp.message) - - print "Received", pprint(resp) - return resp - -d = PipeTransport('../../bitkey-python/device.socket', is_device=False) +''' +d = PipeTransport('../bitkey-python/device.socket', is_device=False) #d = SerialTransport('../../bitkey-python/COM9') #start = time.time() @@ -66,5 +32,6 @@ call(proto.GetUUID()) #call(proto.ResetDevice()) call(proto.GetMasterPublicKey(algo=proto.ELECTRUM)) #call(proto.ResetDevice()) - +''' + #print 10000 / (time.time() - start) From c8e3242efb2d435a40393c7487df520808d1b145 Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 15 Nov 2012 10:35:48 +0000 Subject: [PATCH 0008/1535] Refactored protobuf directory --- protobuf/__init__.py | 0 protobuf/bitkey.proto | 154 ++++++++++++++++++++++++++++++++++++++++++ protobuf/build.sh | 5 ++ 3 files changed, 159 insertions(+) create mode 100644 protobuf/__init__.py create mode 100644 protobuf/bitkey.proto create mode 100755 protobuf/build.sh diff --git a/protobuf/__init__.py b/protobuf/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/protobuf/bitkey.proto b/protobuf/bitkey.proto new file mode 100644 index 000000000..2390fe692 --- /dev/null +++ b/protobuf/bitkey.proto @@ -0,0 +1,154 @@ +enum Algorithm { + BIP32 = 0; + ELECTRUM = 1; +} + +enum ScriptType { + PAYTOADDRESS = 0; + PAYTOSCRIPTHASH = 1; +} + +// Response: None or Features +message Initialize { +} + +message Features { + optional string version = 1; + optional bool otp = 2; + optional bool pin = 3; + optional bool spv = 4; + optional uint64 maxfee_kb = 5; + repeated Algorithm algo = 6; +} + +// Description: Test if another side is still alive. +// Response: None or Success +message Ping { + optional string message = 1; +} + +// Description: Response message for previous request with given id. +message Success { + optional string message = 1; +} + +// Description: Response message for previous request with given id. +message Failure { + optional int32 code = 1; + optional string message = 2; +} + +// Response: UUID or Failure +message GetUUID { +} + +message UUID { + required bytes UUID = 1; +} + +message OtpRequest { + optional string message = 1; +} + +message OtpAck { + required string otp = 1; +} + +message OtpCancel { +} + +message PinRequest { + optional string message = 1; +} + +message PinAck { + required string pin = 1; +} + +message PinCancel { +} + +// Response: OtpRequest, Entropy, Failure +message GetEntropy { + required uint32 size = 1; +} + +message Entropy { + required bytes entropy = 1; +} + +// Response: Success, OtpRequest, PinRequest, Failure +message SetMaxFeeKb { + required uint64 maxfee_kb= 1; +} + +// Response: MasterPublicKey, Failure +message GetMasterPublicKey { + required Algorithm algo = 1 [default=BIP32]; +} + +message MasterPublicKey { + required bytes key = 1; +} + +// Response: Success, OtpRequest, Failure +message LoadDevice { + required string seed = 1; + optional bool otp = 2 [default=true]; + optional string pin = 3; + optional bool spv = 4 [default=true]; +} + +// Response: Success, OtpRequest, PinRequest, Failure +message ResetDevice { +} + +message TxOutput { + required string address = 1; + repeated uint32 address_n = 2; + required uint64 amount = 3; + required ScriptType script_type = 4; + repeated bytes script_args = 5; +} + +// Response: Success, SignedInput, Failure +message TxInput { + repeated uint32 address_n = 1; + required uint64 amount = 2; + required bytes prev_hash = 3; + required uint32 prev_index = 4; + optional bytes script_sig = 5; +} + +// Response: SignedTx, Success, OtpRequest, PinRequest, Failure +message SignTx { + required Algorithm algo = 1 [default=BIP32]; + optional bool stream = 2; // enable streaming + required uint64 fee = 3; + repeated TxOutput outputs = 4; + repeated TxInput inputs = 5; + optional uint32 inputs_count = 6; // for streaming + optional bytes random = 7; +} + +message SignedTx { + repeated bytes signature = 1; +} + +/* +inputs = [] # list of TxInput +for i in inputs: + for x in inputs: + send(x) + + signature = send(SignInput(i)) +*/ + +// Response: SignedInput, Failure +message SignInput { + required TxInput input = 1; +} + +message SignedInput { + required bytes signature = 1; +} \ No newline at end of file diff --git a/protobuf/build.sh b/protobuf/build.sh new file mode 100755 index 000000000..6dfc18d47 --- /dev/null +++ b/protobuf/build.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +cd `dirname $0` + +protoc --python_out=../bitkeylib/ bitkey.proto From 1d56e4da59d7609d3d82203c3784960255f13419 Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 15 Nov 2012 10:36:18 +0000 Subject: [PATCH 0009/1535] Reworked directory structure --- bitkey_proto/__init__.py | 0 bitkey_proto/bitkey.proto | 154 ------------------ bitkey_proto/build.sh | 5 - __init__.py => bitkeylib/__init__.py | 0 client.py => bitkeylib/client.py | 0 {bitkey_proto => bitkeylib}/mapping.py | 0 test.py => bitkeylib/test.py | 0 transport.py => bitkeylib/transport.py | 0 .../transport_pipe.py | 0 .../transport_serial.py | 0 10 files changed, 159 deletions(-) delete mode 100644 bitkey_proto/__init__.py delete mode 100644 bitkey_proto/bitkey.proto delete mode 100755 bitkey_proto/build.sh rename __init__.py => bitkeylib/__init__.py (100%) rename client.py => bitkeylib/client.py (100%) rename {bitkey_proto => bitkeylib}/mapping.py (100%) rename test.py => bitkeylib/test.py (100%) rename transport.py => bitkeylib/transport.py (100%) rename transport_pipe.py => bitkeylib/transport_pipe.py (100%) rename transport_serial.py => bitkeylib/transport_serial.py (100%) diff --git a/bitkey_proto/__init__.py b/bitkey_proto/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/bitkey_proto/bitkey.proto b/bitkey_proto/bitkey.proto deleted file mode 100644 index 2390fe692..000000000 --- a/bitkey_proto/bitkey.proto +++ /dev/null @@ -1,154 +0,0 @@ -enum Algorithm { - BIP32 = 0; - ELECTRUM = 1; -} - -enum ScriptType { - PAYTOADDRESS = 0; - PAYTOSCRIPTHASH = 1; -} - -// Response: None or Features -message Initialize { -} - -message Features { - optional string version = 1; - optional bool otp = 2; - optional bool pin = 3; - optional bool spv = 4; - optional uint64 maxfee_kb = 5; - repeated Algorithm algo = 6; -} - -// Description: Test if another side is still alive. -// Response: None or Success -message Ping { - optional string message = 1; -} - -// Description: Response message for previous request with given id. -message Success { - optional string message = 1; -} - -// Description: Response message for previous request with given id. -message Failure { - optional int32 code = 1; - optional string message = 2; -} - -// Response: UUID or Failure -message GetUUID { -} - -message UUID { - required bytes UUID = 1; -} - -message OtpRequest { - optional string message = 1; -} - -message OtpAck { - required string otp = 1; -} - -message OtpCancel { -} - -message PinRequest { - optional string message = 1; -} - -message PinAck { - required string pin = 1; -} - -message PinCancel { -} - -// Response: OtpRequest, Entropy, Failure -message GetEntropy { - required uint32 size = 1; -} - -message Entropy { - required bytes entropy = 1; -} - -// Response: Success, OtpRequest, PinRequest, Failure -message SetMaxFeeKb { - required uint64 maxfee_kb= 1; -} - -// Response: MasterPublicKey, Failure -message GetMasterPublicKey { - required Algorithm algo = 1 [default=BIP32]; -} - -message MasterPublicKey { - required bytes key = 1; -} - -// Response: Success, OtpRequest, Failure -message LoadDevice { - required string seed = 1; - optional bool otp = 2 [default=true]; - optional string pin = 3; - optional bool spv = 4 [default=true]; -} - -// Response: Success, OtpRequest, PinRequest, Failure -message ResetDevice { -} - -message TxOutput { - required string address = 1; - repeated uint32 address_n = 2; - required uint64 amount = 3; - required ScriptType script_type = 4; - repeated bytes script_args = 5; -} - -// Response: Success, SignedInput, Failure -message TxInput { - repeated uint32 address_n = 1; - required uint64 amount = 2; - required bytes prev_hash = 3; - required uint32 prev_index = 4; - optional bytes script_sig = 5; -} - -// Response: SignedTx, Success, OtpRequest, PinRequest, Failure -message SignTx { - required Algorithm algo = 1 [default=BIP32]; - optional bool stream = 2; // enable streaming - required uint64 fee = 3; - repeated TxOutput outputs = 4; - repeated TxInput inputs = 5; - optional uint32 inputs_count = 6; // for streaming - optional bytes random = 7; -} - -message SignedTx { - repeated bytes signature = 1; -} - -/* -inputs = [] # list of TxInput -for i in inputs: - for x in inputs: - send(x) - - signature = send(SignInput(i)) -*/ - -// Response: SignedInput, Failure -message SignInput { - required TxInput input = 1; -} - -message SignedInput { - required bytes signature = 1; -} \ No newline at end of file diff --git a/bitkey_proto/build.sh b/bitkey_proto/build.sh deleted file mode 100755 index b96dd453e..000000000 --- a/bitkey_proto/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -cd `dirname $0` - -protoc --python_out=. bitkey.proto diff --git a/__init__.py b/bitkeylib/__init__.py similarity index 100% rename from __init__.py rename to bitkeylib/__init__.py diff --git a/client.py b/bitkeylib/client.py similarity index 100% rename from client.py rename to bitkeylib/client.py diff --git a/bitkey_proto/mapping.py b/bitkeylib/mapping.py similarity index 100% rename from bitkey_proto/mapping.py rename to bitkeylib/mapping.py diff --git a/test.py b/bitkeylib/test.py similarity index 100% rename from test.py rename to bitkeylib/test.py diff --git a/transport.py b/bitkeylib/transport.py similarity index 100% rename from transport.py rename to bitkeylib/transport.py diff --git a/transport_pipe.py b/bitkeylib/transport_pipe.py similarity index 100% rename from transport_pipe.py rename to bitkeylib/transport_pipe.py diff --git a/transport_serial.py b/bitkeylib/transport_serial.py similarity index 100% rename from transport_serial.py rename to bitkeylib/transport_serial.py From b7a81c61eb5b6a726055a8016a3d91a6d5a2694d Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 15 Nov 2012 10:42:19 +0000 Subject: [PATCH 0010/1535] Fixed paths and imports --- bitkeylib/client.py | 2 +- bitkeylib/transport.py | 6 +++--- {bitkeylib => tests}/test.py | 12 +++++++----- 3 files changed, 11 insertions(+), 9 deletions(-) rename {bitkeylib => tests}/test.py (71%) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index ea9bded16..e07acdd17 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -1,6 +1,6 @@ import os -from bitkey_proto import bitkey_pb2 as proto +import bitkey_pb2 as proto from transport_pipe import PipeTransport def show_message(message): diff --git a/bitkeylib/transport.py b/bitkeylib/transport.py index 5bc83f8ce..fb47cfef8 100644 --- a/bitkeylib/transport.py +++ b/bitkeylib/transport.py @@ -1,6 +1,6 @@ import struct -from bitkey_proto import bitkey_pb2 as proto -from bitkey_proto import mapping +import bitkey_pb2 as proto +import mapping class Transport(object): def __init__(self, device, *args, **kwargs): @@ -59,4 +59,4 @@ class Transport(object): except: raise Exception("Cannot parse header length") - return (msg_type, datalen) \ No newline at end of file + return (msg_type, datalen) diff --git a/bitkeylib/test.py b/tests/test.py similarity index 71% rename from bitkeylib/test.py rename to tests/test.py index 7c2488bb8..c09b44b9f 100755 --- a/bitkeylib/test.py +++ b/tests/test.py @@ -1,14 +1,16 @@ #!/usr/bin/python +import sys +sys.path = ['../',] + sys.path import time -from transport_pipe import PipeTransport -from transport_serial import SerialTransport -from bitkey_proto import bitkey_pb2 as proto +from bitkeylib.transport_pipe import PipeTransport +from bitkeylib.transport_serial import SerialTransport +import bitkeylib.bitkey_pb2 as proto -from client import BitkeyClient +from bitkeylib.client import BitkeyClient -bitkey = BitkeyClient('../bitkey-python/device.socket', debug=True) +bitkey = BitkeyClient('../../bitkey-python/device.socket', debug=True) bitkey.open() bitkey.call(proto.Ping(message='ahoj!')) bitkey.call(proto.SetMaxFeeKb(maxfee_kb=200000)) From 05a15eaf7db29aa4bfa9f20e032499d710ecff97 Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 15 Nov 2012 10:46:08 +0000 Subject: [PATCH 0011/1535] Warning about missing bitkey_pb2.py --- bitkeylib/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bitkeylib/__init__.py b/bitkeylib/__init__.py index e69de29bb..2175ebde9 100644 --- a/bitkeylib/__init__.py +++ b/bitkeylib/__init__.py @@ -0,0 +1,6 @@ +try: + import bitkey_pb2 +except ImportError: + print "bitkey_pb2.py not found. Please run /protobuf/build.sh to generate it!" + import sys + sys.exit() From b6106fa68194904a5e613a62f5596615812b882a Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 15 Nov 2012 20:05:57 +0000 Subject: [PATCH 0012/1535] Basic structure of unit tests --- tests/config.py | 10 ++++++++++ tests/run.sh | 3 +++ tests/test.py | 29 +++++++++++++++++++++++------ tests/test_basic.py | 19 +++++++++++++++++++ 4 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 tests/config.py create mode 100755 tests/run.sh create mode 100644 tests/test_basic.py diff --git a/tests/config.py b/tests/config.py new file mode 100644 index 000000000..f4ded9423 --- /dev/null +++ b/tests/config.py @@ -0,0 +1,10 @@ +import sys +sys.path = ['../',] + sys.path + +from bitkeylib.transport_pipe import PipeTransport + +TRANSPORT = PipeTransport +TRANSPORT_ARGS = ('../../bitkey-python/device.socket', False) + +DEBUG_TRANSPORT = PipeTransport +DEBUG_TRANSPORT_ARGS = ('../../bitkey-python/device.socket.debug', False) \ No newline at end of file diff --git a/tests/run.sh b/tests/run.sh new file mode 100755 index 000000000..5936b7999 --- /dev/null +++ b/tests/run.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +python -m unittest discover diff --git a/tests/test.py b/tests/test.py index c09b44b9f..a9a5b26fd 100755 --- a/tests/test.py +++ b/tests/test.py @@ -1,20 +1,37 @@ #!/usr/bin/python +''' import sys sys.path = ['../',] + sys.path import time +ENABLE_DEBUG_LINK = True + from bitkeylib.transport_pipe import PipeTransport from bitkeylib.transport_serial import SerialTransport -import bitkeylib.bitkey_pb2 as proto +from bitkeylib.transport_fake import FakeTransport +from bitkeylib import proto from bitkeylib.client import BitkeyClient +from bitkeylib.debuglink import DebugLink + +transport = PipeTransport('../../bitkey-python/device.socket', is_device=False) + +if ENABLE_DEBUG_LINK: + debug_transport = PipeTransport('../../bitkey-python/device.socket.debug', is_device=False) + debuglink = DebugLink(debug_transport) +else: + debuglink = None -bitkey = BitkeyClient('../../bitkey-python/device.socket', debug=True) -bitkey.open() -bitkey.call(proto.Ping(message='ahoj!')) -bitkey.call(proto.SetMaxFeeKb(maxfee_kb=200000)) -bitkey.close() +bitkey = BitkeyClient(transport, debuglink) + +print bitkey.call(proto.Initialize()) +#bitkey.call(proto.Ping(message='ahoj!')) +#bitkey.call(proto.GetUUID()) + +print bitkey.call(proto.GetEntropy(size=10), button=True) +bitkey.call(proto.SetMaxFeeKb(maxfee_kb=100000), button=True, pin_correct=False) +''' ''' d = PipeTransport('../bitkey-python/device.socket', is_device=False) diff --git a/tests/test_basic.py b/tests/test_basic.py new file mode 100644 index 000000000..da3192912 --- /dev/null +++ b/tests/test_basic.py @@ -0,0 +1,19 @@ +import unittest +import config + +from bitkeylib.client import BitkeyClient +from bitkeylib import proto + +class TestBasic(unittest.TestCase): + + def setUp(self): + self.debuglink = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS) + self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) + self.bitkey = BitkeyClient(self.transport, self.debuglink) + + def tearDown(self): + self.debuglink.close() + self.transport.close() + + def test_basic(self): + self.assertEqual(self.bitkey.call(proto.Ping(message='ahoj!')), proto.Success(message='ahoj!')) \ No newline at end of file From 8cf7a6ae3d595b88f02fae66d13dc590d9007b6c Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 15 Nov 2012 20:06:39 +0000 Subject: [PATCH 0013/1535] Check for generated bitkey_pb2.py --- bitkeylib/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bitkeylib/__init__.py b/bitkeylib/__init__.py index 2175ebde9..ec9cbc659 100644 --- a/bitkeylib/__init__.py +++ b/bitkeylib/__init__.py @@ -1,5 +1,5 @@ try: - import bitkey_pb2 + import bitkey_pb2 as proto except ImportError: print "bitkey_pb2.py not found. Please run /protobuf/build.sh to generate it!" import sys From b8e60121fe9a9cf658f03c6ddb340d2fe696bc33 Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 15 Nov 2012 20:07:23 +0000 Subject: [PATCH 0014/1535] Added DebugLinkDecision message --- bitkeylib/mapping.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bitkeylib/mapping.py b/bitkeylib/mapping.py index 4400954e2..610919992 100644 --- a/bitkeylib/mapping.py +++ b/bitkeylib/mapping.py @@ -27,6 +27,7 @@ map_type_to_class = { 23: proto.TxInput, 24: proto.TxOutput, 25: proto.SetMaxFeeKb, + 100: proto.DebugLinkDecision, } map_class_to_type = {} From 0c3f723ee72bf410a289b97061a625a46db4f1e6 Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 15 Nov 2012 20:08:02 +0000 Subject: [PATCH 0015/1535] Implemented ready_to_read() --- bitkeylib/transport.py | 5 ++++- bitkeylib/transport_pipe.py | 6 +++++- bitkeylib/transport_serial.py | 6 +++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/bitkeylib/transport.py b/bitkeylib/transport.py index fb47cfef8..9a6f8fd0e 100644 --- a/bitkeylib/transport.py +++ b/bitkeylib/transport.py @@ -19,6 +19,9 @@ class Transport(object): def _read(self): raise NotImplemented + def ready_to_read(self): + raise NotImplemented + def close(self): self._close() @@ -26,7 +29,7 @@ class Transport(object): ser = msg.SerializeToString() header = struct.pack(">HL", mapping.get_type(msg), len(ser)) self._write("##%s%s" % (header, ser)) - + def read(self): (msg_type, data) = self._read() inst = mapping.get_class(msg_type)() diff --git a/bitkeylib/transport_pipe.py b/bitkeylib/transport_pipe.py index 21abdd6df..ee27857d8 100644 --- a/bitkeylib/transport_pipe.py +++ b/bitkeylib/transport_pipe.py @@ -2,7 +2,7 @@ Use this transport for talking with bitkey simulator.''' import os - +from select import select from transport import Transport class PipeTransport(Transport): @@ -38,6 +38,10 @@ class PipeTransport(Transport): os.unlink(self.filename_read) os.unlink(self.filename_write) + def ready_to_read(self): + rlist, _, _ = select([self.read_f], [], [], 0) + return len(rlist) > 0 + def _write(self, msg): try: self.write_f.write(msg) diff --git a/bitkeylib/transport_serial.py b/bitkeylib/transport_serial.py index 8820096e3..8568c944a 100644 --- a/bitkeylib/transport_serial.py +++ b/bitkeylib/transport_serial.py @@ -3,7 +3,7 @@ # Local serial port loopback: socat PTY,link=COM8 PTY,link=COM9 import serial - +from select import select from transport import Transport class SerialTransport(Transport): @@ -18,6 +18,10 @@ class SerialTransport(Transport): self.serial.close() self.serial = None + def ready_to_read(self): + rlist, _, _ = select([self.serial], [], [], 0) + return len(rlist) > 0 + def _write(self, msg): try: self.serial.write(msg) From 0c81a7d8ec0b6e6ee51855d20b5b52aa6bfbaaf1 Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 15 Nov 2012 20:08:52 +0000 Subject: [PATCH 0016/1535] DebugLinkDecision message Features message indicates if device has a support for DebugLink connection --- protobuf/bitkey.proto | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/protobuf/bitkey.proto b/protobuf/bitkey.proto index 2390fe692..8b122623c 100644 --- a/protobuf/bitkey.proto +++ b/protobuf/bitkey.proto @@ -19,6 +19,7 @@ message Features { optional bool spv = 4; optional uint64 maxfee_kb = 5; repeated Algorithm algo = 6; + optional bool debug_link = 7; } // Description: Test if another side is still alive. @@ -38,6 +39,10 @@ message Failure { optional string message = 2; } +message DebugLinkDecision { + required bool yes_no = 1; +} + // Response: UUID or Failure message GetUUID { } From 37b75d1bc961ba7aabf697320e97ec33cccdfc8f Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 15 Nov 2012 20:10:23 +0000 Subject: [PATCH 0017/1535] Implemented debuglink connection --- bitkeylib/client.py | 65 +++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index e07acdd17..d702b0ec1 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -1,7 +1,5 @@ import os - import bitkey_pb2 as proto -from transport_pipe import PipeTransport def show_message(message): print "MESSAGE FROM DEVICE:", message @@ -13,46 +11,58 @@ def show_input(input_text, message=None): class BitkeyClient(object): - def __init__(self, path, message_func=show_message, input_func=show_input, debug=False): + def __init__(self, transport, debuglink=None, message_func=show_message, input_func=show_input, debug=False): self.master_public_key = None - self.path = path - self.connected = False - self.device = None + self.transport = transport + self.debuglink = debuglink self.message_func = message_func self.input_func = input_func self.debug = debug - - def open(self): - self.device = PipeTransport(self.path, False) + self.features = self.call(proto.Initialize()) self.UUID = self.call(proto.GetUUID()) - - def close(self): - if self.device: - self.device.close() - self.device = None - + def _pprint(self, msg): return "<%s>:\n%s" % (msg.__class__.__name__, msg) - def call(self, msg, tries=3): + def call(self, msg, tries=1, button=None, pin_correct=True, otp_correct=True): if self.debug: print '----------------------' print "Sending", self._pprint(msg) - self.device.write(msg) - resp = self.device.read() - + self.transport.write(msg) + + if self.debuglink and button != None: + self.debuglink.press_button(button) + + resp = self.transport.read() + if isinstance(resp, proto.OtpRequest): - otp = self.input_func("OTP required: ", resp.message) - self.device.write(proto.OtpAck(otp=otp)) - resp = self.device.read() + if self.debuglink: + otp = self.debuglink.read_otp() + if otp_correct: + self.transport.write(otp) + else: + self.transport.write(proto.OtpAck(otp='__42__')) + else: + otp = self.input_func("OTP required: ", resp.message) + self.transport.write(proto.OtpAck(otp=otp)) + + resp = self.transport.read() if isinstance(resp, proto.PinRequest): - pin = self.input_func("PIN required: ", resp.message) - self.device.write(proto.PinAck(pin=pin)) - resp = self.device.read() + if self.debuglink: + pin = self.debuglink.read_pin() + if pin_correct: + self.transport.write(pin) + else: + self.transport.write(proto.PinAck(pin='__42__')) + else: + pin = self.input_func("PIN required: ", resp.message) + self.transport.write(proto.PinAck(pin=pin)) + + resp = self.transport.read() if isinstance(resp, proto.Failure): self.message_func(resp.message) @@ -70,7 +80,10 @@ class BitkeyClient(object): raise Exception("PIN is invalid, too many retries") self.message_func("PIN is invalid, let's try again...") - return self.call(msg, tries-1) + return self.call(msg, tries-1, + button=button, + pin_correct=pin_correct, + otp_correct=otp_correct) if isinstance(resp, proto.Failure): raise Exception(resp.code, resp.message) From 8f84e356ad7a4bd57c73bcf4fa7793aeb71d0af4 Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 3 Dec 2012 15:36:03 +0000 Subject: [PATCH 0018/1535] Major refactoring Added commandline tool cmd.py --- bitkeylib/client.py | 84 +++++++------ bitkeylib/debuglink.py | 44 +++++++ bitkeylib/mapping.py | 8 +- bitkeylib/transport_fake.py | 24 ++++ cmd.py | 108 +++++++++++++++++ protobuf/__init__.py | 0 protobuf/bitkey.proto | 232 ++++++++++++++++++++++++------------ tests/config.py | 4 +- tests/test_basic.py | 49 +++++++- tests/test_signtx.py | 28 +++++ 10 files changed, 456 insertions(+), 125 deletions(-) create mode 100644 bitkeylib/debuglink.py create mode 100644 bitkeylib/transport_fake.py create mode 100755 cmd.py delete mode 100644 protobuf/__init__.py create mode 100644 tests/test_signtx.py diff --git a/bitkeylib/client.py b/bitkeylib/client.py index d702b0ec1..e7e990c42 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -1,5 +1,6 @@ import os import bitkey_pb2 as proto +import random def show_message(message): print "MESSAGE FROM DEVICE:", message @@ -11,22 +12,44 @@ def show_input(input_text, message=None): class BitkeyClient(object): - def __init__(self, transport, debuglink=None, message_func=show_message, input_func=show_input, debug=False): - self.master_public_key = None - self.transport = transport + def __init__(self, transport, debuglink=None, + algo=proto.BIP32, + message_func=show_message, input_func=show_input, debug=False): + self.transport = transport self.debuglink = debuglink + self.algo = algo self.message_func = message_func self.input_func = input_func self.debug = debug - - self.features = self.call(proto.Initialize()) + + self.setup_debuglink() + self.init_device() + + def init_device(self): + self.master_public_key = None + self.session_id = ''.join([ chr(random.randrange(0, 255, 1)) for _ in xrange(0, 16) ]) + self.features = self.call(proto.Initialize(session_id=self.session_id)) self.UUID = self.call(proto.GetUUID()) - + + def get_master_public_key(self): + if self.master_public_key: + return self.master_public_key + + self.master_public_key = self.call(proto.GetMasterPublicKey(algo=self.algo)) + return self.master_public_key + + def get_entropy(self, size): + return self.call(proto.GetEntropy(size=size)).entropy + def _pprint(self, msg): return "<%s>:\n%s" % (msg.__class__.__name__, msg) - def call(self, msg, tries=1, button=None, pin_correct=True, otp_correct=True): + def setup_debuglink(self, pin_correct=False, otp_correct=False): + self.debug_pin = pin_correct + self.debug_otp = otp_correct + + def call(self, msg, button=None, tries=1): if self.debug: print '----------------------' print "Sending", self._pprint(msg) @@ -41,7 +64,7 @@ class BitkeyClient(object): if isinstance(resp, proto.OtpRequest): if self.debuglink: otp = self.debuglink.read_otp() - if otp_correct: + if self.debug_otp: self.transport.write(otp) else: self.transport.write(proto.OtpAck(otp='__42__')) @@ -54,7 +77,7 @@ class BitkeyClient(object): if isinstance(resp, proto.PinRequest): if self.debuglink: pin = self.debuglink.read_pin() - if pin_correct: + if self.debug_pin: self.transport.write(pin) else: self.transport.write(proto.PinAck(pin='__42__')) @@ -80,11 +103,7 @@ class BitkeyClient(object): raise Exception("PIN is invalid, too many retries") self.message_func("PIN is invalid, let's try again...") - return self.call(msg, tries-1, - button=button, - pin_correct=pin_correct, - otp_correct=otp_correct) - + return self.call(msg, button, tries-1) if isinstance(resp, proto.Failure): raise Exception(resp.code, resp.message) @@ -93,39 +112,28 @@ class BitkeyClient(object): return resp - def sign_tx(self, algo, inputs, outputs, fee): + def get_uuid(self): + return self.call(proto.GetUUID()) + + def sign_tx(self, inputs, outputs): ''' inputs: list of TxInput outputs: list of TxOutput ''' - + tx = proto.SignTx() - tx.algo = algo # Choose BIP32 or ELECTRUM way for deterministic keys + tx.algo = self.algo # Choose BIP32 or ELECTRUM way for deterministic keys tx.random = os.urandom(256) # Provide additional entropy to the device - - for addr, amount in outputs: - if addr in self.addresses: - addr_n = self.addresses.index(addr) - else: - addr_n = None + tx.outputs.extend(outputs) - fee -= amount - output = tx.outputs.add() - output.address=addr - output.address_n.append(addr_n) - output.amount=amount - output.script_type=proto.PAYTOADDRESS - - print "FEE", fee - #print inputs2, outputs2 - - tx.fee = fee - print "PBDATA", tx.SerializeToString().encode('hex') + return self.call(tx) + #print "PBDATA", tx.SerializeToString().encode('hex') ################# ################# ################# + ''' signatures = [('add550d6ba9ab7e01d37e17658f98b6e901208d241f24b08197b5e20dfa7f29f095ae01acbfa5c4281704a64053dcb80e9b089ecbe09f5871d67725803e36edd', '3045022100dced96eeb43836bc95676879eac303eabf39802e513f4379a517475c259da12502201fd36c90ecd91a32b2ca8fed2e1755a7f2a89c2d520eb0da10147802bc7ca217')] s_inputs = [] @@ -136,7 +144,7 @@ class BitkeyClient(object): s_inputs.append((addr, v, p_hash, p_pos, p_scriptPubKey, pubkey, sig)) return s_inputs - ''' + s_inputs = [] for i in range(len(inputs)): addr, v, p_hash, p_pos, p_scriptPubKey, _, _ = inputs[i] @@ -149,3 +157,7 @@ class BitkeyClient(object): s_inputs.append( (addr, v, p_hash, p_pos, p_scriptPubKey, pubkey, sig) ) return s_inputs ''' + + def load_device(self, seed, otp, pin, spv, button=None): + self.call(proto.LoadDevice(seed=seed, otp=otp, pin=pin, spv=spv), button=button) + self.init_device() \ No newline at end of file diff --git a/bitkeylib/debuglink.py b/bitkeylib/debuglink.py new file mode 100644 index 000000000..98e81525d --- /dev/null +++ b/bitkeylib/debuglink.py @@ -0,0 +1,44 @@ +import bitkey_pb2 as proto + +def otp_info(otp): + print "Device asks for OTP %s" % otp + +def pin_info(pin): + print "Device asks for PIN %s" % pin + +def button_press(yes_no): + print "User pressed", '"y"' if yes_no else '"n"' + +class DebugLink(object): + def __init__(self, transport, otp_func=otp_info, pin_func=pin_info, button_func=button_press): + self.transport = transport + self.otp_func = otp_func + self.pin_func = pin_func + self.button_func = button_func + + def read_otp(self): + obj = self.transport.read() + if not isinstance(obj, proto.OtpAck): + raise Exception("Expected OtpAck object, got %s" % obj) + self.otp_func(obj) + return obj + + def read_pin(self): + obj = self.transport.read() + if not isinstance(obj, proto.PinAck): + raise Exception("Expected PinAck object, got %s" % obj) + self.pin_func(obj) + return obj + + def press_button(self, yes_no): + self.button_func(yes_no) + self.transport.write(proto.DebugLinkDecision(yes_no=yes_no)) + #obj = self.transport.read() + #if not isinstance(obj, proto.Success): + # raise Exception("Expected Success object, got %s" % obj) + + def press_yes(self): + self.press_button(True) + + def press_no(self): + self.press_button(False) \ No newline at end of file diff --git a/bitkeylib/mapping.py b/bitkeylib/mapping.py index 610919992..87f0cae1f 100644 --- a/bitkeylib/mapping.py +++ b/bitkeylib/mapping.py @@ -17,17 +17,19 @@ map_type_to_class = { 13: proto.LoadDevice, 14: proto.ResetDevice, 15: proto.SignTx, - 16: proto.SignedTx, +# 16: proto.SignedTx, 17: proto.Features, 18: proto.PinRequest, 19: proto.PinAck, 20: proto.PinCancel, - 21: proto.SignInput, - 22: proto.SignedInput, + 21: proto.InputRequest, + 22: proto.OutputRequest, 23: proto.TxInput, 24: proto.TxOutput, 25: proto.SetMaxFeeKb, 100: proto.DebugLinkDecision, + 101: proto.DebugLinkGetState, + 102: proto.DebugLinkState, } map_class_to_type = {} diff --git a/bitkeylib/transport_fake.py b/bitkeylib/transport_fake.py new file mode 100644 index 000000000..1954c96b4 --- /dev/null +++ b/bitkeylib/transport_fake.py @@ -0,0 +1,24 @@ +'''FakeTransport implements dummy interface for Transport.''' + +# Local serial port loopback: socat PTY,link=COM8 PTY,link=COM9 + +from transport import Transport + +class FakeTransport(Transport): + def __init__(self, device, *args, **kwargs): + super(FakeTransport, self).__init__(device, *args, **kwargs) + + def _open(self): + pass + + def _close(self): + pass + + def ready_to_read(self): + return False + + def _write(self, msg): + pass + + def _read(self): + raise NotImplemented \ No newline at end of file diff --git a/cmd.py b/cmd.py new file mode 100755 index 000000000..0f57851b5 --- /dev/null +++ b/cmd.py @@ -0,0 +1,108 @@ +#!/usr/bin/python +import binascii +import argparse +import json + +import bitkeylib.bitkey_pb2 as proto +from bitkeylib.client import BitkeyClient + +def parse_args(commands): + parser = argparse.ArgumentParser(description='Commandline tool for Bitkey devices.') + parser.add_argument('-a', '--algorithm', dest='algorithm', choices=['bip32', 'electrum'], default='bip32', help='Key derivation algorithm') + parser.add_argument('-t', '--transport', dest='transport', choices=['usb', 'serial', 'pipe', 'socket'], default='serial', help="Transport used for talking with the device") + parser.add_argument('-p', '--path', dest='path', default='/dev/ttyAMA0', help="Path used by the transport (usually serial port)") + parser.add_argument('-dt', '--debuglink-transport', dest='debuglink_transport', choices=['usb', 'serial', 'pipe', 'socket'], default='socket', help="Debuglink transport") + parser.add_argument('-dp', '--debuglink-path', dest='debuglink_path', default='0.0.0.0:8001', help="Path used by the transport (usually serial port)") + parser.add_argument('-j', '--json', dest='json', action='store_true', help="Prints result as json object") +# parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', help='Enable low-level debugging messages') + + cmdparser = parser.add_subparsers(title='Available commands') + + for cmd in commands._list_commands(): + func = object.__getattribute__(commands, cmd) + try: + help = func.help + except AttributeError: + help = '' + + try: + arguments = func.arguments + except AttributeError: + arguments = ((('params',), {'nargs': '*'}),) + + item = cmdparser.add_parser(cmd, help=func.help) + for arg in arguments: + item.add_argument(*arg[0], **arg[1]) + + item.set_defaults(func=func) + + return parser.parse_args() + +def get_transport(transport_string, path): + if transport_string == 'usb': + raise NotImplemented("USB HID transport not implemented yet") + + if transport_string == 'serial': + from bitkeylib.transport_serial import SerialTransport + return SerialTransport(path) + + if transport_string == 'pipe': + from bitkeylib.transport_pipe import PipeTransport + return PipeTransport(path, is_device=False) + + if transport_string == 'socket': + from bitkeylib.transport_socket import SocketTransport + return SocketTransport(path, listen=False) + + if transport_string == 'fake': + from bitkeylib.transport_fake import FakeTransport + return FakeTransport(path) + + raise NotImplemented("Unknown transport") + +class Commands(object): + def __init__(self, client): + self.client = client + + @classmethod + def _list_commands(cls): + return [ x for x in dir(cls) if not x.startswith('_') ] + + def get_master_public_key(self, args): + return 'ahoj' + + def get_entropy(self, args): + return binascii.hexlify(self.client.get_entropy(args.size)) + + get_entropy.help = 'Get example entropy' + get_master_public_key.help = 'Get master public key' + + get_entropy.arguments = ( + (('size',), {'type': int}), + ) + +def main(): + args = parse_args(Commands) + + transport = get_transport(args.transport, args.path) + debuglink_transport = get_transport(args.debuglink_transport, args.debuglink_path) + + if args.algorithm == 'electrum': + algo = proto.ELECTRUM + elif args.algorithm == 'bip32': + algo = proto.BIP32 + else: + raise Exception("Unknown algorithm") + + client = BitkeyClient(transport, debuglink_transport, algo=algo) + cmds = Commands(client) + + res = args.func(cmds, args) + + if args.json: + print json.dumps(res) + else: + print res + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/protobuf/__init__.py b/protobuf/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/protobuf/bitkey.proto b/protobuf/bitkey.proto index 8b122623c..9935a9150 100644 --- a/protobuf/bitkey.proto +++ b/protobuf/bitkey.proto @@ -1,159 +1,235 @@ +/* + This file describes Protocol buffers messages for bitcoin hardware wallet devices. + + Author: slush +*/ + +// Specifies algorithm used for generating private/public keys from the seed. enum Algorithm { BIP32 = 0; ELECTRUM = 1; } - + +// Specifies which script will be used for given transaction output. enum ScriptType { PAYTOADDRESS = 0; PAYTOSCRIPTHASH = 1; } -// Response: None or Features +// Reset device's internal state +// +// Response: Features message Initialize { + required bytes session_id = 1; // Any value identifying current connection, will be echoed back in Features message } +// Response object for Initialize. Contains list of available features on the device. message Features { - optional string version = 1; - optional bool otp = 2; - optional bool pin = 3; - optional bool spv = 4; - optional uint64 maxfee_kb = 5; - repeated Algorithm algo = 6; - optional bool debug_link = 7; -} - -// Description: Test if another side is still alive. + required bytes session_id = 1; // Echoed back from Initialize message + optional string vendor = 2; // Name of the manufacturer, e.g. "bitkey" + optional uint32 major_version = 3; // Major version of the device, e.g. 1 + optional uint32 minor_version = 4; // Minor version of the device, e.g. 0 + optional bool otp = 5; // True when device will send OtpRequest on important action + optional bool pin = 6; // True when device will send PinRequest on important action + optional bool spv = 7; // True when device requires SPV verification of transaction inputs + optional uint64 maxfee_kb = 8; // Maximum accepted fee per kilobyte of signed transaction + repeated Algorithm algo = 9; // List of key generation algorithms supported by the device + optional bool debug_link = 10; // Indicates support for DebugLink connection +} + +// Test if device is live, device will send back the message on success +// // Response: None or Success message Ping { - optional string message = 1; + optional string message = 1; // Message will be sent back in Success message } -// Description: Response message for previous request with given id. -message Success { - optional string message = 1; +// Virtually "press" the button on the device. +// Message is available only on debugging connection and device must support "debug_link" feature. +// +// Response: Success +message DebugLinkDecision { + required bool yes_no = 1; // True for "confirm", False for "cancel" } -// Description: Response message for previous request with given id. -message Failure { - optional int32 code = 1; - optional string message = 2; +// When sent over debug link connection, computer asks for some internal information of the device. +// +// Response: DebugLinkState +message DebugLinkGetState { + optional bool layout = 1; // Request raw buffer of display + optional bool otp = 2; // Request current OTP + optional bool pin = 3; // Request current PIN + optional bool seed = 4; // Request current seed +// optional bool state = 5; } -message DebugLinkDecision { - required bool yes_no = 1; +// Response object reflecting device's current state. It can be received only over debug link connection. +message DebugLinkState { + optional bytes layout = 1; // Raw buffer of display + optional OtpAck otp = 2; // Current OTP, blank if device is not waiting to OTP + optional PinAck pin = 3; // Current PIN, blank if PIN is not set/enabled + optional string seed = 4; // Current seed (in mnemonic format) +// optional string state = 5; +} + +// Response object defining success of the previous request +message Success { + optional string message = 1; // May contain human readable description of the action or request-specific payload +} + +// Response object defining failure of the previous request +message Failure { + optional int32 code = 1; // May contain computer-readable definition of the error state + optional string message = 2; // May contain human-readable message of the error state } -// Response: UUID or Failure +// Ask device for unique identifier. +// +// Response: UUID message GetUUID { } +// Identifier of the device. This identifier must be composed from CPU serial number +// or other persistent source and must be the same for consecutive requests. message UUID { required bytes UUID = 1; } +// Message can be sent by the *device* as a response to any request. +// Message asks computer to send back OtpAck with the password printed on the device's display. +// +// Response: OtpAck, OtpCancel message OtpRequest { - optional string message = 1; + optional string message = 1; // Human readable message } +// Message is sent by the computer as a response to OtpRequest previously sent by the device. message OtpAck { - required string otp = 1; + required string otp = 1; // User must be asked for the otp, which is displayed on the device's display } +// Message is sent as a response to OtpRequest by the computer, asking the device to cancel +// pending action and reset to the default state. message OtpCancel { } +// Message can be sent by the *device* as a response to any request. +// Message asks computer to send back PinAck with the password associated with the device. +// +// Response: PinAck, PinCancel message PinRequest { - optional string message = 1; + optional string message = 1; // Human readable message } +// Message is sent by the computer as a response to PinRequest previously sent by the device. message PinAck { - required string pin = 1; + required string pin = 1; // User must write down the password for accessing the device. } +// Message is sent as a response to PinRequest by the computer, asking the device to cancel +// pending action and reset to the default state. message PinCancel { } -// Response: OtpRequest, Entropy, Failure +// Request a sample of random data generated by hardware RNG. May be used +// for tests of internal RNG. +// +// Response: OtpRequest, PinRequest, Entropy, Failure message GetEntropy { - required uint32 size = 1; + required uint32 size = 1; // Size of randomly generated buffer } +// Response to GetEntropy request contains random data generated by internal HRNG. message Entropy { - required bytes entropy = 1; + required bytes entropy = 1; // Stream of generated bytes } +// Set maximum allowed fee per kB of transaction. This is used by internal sanity checking +// in SignTx method. Transaction won't be signed if requested transaction fees are above +// current value. +// // Response: Success, OtpRequest, PinRequest, Failure message SetMaxFeeKb { - required uint64 maxfee_kb= 1; + required uint64 maxfee_kb= 1; // Maximum allowed transaction fee in satoshis per kB } +// Ask device for it's current master public key. This may be used for generating +// public keys on the computer independently to the device. API doesn't provide +// any other way how to get bitcoin addresses from the device. +// // Response: MasterPublicKey, Failure message GetMasterPublicKey { - required Algorithm algo = 1 [default=BIP32]; + required Algorithm algo = 1 [default=BIP32]; // Used algorithm for generating master public key } +// Contains master public key derived from device's seed. message MasterPublicKey { - required bytes key = 1; + required bytes key = 1; // master public key of requested algorithm in binary format } -// Response: Success, OtpRequest, Failure +// Load seed and related internal settings from computer to the device. Existing seed is overwritten. +// +// Response: Success, OtpRequest, PinRequest, Failure message LoadDevice { - required string seed = 1; - optional bool otp = 2 [default=true]; - optional string pin = 3; - optional bool spv = 4 [default=true]; + required string seed = 1; // Seed encoded as a mnemonic (12 english words) + optional bool otp = 2 [default=true]; // Enable OTP for important actions? + optional string pin = 3; // Set PIN protection for important actions + optional bool spv = 4 [default=true]; // Enable SPV verification for transaction inputs (if available on device) } +// Request device to do full-reset, to generate new seed +// and ask user for new settings (OTP, PIN, SPV). +// // Response: Success, OtpRequest, PinRequest, Failure message ResetDevice { + optional bytes random = 7; // Provide additional entropy for seed generation function. + // Recommended to provide 256 bytes of random data. } -message TxOutput { - required string address = 1; - repeated uint32 address_n = 2; - required uint64 amount = 3; - required ScriptType script_type = 4; - repeated bytes script_args = 5; -} - -// Response: Success, SignedInput, Failure -message TxInput { - repeated uint32 address_n = 1; - required uint64 amount = 2; - required bytes prev_hash = 3; - required uint32 prev_index = 4; - optional bytes script_sig = 5; -} - -// Response: SignedTx, Success, OtpRequest, PinRequest, Failure +// Request the device to sign the transaction +// +// Response: InputRequest, OutputRequest, OtpRequest, PinRequest, Failure message SignTx { - required Algorithm algo = 1 [default=BIP32]; - optional bool stream = 2; // enable streaming - required uint64 fee = 3; - repeated TxOutput outputs = 4; - repeated TxInput inputs = 5; - optional uint32 inputs_count = 6; // for streaming - optional bytes random = 7; + required Algorithm algo = 1 [default=BIP32]; // Algorithm using for key generation algorithm + repeated uint32 outputs_count = 3; // Count of outputs of the transaction + repeated uint32 inputs_count = 5; // Count of inputs of the transaction + optional bytes random = 6; // Provide additional entropy for signing function. + // Recommended to provide 256 bytes of random data. } -message SignedTx { - repeated bytes signature = 1; +// Sent by the device as a response for SignTx. +// If request_index is set, device asks for TxInput message with details of index's input. +// If signed_index is set, 'signature' contains signed input of signed_index's input. +message InputRequest { + optional uint32 request_index = 1; // If presented, device expects TxInput message from the computer + optional uint32 signed_index = 2; // If presented, 'signature' contains signed input of this input + optional bytes signature = 3; // If presented, represent signature of the signed_index input } -/* -inputs = [] # list of TxInput -for i in inputs: - for x in inputs: - send(x) - - signature = send(SignInput(i)) -*/ +// Sent by the device as a response for SignTx or TxInput. +// Device asks for Tx +message OutputRequest { + required uint32 request_index = 1; // Device expects TxOutput message from the computer +} -// Response: SignedInput, Failure -message SignInput { - required TxInput input = 1; +// Transaction onput for SignTx workflow. It is response to InputRequest message sent by device. +// +// Response: InputRequest, OutputRequest, Failure +message TxInput { + required uint32 index = 1; // Position of input in proposed transaction + repeated uint32 address_n = 2; // Parameter for address generation algorithm to derive the address from the master public key + required uint64 amount = 3; // Amount to spend in satoshis. The rest will be used for transaction fees + required bytes prev_hash = 4; // Hash of previous transaction spent by this input + required uint32 prev_index = 5; // Index of previous spent output + optional bytes script_sig = 6; // Script signature } -message SignedInput { - required bytes signature = 1; +// Transaction output for SignTx workflow. It is response to OutputRequest message sent by the device. +message TxOutput { + required uint32 index = 1; // Position of output in proposed transaction + required string address = 2; // Target bitcoin address in base58 encoding + repeated uint32 address_n = 3; // Has higher priority than "address". If the output is to myself, specify parameter for address generation algorithm. + required uint64 amount = 4; // Amount to send in satoshis + required ScriptType script_type = 5;// Select output script type + repeated bytes script_args = 6; // Provide additional parameters for the script (its script-depended) } \ No newline at end of file diff --git a/tests/config.py b/tests/config.py index f4ded9423..00be0cbec 100644 --- a/tests/config.py +++ b/tests/config.py @@ -4,7 +4,7 @@ sys.path = ['../',] + sys.path from bitkeylib.transport_pipe import PipeTransport TRANSPORT = PipeTransport -TRANSPORT_ARGS = ('../../bitkey-python/device.socket', False) +TRANSPORT_ARGS = ('../../bitkey-python/pipe', False) DEBUG_TRANSPORT = PipeTransport -DEBUG_TRANSPORT_ARGS = ('../../bitkey-python/device.socket.debug', False) \ No newline at end of file +DEBUG_TRANSPORT_ARGS = ('../../bitkey-python/pipe.debug', False) diff --git a/tests/test_basic.py b/tests/test_basic.py index da3192912..35c9e7583 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -2,18 +2,55 @@ import unittest import config from bitkeylib.client import BitkeyClient +from bitkeylib.debuglink import DebugLink from bitkeylib import proto +''' + TODO: + * Features reflects all variations of LoadDevice + * Maxfee settings + * Client requires OTP + * Client requires PIN + +''' + class TestBasic(unittest.TestCase): def setUp(self): - self.debuglink = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS) + self.debug_transport = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS) self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) - self.bitkey = BitkeyClient(self.transport, self.debuglink) + self.bitkey = BitkeyClient(self.transport, DebugLink(self.debug_transport), algo=proto.ELECTRUM) + + self.bitkey.setup_debuglink(pin_correct=True, otp_correct=True) + + self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + otp=True, pin='1234', spv=True, button=True) + + print "Setup finished" + print "--------------" def tearDown(self): - self.debuglink.close() + self.debug_transport.close() self.transport.close() - - def test_basic(self): - self.assertEqual(self.bitkey.call(proto.Ping(message='ahoj!')), proto.Success(message='ahoj!')) \ No newline at end of file + + def test_features(self): + features = self.bitkey.call(proto.Initialize(session_id=self.bitkey.session_id)) + + # Result is the same as reported by BitkeyClient class + self.assertEqual(features, self.bitkey.features) + + def test_ping(self): + ping = self.bitkey.call(proto.Ping(message='ahoj!')) + + # Ping results in Success(message='Ahoj!') + self.assertEqual(ping, proto.Success(message='ahoj!')) + + def test_uuid(self): + uuid1 = self.bitkey.get_uuid() + uuid2 = self.bitkey.get_uuid() + + # UUID must be longer than 10 characters + self.assertGreater(len(uuid1.UUID), 10) + + # Every resulf of UUID must be the same + self.assertEqual(uuid1, uuid2) diff --git a/tests/test_signtx.py b/tests/test_signtx.py new file mode 100644 index 000000000..5aa163fc3 --- /dev/null +++ b/tests/test_signtx.py @@ -0,0 +1,28 @@ +import unittest +import config + +from bitkeylib.client import BitkeyClient +from bitkeylib.debuglink import DebugLink +from bitkeylib import proto + +class TestSignTx(unittest.TestCase): + + def setUp(self): + self.debug_transport = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS) + self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) + self.bitkey = BitkeyClient(self.transport, DebugLink(self.debug_transport), algo=proto.ELECTRUM) + + self.bitkey.setup_debuglink(pin_correct=True, otp_correct=True) + + self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + otp=True, pin='1234', spv=True, button=True) + + print "Setup finished" + print "--------------" + + def tearDown(self): + self.debug_transport.close() + self.transport.close() + + def test_signtx(self): + print self.bitkey.sign_tx([], []) \ No newline at end of file From 52c50cd442c110934b20c78d63f9383451bbca63 Mon Sep 17 00:00:00 2001 From: slush Date: Wed, 5 Dec 2012 19:31:21 +0000 Subject: [PATCH 0019/1535] Socket transport --- bitkeylib/transport_socket.py | 122 ++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 bitkeylib/transport_socket.py diff --git a/bitkeylib/transport_socket.py b/bitkeylib/transport_socket.py new file mode 100644 index 000000000..4031fd6fc --- /dev/null +++ b/bitkeylib/transport_socket.py @@ -0,0 +1,122 @@ +'''SocketTransport implements TCP socket interface for Transport.''' + +import socket +from select import select +from transport import Transport + +class FakeRead(object): + # Because socket is the only transport which don't implement read() + + def __init__(self, socket): + self.socket = socket + + def read(self, size): + return self.socket.recv(size) + +class SocketTransportClient(Transport): + def __init__(self, device, *args, **kwargs): + device = device.split(':') + if len(device) < 2: + device = ('0.0.0.0', int(device[0])) + else: + device = (device[0], int(device[1])) + + self.socket = None + super(SocketTransportClient, self).__init__(device, *args, **kwargs) + + def _open(self): + print self.device + self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.socket.connect(self.device) + self.filelike = self.socket.makefile() + + def _close(self): + self.socket.close() + self.socket = None + self.filelike = None + + def ready_to_read(self): + rlist, _, _ = select([self.socket], [], [], 0) + return len(rlist) > 0 + + def _write(self, msg): + self.socket.sendall(msg) + + def _read(self): + try: + print 'filelike', self.filelike + (msg_type, datalen) = self._read_headers(self.filelike) + return (msg_type, self.filelike.read(datalen)) + except socket.error: + print "Failed to read from device" + raise + +class SocketTransport(Transport): + def __init__(self, device, *args, **kwargs): + device = device.split(':') + if len(device) < 2: + device = ('0.0.0.0', int(device[0])) + else: + device = (device[0], int(device[1])) + + self.socket = None + self.client = None + self.filelike = None + + super(SocketTransport, self).__init__(device, *args, **kwargs) + + def _open(self): + print self.device + + self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + #self.socket.setblocking(0) + + self.socket.bind(self.device) + self.socket.listen(1) + + def _disconnect_client(self): + if self.client != None: + self.client = None + self.filelike = None + + def _close(self): + self._disconnect_client() + self.socket.close() + self.socket = None + + def ready_to_read(self): + if self.client: + # Connected + rlist, _, _ = select([self.client], [], [], 0) + return len(rlist) > 0 + else: + # Waiting for connection + rlist, _, _ = select([self.socket], [], [], 0) + if len(rlist) > 0: + (self.client, _) = self.socket.accept() + print "Connected", self.client + self.filelike = self.client.makefile()#FakeRead(self.client)#self.client.makefile() + return self.ready_to_read() + return False + + + def _write(self, msg): + if self.filelike: + # None on disconnected client + self.filelike.write(msg) + self.filelike.flush() + + def _read(self): + try: + print 'filelike', self.filelike + (msg_type, datalen) = self._read_headers(self.filelike) + x = (msg_type, self.filelike.read(datalen)) + print x + return x + except socket.error: + print "Failed to read from device" + raise + except Exception: + self._disconnect_client() + return None \ No newline at end of file From c164eba47b4ac05318eb5976ad4a92a9f22a8333 Mon Sep 17 00:00:00 2001 From: slush Date: Wed, 5 Dec 2012 19:31:26 +0000 Subject: [PATCH 0020/1535] Some basic commands (still under heavy development) --- cmd.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/cmd.py b/cmd.py index 0f57851b5..23129256f 100755 --- a/cmd.py +++ b/cmd.py @@ -14,7 +14,7 @@ def parse_args(commands): parser.add_argument('-dt', '--debuglink-transport', dest='debuglink_transport', choices=['usb', 'serial', 'pipe', 'socket'], default='socket', help="Debuglink transport") parser.add_argument('-dp', '--debuglink-path', dest='debuglink_path', default='0.0.0.0:8001', help="Path used by the transport (usually serial port)") parser.add_argument('-j', '--json', dest='json', action='store_true', help="Prints result as json object") -# parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', help='Enable low-level debugging messages') + parser.add_argument('-d', '--debug', dest='debug', action='store_true', help='Enable low-level debugging') cmdparser = parser.add_subparsers(title='Available commands') @@ -51,8 +51,8 @@ def get_transport(transport_string, path): return PipeTransport(path, is_device=False) if transport_string == 'socket': - from bitkeylib.transport_socket import SocketTransport - return SocketTransport(path, listen=False) + from bitkeylib.transport_socket import SocketTransportClient + return SocketTransportClient(path) if transport_string == 'fake': from bitkeylib.transport_fake import FakeTransport @@ -74,18 +74,34 @@ class Commands(object): def get_entropy(self, args): return binascii.hexlify(self.client.get_entropy(args.size)) + def load_device(self, args): + seed = ' '.join(args.seed) + + return self.client.load_device(seed, args.otp, args.pin, args.spv) + get_entropy.help = 'Get example entropy' get_master_public_key.help = 'Get master public key' + load_device.help = 'Load custom configuration to the device' get_entropy.arguments = ( (('size',), {'type': int}), ) + load_device.arguments = ( + (('-s', '--seed'), {'type': str, 'nargs': '+'}), + (('-n', '--pin'), {'type': str, 'default': ''}), + (('-o', '--otp'), {'action': 'store_true'}), + (('-p', '--spv'), {'action': 'store_true'}), + ) + def main(): args = parse_args(Commands) transport = get_transport(args.transport, args.path) - debuglink_transport = get_transport(args.debuglink_transport, args.debuglink_path) + if args.debug: + debuglink_transport = get_transport(args.debuglink_transport, args.debuglink_path) + else: + debuglink_transport = get_transport('fake', '') if args.algorithm == 'electrum': algo = proto.ELECTRUM @@ -94,7 +110,7 @@ def main(): else: raise Exception("Unknown algorithm") - client = BitkeyClient(transport, debuglink_transport, algo=algo) + client = BitkeyClient(transport, debuglink=None, algo=algo) cmds = Commands(client) res = args.func(cmds, args) From f16ade99e08c738af3215f93dd7cb0ab5f623b7c Mon Sep 17 00:00:00 2001 From: slush Date: Wed, 5 Dec 2012 19:45:53 +0000 Subject: [PATCH 0021/1535] Refactored client.call() to allow PIN/OTP in any order --- bitkeylib/client.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index e7e990c42..5b17a1d6c 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -65,27 +65,27 @@ class BitkeyClient(object): if self.debuglink: otp = self.debuglink.read_otp() if self.debug_otp: - self.transport.write(otp) + msg2 = otp else: - self.transport.write(proto.OtpAck(otp='__42__')) + msg2 = proto.OtpAck(otp='__42__') else: otp = self.input_func("OTP required: ", resp.message) - self.transport.write(proto.OtpAck(otp=otp)) + msg2 = proto.OtpAck(otp=otp) - resp = self.transport.read() + return self.call(msg2, button, tries) if isinstance(resp, proto.PinRequest): if self.debuglink: pin = self.debuglink.read_pin() if self.debug_pin: - self.transport.write(pin) + msg2 = pin else: - self.transport.write(proto.PinAck(pin='__42__')) + msg2 = proto.PinAck(pin='__42__') else: pin = self.input_func("PIN required: ", resp.message) - self.transport.write(proto.PinAck(pin=pin)) + msg2 = proto.PinAck(pin=pin) - resp = self.transport.read() + return self.call(msg2, button, tries) if isinstance(resp, proto.Failure): self.message_func(resp.message) @@ -103,7 +103,8 @@ class BitkeyClient(object): raise Exception("PIN is invalid, too many retries") self.message_func("PIN is invalid, let's try again...") - return self.call(msg, button, tries-1) + return self.call(msg, button, tries-1) + if isinstance(resp, proto.Failure): raise Exception(resp.code, resp.message) From 89f0ca3f7e808b39a76ca7e693c07b0d1603ece7 Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 9 Dec 2012 13:53:09 +0000 Subject: [PATCH 0022/1535] Removed debug prints --- bitkeylib/transport.py | 9 ++++++++- bitkeylib/transport_socket.py | 15 ++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/bitkeylib/transport.py b/bitkeylib/transport.py index 9a6f8fd0e..57b27e781 100644 --- a/bitkeylib/transport.py +++ b/bitkeylib/transport.py @@ -31,7 +31,14 @@ class Transport(object): self._write("##%s%s" % (header, ser)) def read(self): - (msg_type, data) = self._read() + if not self.ready_to_read(): + return None + + data = self._read() + if data == None: + return None + + (msg_type, data) = data inst = mapping.get_class(msg_type)() inst.ParseFromString(data) return inst diff --git a/bitkeylib/transport_socket.py b/bitkeylib/transport_socket.py index 4031fd6fc..704cc53df 100644 --- a/bitkeylib/transport_socket.py +++ b/bitkeylib/transport_socket.py @@ -25,7 +25,6 @@ class SocketTransportClient(Transport): super(SocketTransportClient, self).__init__(device, *args, **kwargs) def _open(self): - print self.device self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect(self.device) self.filelike = self.socket.makefile() @@ -44,7 +43,6 @@ class SocketTransportClient(Transport): def _read(self): try: - print 'filelike', self.filelike (msg_type, datalen) = self._read_headers(self.filelike) return (msg_type, self.filelike.read(datalen)) except socket.error: @@ -66,14 +64,12 @@ class SocketTransport(Transport): super(SocketTransport, self).__init__(device, *args, **kwargs) def _open(self): - print self.device - self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #self.socket.setblocking(0) self.socket.bind(self.device) - self.socket.listen(1) + self.socket.listen(5) def _disconnect_client(self): if self.client != None: @@ -94,8 +90,8 @@ class SocketTransport(Transport): # Waiting for connection rlist, _, _ = select([self.socket], [], [], 0) if len(rlist) > 0: - (self.client, _) = self.socket.accept() - print "Connected", self.client + (self.client, ipaddr) = self.socket.accept() + print "Connected", ipaddr[0] self.filelike = self.client.makefile()#FakeRead(self.client)#self.client.makefile() return self.ready_to_read() return False @@ -109,11 +105,8 @@ class SocketTransport(Transport): def _read(self): try: - print 'filelike', self.filelike (msg_type, datalen) = self._read_headers(self.filelike) - x = (msg_type, self.filelike.read(datalen)) - print x - return x + return (msg_type, self.filelike.read(datalen)) except socket.error: print "Failed to read from device" raise From 694452c861ee7d7f6dead653d9cf156730d8f445 Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 13 Dec 2012 18:47:37 +0000 Subject: [PATCH 0023/1535] Added ButtonRequest, ButtonAck, ButtonCancel messages --- bitkeylib/bitkey_pb2.py | 1354 +++++++++++++++++++++++++++++++++++++++ bitkeylib/mapping.py | 3 + protobuf/bitkey.proto | 15 + 3 files changed, 1372 insertions(+) create mode 100644 bitkeylib/bitkey_pb2.py diff --git a/bitkeylib/bitkey_pb2.py b/bitkeylib/bitkey_pb2.py new file mode 100644 index 000000000..f634fda53 --- /dev/null +++ b/bitkeylib/bitkey_pb2.py @@ -0,0 +1,1354 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! + +from google.protobuf import descriptor +from google.protobuf import message +from google.protobuf import reflection +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + + + +DESCRIPTOR = descriptor.FileDescriptor( + name='bitkey.proto', + package='', + serialized_pb='\n\x0c\x62itkey.proto\" \n\nInitialize\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\"\xc4\x01\n\x08\x46\x65\x61tures\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x0b\n\x03otp\x18\x05 \x01(\x08\x12\x0b\n\x03pin\x18\x06 \x01(\x08\x12\x0b\n\x03spv\x18\x07 \x01(\x08\x12\x11\n\tmaxfee_kb\x18\x08 \x01(\x04\x12\x18\n\x04\x61lgo\x18\t \x03(\x0e\x32\n.Algorithm\x12\x12\n\ndebug_link\x18\n \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"K\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03otp\x18\x02 \x01(\x08\x12\x0b\n\x03pin\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Z\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x14\n\x03otp\x18\x02 \x01(\x0b\x32\x07.OtpAck\x12\x14\n\x03pin\x18\x03 \x01(\x0b\x32\x07.PinAck\x12\x0c\n\x04seed\x18\x04 \x01(\t\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"\x1d\n\nOtpRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06OtpAck\x12\x0b\n\x03otp\x18\x01 \x02(\t\"\x0b\n\tOtpCancel\"\x1d\n\nPinRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06PinAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x0b\n\tPinCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"5\n\x12GetMasterPublicKey\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"M\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\t\x12\x11\n\x03otp\x18\x02 \x01(\x08:\x04true\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x11\n\x03spv\x18\x04 \x01(\x08:\x04true\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"f\n\x06SignTx\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x15\n\routputs_count\x18\x03 \x03(\r\x12\x14\n\x0cinputs_count\x18\x05 \x03(\r\x12\x0e\n\x06random\x18\x06 \x01(\x0c\"N\n\x0cInputRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x14\n\x0csigned_index\x18\x02 \x01(\r\x12\x11\n\tsignature\x18\x03 \x01(\x0c\"&\n\rOutputRequest\x12\x15\n\rrequest_index\x18\x01 \x02(\r\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*$\n\tAlgorithm\x12\t\n\x05\x42IP32\x10\x00\x12\x0c\n\x08\x45LECTRUM\x10\x01*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01') + +_ALGORITHM = descriptor.EnumDescriptor( + name='Algorithm', + full_name='Algorithm', + filename=None, + file=DESCRIPTOR, + values=[ + descriptor.EnumValueDescriptor( + name='BIP32', index=0, number=0, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='ELECTRUM', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1529, + serialized_end=1565, +) + + +_SCRIPTTYPE = descriptor.EnumDescriptor( + name='ScriptType', + full_name='ScriptType', + filename=None, + file=DESCRIPTOR, + values=[ + descriptor.EnumValueDescriptor( + name='PAYTOADDRESS', index=0, number=0, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='PAYTOSCRIPTHASH', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1567, + serialized_end=1618, +) + + +BIP32 = 0 +ELECTRUM = 1 +PAYTOADDRESS = 0 +PAYTOSCRIPTHASH = 1 + + + +_INITIALIZE = descriptor.Descriptor( + name='Initialize', + full_name='Initialize', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='session_id', full_name='Initialize.session_id', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=16, + serialized_end=48, +) + + +_FEATURES = descriptor.Descriptor( + name='Features', + full_name='Features', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='session_id', full_name='Features.session_id', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='vendor', full_name='Features.vendor', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='major_version', full_name='Features.major_version', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='minor_version', full_name='Features.minor_version', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='otp', full_name='Features.otp', index=4, + number=5, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='pin', full_name='Features.pin', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='spv', full_name='Features.spv', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='maxfee_kb', full_name='Features.maxfee_kb', index=7, + number=8, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='algo', full_name='Features.algo', index=8, + number=9, type=14, cpp_type=8, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='debug_link', full_name='Features.debug_link', index=9, + number=10, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=51, + serialized_end=247, +) + + +_PING = descriptor.Descriptor( + name='Ping', + full_name='Ping', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='message', full_name='Ping.message', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=249, + serialized_end=272, +) + + +_DEBUGLINKDECISION = descriptor.Descriptor( + name='DebugLinkDecision', + full_name='DebugLinkDecision', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='yes_no', full_name='DebugLinkDecision.yes_no', index=0, + number=1, type=8, cpp_type=7, label=2, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=274, + serialized_end=309, +) + + +_DEBUGLINKGETSTATE = descriptor.Descriptor( + name='DebugLinkGetState', + full_name='DebugLinkGetState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='layout', full_name='DebugLinkGetState.layout', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='otp', full_name='DebugLinkGetState.otp', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='pin', full_name='DebugLinkGetState.pin', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='seed', full_name='DebugLinkGetState.seed', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=311, + serialized_end=386, +) + + +_DEBUGLINKSTATE = descriptor.Descriptor( + name='DebugLinkState', + full_name='DebugLinkState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='layout', full_name='DebugLinkState.layout', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='otp', full_name='DebugLinkState.otp', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='pin', full_name='DebugLinkState.pin', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='seed', full_name='DebugLinkState.seed', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=388, + serialized_end=478, +) + + +_SUCCESS = descriptor.Descriptor( + name='Success', + full_name='Success', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='message', full_name='Success.message', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=480, + serialized_end=506, +) + + +_FAILURE = descriptor.Descriptor( + name='Failure', + full_name='Failure', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='code', full_name='Failure.code', index=0, + number=1, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='message', full_name='Failure.message', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=508, + serialized_end=548, +) + + +_GETUUID = descriptor.Descriptor( + name='GetUUID', + full_name='GetUUID', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=550, + serialized_end=559, +) + + +_UUID = descriptor.Descriptor( + name='UUID', + full_name='UUID', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='UUID', full_name='UUID.UUID', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=561, + serialized_end=581, +) + + +_BUTTONREQUEST = descriptor.Descriptor( + name='ButtonRequest', + full_name='ButtonRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=583, + serialized_end=598, +) + + +_BUTTONACK = descriptor.Descriptor( + name='ButtonAck', + full_name='ButtonAck', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=600, + serialized_end=611, +) + + +_BUTTONCANCEL = descriptor.Descriptor( + name='ButtonCancel', + full_name='ButtonCancel', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=613, + serialized_end=627, +) + + +_OTPREQUEST = descriptor.Descriptor( + name='OtpRequest', + full_name='OtpRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='message', full_name='OtpRequest.message', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=629, + serialized_end=658, +) + + +_OTPACK = descriptor.Descriptor( + name='OtpAck', + full_name='OtpAck', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='otp', full_name='OtpAck.otp', index=0, + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=660, + serialized_end=681, +) + + +_OTPCANCEL = descriptor.Descriptor( + name='OtpCancel', + full_name='OtpCancel', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=683, + serialized_end=694, +) + + +_PINREQUEST = descriptor.Descriptor( + name='PinRequest', + full_name='PinRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='message', full_name='PinRequest.message', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=696, + serialized_end=725, +) + + +_PINACK = descriptor.Descriptor( + name='PinAck', + full_name='PinAck', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='pin', full_name='PinAck.pin', index=0, + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=727, + serialized_end=748, +) + + +_PINCANCEL = descriptor.Descriptor( + name='PinCancel', + full_name='PinCancel', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=750, + serialized_end=761, +) + + +_GETENTROPY = descriptor.Descriptor( + name='GetEntropy', + full_name='GetEntropy', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='size', full_name='GetEntropy.size', index=0, + number=1, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=763, + serialized_end=789, +) + + +_ENTROPY = descriptor.Descriptor( + name='Entropy', + full_name='Entropy', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='entropy', full_name='Entropy.entropy', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=791, + serialized_end=817, +) + + +_SETMAXFEEKB = descriptor.Descriptor( + name='SetMaxFeeKb', + full_name='SetMaxFeeKb', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='maxfee_kb', full_name='SetMaxFeeKb.maxfee_kb', index=0, + number=1, type=4, cpp_type=4, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=819, + serialized_end=851, +) + + +_GETMASTERPUBLICKEY = descriptor.Descriptor( + name='GetMasterPublicKey', + full_name='GetMasterPublicKey', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='algo', full_name='GetMasterPublicKey.algo', index=0, + number=1, type=14, cpp_type=8, label=2, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=853, + serialized_end=906, +) + + +_MASTERPUBLICKEY = descriptor.Descriptor( + name='MasterPublicKey', + full_name='MasterPublicKey', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='key', full_name='MasterPublicKey.key', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=908, + serialized_end=938, +) + + +_LOADDEVICE = descriptor.Descriptor( + name='LoadDevice', + full_name='LoadDevice', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='seed', full_name='LoadDevice.seed', index=0, + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='otp', full_name='LoadDevice.otp', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='pin', full_name='LoadDevice.pin', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='spv', full_name='LoadDevice.spv', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=True, default_value=True, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=940, + serialized_end=1017, +) + + +_RESETDEVICE = descriptor.Descriptor( + name='ResetDevice', + full_name='ResetDevice', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='random', full_name='ResetDevice.random', index=0, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1019, + serialized_end=1048, +) + + +_SIGNTX = descriptor.Descriptor( + name='SignTx', + full_name='SignTx', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='algo', full_name='SignTx.algo', index=0, + number=1, type=14, cpp_type=8, label=2, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='outputs_count', full_name='SignTx.outputs_count', index=1, + number=3, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='inputs_count', full_name='SignTx.inputs_count', index=2, + number=5, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='random', full_name='SignTx.random', index=3, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1050, + serialized_end=1152, +) + + +_INPUTREQUEST = descriptor.Descriptor( + name='InputRequest', + full_name='InputRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='request_index', full_name='InputRequest.request_index', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='signed_index', full_name='InputRequest.signed_index', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='signature', full_name='InputRequest.signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1154, + serialized_end=1232, +) + + +_OUTPUTREQUEST = descriptor.Descriptor( + name='OutputRequest', + full_name='OutputRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='request_index', full_name='OutputRequest.request_index', index=0, + number=1, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1234, + serialized_end=1272, +) + + +_TXINPUT = descriptor.Descriptor( + name='TxInput', + full_name='TxInput', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='index', full_name='TxInput.index', index=0, + number=1, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='address_n', full_name='TxInput.address_n', index=1, + number=2, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='amount', full_name='TxInput.amount', index=2, + number=3, type=4, cpp_type=4, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='prev_hash', full_name='TxInput.prev_hash', index=3, + number=4, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='prev_index', full_name='TxInput.prev_index', index=4, + number=5, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='script_sig', full_name='TxInput.script_sig', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1274, + serialized_end=1392, +) + + +_TXOUTPUT = descriptor.Descriptor( + name='TxOutput', + full_name='TxOutput', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='index', full_name='TxOutput.index', index=0, + number=1, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='address', full_name='TxOutput.address', index=1, + number=2, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='address_n', full_name='TxOutput.address_n', index=2, + number=3, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='amount', full_name='TxOutput.amount', index=3, + number=4, type=4, cpp_type=4, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='script_type', full_name='TxOutput.script_type', index=4, + number=5, type=14, cpp_type=8, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='script_args', full_name='TxOutput.script_args', index=5, + number=6, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1395, + serialized_end=1527, +) + +_FEATURES.fields_by_name['algo'].enum_type = _ALGORITHM +_DEBUGLINKSTATE.fields_by_name['otp'].message_type = _OTPACK +_DEBUGLINKSTATE.fields_by_name['pin'].message_type = _PINACK +_GETMASTERPUBLICKEY.fields_by_name['algo'].enum_type = _ALGORITHM +_SIGNTX.fields_by_name['algo'].enum_type = _ALGORITHM +_TXOUTPUT.fields_by_name['script_type'].enum_type = _SCRIPTTYPE +DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE +DESCRIPTOR.message_types_by_name['Features'] = _FEATURES +DESCRIPTOR.message_types_by_name['Ping'] = _PING +DESCRIPTOR.message_types_by_name['DebugLinkDecision'] = _DEBUGLINKDECISION +DESCRIPTOR.message_types_by_name['DebugLinkGetState'] = _DEBUGLINKGETSTATE +DESCRIPTOR.message_types_by_name['DebugLinkState'] = _DEBUGLINKSTATE +DESCRIPTOR.message_types_by_name['Success'] = _SUCCESS +DESCRIPTOR.message_types_by_name['Failure'] = _FAILURE +DESCRIPTOR.message_types_by_name['GetUUID'] = _GETUUID +DESCRIPTOR.message_types_by_name['UUID'] = _UUID +DESCRIPTOR.message_types_by_name['ButtonRequest'] = _BUTTONREQUEST +DESCRIPTOR.message_types_by_name['ButtonAck'] = _BUTTONACK +DESCRIPTOR.message_types_by_name['ButtonCancel'] = _BUTTONCANCEL +DESCRIPTOR.message_types_by_name['OtpRequest'] = _OTPREQUEST +DESCRIPTOR.message_types_by_name['OtpAck'] = _OTPACK +DESCRIPTOR.message_types_by_name['OtpCancel'] = _OTPCANCEL +DESCRIPTOR.message_types_by_name['PinRequest'] = _PINREQUEST +DESCRIPTOR.message_types_by_name['PinAck'] = _PINACK +DESCRIPTOR.message_types_by_name['PinCancel'] = _PINCANCEL +DESCRIPTOR.message_types_by_name['GetEntropy'] = _GETENTROPY +DESCRIPTOR.message_types_by_name['Entropy'] = _ENTROPY +DESCRIPTOR.message_types_by_name['SetMaxFeeKb'] = _SETMAXFEEKB +DESCRIPTOR.message_types_by_name['GetMasterPublicKey'] = _GETMASTERPUBLICKEY +DESCRIPTOR.message_types_by_name['MasterPublicKey'] = _MASTERPUBLICKEY +DESCRIPTOR.message_types_by_name['LoadDevice'] = _LOADDEVICE +DESCRIPTOR.message_types_by_name['ResetDevice'] = _RESETDEVICE +DESCRIPTOR.message_types_by_name['SignTx'] = _SIGNTX +DESCRIPTOR.message_types_by_name['InputRequest'] = _INPUTREQUEST +DESCRIPTOR.message_types_by_name['OutputRequest'] = _OUTPUTREQUEST +DESCRIPTOR.message_types_by_name['TxInput'] = _TXINPUT +DESCRIPTOR.message_types_by_name['TxOutput'] = _TXOUTPUT + +class Initialize(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _INITIALIZE + + # @@protoc_insertion_point(class_scope:Initialize) + +class Features(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _FEATURES + + # @@protoc_insertion_point(class_scope:Features) + +class Ping(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _PING + + # @@protoc_insertion_point(class_scope:Ping) + +class DebugLinkDecision(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DEBUGLINKDECISION + + # @@protoc_insertion_point(class_scope:DebugLinkDecision) + +class DebugLinkGetState(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DEBUGLINKGETSTATE + + # @@protoc_insertion_point(class_scope:DebugLinkGetState) + +class DebugLinkState(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DEBUGLINKSTATE + + # @@protoc_insertion_point(class_scope:DebugLinkState) + +class Success(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SUCCESS + + # @@protoc_insertion_point(class_scope:Success) + +class Failure(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _FAILURE + + # @@protoc_insertion_point(class_scope:Failure) + +class GetUUID(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _GETUUID + + # @@protoc_insertion_point(class_scope:GetUUID) + +class UUID(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _UUID + + # @@protoc_insertion_point(class_scope:UUID) + +class ButtonRequest(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _BUTTONREQUEST + + # @@protoc_insertion_point(class_scope:ButtonRequest) + +class ButtonAck(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _BUTTONACK + + # @@protoc_insertion_point(class_scope:ButtonAck) + +class ButtonCancel(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _BUTTONCANCEL + + # @@protoc_insertion_point(class_scope:ButtonCancel) + +class OtpRequest(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _OTPREQUEST + + # @@protoc_insertion_point(class_scope:OtpRequest) + +class OtpAck(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _OTPACK + + # @@protoc_insertion_point(class_scope:OtpAck) + +class OtpCancel(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _OTPCANCEL + + # @@protoc_insertion_point(class_scope:OtpCancel) + +class PinRequest(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _PINREQUEST + + # @@protoc_insertion_point(class_scope:PinRequest) + +class PinAck(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _PINACK + + # @@protoc_insertion_point(class_scope:PinAck) + +class PinCancel(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _PINCANCEL + + # @@protoc_insertion_point(class_scope:PinCancel) + +class GetEntropy(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _GETENTROPY + + # @@protoc_insertion_point(class_scope:GetEntropy) + +class Entropy(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _ENTROPY + + # @@protoc_insertion_point(class_scope:Entropy) + +class SetMaxFeeKb(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SETMAXFEEKB + + # @@protoc_insertion_point(class_scope:SetMaxFeeKb) + +class GetMasterPublicKey(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _GETMASTERPUBLICKEY + + # @@protoc_insertion_point(class_scope:GetMasterPublicKey) + +class MasterPublicKey(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _MASTERPUBLICKEY + + # @@protoc_insertion_point(class_scope:MasterPublicKey) + +class LoadDevice(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _LOADDEVICE + + # @@protoc_insertion_point(class_scope:LoadDevice) + +class ResetDevice(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _RESETDEVICE + + # @@protoc_insertion_point(class_scope:ResetDevice) + +class SignTx(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SIGNTX + + # @@protoc_insertion_point(class_scope:SignTx) + +class InputRequest(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _INPUTREQUEST + + # @@protoc_insertion_point(class_scope:InputRequest) + +class OutputRequest(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _OUTPUTREQUEST + + # @@protoc_insertion_point(class_scope:OutputRequest) + +class TxInput(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _TXINPUT + + # @@protoc_insertion_point(class_scope:TxInput) + +class TxOutput(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _TXOUTPUT + + # @@protoc_insertion_point(class_scope:TxOutput) + +# @@protoc_insertion_point(module_scope) diff --git a/bitkeylib/mapping.py b/bitkeylib/mapping.py index 87f0cae1f..a671689c0 100644 --- a/bitkeylib/mapping.py +++ b/bitkeylib/mapping.py @@ -27,6 +27,9 @@ map_type_to_class = { 23: proto.TxInput, 24: proto.TxOutput, 25: proto.SetMaxFeeKb, + 26: proto.ButtonRequest, + 27: proto.ButtonAck, + 28: proto.ButtonCancel, 100: proto.DebugLinkDecision, 101: proto.DebugLinkGetState, 102: proto.DebugLinkState, diff --git a/protobuf/bitkey.proto b/protobuf/bitkey.proto index 9935a9150..302b0256f 100644 --- a/protobuf/bitkey.proto +++ b/protobuf/bitkey.proto @@ -95,6 +95,21 @@ message UUID { required bytes UUID = 1; } +// Message can be sent by the *device* as a resopnse to any request. +// Device is waiting for HW button press. No action is required from computer +// Computer should respond with ButtonAck message or ButtonCancel to cancel +// the original request. +message ButtonRequest { +} + +// Computer agrees to wait for HW button press. +message ButtonAck { +} + +// Computer want to cancel current action (don't wait to HW button press) +message ButtonCancel { +} + // Message can be sent by the *device* as a response to any request. // Message asks computer to send back OtpAck with the password printed on the device's display. // From 140966530283b41b1bddecb3b5d6f9235e2c9624 Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 13 Dec 2012 18:48:24 +0000 Subject: [PATCH 0024/1535] transport.read_blocking, fixes socket transport --- bitkeylib/transport.py | 14 ++++++++++++-- bitkeylib/transport_socket.py | 22 +++++++++++++--------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/bitkeylib/transport.py b/bitkeylib/transport.py index 57b27e781..aaf13eeba 100644 --- a/bitkeylib/transport.py +++ b/bitkeylib/transport.py @@ -1,5 +1,4 @@ import struct -import bitkey_pb2 as proto import mapping class Transport(object): @@ -33,11 +32,22 @@ class Transport(object): def read(self): if not self.ready_to_read(): return None - + data = self._read() if data == None: return None + return self._parse_message(data) + + def read_blocking(self): + while True: + data = self._read() + if data != None: + break + + return self._parse_message(data) + + def _parse_message(self, data): (msg_type, data) = data inst = mapping.get_class(msg_type)() inst.ParseFromString(data) diff --git a/bitkeylib/transport_socket.py b/bitkeylib/transport_socket.py index 704cc53df..dd47793b6 100644 --- a/bitkeylib/transport_socket.py +++ b/bitkeylib/transport_socket.py @@ -47,7 +47,7 @@ class SocketTransportClient(Transport): return (msg_type, self.filelike.read(datalen)) except socket.error: print "Failed to read from device" - raise + return None class SocketTransport(Transport): def __init__(self, device, *args, **kwargs): @@ -72,7 +72,9 @@ class SocketTransport(Transport): self.socket.listen(5) def _disconnect_client(self): + print "Disconnecting client" if self.client != None: + self.client.close() self.client = None self.filelike = None @@ -82,7 +84,7 @@ class SocketTransport(Transport): self.socket = None def ready_to_read(self): - if self.client: + if self.filelike: # Connected rlist, _, _ = select([self.client], [], [], 0) return len(rlist) > 0 @@ -96,20 +98,22 @@ class SocketTransport(Transport): return self.ready_to_read() return False - def _write(self, msg): if self.filelike: # None on disconnected client - self.filelike.write(msg) - self.filelike.flush() - + + try: + self.filelike.write(msg) + self.filelike.flush() + except socket.error: + print "Socket error" + self._disconnect_client() + def _read(self): try: (msg_type, datalen) = self._read_headers(self.filelike) return (msg_type, self.filelike.read(datalen)) - except socket.error: - print "Failed to read from device" - raise except Exception: + print "Failed to read from device" self._disconnect_client() return None \ No newline at end of file From e203d2ef53f9980655add5b775abcbb71ccd6796 Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 13 Dec 2012 19:05:04 +0000 Subject: [PATCH 0025/1535] Implemented Button* messages --- bitkeylib/client.py | 40 ++++++++++++++++++++-------------------- bitkeylib/debuglink.py | 27 ++++++++++++++------------- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index 5b17a1d6c..2fd7dbcb8 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -45,21 +45,26 @@ class BitkeyClient(object): def _pprint(self, msg): return "<%s>:\n%s" % (msg.__class__.__name__, msg) - def setup_debuglink(self, pin_correct=False, otp_correct=False): + def setup_debuglink(self, button=None, pin_correct=False, otp_correct=False): + self.debug_button = button self.debug_pin = pin_correct self.debug_otp = otp_correct - def call(self, msg, button=None, tries=1): + def call(self, msg): if self.debug: print '----------------------' print "Sending", self._pprint(msg) self.transport.write(msg) - - if self.debuglink and button != None: - self.debuglink.press_button(button) + resp = self.transport.read_blocking() - resp = self.transport.read() + if isinstance(resp, proto.ButtonRequest): + if self.debuglink and self.debug_button: + print "Pressing button", self.debug_button + self.debuglink.press_button(self.debug_button) + + self.transport.write(proto.ButtonAck()) + resp = self.transport.read_blocking() if isinstance(resp, proto.OtpRequest): if self.debuglink: @@ -72,7 +77,7 @@ class BitkeyClient(object): otp = self.input_func("OTP required: ", resp.message) msg2 = proto.OtpAck(otp=otp) - return self.call(msg2, button, tries) + return self.call(msg2) if isinstance(resp, proto.PinRequest): if self.debuglink: @@ -85,27 +90,20 @@ class BitkeyClient(object): pin = self.input_func("PIN required: ", resp.message) msg2 = proto.PinAck(pin=pin) - return self.call(msg2, button, tries) + return self.call(msg2) if isinstance(resp, proto.Failure): self.message_func(resp.message) if resp.code == 3: - if tries <= 1: - raise Exception("OTP is invalid, too many retries") - self.message_func("OTP is invalid, let's try again...") + raise Exception("OTP is invalid") elif resp.code == 4: raise Exception("Action cancelled by user") elif resp.code == 6: - if tries <= 1: - raise Exception("PIN is invalid, too many retries") - self.message_func("PIN is invalid, let's try again...") + raise Exception("PIN is invalid") - return self.call(msg, button, tries-1) - - if isinstance(resp, proto.Failure): raise Exception(resp.code, resp.message) if self.debug: @@ -122,6 +120,7 @@ class BitkeyClient(object): outputs: list of TxOutput ''' + tx = proto.SignTx() tx.algo = self.algo # Choose BIP32 or ELECTRUM way for deterministic keys tx.random = os.urandom(256) # Provide additional entropy to the device @@ -159,6 +158,7 @@ class BitkeyClient(object): return s_inputs ''' - def load_device(self, seed, otp, pin, spv, button=None): - self.call(proto.LoadDevice(seed=seed, otp=otp, pin=pin, spv=spv), button=button) - self.init_device() \ No newline at end of file + def load_device(self, seed, otp, pin, spv): + resp = self.call(proto.LoadDevice(seed=seed, otp=otp, pin=pin, spv=spv)) + self.init_device() + return isinstance(resp, proto.Success) \ No newline at end of file diff --git a/bitkeylib/debuglink.py b/bitkeylib/debuglink.py index 98e81525d..2e072f6fb 100644 --- a/bitkeylib/debuglink.py +++ b/bitkeylib/debuglink.py @@ -1,10 +1,10 @@ import bitkey_pb2 as proto - + def otp_info(otp): - print "Device asks for OTP %s" % otp + print "Device asks for OTP %s" % otp.otp def pin_info(pin): - print "Device asks for PIN %s" % pin + print "Device asks for PIN %s" % pin.pin def button_press(yes_no): print "User pressed", '"y"' if yes_no else '"n"' @@ -12,31 +12,32 @@ def button_press(yes_no): class DebugLink(object): def __init__(self, transport, otp_func=otp_info, pin_func=pin_info, button_func=button_press): self.transport = transport + self.otp_func = otp_func self.pin_func = pin_func self.button_func = button_func + def get_state(self, otp=False, pin=False): + self.transport.write(proto.DebugLinkGetState(otp=otp, pin=pin)) + return self.transport.read_blocking() + def read_otp(self): - obj = self.transport.read() - if not isinstance(obj, proto.OtpAck): - raise Exception("Expected OtpAck object, got %s" % obj) + obj = self.get_state(otp=True).otp + print "Read OTP:", obj.otp self.otp_func(obj) return obj def read_pin(self): - obj = self.transport.read() - if not isinstance(obj, proto.PinAck): - raise Exception("Expected PinAck object, got %s" % obj) + obj = self.get_state(pin=True).pin + print "Read PIN:", obj.pin self.pin_func(obj) return obj def press_button(self, yes_no): + print "Pressing", yes_no self.button_func(yes_no) self.transport.write(proto.DebugLinkDecision(yes_no=yes_no)) - #obj = self.transport.read() - #if not isinstance(obj, proto.Success): - # raise Exception("Expected Success object, got %s" % obj) - + def press_yes(self): self.press_button(True) From b96b65e1ce310a526d0fab12809173037631fa4c Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 13 Dec 2012 19:05:21 +0000 Subject: [PATCH 0026/1535] Updated call parameters --- tests/test_basic.py | 6 +++--- tests/test_signtx.py | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/test_basic.py b/tests/test_basic.py index 35c9e7583..ecb751584 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -19,12 +19,12 @@ class TestBasic(unittest.TestCase): def setUp(self): self.debug_transport = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS) self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) - self.bitkey = BitkeyClient(self.transport, DebugLink(self.debug_transport), algo=proto.ELECTRUM) + self.bitkey = BitkeyClient(self.transport, DebugLink(self.debug_transport), algo=proto.ELECTRUM, debug=True) - self.bitkey.setup_debuglink(pin_correct=True, otp_correct=True) + self.bitkey.setup_debuglink(button=True, pin_correct=True, otp_correct=True) self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - otp=True, pin='1234', spv=True, button=True) + otp=True, pin='1234', spv=True) print "Setup finished" print "--------------" diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 5aa163fc3..08a9b5637 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -23,6 +23,8 @@ class TestSignTx(unittest.TestCase): def tearDown(self): self.debug_transport.close() self.transport.close() - + +''' def test_signtx(self): - print self.bitkey.sign_tx([], []) \ No newline at end of file + print self.bitkey.sign_tx([], []) +''' \ No newline at end of file From 6bdaaaf514ec09df20049b3d4f3ef4cdeaca0c27 Mon Sep 17 00:00:00 2001 From: slush Date: Sat, 5 Jan 2013 14:40:53 +0000 Subject: [PATCH 0027/1535] Added GetAddress/Address messages --- bitkeylib/mapping.py | 2 ++ protobuf/bitkey.proto | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/bitkeylib/mapping.py b/bitkeylib/mapping.py index a671689c0..6a8419eb3 100644 --- a/bitkeylib/mapping.py +++ b/bitkeylib/mapping.py @@ -30,6 +30,8 @@ map_type_to_class = { 26: proto.ButtonRequest, 27: proto.ButtonAck, 28: proto.ButtonCancel, + 29: proto.GetAddress, + 30: proto.Address, 100: proto.DebugLinkDecision, 101: proto.DebugLinkGetState, 102: proto.DebugLinkState, diff --git a/protobuf/bitkey.proto b/protobuf/bitkey.proto index 302b0256f..1a29cf38d 100644 --- a/protobuf/bitkey.proto +++ b/protobuf/bitkey.proto @@ -174,7 +174,7 @@ message SetMaxFeeKb { // // Response: MasterPublicKey, Failure message GetMasterPublicKey { - required Algorithm algo = 1 [default=BIP32]; // Used algorithm for generating master public key + required Algorithm algo = 1 [default=BIP32]; // Used algorithm for generating the master public key } // Contains master public key derived from device's seed. @@ -182,6 +182,15 @@ message MasterPublicKey { required bytes key = 1; // master public key of requested algorithm in binary format } +message GetAddress { + required Algorithm algo = 1 [default=BIP32]; // Used algorithm for generating the address + repeated uint32 address_n = 2; // Parameter for address generation algorithm to derive the address from the master public key +} + +message Address { + required string address = 1; // Bitcoin address in base58 encoding corresponding to GetAddress(algo, n) call +} + // Load seed and related internal settings from computer to the device. Existing seed is overwritten. // // Response: Success, OtpRequest, PinRequest, Failure From 68d46cb2f91cd586129935ecdf4f9619cbb6210c Mon Sep 17 00:00:00 2001 From: slush Date: Sat, 5 Jan 2013 14:41:22 +0000 Subject: [PATCH 0028/1535] Updated generated protobuf --- bitkeylib/bitkey_pb2.py | 116 +++++++++++++++++++++++++++++++++------- 1 file changed, 97 insertions(+), 19 deletions(-) diff --git a/bitkeylib/bitkey_pb2.py b/bitkeylib/bitkey_pb2.py index f634fda53..cecc34983 100644 --- a/bitkeylib/bitkey_pb2.py +++ b/bitkeylib/bitkey_pb2.py @@ -11,7 +11,7 @@ from google.protobuf import descriptor_pb2 DESCRIPTOR = descriptor.FileDescriptor( name='bitkey.proto', package='', - serialized_pb='\n\x0c\x62itkey.proto\" \n\nInitialize\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\"\xc4\x01\n\x08\x46\x65\x61tures\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x0b\n\x03otp\x18\x05 \x01(\x08\x12\x0b\n\x03pin\x18\x06 \x01(\x08\x12\x0b\n\x03spv\x18\x07 \x01(\x08\x12\x11\n\tmaxfee_kb\x18\x08 \x01(\x04\x12\x18\n\x04\x61lgo\x18\t \x03(\x0e\x32\n.Algorithm\x12\x12\n\ndebug_link\x18\n \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"K\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03otp\x18\x02 \x01(\x08\x12\x0b\n\x03pin\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Z\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x14\n\x03otp\x18\x02 \x01(\x0b\x32\x07.OtpAck\x12\x14\n\x03pin\x18\x03 \x01(\x0b\x32\x07.PinAck\x12\x0c\n\x04seed\x18\x04 \x01(\t\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"\x1d\n\nOtpRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06OtpAck\x12\x0b\n\x03otp\x18\x01 \x02(\t\"\x0b\n\tOtpCancel\"\x1d\n\nPinRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06PinAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x0b\n\tPinCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"5\n\x12GetMasterPublicKey\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"M\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\t\x12\x11\n\x03otp\x18\x02 \x01(\x08:\x04true\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x11\n\x03spv\x18\x04 \x01(\x08:\x04true\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"f\n\x06SignTx\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x15\n\routputs_count\x18\x03 \x03(\r\x12\x14\n\x0cinputs_count\x18\x05 \x03(\r\x12\x0e\n\x06random\x18\x06 \x01(\x0c\"N\n\x0cInputRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x14\n\x0csigned_index\x18\x02 \x01(\r\x12\x11\n\tsignature\x18\x03 \x01(\x0c\"&\n\rOutputRequest\x12\x15\n\rrequest_index\x18\x01 \x02(\r\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*$\n\tAlgorithm\x12\t\n\x05\x42IP32\x10\x00\x12\x0c\n\x08\x45LECTRUM\x10\x01*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01') + serialized_pb='\n\x0c\x62itkey.proto\" \n\nInitialize\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\"\xc4\x01\n\x08\x46\x65\x61tures\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x0b\n\x03otp\x18\x05 \x01(\x08\x12\x0b\n\x03pin\x18\x06 \x01(\x08\x12\x0b\n\x03spv\x18\x07 \x01(\x08\x12\x11\n\tmaxfee_kb\x18\x08 \x01(\x04\x12\x18\n\x04\x61lgo\x18\t \x03(\x0e\x32\n.Algorithm\x12\x12\n\ndebug_link\x18\n \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"K\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03otp\x18\x02 \x01(\x08\x12\x0b\n\x03pin\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Z\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x14\n\x03otp\x18\x02 \x01(\x0b\x32\x07.OtpAck\x12\x14\n\x03pin\x18\x03 \x01(\x0b\x32\x07.PinAck\x12\x0c\n\x04seed\x18\x04 \x01(\t\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"\x1d\n\nOtpRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06OtpAck\x12\x0b\n\x03otp\x18\x01 \x02(\t\"\x0b\n\tOtpCancel\"\x1d\n\nPinRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06PinAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x0b\n\tPinCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"5\n\x12GetMasterPublicKey\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"@\n\nGetAddress\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x11\n\taddress_n\x18\x02 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"M\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\t\x12\x11\n\x03otp\x18\x02 \x01(\x08:\x04true\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x11\n\x03spv\x18\x04 \x01(\x08:\x04true\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"f\n\x06SignTx\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x15\n\routputs_count\x18\x03 \x03(\r\x12\x14\n\x0cinputs_count\x18\x05 \x03(\r\x12\x0e\n\x06random\x18\x06 \x01(\x0c\"N\n\x0cInputRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x14\n\x0csigned_index\x18\x02 \x01(\r\x12\x11\n\tsignature\x18\x03 \x01(\x0c\"&\n\rOutputRequest\x12\x15\n\rrequest_index\x18\x01 \x02(\r\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*$\n\tAlgorithm\x12\t\n\x05\x42IP32\x10\x00\x12\x0c\n\x08\x45LECTRUM\x10\x01*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01') _ALGORITHM = descriptor.EnumDescriptor( name='Algorithm', @@ -30,8 +30,8 @@ _ALGORITHM = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1529, - serialized_end=1565, + serialized_start=1623, + serialized_end=1659, ) @@ -52,8 +52,8 @@ _SCRIPTTYPE = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1567, - serialized_end=1618, + serialized_start=1661, + serialized_end=1712, ) @@ -806,6 +806,69 @@ _MASTERPUBLICKEY = descriptor.Descriptor( ) +_GETADDRESS = descriptor.Descriptor( + name='GetAddress', + full_name='GetAddress', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='algo', full_name='GetAddress.algo', index=0, + number=1, type=14, cpp_type=8, label=2, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='address_n', full_name='GetAddress.address_n', index=1, + number=2, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=940, + serialized_end=1004, +) + + +_ADDRESS = descriptor.Descriptor( + name='Address', + full_name='Address', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='address', full_name='Address.address', index=0, + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1006, + serialized_end=1032, +) + + _LOADDEVICE = descriptor.Descriptor( name='LoadDevice', full_name='LoadDevice', @@ -850,8 +913,8 @@ _LOADDEVICE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=940, - serialized_end=1017, + serialized_start=1034, + serialized_end=1111, ) @@ -878,8 +941,8 @@ _RESETDEVICE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1019, - serialized_end=1048, + serialized_start=1113, + serialized_end=1142, ) @@ -927,8 +990,8 @@ _SIGNTX = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1050, - serialized_end=1152, + serialized_start=1144, + serialized_end=1246, ) @@ -969,8 +1032,8 @@ _INPUTREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1154, - serialized_end=1232, + serialized_start=1248, + serialized_end=1326, ) @@ -997,8 +1060,8 @@ _OUTPUTREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1234, - serialized_end=1272, + serialized_start=1328, + serialized_end=1366, ) @@ -1060,8 +1123,8 @@ _TXINPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1274, - serialized_end=1392, + serialized_start=1368, + serialized_end=1486, ) @@ -1123,14 +1186,15 @@ _TXOUTPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1395, - serialized_end=1527, + serialized_start=1489, + serialized_end=1621, ) _FEATURES.fields_by_name['algo'].enum_type = _ALGORITHM _DEBUGLINKSTATE.fields_by_name['otp'].message_type = _OTPACK _DEBUGLINKSTATE.fields_by_name['pin'].message_type = _PINACK _GETMASTERPUBLICKEY.fields_by_name['algo'].enum_type = _ALGORITHM +_GETADDRESS.fields_by_name['algo'].enum_type = _ALGORITHM _SIGNTX.fields_by_name['algo'].enum_type = _ALGORITHM _TXOUTPUT.fields_by_name['script_type'].enum_type = _SCRIPTTYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE @@ -1157,6 +1221,8 @@ DESCRIPTOR.message_types_by_name['Entropy'] = _ENTROPY DESCRIPTOR.message_types_by_name['SetMaxFeeKb'] = _SETMAXFEEKB DESCRIPTOR.message_types_by_name['GetMasterPublicKey'] = _GETMASTERPUBLICKEY DESCRIPTOR.message_types_by_name['MasterPublicKey'] = _MASTERPUBLICKEY +DESCRIPTOR.message_types_by_name['GetAddress'] = _GETADDRESS +DESCRIPTOR.message_types_by_name['Address'] = _ADDRESS DESCRIPTOR.message_types_by_name['LoadDevice'] = _LOADDEVICE DESCRIPTOR.message_types_by_name['ResetDevice'] = _RESETDEVICE DESCRIPTOR.message_types_by_name['SignTx'] = _SIGNTX @@ -1309,6 +1375,18 @@ class MasterPublicKey(message.Message): # @@protoc_insertion_point(class_scope:MasterPublicKey) +class GetAddress(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _GETADDRESS + + # @@protoc_insertion_point(class_scope:GetAddress) + +class Address(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _ADDRESS + + # @@protoc_insertion_point(class_scope:Address) + class LoadDevice(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _LOADDEVICE From 842720052a510542978c3efd6e4680be96c123da Mon Sep 17 00:00:00 2001 From: slush Date: Sat, 5 Jan 2013 14:42:09 +0000 Subject: [PATCH 0029/1535] Better exception handling --- bitkeylib/transport.py | 13 ++++++++----- bitkeylib/transport_fake.py | 4 ++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/bitkeylib/transport.py b/bitkeylib/transport.py index aaf13eeba..ad13c3f62 100644 --- a/bitkeylib/transport.py +++ b/bitkeylib/transport.py @@ -1,25 +1,28 @@ import struct import mapping +class NotImplementedException(Exception): + pass + class Transport(object): def __init__(self, device, *args, **kwargs): self.device = device self._open() def _open(self): - raise NotImplemented + raise NotImplementedException("Not implemented") def _close(self): - raise NotImplemented + raise NotImplementedException("Not implemented") def _write(self, msg): - raise NotImplemented + raise NotImplementedException("Not implemented") def _read(self): - raise NotImplemented + raise NotImplementedException("Not implemented") def ready_to_read(self): - raise NotImplemented + raise NotImplementedException("Not implemented") def close(self): self._close() diff --git a/bitkeylib/transport_fake.py b/bitkeylib/transport_fake.py index 1954c96b4..a56f44297 100644 --- a/bitkeylib/transport_fake.py +++ b/bitkeylib/transport_fake.py @@ -2,7 +2,7 @@ # Local serial port loopback: socat PTY,link=COM8 PTY,link=COM9 -from transport import Transport +from transport import Transport, NotImplementedException class FakeTransport(Transport): def __init__(self, device, *args, **kwargs): @@ -21,4 +21,4 @@ class FakeTransport(Transport): pass def _read(self): - raise NotImplemented \ No newline at end of file + raise NotImplementedException("Not implemented") \ No newline at end of file From 9d7e55ea306b05d2347b786e5a4159872d643fef Mon Sep 17 00:00:00 2001 From: slush Date: Sat, 5 Jan 2013 14:42:49 +0000 Subject: [PATCH 0030/1535] Implemented get_address API --- bitkeylib/client.py | 7 +++++-- bitkeylib/debuglink.py | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index 2fd7dbcb8..51e6d23ab 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -36,9 +36,12 @@ class BitkeyClient(object): if self.master_public_key: return self.master_public_key - self.master_public_key = self.call(proto.GetMasterPublicKey(algo=self.algo)) + self.master_public_key = self.call(proto.GetMasterPublicKey(algo=self.algo)).key return self.master_public_key + def get_address(self, n): + return self.call(proto.GetAddress(algo=self.algo, address_n=n)).address + def get_entropy(self, size): return self.call(proto.GetEntropy(size=size)).entropy @@ -112,7 +115,7 @@ class BitkeyClient(object): return resp def get_uuid(self): - return self.call(proto.GetUUID()) + return self.call(proto.GetUUID()).UUID def sign_tx(self, inputs, outputs): ''' diff --git a/bitkeylib/debuglink.py b/bitkeylib/debuglink.py index 2e072f6fb..93e5825d4 100644 --- a/bitkeylib/debuglink.py +++ b/bitkeylib/debuglink.py @@ -1,4 +1,5 @@ import bitkey_pb2 as proto +from transport import NotImplementedException def otp_info(otp): print "Device asks for OTP %s" % otp.otp From ca78da632de170ed900c317732008556b0391395 Mon Sep 17 00:00:00 2001 From: slush Date: Sat, 5 Jan 2013 14:43:21 +0000 Subject: [PATCH 0031/1535] Fixed DebugLink handling Implemented get_address, get_master_public_key and some other basic commands --- cmd.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/cmd.py b/cmd.py index 23129256f..9f97715ef 100755 --- a/cmd.py +++ b/cmd.py @@ -5,6 +5,7 @@ import json import bitkeylib.bitkey_pb2 as proto from bitkeylib.client import BitkeyClient +from bitkeylib.debuglink import DebugLink def parse_args(commands): parser = argparse.ArgumentParser(description='Commandline tool for Bitkey devices.') @@ -67,22 +68,33 @@ class Commands(object): @classmethod def _list_commands(cls): return [ x for x in dir(cls) if not x.startswith('_') ] - - def get_master_public_key(self, args): - return 'ahoj' - + + def get_address(self, args): + return self.client.get_address(args.n) def get_entropy(self, args): return binascii.hexlify(self.client.get_entropy(args.size)) + + def get_master_public_key(self, args): + return binascii.hexlify(self.client.get_master_public_key()) + def get_uuid(self, args): + return binascii.hexlify(self.client.get_uuid()) + def load_device(self, args): seed = ' '.join(args.seed) return self.client.load_device(seed, args.otp, args.pin, args.spv) + get_address.help = 'Get bitcoin address in base58 encoding' get_entropy.help = 'Get example entropy' + get_uuid.help = 'Get device\'s unique identifier' get_master_public_key.help = 'Get master public key' load_device.help = 'Load custom configuration to the device' + get_address.arguments = ( + (('n',), {'metavar': 'N', 'type': int, 'nargs': '+'}), + ) + get_entropy.arguments = ( (('size',), {'type': int}), ) @@ -100,8 +112,9 @@ def main(): transport = get_transport(args.transport, args.path) if args.debug: debuglink_transport = get_transport(args.debuglink_transport, args.debuglink_path) + debuglink = DebugLink(debuglink_transport) else: - debuglink_transport = get_transport('fake', '') + debuglink = None if args.algorithm == 'electrum': algo = proto.ELECTRUM @@ -110,7 +123,8 @@ def main(): else: raise Exception("Unknown algorithm") - client = BitkeyClient(transport, debuglink=None, algo=algo) + client = BitkeyClient(transport, debuglink=debuglink, algo=algo) + client.setup_debuglink(button=True, otp_correct=True, pin_correct=True) cmds = Commands(client) res = args.func(cmds, args) From 4aafd2deff13f43bce1e231ac1fe574533796302 Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 14 Jan 2013 14:44:11 +0100 Subject: [PATCH 0032/1535] Stub for protect_call tests --- tests/test_protect_call.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 tests/test_protect_call.py diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py new file mode 100644 index 000000000..dc818e7f4 --- /dev/null +++ b/tests/test_protect_call.py @@ -0,0 +1,30 @@ +import unittest +import common + +from bitkeylib import proto + +class TestProtectCall(common.BitkeyTest): + def test_features(self): + features = self.bitkey.call(proto.Initialize(session_id=self.bitkey.session_id)) + + # Result is the same as reported by BitkeyClient class + self.assertEqual(features, self.bitkey.features) + + def test_ping(self): + ping = self.bitkey.call(proto.Ping(message='ahoj!')) + + # Ping results in Success(message='Ahoj!') + self.assertEqual(ping, proto.Success(message='ahoj!')) + + def test_uuid(self): + uuid1 = self.bitkey.get_uuid() + uuid2 = self.bitkey.get_uuid() + + # UUID must be longer than 10 characters + self.assertGreater(len(uuid1), 10) + + # Every resulf of UUID must be the same + self.assertEqual(uuid1, uuid2) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file From 9b4359fe018fa4612587036aab0080fc9ae5f8bf Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 14 Jan 2013 14:44:31 +0100 Subject: [PATCH 0033/1535] Refactored tests, added common.BitkeyTest --- tests/common.py | 24 ++++++++++++++++++++++++ tests/test_basic.py | 29 ++++++----------------------- tests/test_signtx.py | 33 +++++++-------------------------- 3 files changed, 37 insertions(+), 49 deletions(-) create mode 100644 tests/common.py diff --git a/tests/common.py b/tests/common.py new file mode 100644 index 000000000..cf4f16964 --- /dev/null +++ b/tests/common.py @@ -0,0 +1,24 @@ +import unittest +import config + +from bitkeylib.client import BitkeyClient +from bitkeylib.debuglink import DebugLink +from bitkeylib import proto + +class BitkeyTest(unittest.TestCase): + def setUp(self): + self.debug_transport = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS) + self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) + self.bitkey = BitkeyClient(self.transport, DebugLink(self.debug_transport), algo=proto.ELECTRUM, debug=True) + + self.bitkey.setup_debuglink(button=True, pin_correct=True, otp_correct=True) + + self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + otp=True, pin='1234', spv=True) + + print "Setup finished" + print "--------------" + + def tearDown(self): + self.debug_transport.close() + self.transport.close() \ No newline at end of file diff --git a/tests/test_basic.py b/tests/test_basic.py index ecb751584..dbfe4e019 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -1,8 +1,6 @@ import unittest -import config +import common -from bitkeylib.client import BitkeyClient -from bitkeylib.debuglink import DebugLink from bitkeylib import proto ''' @@ -14,25 +12,7 @@ from bitkeylib import proto ''' -class TestBasic(unittest.TestCase): - - def setUp(self): - self.debug_transport = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS) - self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) - self.bitkey = BitkeyClient(self.transport, DebugLink(self.debug_transport), algo=proto.ELECTRUM, debug=True) - - self.bitkey.setup_debuglink(button=True, pin_correct=True, otp_correct=True) - - self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - otp=True, pin='1234', spv=True) - - print "Setup finished" - print "--------------" - - def tearDown(self): - self.debug_transport.close() - self.transport.close() - +class TestBasic(common.BitkeyTest): def test_features(self): features = self.bitkey.call(proto.Initialize(session_id=self.bitkey.session_id)) @@ -50,7 +30,10 @@ class TestBasic(unittest.TestCase): uuid2 = self.bitkey.get_uuid() # UUID must be longer than 10 characters - self.assertGreater(len(uuid1.UUID), 10) + self.assertGreater(len(uuid1), 10) # Every resulf of UUID must be the same self.assertEqual(uuid1, uuid2) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 08a9b5637..bfa1ef84d 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -1,30 +1,11 @@ import unittest -import config +import common -from bitkeylib.client import BitkeyClient -from bitkeylib.debuglink import DebugLink -from bitkeylib import proto - -class TestSignTx(unittest.TestCase): - - def setUp(self): - self.debug_transport = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS) - self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) - self.bitkey = BitkeyClient(self.transport, DebugLink(self.debug_transport), algo=proto.ELECTRUM) - - self.bitkey.setup_debuglink(pin_correct=True, otp_correct=True) - - self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - otp=True, pin='1234', spv=True, button=True) - - print "Setup finished" - print "--------------" - - def tearDown(self): - self.debug_transport.close() - self.transport.close() - -''' +class TestSignTx(common.BitkeyTest): + ''' def test_signtx(self): print self.bitkey.sign_tx([], []) -''' \ No newline at end of file + ''' + +if __name__ == '__main__': + unittest.main() \ No newline at end of file From 1c78397c1b3cc20e7ae1cca569b4652e0d6591a2 Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 14 Jan 2013 17:04:58 +0100 Subject: [PATCH 0034/1535] ButtonAck sent over recursion call, like other *Ack --- bitkeylib/client.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index 51e6d23ab..c4cd5e2d0 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -10,6 +10,15 @@ def show_input(input_text, message=None): print "QUESTION FROM DEVICE:", message return raw_input(input_text) +class CallException(Exception): + pass + +class PinException(CallException): + pass + +class OtpException(CallException): + pass + class BitkeyClient(object): def __init__(self, transport, debuglink=None, @@ -65,9 +74,8 @@ class BitkeyClient(object): if self.debuglink and self.debug_button: print "Pressing button", self.debug_button self.debuglink.press_button(self.debug_button) - - self.transport.write(proto.ButtonAck()) - resp = self.transport.read_blocking() + + return self.call(proto.ButtonAck()) if isinstance(resp, proto.OtpRequest): if self.debuglink: @@ -99,15 +107,15 @@ class BitkeyClient(object): self.message_func(resp.message) if resp.code == 3: - raise Exception("OTP is invalid") + raise OtpException("OTP is invalid") elif resp.code == 4: - raise Exception("Action cancelled by user") + raise CallException("Action cancelled by user") elif resp.code == 6: - raise Exception("PIN is invalid") + raise PinException("PIN is invalid") - raise Exception(resp.code, resp.message) + raise CallException(resp.code, resp.message) if self.debug: print "Received", self._pprint(resp) From 1e6588e28f647a12b530d1e9801e16f59ecf69b0 Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 14 Jan 2013 17:05:38 +0100 Subject: [PATCH 0035/1535] Test for protect_call --- tests/test_protect_call.py | 61 ++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index dc818e7f4..abb5d70b8 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -2,29 +2,58 @@ import unittest import common from bitkeylib import proto +from bitkeylib.client import CallException, PinException, OtpException class TestProtectCall(common.BitkeyTest): - def test_features(self): - features = self.bitkey.call(proto.Initialize(session_id=self.bitkey.session_id)) + def _some_protected_call(self): + # This method perform any call which have protection in the device + entropy_len = 10 + entropy = self.bitkey.get_entropy(entropy_len) + self.assertEqual(len(entropy), entropy_len) - # Result is the same as reported by BitkeyClient class - self.assertEqual(features, self.bitkey.features) - - def test_ping(self): - ping = self.bitkey.call(proto.Ping(message='ahoj!')) + def test_no_protection(self): + self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + otp=False, pin='', spv=False) - # Ping results in Success(message='Ahoj!') - self.assertEqual(ping, proto.Success(message='ahoj!')) + self.assertEqual(self.bitkey.features.otp, False) + self.assertEqual(self.bitkey.features.pin, False) + self._some_protected_call() + + def test_otp_only(self): + self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + otp=True, pin='', spv=False) + + self.assertEqual(self.bitkey.features.otp, True) + self.assertEqual(self.bitkey.features.pin, False) + self._some_protected_call() - def test_uuid(self): - uuid1 = self.bitkey.get_uuid() - uuid2 = self.bitkey.get_uuid() + def test_pin_only(self): + self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + otp=False, pin='2345', spv=False) + + self.assertEqual(self.bitkey.features.otp, False) + self.assertEqual(self.bitkey.features.pin, True) + self._some_protected_call() - # UUID must be longer than 10 characters - self.assertGreater(len(uuid1), 10) + def test_both(self): + self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + otp=True, pin='3456', spv=False) - # Every resulf of UUID must be the same - self.assertEqual(uuid1, uuid2) + self.assertEqual(self.bitkey.features.otp, True) + self.assertEqual(self.bitkey.features.pin, True) + self._some_protected_call() + def test_incorrect_pin(self): + self.bitkey.setup_debuglink(button=True, pin_correct=False, otp_correct=True) + self.assertRaises(PinException, self._some_protected_call) + + def test_incorrect_otp(self): + self.bitkey.setup_debuglink(button=True, pin_correct=True, otp_correct=False) + self.assertRaises(OtpException, self._some_protected_call) + + def test_incorrect_both(self): + self.bitkey.setup_debuglink(button=True, pin_correct=False, otp_correct=False) + self.assertRaises(CallException, self._some_protected_call) + if __name__ == '__main__': unittest.main() \ No newline at end of file From db26da19a95366d8f1d466944d5d33986748f459 Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 14 Jan 2013 19:20:55 +0100 Subject: [PATCH 0036/1535] Fixed protobuf, int32 instead of uint32 in InputRequest --- bitkeylib/bitkey_pb2.py | 14 +++++++------- protobuf/bitkey.proto | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/bitkeylib/bitkey_pb2.py b/bitkeylib/bitkey_pb2.py index cecc34983..6fe3f227f 100644 --- a/bitkeylib/bitkey_pb2.py +++ b/bitkeylib/bitkey_pb2.py @@ -11,7 +11,7 @@ from google.protobuf import descriptor_pb2 DESCRIPTOR = descriptor.FileDescriptor( name='bitkey.proto', package='', - serialized_pb='\n\x0c\x62itkey.proto\" \n\nInitialize\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\"\xc4\x01\n\x08\x46\x65\x61tures\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x0b\n\x03otp\x18\x05 \x01(\x08\x12\x0b\n\x03pin\x18\x06 \x01(\x08\x12\x0b\n\x03spv\x18\x07 \x01(\x08\x12\x11\n\tmaxfee_kb\x18\x08 \x01(\x04\x12\x18\n\x04\x61lgo\x18\t \x03(\x0e\x32\n.Algorithm\x12\x12\n\ndebug_link\x18\n \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"K\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03otp\x18\x02 \x01(\x08\x12\x0b\n\x03pin\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Z\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x14\n\x03otp\x18\x02 \x01(\x0b\x32\x07.OtpAck\x12\x14\n\x03pin\x18\x03 \x01(\x0b\x32\x07.PinAck\x12\x0c\n\x04seed\x18\x04 \x01(\t\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"\x1d\n\nOtpRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06OtpAck\x12\x0b\n\x03otp\x18\x01 \x02(\t\"\x0b\n\tOtpCancel\"\x1d\n\nPinRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06PinAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x0b\n\tPinCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"5\n\x12GetMasterPublicKey\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"@\n\nGetAddress\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x11\n\taddress_n\x18\x02 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"M\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\t\x12\x11\n\x03otp\x18\x02 \x01(\x08:\x04true\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x11\n\x03spv\x18\x04 \x01(\x08:\x04true\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"f\n\x06SignTx\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x15\n\routputs_count\x18\x03 \x03(\r\x12\x14\n\x0cinputs_count\x18\x05 \x03(\r\x12\x0e\n\x06random\x18\x06 \x01(\x0c\"N\n\x0cInputRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x14\n\x0csigned_index\x18\x02 \x01(\r\x12\x11\n\tsignature\x18\x03 \x01(\x0c\"&\n\rOutputRequest\x12\x15\n\rrequest_index\x18\x01 \x02(\r\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*$\n\tAlgorithm\x12\t\n\x05\x42IP32\x10\x00\x12\x0c\n\x08\x45LECTRUM\x10\x01*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01') + serialized_pb='\n\x0c\x62itkey.proto\" \n\nInitialize\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\"\xc4\x01\n\x08\x46\x65\x61tures\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x0b\n\x03otp\x18\x05 \x01(\x08\x12\x0b\n\x03pin\x18\x06 \x01(\x08\x12\x0b\n\x03spv\x18\x07 \x01(\x08\x12\x11\n\tmaxfee_kb\x18\x08 \x01(\x04\x12\x18\n\x04\x61lgo\x18\t \x03(\x0e\x32\n.Algorithm\x12\x12\n\ndebug_link\x18\n \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"K\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03otp\x18\x02 \x01(\x08\x12\x0b\n\x03pin\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Z\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x14\n\x03otp\x18\x02 \x01(\x0b\x32\x07.OtpAck\x12\x14\n\x03pin\x18\x03 \x01(\x0b\x32\x07.PinAck\x12\x0c\n\x04seed\x18\x04 \x01(\t\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"\x1d\n\nOtpRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06OtpAck\x12\x0b\n\x03otp\x18\x01 \x02(\t\"\x0b\n\tOtpCancel\"\x1d\n\nPinRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06PinAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x0b\n\tPinCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"5\n\x12GetMasterPublicKey\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"@\n\nGetAddress\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x11\n\taddress_n\x18\x02 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"M\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\t\x12\x11\n\x03otp\x18\x02 \x01(\x08:\x04true\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x11\n\x03spv\x18\x04 \x01(\x08:\x04true\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"f\n\x06SignTx\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\x12\x0e\n\x06random\x18\x06 \x01(\x0c\"N\n\x0cInputRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\x14\n\x0csigned_index\x18\x02 \x01(\x05\x12\x11\n\tsignature\x18\x03 \x01(\x0c\"&\n\rOutputRequest\x12\x15\n\rrequest_index\x18\x01 \x02(\r\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*$\n\tAlgorithm\x12\t\n\x05\x42IP32\x10\x00\x12\x0c\n\x08\x45LECTRUM\x10\x01*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01') _ALGORITHM = descriptor.EnumDescriptor( name='Algorithm', @@ -962,15 +962,15 @@ _SIGNTX = descriptor.Descriptor( options=None), descriptor.FieldDescriptor( name='outputs_count', full_name='SignTx.outputs_count', index=1, - number=3, type=13, cpp_type=3, label=3, - has_default_value=False, default_value=[], + number=3, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='inputs_count', full_name='SignTx.inputs_count', index=2, - number=5, type=13, cpp_type=3, label=3, - has_default_value=False, default_value=[], + number=5, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1004,14 +1004,14 @@ _INPUTREQUEST = descriptor.Descriptor( fields=[ descriptor.FieldDescriptor( name='request_index', full_name='InputRequest.request_index', index=0, - number=1, type=13, cpp_type=3, label=1, + number=1, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='signed_index', full_name='InputRequest.signed_index', index=1, - number=2, type=13, cpp_type=3, label=1, + number=2, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, diff --git a/protobuf/bitkey.proto b/protobuf/bitkey.proto index 1a29cf38d..8b8d23afd 100644 --- a/protobuf/bitkey.proto +++ b/protobuf/bitkey.proto @@ -215,8 +215,8 @@ message ResetDevice { // Response: InputRequest, OutputRequest, OtpRequest, PinRequest, Failure message SignTx { required Algorithm algo = 1 [default=BIP32]; // Algorithm using for key generation algorithm - repeated uint32 outputs_count = 3; // Count of outputs of the transaction - repeated uint32 inputs_count = 5; // Count of inputs of the transaction + required uint32 outputs_count = 3; // Count of outputs of the transaction + required uint32 inputs_count = 5; // Count of inputs of the transaction optional bytes random = 6; // Provide additional entropy for signing function. // Recommended to provide 256 bytes of random data. } @@ -225,9 +225,9 @@ message SignTx { // If request_index is set, device asks for TxInput message with details of index's input. // If signed_index is set, 'signature' contains signed input of signed_index's input. message InputRequest { - optional uint32 request_index = 1; // If presented, device expects TxInput message from the computer - optional uint32 signed_index = 2; // If presented, 'signature' contains signed input of this input - optional bytes signature = 3; // If presented, represent signature of the signed_index input + optional int32 request_index = 1; // If >=0, device expects TxInput message from the computer + optional int32 signed_index = 2; // If >=0, 'signature' contains signed input of this input + optional bytes signature = 3; // If signed_index>=0, represent signature of the signed_index input } // Sent by the device as a response for SignTx or TxInput. @@ -243,8 +243,8 @@ message TxInput { required uint32 index = 1; // Position of input in proposed transaction repeated uint32 address_n = 2; // Parameter for address generation algorithm to derive the address from the master public key required uint64 amount = 3; // Amount to spend in satoshis. The rest will be used for transaction fees - required bytes prev_hash = 4; // Hash of previous transaction spent by this input - required uint32 prev_index = 5; // Index of previous spent output + required bytes prev_hash = 4; // Hash of previous transaction output to spend by this input + required uint32 prev_index = 5; // Index of previous output to spend optional bytes script_sig = 6; // Script signature } From 80e25b1410b91e9a5dea5b93eab7eec61cfee60c Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 14 Jan 2013 19:21:48 +0100 Subject: [PATCH 0037/1535] Removed unnecessary import in test_protect_call --- tests/test_protect_call.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index abb5d70b8..dac476de3 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -1,7 +1,6 @@ import unittest import common -from bitkeylib import proto from bitkeylib.client import CallException, PinException, OtpException class TestProtectCall(common.BitkeyTest): From 2730631e6d458b7a2567f7a64f34aea6eff0e407 Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 14 Jan 2013 19:22:02 +0100 Subject: [PATCH 0038/1535] Implemented responder for signing Basic signtx unit test --- bitkeylib/client.py | 61 ++++++++++++++++++++++++++++++++++++++++---- tests/test_signtx.py | 38 ++++++++++++++++++++++++--- 2 files changed, 91 insertions(+), 8 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index c4cd5e2d0..83f09dcd7 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -34,6 +34,9 @@ class BitkeyClient(object): self.setup_debuglink() self.init_device() + + def _get_local_entropy(self): + return os.urandom(32) def init_device(self): self.master_public_key = None @@ -129,15 +132,58 @@ class BitkeyClient(object): ''' inputs: list of TxInput outputs: list of TxOutput + + proto.TxInput(index=0, + address_n=0, + amount=0, + prev_hash='', + prev_index=0, + #script_sig= + ) + proto.TxOutput(index=0, + address='1Bitkey', + #address_n=[], + amount=100000000, + script_type=proto.PAYTOADDRESS, + #script_args= + ) ''' - - + + # Prepare and send initial message tx = proto.SignTx() tx.algo = self.algo # Choose BIP32 or ELECTRUM way for deterministic keys - tx.random = os.urandom(256) # Provide additional entropy to the device - tx.outputs.extend(outputs) + tx.random = self._get_local_entropy() # Provide additional entropy to the device + tx.inputs_count = len(inputs) + tx.outputs_count = len(outputs) + res = self.call(tx) + + # Prepare structure for signatures + signatures = [None]*len(inputs) + + while True: + if isinstance(res, proto.OutputRequest): + res = self.call(outputs[res.request_index]) + continue - return self.call(tx) + if isinstance(res, proto.InputRequest): + if res.signed_index >= 0: + print "!!! SIGNED INPUT" + signatures[res.signed_index] = res.signature + + if res.request_index >= 0: + print "REQUESTING", res.request_index + res = self.call(inputs[res.request_index]) + continue + + # There was no request for another input, + # so we're done! + break + + if isinstance(res, proto.Failure): + raise CallException("Signing failed") + + return signatures + #print "PBDATA", tx.SerializeToString().encode('hex') ################# @@ -169,6 +215,11 @@ class BitkeyClient(object): return s_inputs ''' + def reset_device(self): + resp = self.call(proto.ResetDevice(random=self._get_local_entropy())) + self.init_device() + return isinstance(resp, proto.Success) + def load_device(self, seed, otp, pin, spv): resp = self.call(proto.LoadDevice(seed=seed, otp=otp, pin=pin, spv=spv)) self.init_device() diff --git a/tests/test_signtx.py b/tests/test_signtx.py index bfa1ef84d..ca9da1b74 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -1,11 +1,43 @@ import unittest import common +import bitkeylib.bitkey_pb2 as proto + class TestSignTx(common.BitkeyTest): - ''' def test_signtx(self): - print self.bitkey.sign_tx([], []) - ''' + inp1 = proto.TxInput(index=0, + address_n=[1,], + amount=100000000, + prev_hash='prevhash1234354346543456543654', + prev_index=11, + #script_sig= + ) + + inp2 = proto.TxInput(index=1, + address_n=[2,], + amount=100000000, + prev_hash='prevhash2222254346543456543654', + prev_index=11, + #script_sig= + ) + + out1 = proto.TxOutput(index=0, + address='1Bitkey', + #address_n=[], + amount=100000000, + script_type=proto.PAYTOADDRESS, + #script_args= + ) + + out2 = proto.TxOutput(index=1, + address='1Bitkey2', + #address_n=[], + amount=100000000, + script_type=proto.PAYTOADDRESS, + #script_args= + ) + + print self.bitkey.sign_tx([inp1, inp2], [out1, out2]) if __name__ == '__main__': unittest.main() \ No newline at end of file From ca94e682d3ecda22f4011edeb2f1caf93648e7ca Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 17 Jan 2013 13:37:48 +0100 Subject: [PATCH 0039/1535] Unit test for Electrum address generation --- tests/test_addresses.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 tests/test_addresses.py diff --git a/tests/test_addresses.py b/tests/test_addresses.py new file mode 100644 index 000000000..b56f25b76 --- /dev/null +++ b/tests/test_addresses.py @@ -0,0 +1,38 @@ +import unittest +import common + +import bitkeylib.bitkey_pb2 as proto + +class TestAddresses(common.BitkeyTest): + def test_electrum_address(self): + self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + otp=False, pin='', spv=False) + + self.bitkey.algo = proto.ELECTRUM + self.assertEqual(self.bitkey.get_address([0, 0]), "1KqYyzL53R8oA1LdYvyv7m6JUryFfGJDpa") + self.assertEqual(self.bitkey.get_address([2, 0]), "13MzKU6YjjdyiW3dZJDa5VU4AWGczQsdYD") + self.assertEqual(self.bitkey.get_address([3, 0]), "1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv") + self.assertEqual(self.bitkey.get_address([9, 0]), "1C9DHmWBpvGcFKXEiWWC3EK3EY5Bj79nze") + + def test_electrum_change_address(self): + self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + otp=False, pin='', spv=False) + + self.bitkey.algo = proto.ELECTRUM + self.assertEqual(self.bitkey.get_address([0, 1]), "17GpAFnkHRjWKePkX4kxHaHy49V8EHTr7i") + self.assertEqual(self.bitkey.get_address([2, 1]), "1MVgq4XaMX7PmohkYzFEisH1D7uxTiPbFK") + self.assertEqual(self.bitkey.get_address([3, 1]), "1M5NSqrUmmkZqokpHsJd5xm74YG6kjVcz4") + self.assertEqual(self.bitkey.get_address([9, 1]), "1BXUkUsc5gGSzYUAEebg5WZWtRGPNW4NQ9") + + ''' + def test_bip32_address(self): + # TODO, FIXME + self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + otp=False, pin='', spv=False) + + self.bitkey.algo = proto.BIP32 + #self.assertEqual(self.bitkey.get_address([0, 0]), "1KqYyzL53R8oA1LdYvyv7m6JUryFfGJDpa") + ''' + +if __name__ == '__main__': + unittest.main() \ No newline at end of file From 29de33fa98fa817bd972fdb782deda8f3f46d75c Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 17 Jan 2013 17:01:37 +0100 Subject: [PATCH 0040/1535] Data for testing private key generation --- tests/test_secexp.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 tests/test_secexp.py diff --git a/tests/test_secexp.py b/tests/test_secexp.py new file mode 100644 index 000000000..1fb8dc9c1 --- /dev/null +++ b/tests/test_secexp.py @@ -0,0 +1,10 @@ +''' +TODO: Test private key generation. +Requires changes in DebugLink protocol + +address N -> secexp +1KqYyzL53R8oA1LdYvyv7m6JUryFfGJDpa 0 -> 58076025150540604300740730208658111746901313722419801903949973414685471840010 +13MzKU6YjjdyiW3dZJDa5VU4AWGczQsdYD 2 -> 24964362473980156971921866787933161040275203024491680251157021262214416818504 +1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv 3 -> 12500609616964965377900270839876716803428136543899720278159495092510064965376 +1C9DHmWBpvGcFKXEiWWC3EK3EY5Bj79nze 9 -> 67160564554915396199427939496499570939355460294705808200742756759419289432145 +''' \ No newline at end of file From 83aa0e6e660b1c29ab818281d769dcd67e34239f Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 24 Jan 2013 15:51:12 +0100 Subject: [PATCH 0041/1535] UUID is exactly 9 bytes long --- tests/test_basic.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_basic.py b/tests/test_basic.py index dbfe4e019..aba4652b3 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -27,10 +27,11 @@ class TestBasic(common.BitkeyTest): def test_uuid(self): uuid1 = self.bitkey.get_uuid() + self.bitkey.init_device() uuid2 = self.bitkey.get_uuid() # UUID must be longer than 10 characters - self.assertGreater(len(uuid1), 10) + self.assertEqual(len(uuid1), 9) # Every resulf of UUID must be the same self.assertEqual(uuid1, uuid2) From 5f0bf64bfa0685ca63070ba79283478f6bb3fe7b Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 24 Jan 2013 21:19:54 +0100 Subject: [PATCH 0042/1535] Messages TxInput and TxOutput refactored to TxRequest --- bitkeylib/bitkey_pb2.py | 112 +++++++++++++++++++++------------------- bitkeylib/mapping.py | 4 +- protobuf/bitkey.proto | 35 +++++++------ 3 files changed, 79 insertions(+), 72 deletions(-) diff --git a/bitkeylib/bitkey_pb2.py b/bitkeylib/bitkey_pb2.py index 6fe3f227f..a998fcb0c 100644 --- a/bitkeylib/bitkey_pb2.py +++ b/bitkeylib/bitkey_pb2.py @@ -11,7 +11,7 @@ from google.protobuf import descriptor_pb2 DESCRIPTOR = descriptor.FileDescriptor( name='bitkey.proto', package='', - serialized_pb='\n\x0c\x62itkey.proto\" \n\nInitialize\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\"\xc4\x01\n\x08\x46\x65\x61tures\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x0b\n\x03otp\x18\x05 \x01(\x08\x12\x0b\n\x03pin\x18\x06 \x01(\x08\x12\x0b\n\x03spv\x18\x07 \x01(\x08\x12\x11\n\tmaxfee_kb\x18\x08 \x01(\x04\x12\x18\n\x04\x61lgo\x18\t \x03(\x0e\x32\n.Algorithm\x12\x12\n\ndebug_link\x18\n \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"K\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03otp\x18\x02 \x01(\x08\x12\x0b\n\x03pin\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Z\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x14\n\x03otp\x18\x02 \x01(\x0b\x32\x07.OtpAck\x12\x14\n\x03pin\x18\x03 \x01(\x0b\x32\x07.PinAck\x12\x0c\n\x04seed\x18\x04 \x01(\t\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"\x1d\n\nOtpRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06OtpAck\x12\x0b\n\x03otp\x18\x01 \x02(\t\"\x0b\n\tOtpCancel\"\x1d\n\nPinRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06PinAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x0b\n\tPinCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"5\n\x12GetMasterPublicKey\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"@\n\nGetAddress\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x11\n\taddress_n\x18\x02 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"M\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\t\x12\x11\n\x03otp\x18\x02 \x01(\x08:\x04true\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x11\n\x03spv\x18\x04 \x01(\x08:\x04true\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"f\n\x06SignTx\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\x12\x0e\n\x06random\x18\x06 \x01(\x0c\"N\n\x0cInputRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\x14\n\x0csigned_index\x18\x02 \x01(\x05\x12\x11\n\tsignature\x18\x03 \x01(\x0c\"&\n\rOutputRequest\x12\x15\n\rrequest_index\x18\x01 \x02(\r\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*$\n\tAlgorithm\x12\t\n\x05\x42IP32\x10\x00\x12\x0c\n\x08\x45LECTRUM\x10\x01*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01') + serialized_pb='\n\x0c\x62itkey.proto\" \n\nInitialize\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\"\xc4\x01\n\x08\x46\x65\x61tures\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x0b\n\x03otp\x18\x05 \x01(\x08\x12\x0b\n\x03pin\x18\x06 \x01(\x08\x12\x0b\n\x03spv\x18\x07 \x01(\x08\x12\x11\n\tmaxfee_kb\x18\x08 \x01(\x04\x12\x18\n\x04\x61lgo\x18\t \x03(\x0e\x32\n.Algorithm\x12\x12\n\ndebug_link\x18\n \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"K\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03otp\x18\x02 \x01(\x08\x12\x0b\n\x03pin\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Z\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x14\n\x03otp\x18\x02 \x01(\x0b\x32\x07.OtpAck\x12\x14\n\x03pin\x18\x03 \x01(\x0b\x32\x07.PinAck\x12\x0c\n\x04seed\x18\x04 \x01(\t\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"\x1d\n\nOtpRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06OtpAck\x12\x0b\n\x03otp\x18\x01 \x02(\t\"\x0b\n\tOtpCancel\"\x1d\n\nPinRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06PinAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x0b\n\tPinCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"5\n\x12GetMasterPublicKey\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"@\n\nGetAddress\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x11\n\taddress_n\x18\x02 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"M\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\t\x12\x11\n\x03otp\x18\x02 \x01(\x08:\x04true\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x11\n\x03spv\x18\x04 \x01(\x08:\x04true\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"f\n\x06SignTx\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\x12\x0e\n\x06random\x18\x06 \x01(\x0c\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*$\n\tAlgorithm\x12\t\n\x05\x42IP32\x10\x00\x12\x0c\n\x08\x45LECTRUM\x10\x01*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01') _ALGORITHM = descriptor.EnumDescriptor( name='Algorithm', @@ -30,8 +30,8 @@ _ALGORITHM = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1623, - serialized_end=1659, + serialized_start=1640, + serialized_end=1676, ) @@ -52,8 +52,30 @@ _SCRIPTTYPE = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1661, - serialized_end=1712, + serialized_start=1678, + serialized_end=1729, +) + + +_REQUESTTYPE = descriptor.EnumDescriptor( + name='RequestType', + full_name='RequestType', + filename=None, + file=DESCRIPTOR, + values=[ + descriptor.EnumValueDescriptor( + name='TXINPUT', index=0, number=0, + options=None, + type=None), + descriptor.EnumValueDescriptor( + name='TXOUTPUT', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1731, + serialized_end=1771, ) @@ -61,6 +83,8 @@ BIP32 = 0 ELECTRUM = 1 PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 +TXINPUT = 0 +TXOUTPUT = 1 @@ -995,59 +1019,45 @@ _SIGNTX = descriptor.Descriptor( ) -_INPUTREQUEST = descriptor.Descriptor( - name='InputRequest', - full_name='InputRequest', +_TXREQUEST = descriptor.Descriptor( + name='TxRequest', + full_name='TxRequest', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ descriptor.FieldDescriptor( - name='request_index', full_name='InputRequest.request_index', index=0, + name='request_index', full_name='TxRequest.request_index', index=0, number=1, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='signed_index', full_name='InputRequest.signed_index', index=1, - number=2, type=5, cpp_type=1, label=1, + name='request_type', full_name='TxRequest.request_type', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='signed_index', full_name='TxRequest.signed_index', index=2, + number=3, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='signature', full_name='InputRequest.signature', index=2, - number=3, type=12, cpp_type=9, label=1, + name='signature', full_name='TxRequest.signature', index=3, + number=4, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=1248, - serialized_end=1326, -) - - -_OUTPUTREQUEST = descriptor.Descriptor( - name='OutputRequest', - full_name='OutputRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ descriptor.FieldDescriptor( - name='request_index', full_name='OutputRequest.request_index', index=0, - number=1, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, + name='serialized_tx', full_name='TxRequest.serialized_tx', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1060,8 +1070,8 @@ _OUTPUTREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1328, - serialized_end=1366, + serialized_start=1249, + serialized_end=1383, ) @@ -1123,8 +1133,8 @@ _TXINPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1368, - serialized_end=1486, + serialized_start=1385, + serialized_end=1503, ) @@ -1186,8 +1196,8 @@ _TXOUTPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1489, - serialized_end=1621, + serialized_start=1506, + serialized_end=1638, ) _FEATURES.fields_by_name['algo'].enum_type = _ALGORITHM @@ -1196,6 +1206,7 @@ _DEBUGLINKSTATE.fields_by_name['pin'].message_type = _PINACK _GETMASTERPUBLICKEY.fields_by_name['algo'].enum_type = _ALGORITHM _GETADDRESS.fields_by_name['algo'].enum_type = _ALGORITHM _SIGNTX.fields_by_name['algo'].enum_type = _ALGORITHM +_TXREQUEST.fields_by_name['request_type'].enum_type = _REQUESTTYPE _TXOUTPUT.fields_by_name['script_type'].enum_type = _SCRIPTTYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE DESCRIPTOR.message_types_by_name['Features'] = _FEATURES @@ -1226,8 +1237,7 @@ DESCRIPTOR.message_types_by_name['Address'] = _ADDRESS DESCRIPTOR.message_types_by_name['LoadDevice'] = _LOADDEVICE DESCRIPTOR.message_types_by_name['ResetDevice'] = _RESETDEVICE DESCRIPTOR.message_types_by_name['SignTx'] = _SIGNTX -DESCRIPTOR.message_types_by_name['InputRequest'] = _INPUTREQUEST -DESCRIPTOR.message_types_by_name['OutputRequest'] = _OUTPUTREQUEST +DESCRIPTOR.message_types_by_name['TxRequest'] = _TXREQUEST DESCRIPTOR.message_types_by_name['TxInput'] = _TXINPUT DESCRIPTOR.message_types_by_name['TxOutput'] = _TXOUTPUT @@ -1405,17 +1415,11 @@ class SignTx(message.Message): # @@protoc_insertion_point(class_scope:SignTx) -class InputRequest(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _INPUTREQUEST - - # @@protoc_insertion_point(class_scope:InputRequest) - -class OutputRequest(message.Message): +class TxRequest(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _OUTPUTREQUEST + DESCRIPTOR = _TXREQUEST - # @@protoc_insertion_point(class_scope:OutputRequest) + # @@protoc_insertion_point(class_scope:TxRequest) class TxInput(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType diff --git a/bitkeylib/mapping.py b/bitkeylib/mapping.py index 6a8419eb3..19969b3cf 100644 --- a/bitkeylib/mapping.py +++ b/bitkeylib/mapping.py @@ -22,8 +22,8 @@ map_type_to_class = { 18: proto.PinRequest, 19: proto.PinAck, 20: proto.PinCancel, - 21: proto.InputRequest, - 22: proto.OutputRequest, + 21: proto.TxRequest, + #22: proto.OutputRequest, 23: proto.TxInput, 24: proto.TxOutput, 25: proto.SetMaxFeeKb, diff --git a/protobuf/bitkey.proto b/protobuf/bitkey.proto index 8b8d23afd..8364a4f04 100644 --- a/protobuf/bitkey.proto +++ b/protobuf/bitkey.proto @@ -16,6 +16,12 @@ enum ScriptType { PAYTOSCRIPTHASH = 1; } +// Specifies which kind of information is required by transaction signing process +enum RequestType { + TXINPUT = 0; + TXOUTPUT = 1; +} + // Reset device's internal state // // Response: Features @@ -212,7 +218,7 @@ message ResetDevice { // Request the device to sign the transaction // -// Response: InputRequest, OutputRequest, OtpRequest, PinRequest, Failure +// Response: TxRequest, OtpRequest, PinRequest, Failure message SignTx { required Algorithm algo = 1 [default=BIP32]; // Algorithm using for key generation algorithm required uint32 outputs_count = 3; // Count of outputs of the transaction @@ -221,24 +227,21 @@ message SignTx { // Recommended to provide 256 bytes of random data. } -// Sent by the device as a response for SignTx. -// If request_index is set, device asks for TxInput message with details of index's input. +// Sent by the device as a response for SignTx. Device asks for information for signing transaction. +// If request_index is set, device asks for TxInput/TxOutput message (depends on request_type) +// with details of index's input. // If signed_index is set, 'signature' contains signed input of signed_index's input. -message InputRequest { - optional int32 request_index = 1; // If >=0, device expects TxInput message from the computer - optional int32 signed_index = 2; // If >=0, 'signature' contains signed input of this input - optional bytes signature = 3; // If signed_index>=0, represent signature of the signed_index input -} - -// Sent by the device as a response for SignTx or TxInput. -// Device asks for Tx -message OutputRequest { - required uint32 request_index = 1; // Device expects TxOutput message from the computer +message TxRequest { + optional int32 request_index = 1; // If >=0, device expects TxInput/TxOutput message from the computer + optional RequestType request_type = 2; // Ask for TxInput or TxOutput? + optional int32 signed_index = 3 [default=-1]; // If >=0, 'signature' contains signed input of this input + optional bytes signature = 4; // If signed_index>=0, represent signature of the signed_index input + optional bytes serialized_tx = 5; // Part of serialized and signed transaction } -// Transaction onput for SignTx workflow. It is response to InputRequest message sent by device. +// Transaction onput for SignTx workflow. It is response to TxRequest message sent by device. // -// Response: InputRequest, OutputRequest, Failure +// Response: TxRequest, Failure message TxInput { required uint32 index = 1; // Position of input in proposed transaction repeated uint32 address_n = 2; // Parameter for address generation algorithm to derive the address from the master public key @@ -248,7 +251,7 @@ message TxInput { optional bytes script_sig = 6; // Script signature } -// Transaction output for SignTx workflow. It is response to OutputRequest message sent by the device. +// Transaction output for SignTx workflow. It is response to TxRequest message sent by the device. message TxOutput { required uint32 index = 1; // Position of output in proposed transaction required string address = 2; // Target bitcoin address in base58 encoding From 53ffe3b755e82789bce1d97f4ae0bc46f01dbb64 Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 24 Jan 2013 21:20:41 +0100 Subject: [PATCH 0043/1535] Fixed address_n --- tests/test_signtx.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/tests/test_signtx.py b/tests/test_signtx.py index ca9da1b74..0ed88e0a3 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -6,7 +6,7 @@ import bitkeylib.bitkey_pb2 as proto class TestSignTx(common.BitkeyTest): def test_signtx(self): inp1 = proto.TxInput(index=0, - address_n=[1,], + address_n=[1,0], amount=100000000, prev_hash='prevhash1234354346543456543654', prev_index=11, @@ -14,7 +14,7 @@ class TestSignTx(common.BitkeyTest): ) inp2 = proto.TxInput(index=1, - address_n=[2,], + address_n=[2,0], amount=100000000, prev_hash='prevhash2222254346543456543654', prev_index=11, @@ -22,7 +22,7 @@ class TestSignTx(common.BitkeyTest): ) out1 = proto.TxOutput(index=0, - address='1Bitkey', + address='1BitkeyP2nDd5oa647AjvBbbwST54W5Zmx', #address_n=[], amount=100000000, script_type=proto.PAYTOADDRESS, @@ -30,14 +30,21 @@ class TestSignTx(common.BitkeyTest): ) out2 = proto.TxOutput(index=1, - address='1Bitkey2', + address='1BitkeyP2nDd5oa647AjvBbbwST54W5Zmx', #address_n=[], amount=100000000, script_type=proto.PAYTOADDRESS, #script_args= ) - - print self.bitkey.sign_tx([inp1, inp2], [out1, out2]) + + out3 = proto.TxOutput(index=2, + address='1MVgq4XaMX7PmohkYzFEisH1D7uxTiPbFK', + address_n=[2, 1], + amount=100000000, + script_type=proto.PAYTOADDRESS, + #script_args= + ) + print self.bitkey.sign_tx([inp1, inp2], [out1, out2, out3]) if __name__ == '__main__': unittest.main() \ No newline at end of file From 9a56af5dcbd206daedad8a61fed0dac1288f6704 Mon Sep 17 00:00:00 2001 From: slush Date: Thu, 24 Jan 2013 21:20:54 +0100 Subject: [PATCH 0044/1535] Refactored messages TxInput/TxOutput --- bitkeylib/client.py | 57 ++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index 83f09dcd7..eec7f833f 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -1,4 +1,6 @@ import os +import time + import bitkey_pb2 as proto import random @@ -42,7 +44,7 @@ class BitkeyClient(object): self.master_public_key = None self.session_id = ''.join([ chr(random.randrange(0, 255, 1)) for _ in xrange(0, 16) ]) self.features = self.call(proto.Initialize(session_id=self.session_id)) - self.UUID = self.call(proto.GetUUID()) + self.uuid = self.get_uuid() def get_master_public_key(self): if self.master_public_key: @@ -149,6 +151,8 @@ class BitkeyClient(object): ) ''' + start = time.time() + # Prepare and send initial message tx = proto.SignTx() tx.algo = self.algo # Choose BIP32 or ELECTRUM way for deterministic keys @@ -159,30 +163,45 @@ class BitkeyClient(object): # Prepare structure for signatures signatures = [None]*len(inputs) + serialized_tx = '' + counter = 0 while True: - if isinstance(res, proto.OutputRequest): - res = self.call(outputs[res.request_index]) - continue + counter += 1 - if isinstance(res, proto.InputRequest): - if res.signed_index >= 0: - print "!!! SIGNED INPUT" - signatures[res.signed_index] = res.signature - - if res.request_index >= 0: - print "REQUESTING", res.request_index - res = self.call(inputs[res.request_index]) - continue + if isinstance(res, proto.Failure): + raise CallException("Signing failed") + + if not isinstance(res, proto.TxRequest): + raise CallException("Unexpected message") + + # If there's some part of signed transaction, let's add it + if res.serialized_tx: + print "!!! RECEIVED PART OF SERIALIED TX (%d BYTES)" % len(res.serialized_tx) + serialized_tx += res.serialized_tx + + if res.signed_index >= 0 and res.signature: + print "!!! SIGNED INPUT", res.signed_index + signatures[res.signed_index] = res.signature - # There was no request for another input, - # so we're done! + if res.request_index < 0: + # Device didn't ask for more information, finish workflow break - if isinstance(res, proto.Failure): - raise CallException("Signing failed") - - return signatures + # Device asked for one more information, let's process it. + if res.request_type == proto.TXOUTPUT: + res = self.call(outputs[res.request_index]) + continue + + elif res.request_type == proto.TXINPUT: + print "REQUESTING", res.request_index + res = self.call(inputs[res.request_index]) + continue + + print "SIGNED IN %.03f SECONDS, CALLED %d MESSAGES, %d BYTES" % \ + (time.time() - start, counter, len(serialized_tx)) + + return (signatures, serialized_tx) #print "PBDATA", tx.SerializeToString().encode('hex') From 235aaf77686c8365af3b2a3f488b5626512ffd4c Mon Sep 17 00:00:00 2001 From: slush Date: Fri, 25 Jan 2013 12:52:19 +0100 Subject: [PATCH 0045/1535] Added link to homepage --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b536cf9e3..f29ddfad5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ bitkeylib-python ================ -Client side implementation of bitkey device \ No newline at end of file +Client side implementation for Trezor-compatible Bitcoin hardware wallets. See http://trezor.bitcoin.cz for more information. From 43c2d9b042030c267ccd4f0d371fd716cbeaf5f3 Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 18 Feb 2013 18:45:33 +0100 Subject: [PATCH 0046/1535] load_device moved to debuglink --- bitkeylib/client.py | 9 +++++++-- bitkeylib/debuglink.py | 7 ++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index eec7f833f..3142f414d 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -235,11 +235,16 @@ class BitkeyClient(object): ''' def reset_device(self): + # Begin with device reset workflow resp = self.call(proto.ResetDevice(random=self._get_local_entropy())) self.init_device() return isinstance(resp, proto.Success) def load_device(self, seed, otp, pin, spv): - resp = self.call(proto.LoadDevice(seed=seed, otp=otp, pin=pin, spv=spv)) + if not self.debuglink: + raise Exception("DebugLink not available") + + if not self.debuglink.load_device(seed, otp, pin, spv): + return False self.init_device() - return isinstance(resp, proto.Success) \ No newline at end of file + return True \ No newline at end of file diff --git a/bitkeylib/debuglink.py b/bitkeylib/debuglink.py index 93e5825d4..427e9464e 100644 --- a/bitkeylib/debuglink.py +++ b/bitkeylib/debuglink.py @@ -21,7 +21,12 @@ class DebugLink(object): def get_state(self, otp=False, pin=False): self.transport.write(proto.DebugLinkGetState(otp=otp, pin=pin)) return self.transport.read_blocking() - + + def load_device(self, seed, otp, pin, spv): + self.transport.write(proto.LoadDevice(seed=seed, otp=otp, pin=pin, spv=spv)) + resp = self.transport.read_blocking() + return isinstance(resp, proto.Success) + def read_otp(self): obj = self.get_state(otp=True).otp print "Read OTP:", obj.otp From 41b706d56aa6b214806c4425024db947beb2a2cf Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 10 Mar 2013 16:55:59 +0100 Subject: [PATCH 0047/1535] HID transport --- bitkeylib/transport_hid.py | 71 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 bitkeylib/transport_hid.py diff --git a/bitkeylib/transport_hid.py b/bitkeylib/transport_hid.py new file mode 100644 index 000000000..561ae8669 --- /dev/null +++ b/bitkeylib/transport_hid.py @@ -0,0 +1,71 @@ +'''USB HID implementation of Transport.''' + +import hid +from transport import Transport, NotImplementedException + +DEVICE_IDS = [ + (0x1cbe, 0xcaf3), # Trezor + (0x10c4, 0xea80), # Trezor Pi + (0x08f7, 0x0002), # EasyTemp +] + +class HidTransport(Transport): + def __init__(self, device, *args, **kwargs): + self.hid = None + self.buffer = '' + super(HidTransport, self).__init__(device, *args, **kwargs) + + @classmethod + def enumerate(cls): + devices = [] + for d in hid.enumerate(0, 0): + vendor_id = d.get('vendor_id') + product_id = d.get('product_id') + serial_number = d.get('serial_number') + + if (vendor_id, product_id) in DEVICE_IDS: + devices.append((vendor_id, product_id, serial_number)) + + return devices + + def _open(self): + self.buffer = '' + self.hid = hid.device(self.device[0], self.device[1])#, self.device[2]) + + def _close(self): + self.hid.close() + self.buffer = '' + self.hid = None + + def ready_to_read(self): + return False + + def _write(self, msg): + msg = bytearray(msg) + while len(msg): + to_send = min(63, len(msg)) + + #print [to_send,] + list(msg[:to_send]) + self.hid.write([to_send,] + list(msg[:to_send])) + + msg = msg[to_send:] + + def _read(self): + (msg_type, datalen) = self._read_headers(self._raw_read) + return (msg_type, self._raw_read(datalen)) + + def _raw_read(self, length): + while len(self.buffer) < length: + data = self.hid.read(64) + report_id = data[0] + + if report_id > 63: + # Command report + raise Exception("Not implemented") + + # Payload received + self.buffer += str(bytearray(data[1:report_id+1])) + + ret = self.buffer[:length] + self.buffer = self.buffer[length:] + return ret \ No newline at end of file From c0d267e7d81a8c1b1b706e7248a128572ee5ee4e Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 10 Mar 2013 17:52:04 +0100 Subject: [PATCH 0048/1535] Fixes reading of message headers --- bitkeylib/transport_hid.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/bitkeylib/transport_hid.py b/bitkeylib/transport_hid.py index 561ae8669..dc77714f5 100644 --- a/bitkeylib/transport_hid.py +++ b/bitkeylib/transport_hid.py @@ -9,6 +9,14 @@ DEVICE_IDS = [ (0x08f7, 0x0002), # EasyTemp ] +class FakeRead(object): + # Let's pretend we have a file-like interface + def __init__(self, func): + self.func = func + + def read(self, size): + return self.func(size) + class HidTransport(Transport): def __init__(self, device, *args, **kwargs): self.hid = None @@ -51,7 +59,7 @@ class HidTransport(Transport): msg = msg[to_send:] def _read(self): - (msg_type, datalen) = self._read_headers(self._raw_read) + (msg_type, datalen) = self._read_headers(FakeRead(self._raw_read)) return (msg_type, self._raw_read(datalen)) def _raw_read(self, length): From a2ad820ac105c995edd37641deac019807d9c727 Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 10 Mar 2013 17:52:36 +0100 Subject: [PATCH 0049/1535] Removed unused FakeRead --- bitkeylib/transport_socket.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/bitkeylib/transport_socket.py b/bitkeylib/transport_socket.py index dd47793b6..a89737b25 100644 --- a/bitkeylib/transport_socket.py +++ b/bitkeylib/transport_socket.py @@ -4,15 +4,6 @@ import socket from select import select from transport import Transport -class FakeRead(object): - # Because socket is the only transport which don't implement read() - - def __init__(self, socket): - self.socket = socket - - def read(self, size): - return self.socket.recv(size) - class SocketTransportClient(Transport): def __init__(self, device, *args, **kwargs): device = device.split(':') @@ -94,7 +85,7 @@ class SocketTransport(Transport): if len(rlist) > 0: (self.client, ipaddr) = self.socket.accept() print "Connected", ipaddr[0] - self.filelike = self.client.makefile()#FakeRead(self.client)#self.client.makefile() + self.filelike = self.client.makefile() return self.ready_to_read() return False From 8cd7c1aa0a376d47b75c7635f0743eb4c68d708d Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 18 Mar 2013 16:44:59 +0100 Subject: [PATCH 0050/1535] add gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..0d20b6487 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.pyc From 5d1e1a79aed569367d6d35d9c26d8cf43939d2e1 Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 1 Apr 2013 16:59:16 +0200 Subject: [PATCH 0051/1535] Working HID transport --- bitkeylib/transport_hid.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/bitkeylib/transport_hid.py b/bitkeylib/transport_hid.py index dc77714f5..52caa311c 100644 --- a/bitkeylib/transport_hid.py +++ b/bitkeylib/transport_hid.py @@ -32,13 +32,16 @@ class HidTransport(Transport): serial_number = d.get('serial_number') if (vendor_id, product_id) in DEVICE_IDS: - devices.append((vendor_id, product_id, serial_number)) + devices.append("0x%04x:0x%04x:%s" % (vendor_id, product_id, serial_number)) return devices def _open(self): self.buffer = '' - self.hid = hid.device(self.device[0], self.device[1])#, self.device[2]) + path = self.device.split(':') + self.hid = hid.device(int(path[0], 16), int(path[1], 16))#, path[2]) + self.hid.send_feature_report([0x41, 0x01]) # enable UART + self.hid.send_feature_report([0x43, 0x03]) # purge TX/RX FIFOs def _close(self): self.hid.close() @@ -76,4 +79,4 @@ class HidTransport(Transport): ret = self.buffer[:length] self.buffer = self.buffer[length:] - return ret \ No newline at end of file + return ret From 5f381bd9367d8640349f451b5fe9d89f7d963381 Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 1 Apr 2013 16:59:42 +0200 Subject: [PATCH 0052/1535] Enabled HID transport, 'list' command enumerates HID devices --- cmd.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/cmd.py b/cmd.py index 9f97715ef..6aa08b7fd 100755 --- a/cmd.py +++ b/cmd.py @@ -36,13 +36,15 @@ def parse_args(commands): item.add_argument(*arg[0], **arg[1]) item.set_defaults(func=func) + item.set_defaults(cmd=cmd) return parser.parse_args() def get_transport(transport_string, path): if transport_string == 'usb': - raise NotImplemented("USB HID transport not implemented yet") - + from bitkeylib.transport_hid import HidTransport + return HidTransport(path) + if transport_string == 'serial': from bitkeylib.transport_serial import SerialTransport return SerialTransport(path) @@ -68,7 +70,11 @@ class Commands(object): @classmethod def _list_commands(cls): return [ x for x in dir(cls) if not x.startswith('_') ] - + + def list(self, args): + # Fake method for advertising 'list' command + pass + def get_address(self, args): return self.client.get_address(args.n) def get_entropy(self, args): @@ -85,6 +91,7 @@ class Commands(object): return self.client.load_device(seed, args.otp, args.pin, args.spv) + list.help = 'List connected Trezor USB devices' get_address.help = 'Get bitcoin address in base58 encoding' get_entropy.help = 'Get example entropy' get_uuid.help = 'Get device\'s unique identifier' @@ -108,7 +115,17 @@ class Commands(object): def main(): args = parse_args(Commands) - + + if args.cmd == 'list': + from bitkeylib.transport_hid import HidTransport + devices = HidTransport.enumerate() + if args.json: + print json.dumps(devices) + else: + for dev in devices: + print dev + return + transport = get_transport(args.transport, args.path) if args.debug: debuglink_transport = get_transport(args.debuglink_transport, args.debuglink_path) @@ -135,4 +152,4 @@ def main(): print res if __name__ == '__main__': - main() \ No newline at end of file + main() From 1ae4ab42f8677754d380713e4ba5f12e664dc612 Mon Sep 17 00:00:00 2001 From: slush Date: Fri, 5 Apr 2013 17:11:53 +0200 Subject: [PATCH 0053/1535] Refactored protobuf --- bitkeylib/bitkey_pb2.py | 191 ++++++++++++++++++---------------------- 1 file changed, 84 insertions(+), 107 deletions(-) diff --git a/bitkeylib/bitkey_pb2.py b/bitkeylib/bitkey_pb2.py index a998fcb0c..88a818f22 100644 --- a/bitkeylib/bitkey_pb2.py +++ b/bitkeylib/bitkey_pb2.py @@ -11,7 +11,7 @@ from google.protobuf import descriptor_pb2 DESCRIPTOR = descriptor.FileDescriptor( name='bitkey.proto', package='', - serialized_pb='\n\x0c\x62itkey.proto\" \n\nInitialize\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\"\xc4\x01\n\x08\x46\x65\x61tures\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x0b\n\x03otp\x18\x05 \x01(\x08\x12\x0b\n\x03pin\x18\x06 \x01(\x08\x12\x0b\n\x03spv\x18\x07 \x01(\x08\x12\x11\n\tmaxfee_kb\x18\x08 \x01(\x04\x12\x18\n\x04\x61lgo\x18\t \x03(\x0e\x32\n.Algorithm\x12\x12\n\ndebug_link\x18\n \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"K\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03otp\x18\x02 \x01(\x08\x12\x0b\n\x03pin\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Z\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x14\n\x03otp\x18\x02 \x01(\x0b\x32\x07.OtpAck\x12\x14\n\x03pin\x18\x03 \x01(\x0b\x32\x07.PinAck\x12\x0c\n\x04seed\x18\x04 \x01(\t\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"\x1d\n\nOtpRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06OtpAck\x12\x0b\n\x03otp\x18\x01 \x02(\t\"\x0b\n\tOtpCancel\"\x1d\n\nPinRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06PinAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x0b\n\tPinCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"5\n\x12GetMasterPublicKey\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"@\n\nGetAddress\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x11\n\taddress_n\x18\x02 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"M\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\t\x12\x11\n\x03otp\x18\x02 \x01(\x08:\x04true\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x11\n\x03spv\x18\x04 \x01(\x08:\x04true\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"f\n\x06SignTx\x12\x1f\n\x04\x61lgo\x18\x01 \x02(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\x12\x0e\n\x06random\x18\x06 \x01(\x0c\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*$\n\tAlgorithm\x12\t\n\x05\x42IP32\x10\x00\x12\x0c\n\x08\x45LECTRUM\x10\x01*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01') + serialized_pb='\n\x0c\x62itkey.proto\" \n\nInitialize\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\"\xdc\x01\n\x08\x46\x65\x61tures\x12\x12\n\nsession_id\x18\x01 \x01(\x0c\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x0f\n\x07has_otp\x18\x05 \x01(\x08\x12\x0f\n\x07has_spv\x18\x06 \x01(\x08\x12\x0b\n\x03pin\x18\x07 \x01(\x08\x12\x18\n\x04\x61lgo\x18\x08 \x01(\x0e\x32\n.Algorithm\x12\"\n\x0e\x61lgo_available\x18\t \x03(\x0e\x32\n.Algorithm\x12\x11\n\tmaxfee_kb\x18\n \x01(\x04\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"K\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03otp\x18\x02 \x01(\x08\x12\x0b\n\x03pin\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Z\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x14\n\x03otp\x18\x02 \x01(\x0b\x32\x07.OtpAck\x12\x14\n\x03pin\x18\x03 \x01(\x0b\x32\x07.PinAck\x12\x0c\n\x04seed\x18\x04 \x01(\t\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"\x1d\n\nOtpRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06OtpAck\x12\x0b\n\x03otp\x18\x01 \x02(\t\"\x0b\n\tOtpCancel\"\x1d\n\nPinRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06PinAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x0b\n\tPinCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"\x14\n\x12GetMasterPublicKey\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"M\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\t\x12\x11\n\x03otp\x18\x02 \x01(\x08:\x04true\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x11\n\x03spv\x18\x04 \x01(\x08:\x04true\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"E\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\x12\x0e\n\x06random\x18\x06 \x01(\x0c\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*$\n\tAlgorithm\x12\t\n\x05\x42IP32\x10\x00\x12\x0c\n\x08\x45LECTRUM\x10\x01*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01') _ALGORITHM = descriptor.EnumDescriptor( name='Algorithm', @@ -30,8 +30,8 @@ _ALGORITHM = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1640, - serialized_end=1676, + serialized_start=1565, + serialized_end=1601, ) @@ -52,8 +52,8 @@ _SCRIPTTYPE = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1678, - serialized_end=1729, + serialized_start=1603, + serialized_end=1654, ) @@ -74,8 +74,8 @@ _REQUESTTYPE = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1731, - serialized_end=1771, + serialized_start=1656, + serialized_end=1696, ) @@ -125,7 +125,7 @@ _FEATURES = descriptor.Descriptor( fields=[ descriptor.FieldDescriptor( name='session_id', full_name='Features.session_id', index=0, - number=1, type=12, cpp_type=9, label=2, + number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -152,44 +152,44 @@ _FEATURES = descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='otp', full_name='Features.otp', index=4, + name='has_otp', full_name='Features.has_otp', index=4, number=5, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='pin', full_name='Features.pin', index=5, + name='has_spv', full_name='Features.has_spv', index=5, number=6, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='spv', full_name='Features.spv', index=6, + name='pin', full_name='Features.pin', index=6, number=7, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='maxfee_kb', full_name='Features.maxfee_kb', index=7, - number=8, type=4, cpp_type=4, label=1, + name='algo', full_name='Features.algo', index=7, + number=8, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='algo', full_name='Features.algo', index=8, + name='algo_available', full_name='Features.algo_available', index=8, number=9, type=14, cpp_type=8, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='debug_link', full_name='Features.debug_link', index=9, - number=10, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, + name='maxfee_kb', full_name='Features.maxfee_kb', index=9, + number=10, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -203,7 +203,7 @@ _FEATURES = descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=51, - serialized_end=247, + serialized_end=271, ) @@ -230,8 +230,8 @@ _PING = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=249, - serialized_end=272, + serialized_start=273, + serialized_end=296, ) @@ -258,8 +258,8 @@ _DEBUGLINKDECISION = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=274, - serialized_end=309, + serialized_start=298, + serialized_end=333, ) @@ -307,8 +307,8 @@ _DEBUGLINKGETSTATE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=311, - serialized_end=386, + serialized_start=335, + serialized_end=410, ) @@ -356,8 +356,8 @@ _DEBUGLINKSTATE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=388, - serialized_end=478, + serialized_start=412, + serialized_end=502, ) @@ -384,8 +384,8 @@ _SUCCESS = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=480, - serialized_end=506, + serialized_start=504, + serialized_end=530, ) @@ -419,8 +419,8 @@ _FAILURE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=508, - serialized_end=548, + serialized_start=532, + serialized_end=572, ) @@ -440,8 +440,8 @@ _GETUUID = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=550, - serialized_end=559, + serialized_start=574, + serialized_end=583, ) @@ -468,8 +468,8 @@ _UUID = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=561, - serialized_end=581, + serialized_start=585, + serialized_end=605, ) @@ -489,8 +489,8 @@ _BUTTONREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=583, - serialized_end=598, + serialized_start=607, + serialized_end=622, ) @@ -510,8 +510,8 @@ _BUTTONACK = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=600, - serialized_end=611, + serialized_start=624, + serialized_end=635, ) @@ -531,8 +531,8 @@ _BUTTONCANCEL = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=613, - serialized_end=627, + serialized_start=637, + serialized_end=651, ) @@ -559,8 +559,8 @@ _OTPREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=629, - serialized_end=658, + serialized_start=653, + serialized_end=682, ) @@ -587,8 +587,8 @@ _OTPACK = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=660, - serialized_end=681, + serialized_start=684, + serialized_end=705, ) @@ -608,8 +608,8 @@ _OTPCANCEL = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=683, - serialized_end=694, + serialized_start=707, + serialized_end=718, ) @@ -636,8 +636,8 @@ _PINREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=696, - serialized_end=725, + serialized_start=720, + serialized_end=749, ) @@ -664,8 +664,8 @@ _PINACK = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=727, - serialized_end=748, + serialized_start=751, + serialized_end=772, ) @@ -685,8 +685,8 @@ _PINCANCEL = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=750, - serialized_end=761, + serialized_start=774, + serialized_end=785, ) @@ -713,8 +713,8 @@ _GETENTROPY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=763, - serialized_end=789, + serialized_start=787, + serialized_end=813, ) @@ -741,8 +741,8 @@ _ENTROPY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=791, - serialized_end=817, + serialized_start=815, + serialized_end=841, ) @@ -769,8 +769,8 @@ _SETMAXFEEKB = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=819, - serialized_end=851, + serialized_start=843, + serialized_end=875, ) @@ -781,13 +781,6 @@ _GETMASTERPUBLICKEY = descriptor.Descriptor( file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( - name='algo', full_name='GetMasterPublicKey.algo', index=0, - number=1, type=14, cpp_type=8, label=2, - has_default_value=True, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -797,8 +790,8 @@ _GETMASTERPUBLICKEY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=853, - serialized_end=906, + serialized_start=877, + serialized_end=897, ) @@ -825,8 +818,8 @@ _MASTERPUBLICKEY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=908, - serialized_end=938, + serialized_start=899, + serialized_end=929, ) @@ -838,15 +831,8 @@ _GETADDRESS = descriptor.Descriptor( containing_type=None, fields=[ descriptor.FieldDescriptor( - name='algo', full_name='GetAddress.algo', index=0, - number=1, type=14, cpp_type=8, label=2, - has_default_value=True, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='address_n', full_name='GetAddress.address_n', index=1, - number=2, type=13, cpp_type=3, label=3, + name='address_n', full_name='GetAddress.address_n', index=0, + number=1, type=13, cpp_type=3, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -860,8 +846,8 @@ _GETADDRESS = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=940, - serialized_end=1004, + serialized_start=931, + serialized_end=962, ) @@ -888,8 +874,8 @@ _ADDRESS = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1006, - serialized_end=1032, + serialized_start=964, + serialized_end=990, ) @@ -937,8 +923,8 @@ _LOADDEVICE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1034, - serialized_end=1111, + serialized_start=992, + serialized_end=1069, ) @@ -965,8 +951,8 @@ _RESETDEVICE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1113, - serialized_end=1142, + serialized_start=1071, + serialized_end=1100, ) @@ -978,28 +964,21 @@ _SIGNTX = descriptor.Descriptor( containing_type=None, fields=[ descriptor.FieldDescriptor( - name='algo', full_name='SignTx.algo', index=0, - number=1, type=14, cpp_type=8, label=2, - has_default_value=True, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='outputs_count', full_name='SignTx.outputs_count', index=1, + name='outputs_count', full_name='SignTx.outputs_count', index=0, number=3, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='inputs_count', full_name='SignTx.inputs_count', index=2, + name='inputs_count', full_name='SignTx.inputs_count', index=1, number=5, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='random', full_name='SignTx.random', index=3, + name='random', full_name='SignTx.random', index=2, number=6, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, @@ -1014,8 +993,8 @@ _SIGNTX = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1144, - serialized_end=1246, + serialized_start=1102, + serialized_end=1171, ) @@ -1070,8 +1049,8 @@ _TXREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1249, - serialized_end=1383, + serialized_start=1174, + serialized_end=1308, ) @@ -1133,8 +1112,8 @@ _TXINPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1385, - serialized_end=1503, + serialized_start=1310, + serialized_end=1428, ) @@ -1196,16 +1175,14 @@ _TXOUTPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1506, - serialized_end=1638, + serialized_start=1431, + serialized_end=1563, ) _FEATURES.fields_by_name['algo'].enum_type = _ALGORITHM +_FEATURES.fields_by_name['algo_available'].enum_type = _ALGORITHM _DEBUGLINKSTATE.fields_by_name['otp'].message_type = _OTPACK _DEBUGLINKSTATE.fields_by_name['pin'].message_type = _PINACK -_GETMASTERPUBLICKEY.fields_by_name['algo'].enum_type = _ALGORITHM -_GETADDRESS.fields_by_name['algo'].enum_type = _ALGORITHM -_SIGNTX.fields_by_name['algo'].enum_type = _ALGORITHM _TXREQUEST.fields_by_name['request_type'].enum_type = _REQUESTTYPE _TXOUTPUT.fields_by_name['script_type'].enum_type = _SCRIPTTYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE From d0bc74ff21b7be05b551e184c4dc6a7d59ee5664 Mon Sep 17 00:00:00 2001 From: slush Date: Fri, 5 Apr 2013 17:12:18 +0200 Subject: [PATCH 0054/1535] Removed algorithm switching --- cmd.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/cmd.py b/cmd.py index 6aa08b7fd..6f5a74637 100755 --- a/cmd.py +++ b/cmd.py @@ -9,7 +9,6 @@ from bitkeylib.debuglink import DebugLink def parse_args(commands): parser = argparse.ArgumentParser(description='Commandline tool for Bitkey devices.') - parser.add_argument('-a', '--algorithm', dest='algorithm', choices=['bip32', 'electrum'], default='bip32', help='Key derivation algorithm') parser.add_argument('-t', '--transport', dest='transport', choices=['usb', 'serial', 'pipe', 'socket'], default='serial', help="Transport used for talking with the device") parser.add_argument('-p', '--path', dest='path', default='/dev/ttyAMA0', help="Path used by the transport (usually serial port)") parser.add_argument('-dt', '--debuglink-transport', dest='debuglink_transport', choices=['usb', 'serial', 'pipe', 'socket'], default='socket', help="Debuglink transport") @@ -132,15 +131,8 @@ def main(): debuglink = DebugLink(debuglink_transport) else: debuglink = None - - if args.algorithm == 'electrum': - algo = proto.ELECTRUM - elif args.algorithm == 'bip32': - algo = proto.BIP32 - else: - raise Exception("Unknown algorithm") - - client = BitkeyClient(transport, debuglink=debuglink, algo=algo) + + client = BitkeyClient(transport, debuglink=debuglink) client.setup_debuglink(button=True, otp_correct=True, pin_correct=True) cmds = Commands(client) From ea3c8eaef0a88ea04f0937e1faa983061ea96101 Mon Sep 17 00:00:00 2001 From: slush Date: Fri, 5 Apr 2013 17:12:43 +0200 Subject: [PATCH 0055/1535] Refactored protobuf --- protobuf/bitkey.proto | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/protobuf/bitkey.proto b/protobuf/bitkey.proto index 8364a4f04..9e18b6b5e 100644 --- a/protobuf/bitkey.proto +++ b/protobuf/bitkey.proto @@ -31,16 +31,16 @@ message Initialize { // Response object for Initialize. Contains list of available features on the device. message Features { - required bytes session_id = 1; // Echoed back from Initialize message + optional bytes session_id = 1; // Echoed back from Initialize message optional string vendor = 2; // Name of the manufacturer, e.g. "bitkey" optional uint32 major_version = 3; // Major version of the device, e.g. 1 optional uint32 minor_version = 4; // Minor version of the device, e.g. 0 - optional bool otp = 5; // True when device will send OtpRequest on important action - optional bool pin = 6; // True when device will send PinRequest on important action - optional bool spv = 7; // True when device requires SPV verification of transaction inputs - optional uint64 maxfee_kb = 8; // Maximum accepted fee per kilobyte of signed transaction - repeated Algorithm algo = 9; // List of key generation algorithms supported by the device - optional bool debug_link = 10; // Indicates support for DebugLink connection + optional bool has_otp = 5; // True when device will send OtpRequest on important action + optional bool has_spv = 6; // True when device requires SPV verification of transaction inputs + optional bool pin = 7; // True when device will send PinRequest on important action + optional Algorithm algo = 8; // Choosen generation algorithm + repeated Algorithm algo_available = 9; // List of key generation algorithms supported by the device + optional uint64 maxfee_kb = 10; // Maximum accepted fee per kilobyte of signed transaction } // Test if device is live, device will send back the message on success @@ -180,7 +180,6 @@ message SetMaxFeeKb { // // Response: MasterPublicKey, Failure message GetMasterPublicKey { - required Algorithm algo = 1 [default=BIP32]; // Used algorithm for generating the master public key } // Contains master public key derived from device's seed. @@ -189,12 +188,11 @@ message MasterPublicKey { } message GetAddress { - required Algorithm algo = 1 [default=BIP32]; // Used algorithm for generating the address - repeated uint32 address_n = 2; // Parameter for address generation algorithm to derive the address from the master public key + repeated uint32 address_n = 1; // Parameter for address generation algorithm to derive the address from the master public key } message Address { - required string address = 1; // Bitcoin address in base58 encoding corresponding to GetAddress(algo, n) call + required string address = 1; // Bitcoin address in base58 encoding corresponding to GetAddress(n) call } // Load seed and related internal settings from computer to the device. Existing seed is overwritten. @@ -220,7 +218,6 @@ message ResetDevice { // // Response: TxRequest, OtpRequest, PinRequest, Failure message SignTx { - required Algorithm algo = 1 [default=BIP32]; // Algorithm using for key generation algorithm required uint32 outputs_count = 3; // Count of outputs of the transaction required uint32 inputs_count = 5; // Count of inputs of the transaction optional bytes random = 6; // Provide additional entropy for signing function. @@ -234,7 +231,7 @@ message SignTx { message TxRequest { optional int32 request_index = 1; // If >=0, device expects TxInput/TxOutput message from the computer optional RequestType request_type = 2; // Ask for TxInput or TxOutput? - optional int32 signed_index = 3 [default=-1]; // If >=0, 'signature' contains signed input of this input + optional int32 signed_index = 3; // If >=0, 'signature' contains signed input of this input optional bytes signature = 4; // If signed_index>=0, represent signature of the signed_index input optional bytes serialized_tx = 5; // Part of serialized and signed transaction } From d363c2448d2fd978dc181a0d7727b207bd00d6d5 Mon Sep 17 00:00:00 2001 From: slush Date: Fri, 5 Apr 2013 17:12:54 +0200 Subject: [PATCH 0056/1535] Removed 'algorithm' from protobuf --- bitkeylib/client.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index 3142f414d..b65e1de4d 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -23,13 +23,11 @@ class OtpException(CallException): class BitkeyClient(object): - def __init__(self, transport, debuglink=None, - algo=proto.BIP32, + def __init__(self, transport, debuglink=None, message_func=show_message, input_func=show_input, debug=False): self.transport = transport self.debuglink = debuglink - self.algo = algo self.message_func = message_func self.input_func = input_func self.debug = debug @@ -50,11 +48,11 @@ class BitkeyClient(object): if self.master_public_key: return self.master_public_key - self.master_public_key = self.call(proto.GetMasterPublicKey(algo=self.algo)).key + self.master_public_key = self.call(proto.GetMasterPublicKey()).key return self.master_public_key def get_address(self, n): - return self.call(proto.GetAddress(algo=self.algo, address_n=n)).address + return self.call(proto.GetAddress(address_n=n)).address def get_entropy(self, size): return self.call(proto.GetEntropy(size=size)).entropy @@ -155,7 +153,6 @@ class BitkeyClient(object): # Prepare and send initial message tx = proto.SignTx() - tx.algo = self.algo # Choose BIP32 or ELECTRUM way for deterministic keys tx.random = self._get_local_entropy() # Provide additional entropy to the device tx.inputs_count = len(inputs) tx.outputs_count = len(outputs) From a6f0657de7348c4bd3e42b9711a7f06d62ced5f6 Mon Sep 17 00:00:00 2001 From: slush Date: Fri, 5 Apr 2013 17:13:29 +0200 Subject: [PATCH 0057/1535] Fixes workflow for failed test --- tests/common.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/common.py b/tests/common.py index cf4f16964..6d13562d7 100644 --- a/tests/common.py +++ b/tests/common.py @@ -20,5 +20,6 @@ class BitkeyTest(unittest.TestCase): print "--------------" def tearDown(self): + self.bitkey.init_device() self.debug_transport.close() self.transport.close() \ No newline at end of file From 4b9a6675c7fd48007c4e9f80fff799bf60fe654c Mon Sep 17 00:00:00 2001 From: slush Date: Fri, 5 Apr 2013 17:13:57 +0200 Subject: [PATCH 0058/1535] SignTx test --- tests/config.py | 16 +++-- tests/test_signtx.py | 156 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 156 insertions(+), 16 deletions(-) diff --git a/tests/config.py b/tests/config.py index 00be0cbec..2175ea8a1 100644 --- a/tests/config.py +++ b/tests/config.py @@ -2,9 +2,17 @@ import sys sys.path = ['../',] + sys.path from bitkeylib.transport_pipe import PipeTransport +from bitkeylib.transport_hid import HidTransport +from bitkeylib.transport_socket import SocketTransportClient -TRANSPORT = PipeTransport -TRANSPORT_ARGS = ('../../bitkey-python/pipe', False) +#TRANSPORT = PipeTransport +#TRANSPORT_ARGS = ('../../bitkey-python/pipe', False) +TRANSPORT = HidTransport +TRANSPORT_ARGS = ('0x10c4:0xea80:000868D3', False) +#TRANSPORT = SocketTransportClient +#TRANSPORT_ARGS = ('trezor.dyn:3000', False) -DEBUG_TRANSPORT = PipeTransport -DEBUG_TRANSPORT_ARGS = ('../../bitkey-python/pipe.debug', False) +#DEBUG_TRANSPORT = PipeTransport +#DEBUG_TRANSPORT_ARGS = ('../../bitkey-python/pipe.debug', False) +DEBUG_TRANSPORT = SocketTransportClient +DEBUG_TRANSPORT_ARGS = ('trezor.dyn:2000', False) diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 0ed88e0a3..171748686 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -1,16 +1,64 @@ import unittest import common +import binascii import bitkeylib.bitkey_pb2 as proto +''' +./electrum -w ~/.electrum-bitkey mktx 1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv 0.001 +--fromaddr 13jqMdrZAzMYkaFqHGv5GbJavdZpoKDkSL --changeaddr 17GpAFnkHRjWKePkX4kxHaHy49V8EHTr7i --fee 0.0005 + +01000000012de70f7d6ffed0db70f8882f3fca90db9bb09f0e99bce27468c23d3c994fcd56 +010000008b4830450221009b985e14d53cfeed3496846db6ddaa77a0206138d0df4c2ccd3b +759e91bae3e1022004c76e10f99ccac8ced761719181a96bae25a74829eab3ecb8f29eb07f +e18f7e01410436ae8595f03a7324d1d1482ede8560a4508c767fbc662559482d5759b32209 +a62964699995f6e018cfbeb7a71a66d4c64fa38875d79ead0a9ac66f59c1c8b3a3ffffffff +0250c30000000000001976a91444ce5c6789b0bb0e8a9ab9a4769fe181cb274c4688aca086 +0100000000001976a9149e03078026388661b197129a43f0f64f88379ce688ac00000000 +''' class TestSignTx(common.BitkeyTest): def test_signtx(self): + expected_tx = '01000000012de70f7d6ffed0db70f8882f3fca90db9bb09f0e99bce27468c23d3c994fcd56' \ + '010000008b4830450221009b985e14d53cfeed3496846db6ddaa77a0206138d0df4c2ccd3b' \ + '759e91bae3e1022004c76e10f99ccac8ced761719181a96bae25a74829eab3ecb8f29eb07f' \ + 'e18f7e01410436ae8595f03a7324d1d1482ede8560a4508c767fbc662559482d5759b32209' \ + 'a62964699995f6e018cfbeb7a71a66d4c64fa38875d79ead0a9ac66f59c1c8b3a3ffffffff' \ + '0250c30000000000001976a91444ce5c6789b0bb0e8a9ab9a4769fe181cb274c4688aca086' \ + '0100000000001976a9149e03078026388661b197129a43f0f64f88379ce688ac00000000' + + inp1 = proto.TxInput(index=0, + address_n=[1,0], + amount=200000, # 0.002 BTC + prev_hash=binascii.unhexlify('56cd4f993c3dc26874e2bc990e9fb09bdb90ca3f2f88f870dbd0fe6f7d0fe72d'), + prev_index=1, + #script_sig= + ) + + out1 = proto.TxOutput(index=0, + address='17GpAFnkHRjWKePkX4kxHaHy49V8EHTr7i', + address_n=[0, 1], + amount=50000, # 0.0005 BTC + script_type=proto.PAYTOADDRESS, + #script_args= + ) + + out2 = proto.TxOutput(index=1, + address='1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv', + #address_n=[], + amount=100000, # 0.001 BTC + script_type=proto.PAYTOADDRESS, + #script_args= + ) + + print binascii.hexlify(self.bitkey.sign_tx([inp1], [out1, out2])[1]) + + ''' + def test_workflow(self): inp1 = proto.TxInput(index=0, address_n=[1,0], amount=100000000, prev_hash='prevhash1234354346543456543654', prev_index=11, - #script_sig= ) inp2 = proto.TxInput(index=1, @@ -18,15 +66,12 @@ class TestSignTx(common.BitkeyTest): amount=100000000, prev_hash='prevhash2222254346543456543654', prev_index=11, - #script_sig= ) out1 = proto.TxOutput(index=0, address='1BitkeyP2nDd5oa647AjvBbbwST54W5Zmx', - #address_n=[], amount=100000000, script_type=proto.PAYTOADDRESS, - #script_args= ) out2 = proto.TxOutput(index=1, @@ -37,14 +82,101 @@ class TestSignTx(common.BitkeyTest): #script_args= ) - out3 = proto.TxOutput(index=2, - address='1MVgq4XaMX7PmohkYzFEisH1D7uxTiPbFK', - address_n=[2, 1], - amount=100000000, - script_type=proto.PAYTOADDRESS, - #script_args= - ) - print self.bitkey.sign_tx([inp1, inp2], [out1, out2, out3]) + serialized = '' + + # Prepare and send initial message + tx = proto.SignTx() + tx.algo = proto.ELECTRUM + tx.random = self.bitkey._get_local_entropy() + tx.inputs_count = 2 + tx.outputs_count = 2 + + res = self.bitkey.call(tx) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXINPUT) + self.assertEqual(res.request_index, 0) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + # FIRST SIGNATURE + res = self.bitkey.call(inp1) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXINPUT) + self.assertEqual(res.request_index, 1) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + res = self.bitkey.call(inp2) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, 0) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + res = self.bitkey.call(out1) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, 1) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + res = self.bitkey.call(out2) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXINPUT) + self.assertEqual(res.request_index, 0) + self.assertNotEqual(res.signature, '') + self.assertNotEqual(res.serialized_tx, '') + serialized += res.serialized_tx + + # SECOND SIGNATURE + res = self.bitkey.call(inp1) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXINPUT) + self.assertEqual(res.request_index, 1) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + res = self.bitkey.call(inp2) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, 0) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + res = self.bitkey.call(out1) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, 1) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + res = self.bitkey.call(out2) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, 0) + self.assertNotEqual(res.signature, '') + self.assertNotEqual(res.serialized_tx, '') + serialized += res.serialized_tx + + # FINALIZING OUTPUTS + res = self.bitkey.call(out1) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, 1) + self.assertEqual(res.signature, '') + self.assertNotEqual(res.serialized_tx, '') + serialized += res.serialized_tx + + res = self.bitkey.call(out2) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, -1) + self.assertEqual(res.signature, '') + self.assertNotEqual(res.serialized_tx, '') + serialized += res.serialized_tx + + print binascii.hexlify(serialized) + ''' if __name__ == '__main__': unittest.main() \ No newline at end of file From 29bd7a10f8dfd7365606c3c8677f5ab69dad34bb Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 15 Apr 2013 19:57:36 +0200 Subject: [PATCH 0059/1535] Tests fixed to work with latest sources --- tests/common.py | 7 ++++--- tests/config.py | 19 +++++++++++-------- tests/test_addresses.py | 6 ++++-- tests/test_protect_call.py | 21 +++++++++++++-------- 4 files changed, 32 insertions(+), 21 deletions(-) diff --git a/tests/common.py b/tests/common.py index 6d13562d7..d48e38f24 100644 --- a/tests/common.py +++ b/tests/common.py @@ -9,11 +9,12 @@ class BitkeyTest(unittest.TestCase): def setUp(self): self.debug_transport = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS) self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) - self.bitkey = BitkeyClient(self.transport, DebugLink(self.debug_transport), algo=proto.ELECTRUM, debug=True) + self.bitkey = BitkeyClient(self.transport, DebugLink(self.debug_transport), debug=True) self.bitkey.setup_debuglink(button=True, pin_correct=True, otp_correct=True) - self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + self.bitkey.load_device(algo=proto.ELECTRUM, + seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', otp=True, pin='1234', spv=True) print "Setup finished" @@ -22,4 +23,4 @@ class BitkeyTest(unittest.TestCase): def tearDown(self): self.bitkey.init_device() self.debug_transport.close() - self.transport.close() \ No newline at end of file + self.transport.close() diff --git a/tests/config.py b/tests/config.py index 2175ea8a1..9113cb510 100644 --- a/tests/config.py +++ b/tests/config.py @@ -5,14 +5,17 @@ from bitkeylib.transport_pipe import PipeTransport from bitkeylib.transport_hid import HidTransport from bitkeylib.transport_socket import SocketTransportClient -#TRANSPORT = PipeTransport -#TRANSPORT_ARGS = ('../../bitkey-python/pipe', False) -TRANSPORT = HidTransport -TRANSPORT_ARGS = ('0x10c4:0xea80:000868D3', False) +TRANSPORT = PipeTransport +TRANSPORT_ARGS = ('../../bitkey-python/bitkey.pipe', False) + +#TRANSPORT = HidTransport +#TRANSPORT_ARGS = ('0x10c4:0xea80:000868D3', False) + #TRANSPORT = SocketTransportClient #TRANSPORT_ARGS = ('trezor.dyn:3000', False) -#DEBUG_TRANSPORT = PipeTransport -#DEBUG_TRANSPORT_ARGS = ('../../bitkey-python/pipe.debug', False) -DEBUG_TRANSPORT = SocketTransportClient -DEBUG_TRANSPORT_ARGS = ('trezor.dyn:2000', False) +DEBUG_TRANSPORT = PipeTransport +DEBUG_TRANSPORT_ARGS = ('../../bitkey-python/bitkey_debug.pipe', False) + +#DEBUG_TRANSPORT = SocketTransportClient +#DEBUG_TRANSPORT_ARGS = ('trezor.dyn:2000', False) diff --git a/tests/test_addresses.py b/tests/test_addresses.py index b56f25b76..8a0113a9a 100644 --- a/tests/test_addresses.py +++ b/tests/test_addresses.py @@ -5,7 +5,8 @@ import bitkeylib.bitkey_pb2 as proto class TestAddresses(common.BitkeyTest): def test_electrum_address(self): - self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + self.bitkey.load_device(algo=proto.ELECTRUM, + seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', otp=False, pin='', spv=False) self.bitkey.algo = proto.ELECTRUM @@ -15,7 +16,8 @@ class TestAddresses(common.BitkeyTest): self.assertEqual(self.bitkey.get_address([9, 0]), "1C9DHmWBpvGcFKXEiWWC3EK3EY5Bj79nze") def test_electrum_change_address(self): - self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + self.bitkey.load_device(algo=proto.ELECTRUM, + seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', otp=False, pin='', spv=False) self.bitkey.algo = proto.ELECTRUM diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index dac476de3..1efc0f9ab 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -2,6 +2,7 @@ import unittest import common from bitkeylib.client import CallException, PinException, OtpException +from bitkeylib import proto class TestProtectCall(common.BitkeyTest): def _some_protected_call(self): @@ -11,34 +12,38 @@ class TestProtectCall(common.BitkeyTest): self.assertEqual(len(entropy), entropy_len) def test_no_protection(self): - self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + self.bitkey.load_device(algo=proto.ELECTRUM, + seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', otp=False, pin='', spv=False) - self.assertEqual(self.bitkey.features.otp, False) + self.assertEqual(self.bitkey.features.has_otp, False) self.assertEqual(self.bitkey.features.pin, False) self._some_protected_call() def test_otp_only(self): - self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + self.bitkey.load_device(algo=proto.ELECTRUM, + seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', otp=True, pin='', spv=False) - self.assertEqual(self.bitkey.features.otp, True) + self.assertEqual(self.bitkey.features.has_otp, True) self.assertEqual(self.bitkey.features.pin, False) self._some_protected_call() def test_pin_only(self): - self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + self.bitkey.load_device(algo=proto.ELECTRUM, + seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', otp=False, pin='2345', spv=False) - self.assertEqual(self.bitkey.features.otp, False) + self.assertEqual(self.bitkey.features.has_otp, False) self.assertEqual(self.bitkey.features.pin, True) self._some_protected_call() def test_both(self): - self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + self.bitkey.load_device(algo=proto.ELECTRUM, + seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', otp=True, pin='3456', spv=False) - self.assertEqual(self.bitkey.features.otp, True) + self.assertEqual(self.bitkey.features.has_otp, True) self.assertEqual(self.bitkey.features.pin, True) self._some_protected_call() From 0af7a672f080f3d33e1a74b9a0df242dea1db427 Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 15 Apr 2013 19:58:07 +0200 Subject: [PATCH 0060/1535] Updated protobuf files --- bitkeylib/bitkey_pb2.py | 62 +++++++++++++++++++++++------------------ protobuf/bitkey.proto | 9 +++--- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/bitkeylib/bitkey_pb2.py b/bitkeylib/bitkey_pb2.py index 88a818f22..dd7493702 100644 --- a/bitkeylib/bitkey_pb2.py +++ b/bitkeylib/bitkey_pb2.py @@ -11,7 +11,7 @@ from google.protobuf import descriptor_pb2 DESCRIPTOR = descriptor.FileDescriptor( name='bitkey.proto', package='', - serialized_pb='\n\x0c\x62itkey.proto\" \n\nInitialize\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\"\xdc\x01\n\x08\x46\x65\x61tures\x12\x12\n\nsession_id\x18\x01 \x01(\x0c\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x0f\n\x07has_otp\x18\x05 \x01(\x08\x12\x0f\n\x07has_spv\x18\x06 \x01(\x08\x12\x0b\n\x03pin\x18\x07 \x01(\x08\x12\x18\n\x04\x61lgo\x18\x08 \x01(\x0e\x32\n.Algorithm\x12\"\n\x0e\x61lgo_available\x18\t \x03(\x0e\x32\n.Algorithm\x12\x11\n\tmaxfee_kb\x18\n \x01(\x04\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"K\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03otp\x18\x02 \x01(\x08\x12\x0b\n\x03pin\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Z\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x14\n\x03otp\x18\x02 \x01(\x0b\x32\x07.OtpAck\x12\x14\n\x03pin\x18\x03 \x01(\x0b\x32\x07.PinAck\x12\x0c\n\x04seed\x18\x04 \x01(\t\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"\x1d\n\nOtpRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06OtpAck\x12\x0b\n\x03otp\x18\x01 \x02(\t\"\x0b\n\tOtpCancel\"\x1d\n\nPinRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06PinAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x0b\n\tPinCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"\x14\n\x12GetMasterPublicKey\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"M\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\t\x12\x11\n\x03otp\x18\x02 \x01(\x08:\x04true\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x11\n\x03spv\x18\x04 \x01(\x08:\x04true\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"E\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\x12\x0e\n\x06random\x18\x06 \x01(\x0c\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*$\n\tAlgorithm\x12\t\n\x05\x42IP32\x10\x00\x12\x0c\n\x08\x45LECTRUM\x10\x01*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01') + serialized_pb='\n\x0c\x62itkey.proto\" \n\nInitialize\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\"\xdc\x01\n\x08\x46\x65\x61tures\x12\x12\n\nsession_id\x18\x01 \x01(\x0c\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x0f\n\x07has_otp\x18\x05 \x01(\x08\x12\x0f\n\x07has_spv\x18\x06 \x01(\x08\x12\x0b\n\x03pin\x18\x07 \x01(\x08\x12\x18\n\x04\x61lgo\x18\x08 \x01(\x0e\x32\n.Algorithm\x12\"\n\x0e\x61lgo_available\x18\t \x03(\x0e\x32\n.Algorithm\x12\x11\n\tmaxfee_kb\x18\n \x01(\x04\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"K\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03otp\x18\x02 \x01(\x08\x12\x0b\n\x03pin\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Z\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x14\n\x03otp\x18\x02 \x01(\x0b\x32\x07.OtpAck\x12\x14\n\x03pin\x18\x03 \x01(\x0b\x32\x07.PinAck\x12\x0c\n\x04seed\x18\x04 \x01(\t\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"\x1d\n\nOtpRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06OtpAck\x12\x0b\n\x03otp\x18\x01 \x02(\t\"\x0b\n\tOtpCancel\"\x1d\n\nPinRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06PinAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x0b\n\tPinCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"\x14\n\x12GetMasterPublicKey\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"n\n\nLoadDevice\x12\x1f\n\x04\x61lgo\x18\x01 \x01(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x0c\n\x04seed\x18\x02 \x02(\t\x12\x11\n\x03otp\x18\x03 \x01(\x08:\x04true\x12\x0b\n\x03pin\x18\x04 \x01(\x0c\x12\x11\n\x03spv\x18\x05 \x01(\x08:\x04true\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"E\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\x12\x0e\n\x06random\x18\x06 \x01(\x0c\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*$\n\tAlgorithm\x12\t\n\x05\x42IP32\x10\x00\x12\x0c\n\x08\x45LECTRUM\x10\x01*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01') _ALGORITHM = descriptor.EnumDescriptor( name='Algorithm', @@ -30,8 +30,8 @@ _ALGORITHM = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1565, - serialized_end=1601, + serialized_start=1598, + serialized_end=1634, ) @@ -52,8 +52,8 @@ _SCRIPTTYPE = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1603, - serialized_end=1654, + serialized_start=1636, + serialized_end=1687, ) @@ -74,8 +74,8 @@ _REQUESTTYPE = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1656, - serialized_end=1696, + serialized_start=1689, + serialized_end=1729, ) @@ -887,29 +887,36 @@ _LOADDEVICE = descriptor.Descriptor( containing_type=None, fields=[ descriptor.FieldDescriptor( - name='seed', full_name='LoadDevice.seed', index=0, - number=1, type=9, cpp_type=9, label=2, + name='algo', full_name='LoadDevice.algo', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='seed', full_name='LoadDevice.seed', index=1, + number=2, type=9, cpp_type=9, label=2, has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='otp', full_name='LoadDevice.otp', index=1, - number=2, type=8, cpp_type=7, label=1, + name='otp', full_name='LoadDevice.otp', index=2, + number=3, type=8, cpp_type=7, label=1, has_default_value=True, default_value=True, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='pin', full_name='LoadDevice.pin', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=unicode("", "utf-8"), + name='pin', full_name='LoadDevice.pin', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='spv', full_name='LoadDevice.spv', index=3, - number=4, type=8, cpp_type=7, label=1, + name='spv', full_name='LoadDevice.spv', index=4, + number=5, type=8, cpp_type=7, label=1, has_default_value=True, default_value=True, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -924,7 +931,7 @@ _LOADDEVICE = descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=992, - serialized_end=1069, + serialized_end=1102, ) @@ -951,8 +958,8 @@ _RESETDEVICE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1071, - serialized_end=1100, + serialized_start=1104, + serialized_end=1133, ) @@ -993,8 +1000,8 @@ _SIGNTX = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1102, - serialized_end=1171, + serialized_start=1135, + serialized_end=1204, ) @@ -1049,8 +1056,8 @@ _TXREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1174, - serialized_end=1308, + serialized_start=1207, + serialized_end=1341, ) @@ -1112,8 +1119,8 @@ _TXINPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1310, - serialized_end=1428, + serialized_start=1343, + serialized_end=1461, ) @@ -1175,14 +1182,15 @@ _TXOUTPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1431, - serialized_end=1563, + serialized_start=1464, + serialized_end=1596, ) _FEATURES.fields_by_name['algo'].enum_type = _ALGORITHM _FEATURES.fields_by_name['algo_available'].enum_type = _ALGORITHM _DEBUGLINKSTATE.fields_by_name['otp'].message_type = _OTPACK _DEBUGLINKSTATE.fields_by_name['pin'].message_type = _PINACK +_LOADDEVICE.fields_by_name['algo'].enum_type = _ALGORITHM _TXREQUEST.fields_by_name['request_type'].enum_type = _REQUESTTYPE _TXOUTPUT.fields_by_name['script_type'].enum_type = _SCRIPTTYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE diff --git a/protobuf/bitkey.proto b/protobuf/bitkey.proto index 9e18b6b5e..a3fc4e1d3 100644 --- a/protobuf/bitkey.proto +++ b/protobuf/bitkey.proto @@ -199,10 +199,11 @@ message Address { // // Response: Success, OtpRequest, PinRequest, Failure message LoadDevice { - required string seed = 1; // Seed encoded as a mnemonic (12 english words) - optional bool otp = 2 [default=true]; // Enable OTP for important actions? - optional string pin = 3; // Set PIN protection for important actions - optional bool spv = 4 [default=true]; // Enable SPV verification for transaction inputs (if available on device) + optional Algorithm algo = 1 [default=BIP32]; // Choose address generation algorithm + required string seed = 2; // Seed encoded as a mnemonic (12 english words) + optional bool otp = 3 [default=true]; // Enable OTP for important actions? + optional bytes pin = 4; // Set PIN protection for important actions + optional bool spv = 5 [default=true]; // Enable SPV verification for transaction inputs (if available on device) } // Request device to do full-reset, to generate new seed From b120043fcc830060c48cda00d3e2a33de8082a97 Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 15 Apr 2013 19:58:38 +0200 Subject: [PATCH 0061/1535] Fixed load_device --- bitkeylib/client.py | 4 ++-- bitkeylib/debuglink.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index b65e1de4d..095c0e12a 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -237,11 +237,11 @@ class BitkeyClient(object): self.init_device() return isinstance(resp, proto.Success) - def load_device(self, seed, otp, pin, spv): + def load_device(self, algo, seed, otp, pin, spv): if not self.debuglink: raise Exception("DebugLink not available") - if not self.debuglink.load_device(seed, otp, pin, spv): + if not self.debuglink.load_device(algo, seed, otp, pin, spv): return False self.init_device() return True \ No newline at end of file diff --git a/bitkeylib/debuglink.py b/bitkeylib/debuglink.py index 427e9464e..b7043fd10 100644 --- a/bitkeylib/debuglink.py +++ b/bitkeylib/debuglink.py @@ -22,8 +22,8 @@ class DebugLink(object): self.transport.write(proto.DebugLinkGetState(otp=otp, pin=pin)) return self.transport.read_blocking() - def load_device(self, seed, otp, pin, spv): - self.transport.write(proto.LoadDevice(seed=seed, otp=otp, pin=pin, spv=spv)) + def load_device(self, algo, seed, otp, pin, spv): + self.transport.write(proto.LoadDevice(algo=algo, seed=seed, otp=otp, pin=pin, spv=spv)) resp = self.transport.read_blocking() return isinstance(resp, proto.Success) From 8f42da3fcc836dab739089e82856f234bd11a384 Mon Sep 17 00:00:00 2001 From: slush Date: Fri, 30 Aug 2013 23:32:02 +0200 Subject: [PATCH 0062/1535] Use first USB device by default --- cmd.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/cmd.py b/cmd.py index 6f5a74637..246f77b91 100755 --- a/cmd.py +++ b/cmd.py @@ -9,10 +9,10 @@ from bitkeylib.debuglink import DebugLink def parse_args(commands): parser = argparse.ArgumentParser(description='Commandline tool for Bitkey devices.') - parser.add_argument('-t', '--transport', dest='transport', choices=['usb', 'serial', 'pipe', 'socket'], default='serial', help="Transport used for talking with the device") - parser.add_argument('-p', '--path', dest='path', default='/dev/ttyAMA0', help="Path used by the transport (usually serial port)") + parser.add_argument('-t', '--transport', dest='transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Transport used for talking with the device") + parser.add_argument('-p', '--path', dest='path', default='', help="Path used by the transport (usually serial port)") parser.add_argument('-dt', '--debuglink-transport', dest='debuglink_transport', choices=['usb', 'serial', 'pipe', 'socket'], default='socket', help="Debuglink transport") - parser.add_argument('-dp', '--debuglink-path', dest='debuglink_path', default='0.0.0.0:8001', help="Path used by the transport (usually serial port)") + parser.add_argument('-dp', '--debuglink-path', dest='debuglink_path', default='127.0.0.1:2000', help="Path used by the transport (usually serial port)") parser.add_argument('-j', '--json', dest='json', action='store_true', help="Prints result as json object") parser.add_argument('-d', '--debug', dest='debug', action='store_true', help='Enable low-level debugging') @@ -42,6 +42,10 @@ def parse_args(commands): def get_transport(transport_string, path): if transport_string == 'usb': from bitkeylib.transport_hid import HidTransport + + if path == '': + path = list_usb()[0] + return HidTransport(path) if transport_string == 'serial': @@ -111,13 +115,17 @@ class Commands(object): (('-o', '--otp'), {'action': 'store_true'}), (('-p', '--spv'), {'action': 'store_true'}), ) - + +def list_usb(): + from bitkeylib.transport_hid import HidTransport + devices = HidTransport.enumerate() + return devices + def main(): args = parse_args(Commands) if args.cmd == 'list': - from bitkeylib.transport_hid import HidTransport - devices = HidTransport.enumerate() + devices = list_usb() if args.json: print json.dumps(devices) else: From 1fa4f1eb81920ccd87caca5d70de301747db046a Mon Sep 17 00:00:00 2001 From: slush Date: Sat, 31 Aug 2013 23:45:53 +0200 Subject: [PATCH 0063/1535] Test if USB device is presented --- cmd.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd.py b/cmd.py index 246f77b91..cdfe2d81c 100755 --- a/cmd.py +++ b/cmd.py @@ -44,7 +44,10 @@ def get_transport(transport_string, path): from bitkeylib.transport_hid import HidTransport if path == '': - path = list_usb()[0] + try: + path = list_usb()[0] + except IndexError: + raise Exception("No Trezor found on USB") return HidTransport(path) From cc37fbaa5f419db0af6b41763d8887e7541a3aba Mon Sep 17 00:00:00 2001 From: slush Date: Sat, 31 Aug 2013 23:46:28 +0200 Subject: [PATCH 0064/1535] Protocol has been heavily modified, check trezor-emu for further details --- protobuf/build.sh | 2 +- protobuf/{bitkey.proto => trezor.proto} | 96 ++++++++----------------- 2 files changed, 32 insertions(+), 66 deletions(-) rename protobuf/{bitkey.proto => trezor.proto} (66%) diff --git a/protobuf/build.sh b/protobuf/build.sh index 6dfc18d47..c9fd0e9dd 100755 --- a/protobuf/build.sh +++ b/protobuf/build.sh @@ -2,4 +2,4 @@ cd `dirname $0` -protoc --python_out=../bitkeylib/ bitkey.proto +protoc --python_out=../bitkeylib/ trezor.proto diff --git a/protobuf/bitkey.proto b/protobuf/trezor.proto similarity index 66% rename from protobuf/bitkey.proto rename to protobuf/trezor.proto index a3fc4e1d3..9092a4c30 100644 --- a/protobuf/bitkey.proto +++ b/protobuf/trezor.proto @@ -4,12 +4,6 @@ Author: slush */ -// Specifies algorithm used for generating private/public keys from the seed. -enum Algorithm { - BIP32 = 0; - ELECTRUM = 1; -} - // Specifies which script will be used for given transaction output. enum ScriptType { PAYTOADDRESS = 0; @@ -26,20 +20,13 @@ enum RequestType { // // Response: Features message Initialize { - required bytes session_id = 1; // Any value identifying current connection, will be echoed back in Features message } -// Response object for Initialize. Contains list of available features on the device. +// Response object for Initialize. message Features { - optional bytes session_id = 1; // Echoed back from Initialize message - optional string vendor = 2; // Name of the manufacturer, e.g. "bitkey" + optional string vendor = 2; // Name of the manufacturer, e.g. "trezor" optional uint32 major_version = 3; // Major version of the device, e.g. 1 optional uint32 minor_version = 4; // Minor version of the device, e.g. 0 - optional bool has_otp = 5; // True when device will send OtpRequest on important action - optional bool has_spv = 6; // True when device requires SPV verification of transaction inputs - optional bool pin = 7; // True when device will send PinRequest on important action - optional Algorithm algo = 8; // Choosen generation algorithm - repeated Algorithm algo_available = 9; // List of key generation algorithms supported by the device optional uint64 maxfee_kb = 10; // Maximum accepted fee per kilobyte of signed transaction } @@ -63,8 +50,7 @@ message DebugLinkDecision { // Response: DebugLinkState message DebugLinkGetState { optional bool layout = 1; // Request raw buffer of display - optional bool otp = 2; // Request current OTP - optional bool pin = 3; // Request current PIN + optional bool matrix = 3; // Request current matrix optional bool seed = 4; // Request current seed // optional bool state = 5; } @@ -72,21 +58,24 @@ message DebugLinkGetState { // Response object reflecting device's current state. It can be received only over debug link connection. message DebugLinkState { optional bytes layout = 1; // Raw buffer of display - optional OtpAck otp = 2; // Current OTP, blank if device is not waiting to OTP - optional PinAck pin = 3; // Current PIN, blank if PIN is not set/enabled - optional string seed = 4; // Current seed (in mnemonic format) -// optional string state = 5; + optional PinMatrixAck pin = 3; // Current PIN matrix, blank if PIN is not set/enabled + optional bytes seed = 4; // Current seed (in mnemonic format) +// optional bytes state = 5; +} + +// Ask device to shutdown/restart +message DebugLinkStop { } // Response object defining success of the previous request message Success { - optional string message = 1; // May contain human readable description of the action or request-specific payload + optional bytes message = 1; // May contain human readable description of the action or request-specific payload } // Response object defining failure of the previous request message Failure { optional int32 code = 1; // May contain computer-readable definition of the error state - optional string message = 2; // May contain human-readable message of the error state + optional bytes message = 2; // May contain human-readable message of the error state } // Ask device for unique identifier. @@ -117,45 +106,27 @@ message ButtonCancel { } // Message can be sent by the *device* as a response to any request. -// Message asks computer to send back OtpAck with the password printed on the device's display. -// -// Response: OtpAck, OtpCancel -message OtpRequest { - optional string message = 1; // Human readable message -} - -// Message is sent by the computer as a response to OtpRequest previously sent by the device. -message OtpAck { - required string otp = 1; // User must be asked for the otp, which is displayed on the device's display -} - -// Message is sent as a response to OtpRequest by the computer, asking the device to cancel -// pending action and reset to the default state. -message OtpCancel { -} - -// Message can be sent by the *device* as a response to any request. -// Message asks computer to send back PinAck with the password associated with the device. +// Message asks computer to send back PinMatrixAck with the password encoded in pin matrix scheme. // -// Response: PinAck, PinCancel -message PinRequest { - optional string message = 1; // Human readable message +// Response: PinMatrixAck, PinMatrixCancel +message PinMatrixRequest { + optional bytes message = 1; // Human readable message } -// Message is sent by the computer as a response to PinRequest previously sent by the device. -message PinAck { - required string pin = 1; // User must write down the password for accessing the device. +// Message is sent by the computer as a response to PinMatrixRequest previously sent by the device. +message PinMatrixAck { + required bytes pin = 1; // User must write down the password for accessing the device. } -// Message is sent as a response to PinRequest by the computer, asking the device to cancel +// Message is sent as a response to PinMatrixRequest by the computer, asking the device to cancel // pending action and reset to the default state. -message PinCancel { +message PinMatrixCancel { } // Request a sample of random data generated by hardware RNG. May be used // for tests of internal RNG. // -// Response: OtpRequest, PinRequest, Entropy, Failure +// Response: PinMatrixRequest, Entropy, Failure message GetEntropy { required uint32 size = 1; // Size of randomly generated buffer } @@ -169,9 +140,9 @@ message Entropy { // in SignTx method. Transaction won't be signed if requested transaction fees are above // current value. // -// Response: Success, OtpRequest, PinRequest, Failure +// Response: Success, PinMatrixRequest, Failure message SetMaxFeeKb { - required uint64 maxfee_kb= 1; // Maximum allowed transaction fee in satoshis per kB + required uint64 maxfee_kb = 1; // Maximum allowed transaction fee in satoshis per kB } // Ask device for it's current master public key. This may be used for generating @@ -197,19 +168,16 @@ message Address { // Load seed and related internal settings from computer to the device. Existing seed is overwritten. // -// Response: Success, OtpRequest, PinRequest, Failure +// Response: Success, PinMatrixRequest, Failure message LoadDevice { - optional Algorithm algo = 1 [default=BIP32]; // Choose address generation algorithm - required string seed = 2; // Seed encoded as a mnemonic (12 english words) - optional bool otp = 3 [default=true]; // Enable OTP for important actions? - optional bytes pin = 4; // Set PIN protection for important actions - optional bool spv = 5 [default=true]; // Enable SPV verification for transaction inputs (if available on device) + required string seed = 1; // Seed encoded as a mnemonic (12 english words) + optional bytes pin = 2; // Set PIN protection for important actions } // Request device to do full-reset, to generate new seed -// and ask user for new settings (OTP, PIN, SPV). +// and ask user for new settings (PIN). // -// Response: Success, OtpRequest, PinRequest, Failure +// Response: Success, PinMatrixRequest, Failure message ResetDevice { optional bytes random = 7; // Provide additional entropy for seed generation function. // Recommended to provide 256 bytes of random data. @@ -217,12 +185,10 @@ message ResetDevice { // Request the device to sign the transaction // -// Response: TxRequest, OtpRequest, PinRequest, Failure +// Response: TxRequest, PinMatrixRequest, Failure message SignTx { required uint32 outputs_count = 3; // Count of outputs of the transaction required uint32 inputs_count = 5; // Count of inputs of the transaction - optional bytes random = 6; // Provide additional entropy for signing function. - // Recommended to provide 256 bytes of random data. } // Sent by the device as a response for SignTx. Device asks for information for signing transaction. @@ -257,4 +223,4 @@ message TxOutput { required uint64 amount = 4; // Amount to send in satoshis required ScriptType script_type = 5;// Select output script type repeated bytes script_args = 6; // Provide additional parameters for the script (its script-depended) -} \ No newline at end of file +} From b01c49715efc759078ac634dfed564064ec0e263 Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 1 Sep 2013 00:00:49 +0200 Subject: [PATCH 0065/1535] Mapping reflects latest changes in protobuf file --- bitkeylib/mapping.py | 83 +++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 40 deletions(-) diff --git a/bitkeylib/mapping.py b/bitkeylib/mapping.py index 19969b3cf..668bfdb1b 100644 --- a/bitkeylib/mapping.py +++ b/bitkeylib/mapping.py @@ -1,64 +1,67 @@ -import bitkey_pb2 as proto +import trezor_pb2 as proto map_type_to_class = { - 0: proto.Initialize, - 1: proto.Ping, - 2: proto.Success, - 3: proto.Failure, - 4: proto.GetUUID, - 5: proto.UUID, - 6: proto.OtpRequest, - 7: proto.OtpAck, - 8: proto.OtpCancel, - 9: proto.GetEntropy, - 10: proto.Entropy, - 11: proto.GetMasterPublicKey, - 12: proto.MasterPublicKey, - 13: proto.LoadDevice, - 14: proto.ResetDevice, - 15: proto.SignTx, -# 16: proto.SignedTx, - 17: proto.Features, - 18: proto.PinRequest, - 19: proto.PinAck, - 20: proto.PinCancel, - 21: proto.TxRequest, - #22: proto.OutputRequest, - 23: proto.TxInput, - 24: proto.TxOutput, - 25: proto.SetMaxFeeKb, - 26: proto.ButtonRequest, - 27: proto.ButtonAck, - 28: proto.ButtonCancel, - 29: proto.GetAddress, - 30: proto.Address, - 100: proto.DebugLinkDecision, - 101: proto.DebugLinkGetState, - 102: proto.DebugLinkState, + 0: proto.Initialize, + 1: proto.Ping, + 2: proto.Success, + 3: proto.Failure, + 4: proto.GetUUID, + 5: proto.UUID, + 9: proto.GetEntropy, + 10: proto.Entropy, + 11: proto.GetMasterPublicKey, + 12: proto.MasterPublicKey, + 13: proto.LoadDevice, + 14: proto.ResetDevice, + 15: proto.SignTx, + # 16: proto.SignedTx, + 17: proto.Features, + 18: proto.PinMatrixRequest, + 19: proto.PinMatrixAck, + 20: proto.PinMatrixCancel, + 21: proto.TxRequest, + # 22: proto.OutputRequest, + 23: proto.TxInput, + 24: proto.TxOutput, + 25: proto.SetMaxFeeKb, + 26: proto.ButtonRequest, + 27: proto.ButtonAck, + 28: proto.ButtonCancel, + 29: proto.GetAddress, + 30: proto.Address, + 100: proto.DebugLinkDecision, + 101: proto.DebugLinkGetState, + 102: proto.DebugLinkState, + 103: proto.DebugLinkStop, } map_class_to_type = {} + def get_type(msg): return map_class_to_type[msg.__class__] + def get_class(t): return map_type_to_class[t] + def build_index(): for k, v in map_type_to_class.items(): map_class_to_type[v] = k - + + def check_missing(): from google.protobuf import reflection - - types = [ proto.__dict__[item] for item in dir(proto) - if issubclass(proto.__dict__[item].__class__, reflection.GeneratedProtocolMessageType) ] - + + types = [proto.__dict__[item] for item in dir(proto) + if issubclass(proto.__dict__[item].__class__, reflection.GeneratedProtocolMessageType)] + missing = list(set(types) - set(map_type_to_class.values())) if len(missing): raise Exception("Following protobuf messages are not defined in mapping: %s" % missing) + check_missing() build_index() From ce7e6fbb501c16bb6e718102637ce7dea19a02fd Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 1 Sep 2013 02:45:42 +0200 Subject: [PATCH 0066/1535] Synchronized protobuf, compiled protobuf moved from bitkey_pb2.py to trezor_pb2.py --- bitkeylib/{bitkey_pb2.py => trezor_pb2.py} | 460 +++++++-------------- protobuf/trezor.proto | 8 +- 2 files changed, 147 insertions(+), 321 deletions(-) rename bitkeylib/{bitkey_pb2.py => trezor_pb2.py} (69%) diff --git a/bitkeylib/bitkey_pb2.py b/bitkeylib/trezor_pb2.py similarity index 69% rename from bitkeylib/bitkey_pb2.py rename to bitkeylib/trezor_pb2.py index dd7493702..550fda38a 100644 --- a/bitkeylib/bitkey_pb2.py +++ b/bitkeylib/trezor_pb2.py @@ -9,31 +9,9 @@ from google.protobuf import descriptor_pb2 DESCRIPTOR = descriptor.FileDescriptor( - name='bitkey.proto', + name='trezor.proto', package='', - serialized_pb='\n\x0c\x62itkey.proto\" \n\nInitialize\x12\x12\n\nsession_id\x18\x01 \x02(\x0c\"\xdc\x01\n\x08\x46\x65\x61tures\x12\x12\n\nsession_id\x18\x01 \x01(\x0c\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x0f\n\x07has_otp\x18\x05 \x01(\x08\x12\x0f\n\x07has_spv\x18\x06 \x01(\x08\x12\x0b\n\x03pin\x18\x07 \x01(\x08\x12\x18\n\x04\x61lgo\x18\x08 \x01(\x0e\x32\n.Algorithm\x12\"\n\x0e\x61lgo_available\x18\t \x03(\x0e\x32\n.Algorithm\x12\x11\n\tmaxfee_kb\x18\n \x01(\x04\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"K\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03otp\x18\x02 \x01(\x08\x12\x0b\n\x03pin\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Z\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x14\n\x03otp\x18\x02 \x01(\x0b\x32\x07.OtpAck\x12\x14\n\x03pin\x18\x03 \x01(\x0b\x32\x07.PinAck\x12\x0c\n\x04seed\x18\x04 \x01(\t\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\t\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"\x1d\n\nOtpRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06OtpAck\x12\x0b\n\x03otp\x18\x01 \x02(\t\"\x0b\n\tOtpCancel\"\x1d\n\nPinRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x15\n\x06PinAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x0b\n\tPinCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"\x14\n\x12GetMasterPublicKey\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"n\n\nLoadDevice\x12\x1f\n\x04\x61lgo\x18\x01 \x01(\x0e\x32\n.Algorithm:\x05\x42IP32\x12\x0c\n\x04seed\x18\x02 \x02(\t\x12\x11\n\x03otp\x18\x03 \x01(\x08:\x04true\x12\x0b\n\x03pin\x18\x04 \x01(\x0c\x12\x11\n\x03spv\x18\x05 \x01(\x08:\x04true\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"E\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\x12\x0e\n\x06random\x18\x06 \x01(\x0c\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*$\n\tAlgorithm\x12\t\n\x05\x42IP32\x10\x00\x12\x0c\n\x08\x45LECTRUM\x10\x01*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01') - -_ALGORITHM = descriptor.EnumDescriptor( - name='Algorithm', - full_name='Algorithm', - filename=None, - file=DESCRIPTOR, - values=[ - descriptor.EnumValueDescriptor( - name='BIP32', index=0, number=0, - options=None, - type=None), - descriptor.EnumValueDescriptor( - name='ELECTRUM', index=1, number=1, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=1598, - serialized_end=1634, -) - + serialized_pb='\n\x0ctrezor.proto\"\x0c\n\nInitialize\"[\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x11\n\tmaxfee_kb\x18\n \x01(\x04\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"K\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"\x14\n\x12GetMasterPublicKey\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\'\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\t\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01') _SCRIPTTYPE = descriptor.EnumDescriptor( name='ScriptType', @@ -52,8 +30,8 @@ _SCRIPTTYPE = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1636, - serialized_end=1687, + serialized_start=1317, + serialized_end=1368, ) @@ -74,13 +52,11 @@ _REQUESTTYPE = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1689, - serialized_end=1729, + serialized_start=1370, + serialized_end=1410, ) -BIP32 = 0 -ELECTRUM = 1 PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 TXINPUT = 0 @@ -95,13 +71,6 @@ _INITIALIZE = descriptor.Descriptor( file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( - name='session_id', full_name='Initialize.session_id', index=0, - number=1, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -112,7 +81,7 @@ _INITIALIZE = descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=16, - serialized_end=48, + serialized_end=28, ) @@ -124,70 +93,28 @@ _FEATURES = descriptor.Descriptor( containing_type=None, fields=[ descriptor.FieldDescriptor( - name='session_id', full_name='Features.session_id', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='vendor', full_name='Features.vendor', index=1, + name='vendor', full_name='Features.vendor', index=0, number=2, type=9, cpp_type=9, label=1, has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='major_version', full_name='Features.major_version', index=2, + name='major_version', full_name='Features.major_version', index=1, number=3, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='minor_version', full_name='Features.minor_version', index=3, + name='minor_version', full_name='Features.minor_version', index=2, number=4, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='has_otp', full_name='Features.has_otp', index=4, - number=5, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='has_spv', full_name='Features.has_spv', index=5, - number=6, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='pin', full_name='Features.pin', index=6, - number=7, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='algo', full_name='Features.algo', index=7, - number=8, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='algo_available', full_name='Features.algo_available', index=8, - number=9, type=14, cpp_type=8, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='maxfee_kb', full_name='Features.maxfee_kb', index=9, + name='maxfee_kb', full_name='Features.maxfee_kb', index=3, number=10, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, @@ -202,8 +129,8 @@ _FEATURES = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=51, - serialized_end=271, + serialized_start=30, + serialized_end=121, ) @@ -216,8 +143,8 @@ _PING = descriptor.Descriptor( fields=[ descriptor.FieldDescriptor( name='message', full_name='Ping.message', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=unicode("", "utf-8"), + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -230,8 +157,8 @@ _PING = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=273, - serialized_end=296, + serialized_start=123, + serialized_end=146, ) @@ -258,8 +185,8 @@ _DEBUGLINKDECISION = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=298, - serialized_end=333, + serialized_start=148, + serialized_end=183, ) @@ -278,14 +205,14 @@ _DEBUGLINKGETSTATE = descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='otp', full_name='DebugLinkGetState.otp', index=1, + name='pin', full_name='DebugLinkGetState.pin', index=1, number=2, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='pin', full_name='DebugLinkGetState.pin', index=2, + name='matrix', full_name='DebugLinkGetState.matrix', index=2, number=3, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, @@ -307,8 +234,8 @@ _DEBUGLINKGETSTATE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=335, - serialized_end=410, + serialized_start=185, + serialized_end=263, ) @@ -327,23 +254,23 @@ _DEBUGLINKSTATE = descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='otp', full_name='DebugLinkState.otp', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, + name='pin', full_name='DebugLinkState.pin', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='pin', full_name='DebugLinkState.pin', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, + name='matrix', full_name='DebugLinkState.matrix', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='seed', full_name='DebugLinkState.seed', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=unicode("", "utf-8"), + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -356,8 +283,29 @@ _DEBUGLINKSTATE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=412, - serialized_end=502, + serialized_start=265, + serialized_end=340, +) + + +_DEBUGLINKSTOP = descriptor.Descriptor( + name='DebugLinkStop', + full_name='DebugLinkStop', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=342, + serialized_end=357, ) @@ -370,8 +318,8 @@ _SUCCESS = descriptor.Descriptor( fields=[ descriptor.FieldDescriptor( name='message', full_name='Success.message', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=unicode("", "utf-8"), + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -384,8 +332,8 @@ _SUCCESS = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=504, - serialized_end=530, + serialized_start=359, + serialized_end=385, ) @@ -405,8 +353,8 @@ _FAILURE = descriptor.Descriptor( options=None), descriptor.FieldDescriptor( name='message', full_name='Failure.message', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=unicode("", "utf-8"), + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -419,8 +367,8 @@ _FAILURE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=532, - serialized_end=572, + serialized_start=387, + serialized_end=427, ) @@ -440,8 +388,8 @@ _GETUUID = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=574, - serialized_end=583, + serialized_start=429, + serialized_end=438, ) @@ -468,8 +416,8 @@ _UUID = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=585, - serialized_end=605, + serialized_start=440, + serialized_end=460, ) @@ -489,8 +437,8 @@ _BUTTONREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=607, - serialized_end=622, + serialized_start=462, + serialized_end=477, ) @@ -510,8 +458,8 @@ _BUTTONACK = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=624, - serialized_end=635, + serialized_start=479, + serialized_end=490, ) @@ -531,99 +479,22 @@ _BUTTONCANCEL = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=637, - serialized_end=651, -) - - -_OTPREQUEST = descriptor.Descriptor( - name='OtpRequest', - full_name='OtpRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='message', full_name='OtpRequest.message', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=653, - serialized_end=682, + serialized_start=492, + serialized_end=506, ) -_OTPACK = descriptor.Descriptor( - name='OtpAck', - full_name='OtpAck', +_PINMATRIXREQUEST = descriptor.Descriptor( + name='PinMatrixRequest', + full_name='PinMatrixRequest', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ descriptor.FieldDescriptor( - name='otp', full_name='OtpAck.otp', index=0, - number=1, type=9, cpp_type=9, label=2, - has_default_value=False, default_value=unicode("", "utf-8"), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=684, - serialized_end=705, -) - - -_OTPCANCEL = descriptor.Descriptor( - name='OtpCancel', - full_name='OtpCancel', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=707, - serialized_end=718, -) - - -_PINREQUEST = descriptor.Descriptor( - name='PinRequest', - full_name='PinRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='message', full_name='PinRequest.message', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=unicode("", "utf-8"), + name='message', full_name='PinMatrixRequest.message', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -636,22 +507,22 @@ _PINREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=720, - serialized_end=749, + serialized_start=508, + serialized_end=543, ) -_PINACK = descriptor.Descriptor( - name='PinAck', - full_name='PinAck', +_PINMATRIXACK = descriptor.Descriptor( + name='PinMatrixAck', + full_name='PinMatrixAck', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ descriptor.FieldDescriptor( - name='pin', full_name='PinAck.pin', index=0, - number=1, type=9, cpp_type=9, label=2, - has_default_value=False, default_value=unicode("", "utf-8"), + name='pin', full_name='PinMatrixAck.pin', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -664,14 +535,14 @@ _PINACK = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=751, - serialized_end=772, + serialized_start=545, + serialized_end=572, ) -_PINCANCEL = descriptor.Descriptor( - name='PinCancel', - full_name='PinCancel', +_PINMATRIXCANCEL = descriptor.Descriptor( + name='PinMatrixCancel', + full_name='PinMatrixCancel', filename=None, file=DESCRIPTOR, containing_type=None, @@ -685,8 +556,8 @@ _PINCANCEL = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=774, - serialized_end=785, + serialized_start=574, + serialized_end=591, ) @@ -713,8 +584,8 @@ _GETENTROPY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=787, - serialized_end=813, + serialized_start=593, + serialized_end=619, ) @@ -741,8 +612,8 @@ _ENTROPY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=815, - serialized_end=841, + serialized_start=621, + serialized_end=647, ) @@ -769,8 +640,8 @@ _SETMAXFEEKB = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=843, - serialized_end=875, + serialized_start=649, + serialized_end=681, ) @@ -790,8 +661,8 @@ _GETMASTERPUBLICKEY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=877, - serialized_end=897, + serialized_start=683, + serialized_end=703, ) @@ -818,8 +689,8 @@ _MASTERPUBLICKEY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=899, - serialized_end=929, + serialized_start=705, + serialized_end=735, ) @@ -846,8 +717,8 @@ _GETADDRESS = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=931, - serialized_end=962, + serialized_start=737, + serialized_end=768, ) @@ -874,8 +745,8 @@ _ADDRESS = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=964, - serialized_end=990, + serialized_start=770, + serialized_end=796, ) @@ -887,40 +758,19 @@ _LOADDEVICE = descriptor.Descriptor( containing_type=None, fields=[ descriptor.FieldDescriptor( - name='algo', full_name='LoadDevice.algo', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=True, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='seed', full_name='LoadDevice.seed', index=1, - number=2, type=9, cpp_type=9, label=2, + name='seed', full_name='LoadDevice.seed', index=0, + number=1, type=9, cpp_type=9, label=2, has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='otp', full_name='LoadDevice.otp', index=2, - number=3, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=True, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='pin', full_name='LoadDevice.pin', index=3, - number=4, type=12, cpp_type=9, label=1, + name='pin', full_name='LoadDevice.pin', index=1, + number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( - name='spv', full_name='LoadDevice.spv', index=4, - number=5, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=True, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -930,8 +780,8 @@ _LOADDEVICE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=992, - serialized_end=1102, + serialized_start=798, + serialized_end=837, ) @@ -958,8 +808,8 @@ _RESETDEVICE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1104, - serialized_end=1133, + serialized_start=839, + serialized_end=868, ) @@ -984,13 +834,6 @@ _SIGNTX = descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( - name='random', full_name='SignTx.random', index=2, - number=6, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -1000,8 +843,8 @@ _SIGNTX = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1135, - serialized_end=1204, + serialized_start=870, + serialized_end=923, ) @@ -1056,8 +899,8 @@ _TXREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1207, - serialized_end=1341, + serialized_start=926, + serialized_end=1060, ) @@ -1119,8 +962,8 @@ _TXINPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1343, - serialized_end=1461, + serialized_start=1062, + serialized_end=1180, ) @@ -1182,15 +1025,10 @@ _TXOUTPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1464, - serialized_end=1596, + serialized_start=1183, + serialized_end=1315, ) -_FEATURES.fields_by_name['algo'].enum_type = _ALGORITHM -_FEATURES.fields_by_name['algo_available'].enum_type = _ALGORITHM -_DEBUGLINKSTATE.fields_by_name['otp'].message_type = _OTPACK -_DEBUGLINKSTATE.fields_by_name['pin'].message_type = _PINACK -_LOADDEVICE.fields_by_name['algo'].enum_type = _ALGORITHM _TXREQUEST.fields_by_name['request_type'].enum_type = _REQUESTTYPE _TXOUTPUT.fields_by_name['script_type'].enum_type = _SCRIPTTYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE @@ -1199,6 +1037,7 @@ DESCRIPTOR.message_types_by_name['Ping'] = _PING DESCRIPTOR.message_types_by_name['DebugLinkDecision'] = _DEBUGLINKDECISION DESCRIPTOR.message_types_by_name['DebugLinkGetState'] = _DEBUGLINKGETSTATE DESCRIPTOR.message_types_by_name['DebugLinkState'] = _DEBUGLINKSTATE +DESCRIPTOR.message_types_by_name['DebugLinkStop'] = _DEBUGLINKSTOP DESCRIPTOR.message_types_by_name['Success'] = _SUCCESS DESCRIPTOR.message_types_by_name['Failure'] = _FAILURE DESCRIPTOR.message_types_by_name['GetUUID'] = _GETUUID @@ -1206,12 +1045,9 @@ DESCRIPTOR.message_types_by_name['UUID'] = _UUID DESCRIPTOR.message_types_by_name['ButtonRequest'] = _BUTTONREQUEST DESCRIPTOR.message_types_by_name['ButtonAck'] = _BUTTONACK DESCRIPTOR.message_types_by_name['ButtonCancel'] = _BUTTONCANCEL -DESCRIPTOR.message_types_by_name['OtpRequest'] = _OTPREQUEST -DESCRIPTOR.message_types_by_name['OtpAck'] = _OTPACK -DESCRIPTOR.message_types_by_name['OtpCancel'] = _OTPCANCEL -DESCRIPTOR.message_types_by_name['PinRequest'] = _PINREQUEST -DESCRIPTOR.message_types_by_name['PinAck'] = _PINACK -DESCRIPTOR.message_types_by_name['PinCancel'] = _PINCANCEL +DESCRIPTOR.message_types_by_name['PinMatrixRequest'] = _PINMATRIXREQUEST +DESCRIPTOR.message_types_by_name['PinMatrixAck'] = _PINMATRIXACK +DESCRIPTOR.message_types_by_name['PinMatrixCancel'] = _PINMATRIXCANCEL DESCRIPTOR.message_types_by_name['GetEntropy'] = _GETENTROPY DESCRIPTOR.message_types_by_name['Entropy'] = _ENTROPY DESCRIPTOR.message_types_by_name['SetMaxFeeKb'] = _SETMAXFEEKB @@ -1262,6 +1098,12 @@ class DebugLinkState(message.Message): # @@protoc_insertion_point(class_scope:DebugLinkState) +class DebugLinkStop(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DEBUGLINKSTOP + + # @@protoc_insertion_point(class_scope:DebugLinkStop) + class Success(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _SUCCESS @@ -1304,41 +1146,23 @@ class ButtonCancel(message.Message): # @@protoc_insertion_point(class_scope:ButtonCancel) -class OtpRequest(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _OTPREQUEST - - # @@protoc_insertion_point(class_scope:OtpRequest) - -class OtpAck(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _OTPACK - - # @@protoc_insertion_point(class_scope:OtpAck) - -class OtpCancel(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _OTPCANCEL - - # @@protoc_insertion_point(class_scope:OtpCancel) - -class PinRequest(message.Message): +class PinMatrixRequest(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _PINREQUEST + DESCRIPTOR = _PINMATRIXREQUEST - # @@protoc_insertion_point(class_scope:PinRequest) + # @@protoc_insertion_point(class_scope:PinMatrixRequest) -class PinAck(message.Message): +class PinMatrixAck(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _PINACK + DESCRIPTOR = _PINMATRIXACK - # @@protoc_insertion_point(class_scope:PinAck) + # @@protoc_insertion_point(class_scope:PinMatrixAck) -class PinCancel(message.Message): +class PinMatrixCancel(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _PINCANCEL + DESCRIPTOR = _PINMATRIXCANCEL - # @@protoc_insertion_point(class_scope:PinCancel) + # @@protoc_insertion_point(class_scope:PinMatrixCancel) class GetEntropy(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType diff --git a/protobuf/trezor.proto b/protobuf/trezor.proto index 9092a4c30..2aafd0938 100644 --- a/protobuf/trezor.proto +++ b/protobuf/trezor.proto @@ -34,7 +34,7 @@ message Features { // // Response: None or Success message Ping { - optional string message = 1; // Message will be sent back in Success message + optional bytes message = 1; // Message will be sent back in Success message } // Virtually "press" the button on the device. @@ -50,7 +50,8 @@ message DebugLinkDecision { // Response: DebugLinkState message DebugLinkGetState { optional bool layout = 1; // Request raw buffer of display - optional bool matrix = 3; // Request current matrix + optional bool pin = 2; // Request current pin + optional bool matrix = 3; // Request current pin matrix optional bool seed = 4; // Request current seed // optional bool state = 5; } @@ -58,7 +59,8 @@ message DebugLinkGetState { // Response object reflecting device's current state. It can be received only over debug link connection. message DebugLinkState { optional bytes layout = 1; // Raw buffer of display - optional PinMatrixAck pin = 3; // Current PIN matrix, blank if PIN is not set/enabled + optional bytes pin = 2; // Current PIN, blank if PIN is not set/enabled + optional bytes matrix = 3; // Current PIN matrix optional bytes seed = 4; // Current seed (in mnemonic format) // optional bytes state = 5; } From 5db17b3a6d565489b14b3fce071cda03dff2f0b2 Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 1 Sep 2013 02:46:18 +0200 Subject: [PATCH 0067/1535] Proper loading of trezor_pb2.py --- bitkeylib/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bitkeylib/__init__.py b/bitkeylib/__init__.py index ec9cbc659..a0c8359d4 100644 --- a/bitkeylib/__init__.py +++ b/bitkeylib/__init__.py @@ -1,6 +1,6 @@ try: - import bitkey_pb2 as proto + import trezor_pb2 as proto except ImportError: - print "bitkey_pb2.py not found. Please run /protobuf/build.sh to generate it!" + print "trezor_pb2.py not found. Please run /protobuf/build.sh to generate it!" import sys sys.exit() From 5b214bbed2d480c8ce57516156380cdd848558a3 Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 1 Sep 2013 02:46:53 +0200 Subject: [PATCH 0068/1535] Removed OTP constructs. Implements PinMatrix. Codebase now reflects latest protobuf changes --- bitkeylib/client.py | 50 ++++++++++++------------------------------ bitkeylib/debuglink.py | 42 ++++++++++++++--------------------- 2 files changed, 31 insertions(+), 61 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index 095c0e12a..346a342aa 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -1,8 +1,7 @@ import os import time -import bitkey_pb2 as proto -import random +import trezor_pb2 as proto def show_message(message): print "MESSAGE FROM DEVICE:", message @@ -40,8 +39,7 @@ class BitkeyClient(object): def init_device(self): self.master_public_key = None - self.session_id = ''.join([ chr(random.randrange(0, 255, 1)) for _ in xrange(0, 16) ]) - self.features = self.call(proto.Initialize(session_id=self.session_id)) + self.features = self.call(proto.Initialize()) self.uuid = self.get_uuid() def get_master_public_key(self): @@ -60,10 +58,9 @@ class BitkeyClient(object): def _pprint(self, msg): return "<%s>:\n%s" % (msg.__class__.__name__, msg) - def setup_debuglink(self, button=None, pin_correct=False, otp_correct=False): + def setup_debuglink(self, button=None, pin_correct=False): self.debug_button = button self.debug_pin = pin_correct - self.debug_otp = otp_correct def call(self, msg): if self.debug: @@ -79,40 +76,24 @@ class BitkeyClient(object): self.debuglink.press_button(self.debug_button) return self.call(proto.ButtonAck()) - - if isinstance(resp, proto.OtpRequest): - if self.debuglink: - otp = self.debuglink.read_otp() - if self.debug_otp: - msg2 = otp - else: - msg2 = proto.OtpAck(otp='__42__') - else: - otp = self.input_func("OTP required: ", resp.message) - msg2 = proto.OtpAck(otp=otp) - - return self.call(msg2) - - if isinstance(resp, proto.PinRequest): + + if isinstance(resp, proto.PinMatrixRequest): if self.debuglink: - pin = self.debuglink.read_pin() if self.debug_pin: - msg2 = pin + pin = self.debuglink.read_pin() + msg2 = proto.PinMatrixAck(pin=pin) else: - msg2 = proto.PinAck(pin='__42__') + msg2 = proto.PinMatrixAck(pin='__42__') else: pin = self.input_func("PIN required: ", resp.message) - msg2 = proto.PinAck(pin=pin) + msg2 = proto.PinMatrixAck(pin=pin) return self.call(msg2) if isinstance(resp, proto.Failure): self.message_func(resp.message) - if resp.code == 3: - raise OtpException("OTP is invalid") - - elif resp.code == 4: + if resp.code == 4: raise CallException("Action cancelled by user") elif resp.code == 6: @@ -233,15 +214,12 @@ class BitkeyClient(object): def reset_device(self): # Begin with device reset workflow + raise Exception("Not implemented") resp = self.call(proto.ResetDevice(random=self._get_local_entropy())) self.init_device() return isinstance(resp, proto.Success) - def load_device(self, algo, seed, otp, pin, spv): - if not self.debuglink: - raise Exception("DebugLink not available") - - if not self.debuglink.load_device(algo, seed, otp, pin, spv): - return False + def load_device(self, seed, pin): + resp = self.call(proto.LoadDevice(seed=seed, pin=pin)) self.init_device() - return True \ No newline at end of file + return isinstance(resp, proto.Success) \ No newline at end of file diff --git a/bitkeylib/debuglink.py b/bitkeylib/debuglink.py index b7043fd10..0e459dac6 100644 --- a/bitkeylib/debuglink.py +++ b/bitkeylib/debuglink.py @@ -1,43 +1,35 @@ -import bitkey_pb2 as proto +import trezor_pb2 as proto from transport import NotImplementedException -def otp_info(otp): - print "Device asks for OTP %s" % otp.otp - def pin_info(pin): - print "Device asks for PIN %s" % pin.pin + print "Device asks for PIN %s" % pin def button_press(yes_no): print "User pressed", '"y"' if yes_no else '"n"' class DebugLink(object): - def __init__(self, transport, otp_func=otp_info, pin_func=pin_info, button_func=button_press): + def __init__(self, transport, pin_func=pin_info, button_func=button_press): self.transport = transport - self.otp_func = otp_func self.pin_func = pin_func self.button_func = button_func - def get_state(self, otp=False, pin=False): - self.transport.write(proto.DebugLinkGetState(otp=otp, pin=pin)) - return self.transport.read_blocking() - - def load_device(self, algo, seed, otp, pin, spv): - self.transport.write(proto.LoadDevice(algo=algo, seed=seed, otp=otp, pin=pin, spv=spv)) - resp = self.transport.read_blocking() - return isinstance(resp, proto.Success) - - def read_otp(self): - obj = self.get_state(otp=True).otp - print "Read OTP:", obj.otp - self.otp_func(obj) - return obj - def read_pin(self): - obj = self.get_state(pin=True).pin + self.transport.write(proto.DebugLinkGetState(pin=True, matrix=True)) + obj = self.transport.read_blocking() print "Read PIN:", obj.pin - self.pin_func(obj) - return obj + print "Read matrix:", obj.matrix + + # Now we have real PIN and PIN matrix. + # We have to encode that into encoded pin, + # because application must send back positions + # on keypad, not a real PIN. + pin_encoded = ''.join([ str(obj.matrix.index(p) + 1) for p in obj.pin]) + + print "Encoded PIN:", pin_encoded + self.pin_func(pin_encoded) + + return pin_encoded def press_button(self, yes_no): print "Pressing", yes_no From cb594df79016a3fad04cee5265f946bed4790fbc Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 1 Sep 2013 02:47:49 +0200 Subject: [PATCH 0069/1535] Updated test structure to comply with latest changes. test_basic.py passes succesfully, others will come soon... --- tests/common.py | 6 +++--- tests/config.py | 4 ++-- tests/test_basic.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/common.py b/tests/common.py index d48e38f24..4173610e5 100644 --- a/tests/common.py +++ b/tests/common.py @@ -11,11 +11,11 @@ class BitkeyTest(unittest.TestCase): self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) self.bitkey = BitkeyClient(self.transport, DebugLink(self.debug_transport), debug=True) - self.bitkey.setup_debuglink(button=True, pin_correct=True, otp_correct=True) + self.bitkey.setup_debuglink(button=True, pin_correct=True) - self.bitkey.load_device(algo=proto.ELECTRUM, + self.bitkey.load_device( seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - otp=True, pin='1234', spv=True) + pin='1234') print "Setup finished" print "--------------" diff --git a/tests/config.py b/tests/config.py index 9113cb510..1f3e48587 100644 --- a/tests/config.py +++ b/tests/config.py @@ -6,7 +6,7 @@ from bitkeylib.transport_hid import HidTransport from bitkeylib.transport_socket import SocketTransportClient TRANSPORT = PipeTransport -TRANSPORT_ARGS = ('../../bitkey-python/bitkey.pipe', False) +TRANSPORT_ARGS = ('../../trezor-emu/pipe.trezor', False) #TRANSPORT = HidTransport #TRANSPORT_ARGS = ('0x10c4:0xea80:000868D3', False) @@ -15,7 +15,7 @@ TRANSPORT_ARGS = ('../../bitkey-python/bitkey.pipe', False) #TRANSPORT_ARGS = ('trezor.dyn:3000', False) DEBUG_TRANSPORT = PipeTransport -DEBUG_TRANSPORT_ARGS = ('../../bitkey-python/bitkey_debug.pipe', False) +DEBUG_TRANSPORT_ARGS = ('../../trezor-emu/pipe.trezor_debug', False) #DEBUG_TRANSPORT = SocketTransportClient #DEBUG_TRANSPORT_ARGS = ('trezor.dyn:2000', False) diff --git a/tests/test_basic.py b/tests/test_basic.py index aba4652b3..6ff7d65a8 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -14,7 +14,7 @@ from bitkeylib import proto class TestBasic(common.BitkeyTest): def test_features(self): - features = self.bitkey.call(proto.Initialize(session_id=self.bitkey.session_id)) + features = self.bitkey.call(proto.Initialize()) # Result is the same as reported by BitkeyClient class self.assertEqual(features, self.bitkey.features) From 6fe26c26e46b83470be6a2ed49b56d7638a5d190 Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 1 Sep 2013 03:34:36 +0200 Subject: [PATCH 0070/1535] Fix PIN handling --- bitkeylib/client.py | 10 +++++----- bitkeylib/debuglink.py | 7 ++++++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index 346a342aa..a119af92d 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -17,9 +17,6 @@ class CallException(Exception): class PinException(CallException): pass -class OtpException(CallException): - pass - class BitkeyClient(object): def __init__(self, transport, debuglink=None, @@ -80,10 +77,10 @@ class BitkeyClient(object): if isinstance(resp, proto.PinMatrixRequest): if self.debuglink: if self.debug_pin: - pin = self.debuglink.read_pin() + pin = self.debuglink.read_pin_encoded() msg2 = proto.PinMatrixAck(pin=pin) else: - msg2 = proto.PinMatrixAck(pin='__42__') + msg2 = proto.PinMatrixAck(pin='444444222222') else: pin = self.input_func("PIN required: ", resp.message) msg2 = proto.PinMatrixAck(pin=pin) @@ -106,6 +103,9 @@ class BitkeyClient(object): return resp + def ping(self, msg): + return self.call(proto.Ping(message=msg)).message + def get_uuid(self): return self.call(proto.GetUUID()).UUID diff --git a/bitkeylib/debuglink.py b/bitkeylib/debuglink.py index 0e459dac6..d32f7cbcf 100644 --- a/bitkeylib/debuglink.py +++ b/bitkeylib/debuglink.py @@ -20,11 +20,16 @@ class DebugLink(object): print "Read PIN:", obj.pin print "Read matrix:", obj.matrix + return (obj.pin, obj.matrix) + + def read_pin_encoded(self): + pin, matrix = self.read_pin() + # Now we have real PIN and PIN matrix. # We have to encode that into encoded pin, # because application must send back positions # on keypad, not a real PIN. - pin_encoded = ''.join([ str(obj.matrix.index(p) + 1) for p in obj.pin]) + pin_encoded = ''.join([ str(matrix.index(p) + 1) for p in pin]) print "Encoded PIN:", pin_encoded self.pin_func(pin_encoded) From 702460d1534f955d4e05220d61e8845cb225867b Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 1 Sep 2013 03:35:31 +0200 Subject: [PATCH 0071/1535] Protect call test passed! --- tests/test_protect_call.py | 46 ++++++++------------------------------ 1 file changed, 9 insertions(+), 37 deletions(-) diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index 1efc0f9ab..12066b433 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -1,7 +1,7 @@ import unittest import common -from bitkeylib.client import CallException, PinException, OtpException +from bitkeylib.client import CallException, PinException from bitkeylib import proto class TestProtectCall(common.BitkeyTest): @@ -12,52 +12,24 @@ class TestProtectCall(common.BitkeyTest): self.assertEqual(len(entropy), entropy_len) def test_no_protection(self): - self.bitkey.load_device(algo=proto.ELECTRUM, + self.bitkey.load_device( seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - otp=False, pin='', spv=False) + pin='') - self.assertEqual(self.bitkey.features.has_otp, False) - self.assertEqual(self.bitkey.features.pin, False) + self.assertEqual(self.bitkey.debuglink.read_pin()[0], '') self._some_protected_call() - def test_otp_only(self): - self.bitkey.load_device(algo=proto.ELECTRUM, + def test_pin(self): + self.bitkey.load_device( seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - otp=True, pin='', spv=False) + pin='2345') - self.assertEqual(self.bitkey.features.has_otp, True) - self.assertEqual(self.bitkey.features.pin, False) + self.assertEqual(self.bitkey.debuglink.read_pin()[0], '2345') self._some_protected_call() - def test_pin_only(self): - self.bitkey.load_device(algo=proto.ELECTRUM, - seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - otp=False, pin='2345', spv=False) - - self.assertEqual(self.bitkey.features.has_otp, False) - self.assertEqual(self.bitkey.features.pin, True) - self._some_protected_call() - - def test_both(self): - self.bitkey.load_device(algo=proto.ELECTRUM, - seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - otp=True, pin='3456', spv=False) - - self.assertEqual(self.bitkey.features.has_otp, True) - self.assertEqual(self.bitkey.features.pin, True) - self._some_protected_call() - def test_incorrect_pin(self): - self.bitkey.setup_debuglink(button=True, pin_correct=False, otp_correct=True) + self.bitkey.setup_debuglink(button=True, pin_correct=False) self.assertRaises(PinException, self._some_protected_call) - - def test_incorrect_otp(self): - self.bitkey.setup_debuglink(button=True, pin_correct=True, otp_correct=False) - self.assertRaises(OtpException, self._some_protected_call) - - def test_incorrect_both(self): - self.bitkey.setup_debuglink(button=True, pin_correct=False, otp_correct=False) - self.assertRaises(CallException, self._some_protected_call) if __name__ == '__main__': unittest.main() \ No newline at end of file From 3e39a4c267842579eccd437253078336805f4e7c Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 1 Sep 2013 03:38:03 +0200 Subject: [PATCH 0072/1535] test_addresses.py passed (although it uses Electrum algo, not BIP32) --- tests/test_addresses.py | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/tests/test_addresses.py b/tests/test_addresses.py index 8a0113a9a..9cb665142 100644 --- a/tests/test_addresses.py +++ b/tests/test_addresses.py @@ -1,40 +1,28 @@ import unittest import common -import bitkeylib.bitkey_pb2 as proto +# FIXME: This test implements Electrum algorithm only class TestAddresses(common.BitkeyTest): - def test_electrum_address(self): - self.bitkey.load_device(algo=proto.ELECTRUM, + def test_address(self): + self.bitkey.load_device( seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - otp=False, pin='', spv=False) + pin='') - self.bitkey.algo = proto.ELECTRUM self.assertEqual(self.bitkey.get_address([0, 0]), "1KqYyzL53R8oA1LdYvyv7m6JUryFfGJDpa") self.assertEqual(self.bitkey.get_address([2, 0]), "13MzKU6YjjdyiW3dZJDa5VU4AWGczQsdYD") self.assertEqual(self.bitkey.get_address([3, 0]), "1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv") self.assertEqual(self.bitkey.get_address([9, 0]), "1C9DHmWBpvGcFKXEiWWC3EK3EY5Bj79nze") - def test_electrum_change_address(self): - self.bitkey.load_device(algo=proto.ELECTRUM, + def test_change_address(self): + self.bitkey.load_device( seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - otp=False, pin='', spv=False) + pin='') - self.bitkey.algo = proto.ELECTRUM self.assertEqual(self.bitkey.get_address([0, 1]), "17GpAFnkHRjWKePkX4kxHaHy49V8EHTr7i") self.assertEqual(self.bitkey.get_address([2, 1]), "1MVgq4XaMX7PmohkYzFEisH1D7uxTiPbFK") self.assertEqual(self.bitkey.get_address([3, 1]), "1M5NSqrUmmkZqokpHsJd5xm74YG6kjVcz4") self.assertEqual(self.bitkey.get_address([9, 1]), "1BXUkUsc5gGSzYUAEebg5WZWtRGPNW4NQ9") - - ''' - def test_bip32_address(self): - # TODO, FIXME - self.bitkey.load_device(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - otp=False, pin='', spv=False) - - self.bitkey.algo = proto.BIP32 - #self.assertEqual(self.bitkey.get_address([0, 0]), "1KqYyzL53R8oA1LdYvyv7m6JUryFfGJDpa") - ''' if __name__ == '__main__': unittest.main() \ No newline at end of file From bdfe3fd4ae36c0d0b638838a75e33b592ca3eefc Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 1 Sep 2013 03:42:01 +0200 Subject: [PATCH 0073/1535] Removed 'random' field from signing transaction, because of deterministic ECDSA signing --- bitkeylib/client.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index a119af92d..9463468b5 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -134,7 +134,6 @@ class BitkeyClient(object): # Prepare and send initial message tx = proto.SignTx() - tx.random = self._get_local_entropy() # Provide additional entropy to the device tx.inputs_count = len(inputs) tx.outputs_count = len(outputs) res = self.call(tx) From 8e5abb560e5ddf46d94dbf4bae48a1ca9ec28237 Mon Sep 17 00:00:00 2001 From: slush Date: Sun, 1 Sep 2013 03:42:26 +0200 Subject: [PATCH 0074/1535] Fixed imports --- tests/test_signtx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 171748686..73322423c 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -2,7 +2,7 @@ import unittest import common import binascii -import bitkeylib.bitkey_pb2 as proto +import bitkeylib.trezor_pb2 as proto ''' ./electrum -w ~/.electrum-bitkey mktx 1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv 0.001 From 813fb233a1b27f797300e301cfa4dea5993bb04d Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 9 Sep 2013 15:36:17 +0200 Subject: [PATCH 0075/1535] Added session depth --- bitkeylib/client.py | 136 ++++++++++++++++++++++------------------- bitkeylib/transport.py | 18 ++++++ 2 files changed, 92 insertions(+), 62 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index 9463468b5..81ed98941 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -64,28 +64,34 @@ class BitkeyClient(object): print '----------------------' print "Sending", self._pprint(msg) - self.transport.write(msg) - resp = self.transport.read_blocking() - - if isinstance(resp, proto.ButtonRequest): - if self.debuglink and self.debug_button: - print "Pressing button", self.debug_button - self.debuglink.press_button(self.debug_button) - - return self.call(proto.ButtonAck()) - - if isinstance(resp, proto.PinMatrixRequest): - if self.debuglink: - if self.debug_pin: - pin = self.debuglink.read_pin_encoded() - msg2 = proto.PinMatrixAck(pin=pin) - else: - msg2 = proto.PinMatrixAck(pin='444444222222') - else: - pin = self.input_func("PIN required: ", resp.message) - msg2 = proto.PinMatrixAck(pin=pin) + try: + self.transport.session_begin() + + self.transport.write(msg) + resp = self.transport.read_blocking() + + if isinstance(resp, proto.ButtonRequest): + if self.debuglink and self.debug_button: + print "Pressing button", self.debug_button + self.debuglink.press_button(self.debug_button) - return self.call(msg2) + return self.call(proto.ButtonAck()) + + if isinstance(resp, proto.PinMatrixRequest): + if self.debuglink: + if self.debug_pin: + pin = self.debuglink.read_pin_encoded() + msg2 = proto.PinMatrixAck(pin=pin) + else: + msg2 = proto.PinMatrixAck(pin='444444222222') + else: + pin = self.input_func("PIN required: ", resp.message) + msg2 = proto.PinMatrixAck(pin=pin) + + return self.call(msg2) + + finally: + self.transport.session_end() if isinstance(resp, proto.Failure): self.message_func(resp.message) @@ -132,49 +138,55 @@ class BitkeyClient(object): start = time.time() - # Prepare and send initial message - tx = proto.SignTx() - tx.inputs_count = len(inputs) - tx.outputs_count = len(outputs) - res = self.call(tx) - - # Prepare structure for signatures - signatures = [None]*len(inputs) - serialized_tx = '' - - counter = 0 - while True: - counter += 1 + try: + self.transport.session_begin() - if isinstance(res, proto.Failure): - raise CallException("Signing failed") - - if not isinstance(res, proto.TxRequest): - raise CallException("Unexpected message") - - # If there's some part of signed transaction, let's add it - if res.serialized_tx: - print "!!! RECEIVED PART OF SERIALIED TX (%d BYTES)" % len(res.serialized_tx) - serialized_tx += res.serialized_tx - - if res.signed_index >= 0 and res.signature: - print "!!! SIGNED INPUT", res.signed_index - signatures[res.signed_index] = res.signature + # Prepare and send initial message + tx = proto.SignTx() + tx.inputs_count = len(inputs) + tx.outputs_count = len(outputs) + res = self.call(tx) + + # Prepare structure for signatures + signatures = [None]*len(inputs) + serialized_tx = '' + + counter = 0 + while True: + counter += 1 - if res.request_index < 0: - # Device didn't ask for more information, finish workflow - break - - # Device asked for one more information, let's process it. - if res.request_type == proto.TXOUTPUT: - res = self.call(outputs[res.request_index]) - continue - - elif res.request_type == proto.TXINPUT: - print "REQUESTING", res.request_index - res = self.call(inputs[res.request_index]) - continue - + if isinstance(res, proto.Failure): + raise CallException("Signing failed") + + if not isinstance(res, proto.TxRequest): + raise CallException("Unexpected message") + + # If there's some part of signed transaction, let's add it + if res.serialized_tx: + print "!!! RECEIVED PART OF SERIALIED TX (%d BYTES)" % len(res.serialized_tx) + serialized_tx += res.serialized_tx + + if res.signed_index >= 0 and res.signature: + print "!!! SIGNED INPUT", res.signed_index + signatures[res.signed_index] = res.signature + + if res.request_index < 0: + # Device didn't ask for more information, finish workflow + break + + # Device asked for one more information, let's process it. + if res.request_type == proto.TXOUTPUT: + res = self.call(outputs[res.request_index]) + continue + + elif res.request_type == proto.TXINPUT: + print "REQUESTING", res.request_index + res = self.call(inputs[res.request_index]) + continue + + finally: + self.transport.session_end() + print "SIGNED IN %.03f SECONDS, CALLED %d MESSAGES, %d BYTES" % \ (time.time() - start, counter, len(serialized_tx)) diff --git a/bitkeylib/transport.py b/bitkeylib/transport.py index ad13c3f62..c7e806074 100644 --- a/bitkeylib/transport.py +++ b/bitkeylib/transport.py @@ -7,6 +7,7 @@ class NotImplementedException(Exception): class Transport(object): def __init__(self, device, *args, **kwargs): self.device = device + self.session_depth = 0 self._open() def _open(self): @@ -21,8 +22,25 @@ class Transport(object): def _read(self): raise NotImplementedException("Not implemented") + def _session_begin(self): + pass + + def _session_end(self): + pass + def ready_to_read(self): raise NotImplementedException("Not implemented") + + def session_begin(self): + if self.session_depth == 0: + self._session_begin() + self.session_depth += 1 + + def session_end(self): + self.session_depth -= 1 + self.session_depth = max(0, self.session_depth) + if self.session_depth == 0: + self._session_end() def close(self): self._close() From 682578f1adb7e3e11811d555a7f421be2d070a14 Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 9 Sep 2013 15:37:39 +0200 Subject: [PATCH 0076/1535] Added padding to HID messages --- bitkeylib/transport_hid.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/bitkeylib/transport_hid.py b/bitkeylib/transport_hid.py index 52caa311c..19186bad6 100644 --- a/bitkeylib/transport_hid.py +++ b/bitkeylib/transport_hid.py @@ -22,7 +22,7 @@ class HidTransport(Transport): self.hid = None self.buffer = '' super(HidTransport, self).__init__(device, *args, **kwargs) - + @classmethod def enumerate(cls): devices = [] @@ -35,7 +35,7 @@ class HidTransport(Transport): devices.append("0x%04x:0x%04x:%s" % (vendor_id, product_id, serial_number)) return devices - + def _open(self): self.buffer = '' path = self.device.split(':') @@ -53,13 +53,10 @@ class HidTransport(Transport): def _write(self, msg): msg = bytearray(msg) - while len(msg): - to_send = min(63, len(msg)) - - #print [to_send,] + list(msg[:to_send]) - self.hid.write([to_send,] + list(msg[:to_send])) - - msg = msg[to_send:] + while len(msg): + # Report ID, data padded to 62 bytes + self.hid.write([63,] + list(msg[:63]) + [0]*(63-len(msg[0:63]))) + msg = msg[63:] def _read(self): (msg_type, datalen) = self._read_headers(FakeRead(self._raw_read)) @@ -68,14 +65,15 @@ class HidTransport(Transport): def _raw_read(self, length): while len(self.buffer) < length: data = self.hid.read(64) + report_id = data[0] if report_id > 63: # Command report raise Exception("Not implemented") - - # Payload received - self.buffer += str(bytearray(data[1:report_id+1])) + + # Payload received, skip the report ID + self.buffer += str(bytearray(data[1:64])) ret = self.buffer[:length] self.buffer = self.buffer[length:] From e41387c6e42c76fad706f281dfbacf0b86c192ac Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 9 Sep 2013 15:38:15 +0200 Subject: [PATCH 0077/1535] Removed OTP and PIN handling in cmd.py --- cmd.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cmd.py b/cmd.py index cdfe2d81c..198186a19 100755 --- a/cmd.py +++ b/cmd.py @@ -3,7 +3,7 @@ import binascii import argparse import json -import bitkeylib.bitkey_pb2 as proto +import bitkeylib.trezor_pb2 as proto from bitkeylib.client import BitkeyClient from bitkeylib.debuglink import DebugLink @@ -83,6 +83,7 @@ class Commands(object): def get_address(self, args): return self.client.get_address(args.n) + def get_entropy(self, args): return binascii.hexlify(self.client.get_entropy(args.size)) @@ -95,7 +96,7 @@ class Commands(object): def load_device(self, args): seed = ' '.join(args.seed) - return self.client.load_device(seed, args.otp, args.pin, args.spv) + return self.client.load_device(seed, args.pin) list.help = 'List connected Trezor USB devices' get_address.help = 'Get bitcoin address in base58 encoding' @@ -115,8 +116,6 @@ class Commands(object): load_device.arguments = ( (('-s', '--seed'), {'type': str, 'nargs': '+'}), (('-n', '--pin'), {'type': str, 'default': ''}), - (('-o', '--otp'), {'action': 'store_true'}), - (('-p', '--spv'), {'action': 'store_true'}), ) def list_usb(): @@ -144,7 +143,7 @@ def main(): debuglink = None client = BitkeyClient(transport, debuglink=debuglink) - client.setup_debuglink(button=True, otp_correct=True, pin_correct=True) + client.setup_debuglink(button=True, pin_correct=True) cmds = Commands(client) res = args.func(cmds, args) From 0176c60d2a0d4c9dba97bcd00eab7ced1d929d96 Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 9 Sep 2013 17:29:05 +0200 Subject: [PATCH 0078/1535] Version 0.1 of proto file --- protobuf/trezor.proto | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/protobuf/trezor.proto b/protobuf/trezor.proto index 2aafd0938..2e4d3b173 100644 --- a/protobuf/trezor.proto +++ b/protobuf/trezor.proto @@ -1,7 +1,9 @@ /* This file describes Protocol buffers messages for bitcoin hardware wallet devices. - Author: slush + Author: Marek "slush" Palatinus + + Version: 0.1 */ // Specifies which script will be used for given transaction output. @@ -16,7 +18,7 @@ enum RequestType { TXOUTPUT = 1; } -// Reset device's internal state +// Ask for device details // // Response: Features message Initialize { @@ -24,10 +26,10 @@ message Initialize { // Response object for Initialize. message Features { - optional string vendor = 2; // Name of the manufacturer, e.g. "trezor" - optional uint32 major_version = 3; // Major version of the device, e.g. 1 - optional uint32 minor_version = 4; // Minor version of the device, e.g. 0 - optional uint64 maxfee_kb = 10; // Maximum accepted fee per kilobyte of signed transaction + optional bytes vendor = 1; // Name of the manufacturer, e.g. "trezor" + optional uint32 major_version = 2; // Major version of the device, e.g. 1 + optional uint32 minor_version = 3; // Minor version of the device, e.g. 0 + optional uint64 maxfee_kb = 4; // Maximum accepted fee per kilobyte of signed transaction } // Test if device is live, device will send back the message on success @@ -165,14 +167,14 @@ message GetAddress { } message Address { - required string address = 1; // Bitcoin address in base58 encoding corresponding to GetAddress(n) call + required bytes address = 1; // Bitcoin address in base58 encoding corresponding to GetAddress(n) call } // Load seed and related internal settings from computer to the device. Existing seed is overwritten. // // Response: Success, PinMatrixRequest, Failure message LoadDevice { - required string seed = 1; // Seed encoded as a mnemonic (12 english words) + required bytes seed = 1; // Seed encoded as a mnemonic (12 english words) optional bytes pin = 2; // Set PIN protection for important actions } @@ -220,7 +222,7 @@ message TxInput { // Transaction output for SignTx workflow. It is response to TxRequest message sent by the device. message TxOutput { required uint32 index = 1; // Position of output in proposed transaction - required string address = 2; // Target bitcoin address in base58 encoding + required bytes address = 2; // Target bitcoin address in base58 encoding repeated uint32 address_n = 3; // Has higher priority than "address". If the output is to myself, specify parameter for address generation algorithm. required uint64 amount = 4; // Amount to send in satoshis required ScriptType script_type = 5;// Select output script type From 31aa66e1a22459d3316b4b3fdedc8d4091727bde Mon Sep 17 00:00:00 2001 From: slush Date: Mon, 9 Sep 2013 17:29:27 +0200 Subject: [PATCH 0079/1535] Binary protofile --- bitkeylib/trezor_pb2.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/bitkeylib/trezor_pb2.py b/bitkeylib/trezor_pb2.py index 550fda38a..0fcc36e36 100644 --- a/bitkeylib/trezor_pb2.py +++ b/bitkeylib/trezor_pb2.py @@ -11,7 +11,7 @@ from google.protobuf import descriptor_pb2 DESCRIPTOR = descriptor.FileDescriptor( name='trezor.proto', package='', - serialized_pb='\n\x0ctrezor.proto\"\x0c\n\nInitialize\"[\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x02 \x01(\t\x12\x15\n\rmajor_version\x18\x03 \x01(\r\x12\x15\n\rminor_version\x18\x04 \x01(\r\x12\x11\n\tmaxfee_kb\x18\n \x01(\x04\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"K\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"\x14\n\x12GetMasterPublicKey\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\'\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\t\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\t\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01') + serialized_pb='\n\x0ctrezor.proto\"\x0c\n\nInitialize\"[\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"K\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"\x14\n\x12GetMasterPublicKey\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\'\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01') _SCRIPTTYPE = descriptor.EnumDescriptor( name='ScriptType', @@ -94,28 +94,28 @@ _FEATURES = descriptor.Descriptor( fields=[ descriptor.FieldDescriptor( name='vendor', full_name='Features.vendor', index=0, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=unicode("", "utf-8"), + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='major_version', full_name='Features.major_version', index=1, - number=3, type=13, cpp_type=3, label=1, + number=2, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='minor_version', full_name='Features.minor_version', index=2, - number=4, type=13, cpp_type=3, label=1, + number=3, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( name='maxfee_kb', full_name='Features.maxfee_kb', index=3, - number=10, type=4, cpp_type=4, label=1, + number=4, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -731,8 +731,8 @@ _ADDRESS = descriptor.Descriptor( fields=[ descriptor.FieldDescriptor( name='address', full_name='Address.address', index=0, - number=1, type=9, cpp_type=9, label=2, - has_default_value=False, default_value=unicode("", "utf-8"), + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -759,8 +759,8 @@ _LOADDEVICE = descriptor.Descriptor( fields=[ descriptor.FieldDescriptor( name='seed', full_name='LoadDevice.seed', index=0, - number=1, type=9, cpp_type=9, label=2, - has_default_value=False, default_value=unicode("", "utf-8"), + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -983,8 +983,8 @@ _TXOUTPUT = descriptor.Descriptor( options=None), descriptor.FieldDescriptor( name='address', full_name='TxOutput.address', index=1, - number=2, type=9, cpp_type=9, label=2, - has_default_value=False, default_value=unicode("", "utf-8"), + number=2, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), From 8d100bee0c01c37a451bdc98007b94fbad3d8d45 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 13 Sep 2013 00:17:06 +0200 Subject: [PATCH 0080/1535] Implemented ApplySettings, removed SetMaxFeeKb --- bitkeylib/client.py | 27 ++++++++++----- bitkeylib/mapping.py | 11 +++--- cmd.py | 44 +++++++++++++++++++---- protobuf/trezor.proto | 81 +++++++++++++++++++++++++++++-------------- tests/common.py | 2 +- 5 files changed, 118 insertions(+), 47 deletions(-) diff --git a/bitkeylib/client.py b/bitkeylib/client.py index 81ed98941..24c5a554c 100644 --- a/bitkeylib/client.py +++ b/bitkeylib/client.py @@ -37,7 +37,6 @@ class BitkeyClient(object): def init_device(self): self.master_public_key = None self.features = self.call(proto.Initialize()) - self.uuid = self.get_uuid() def get_master_public_key(self): if self.master_public_key: @@ -51,7 +50,23 @@ class BitkeyClient(object): def get_entropy(self, size): return self.call(proto.GetEntropy(size=size)).entropy - + + def ping(self, msg): + return self.call(proto.Ping(message=msg)).message + + def get_serial_number(self): + return self.features.serial_number + + def apply_settings(self, label=None, coin_shortcut=None, language=None): + settings = proto.ApplySettings() + if label: + settings.label = label + if coin_shortcut: + settings.coin_shortcut = coin_shortcut + if language: + settings.language = language + return self.call(settings).message + def _pprint(self, msg): return "<%s>:\n%s" % (msg.__class__.__name__, msg) @@ -108,12 +123,6 @@ class BitkeyClient(object): print "Received", self._pprint(resp) return resp - - def ping(self, msg): - return self.call(proto.Ping(message=msg)).message - - def get_uuid(self): - return self.call(proto.GetUUID()).UUID def sign_tx(self, inputs, outputs): ''' @@ -233,4 +242,4 @@ class BitkeyClient(object): def load_device(self, seed, pin): resp = self.call(proto.LoadDevice(seed=seed, pin=pin)) self.init_device() - return isinstance(resp, proto.Success) \ No newline at end of file + return isinstance(resp, proto.Success) diff --git a/bitkeylib/mapping.py b/bitkeylib/mapping.py index 668bfdb1b..af4e03d9d 100644 --- a/bitkeylib/mapping.py +++ b/bitkeylib/mapping.py @@ -5,8 +5,8 @@ map_type_to_class = { 1: proto.Ping, 2: proto.Success, 3: proto.Failure, - 4: proto.GetUUID, - 5: proto.UUID, + #4: proto.GetUID, + #5: proto.UUID, 9: proto.GetEntropy, 10: proto.Entropy, 11: proto.GetMasterPublicKey, @@ -14,7 +14,7 @@ map_type_to_class = { 13: proto.LoadDevice, 14: proto.ResetDevice, 15: proto.SignTx, - # 16: proto.SignedTx, + 16: proto.SimpleSignTx, 17: proto.Features, 18: proto.PinMatrixRequest, 19: proto.PinMatrixAck, @@ -23,12 +23,15 @@ map_type_to_class = { # 22: proto.OutputRequest, 23: proto.TxInput, 24: proto.TxOutput, - 25: proto.SetMaxFeeKb, + 25: proto.ApplySettings, 26: proto.ButtonRequest, 27: proto.ButtonAck, 28: proto.ButtonCancel, 29: proto.GetAddress, 30: proto.Address, + 31: proto.SettingsType, + 32: proto.XprvType, + 33: proto.CoinType, 100: proto.DebugLinkDecision, 101: proto.DebugLinkGetState, 102: proto.DebugLinkState, diff --git a/cmd.py b/cmd.py index 198186a19..b5567d327 100755 --- a/cmd.py +++ b/cmd.py @@ -3,10 +3,10 @@ import binascii import argparse import json -import bitkeylib.trezor_pb2 as proto from bitkeylib.client import BitkeyClient from bitkeylib.debuglink import DebugLink - +from bitkeylib.protobuf_json import pb2json + def parse_args(commands): parser = argparse.ArgumentParser(description='Commandline tool for Bitkey devices.') parser.add_argument('-t', '--transport', dest='transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Transport used for talking with the device") @@ -87,22 +87,38 @@ class Commands(object): def get_entropy(self, args): return binascii.hexlify(self.client.get_entropy(args.size)) + def get_features(self, args): + return pb2json(self.client.features) + + def ping(self, args): + return self.client.ping(args.msg) + def get_master_public_key(self, args): return binascii.hexlify(self.client.get_master_public_key()) - def get_uuid(self, args): - return binascii.hexlify(self.client.get_uuid()) - + def get_serial_number(self, args): + return binascii.hexlify(self.client.get_serial_number()) + + def set_label(self, args): + return self.client.apply_settings(label=args.label) + + def set_coin(self, args): + return self.client.apply_settings(coin_shortcut=args.coin_shortcut) + def load_device(self, args): seed = ' '.join(args.seed) return self.client.load_device(seed, args.pin) list.help = 'List connected Trezor USB devices' + ping.help = 'Send ping message' get_address.help = 'Get bitcoin address in base58 encoding' get_entropy.help = 'Get example entropy' - get_uuid.help = 'Get device\'s unique identifier' + get_features.help = 'Retrieve device features and settings' + get_serial_number.help = 'Get device\'s unique identifier' get_master_public_key.help = 'Get master public key' + set_label.help = 'Set new wallet label' + set_coin.help = 'Switch device to another crypto currency' load_device.help = 'Load custom configuration to the device' get_address.arguments = ( @@ -112,7 +128,21 @@ class Commands(object): get_entropy.arguments = ( (('size',), {'type': int}), ) + + get_features.arguments = () + + ping.arguments = ( + (('msg',), {'type': str}), + ) + set_label.arguments = ( + (('label',), {'type': str}), + ) + + set_coin.arguments = ( + (('coin_shortcut',), {'type': str}), + ) + load_device.arguments = ( (('-s', '--seed'), {'type': str, 'nargs': '+'}), (('-n', '--pin'), {'type': str, 'default': ''}), @@ -149,7 +179,7 @@ def main(): res = args.func(cmds, args) if args.json: - print json.dumps(res) + print json.dumps(res, sort_keys=True, indent=4) else: print res diff --git a/protobuf/trezor.proto b/protobuf/trezor.proto index 2e4d3b173..6e8702cc8 100644 --- a/protobuf/trezor.proto +++ b/protobuf/trezor.proto @@ -3,7 +3,7 @@ Author: Marek "slush" Palatinus - Version: 0.1 + Version: 0.4 */ // Specifies which script will be used for given transaction output. @@ -18,7 +18,31 @@ enum RequestType { TXOUTPUT = 1; } -// Ask for device details +// Structure for BIP32-encoded node +// Used for imports into the device +message XprvType { + required bytes version = 1; + required uint32 depth = 2; + required uint32 fingerprint = 3; + required uint32 child_num = 4; + required bytes chain_code = 5; + required bytes private_key = 6; +} + +message CoinType { + optional bytes coin_name = 2; + optional bytes coin_shortcut = 3; + optional uint32 address_type = 4; + optional uint64 maxfee_kb = 5; +} + +message SettingsType { + optional bytes language = 1; // Trezor uses 'english' as default + optional CoinType coin = 2; + optional bytes label = 3; // Human readable wallet name +} + +// Reset device to default state and ask for device details // // Response: Features message Initialize { @@ -29,7 +53,15 @@ message Features { optional bytes vendor = 1; // Name of the manufacturer, e.g. "trezor" optional uint32 major_version = 2; // Major version of the device, e.g. 1 optional uint32 minor_version = 3; // Minor version of the device, e.g. 0 - optional uint64 maxfee_kb = 4; // Maximum accepted fee per kilobyte of signed transaction + optional SettingsType settings = 4; // User-level settings of the device + optional bytes serial_number = 5; // Device's unique identifier +} + +// Overwrites only filled fields of the structure +message ApplySettings { + optional bytes language = 1; + optional bytes coin_shortcut = 2; + optional bytes label = 3; } // Test if device is live, device will send back the message on success @@ -82,18 +114,6 @@ message Failure { optional bytes message = 2; // May contain human-readable message of the error state } -// Ask device for unique identifier. -// -// Response: UUID -message GetUUID { -} - -// Identifier of the device. This identifier must be composed from CPU serial number -// or other persistent source and must be the same for consecutive requests. -message UUID { - required bytes UUID = 1; -} - // Message can be sent by the *device* as a resopnse to any request. // Device is waiting for HW button press. No action is required from computer // Computer should respond with ButtonAck message or ButtonCancel to cancel @@ -140,15 +160,6 @@ message Entropy { required bytes entropy = 1; // Stream of generated bytes } -// Set maximum allowed fee per kB of transaction. This is used by internal sanity checking -// in SignTx method. Transaction won't be signed if requested transaction fees are above -// current value. -// -// Response: Success, PinMatrixRequest, Failure -message SetMaxFeeKb { - required uint64 maxfee_kb = 1; // Maximum allowed transaction fee in satoshis per kB -} - // Ask device for it's current master public key. This may be used for generating // public keys on the computer independently to the device. API doesn't provide // any other way how to get bitcoin addresses from the device. @@ -174,8 +185,9 @@ message Address { // // Response: Success, PinMatrixRequest, Failure message LoadDevice { - required bytes seed = 1; // Seed encoded as a mnemonic (12 english words) - optional bytes pin = 2; // Set PIN protection for important actions + optional bytes seed = 1; // Seed encoded as a mnemonic (12 english words) + optional XprvType xprv = 2; + optional bytes pin = 3; // Set PIN protection for important actions } // Request device to do full-reset, to generate new seed @@ -195,6 +207,23 @@ message SignTx { required uint32 inputs_count = 5; // Count of inputs of the transaction } +// Request a simplified workflow of signing. +// This method doesn't support streaming, +// so there may be hardware limits +// in number of inputs and outputs. +// +// This simplified workflow should not be used +// in production, it is designed mainly for debug purposes. +// +// When everything is fine, Success.message contains +// serialized transaction. +// +// Response: Success, PinMatrixRequest, Failure +message SimpleSignTx { + repeated TxInput inputs = 1; + repeated TxOutput outputs = 2; +} + // Sent by the device as a response for SignTx. Device asks for information for signing transaction. // If request_index is set, device asks for TxInput/TxOutput message (depends on request_type) // with details of index's input. diff --git a/tests/common.py b/tests/common.py index 4173610e5..ea6ec263f 100644 --- a/tests/common.py +++ b/tests/common.py @@ -14,7 +14,7 @@ class BitkeyTest(unittest.TestCase): self.bitkey.setup_debuglink(button=True, pin_correct=True) self.bitkey.load_device( - seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', + seed='soda country ghost glove unusual dose blouse cope bless medal block car', pin='1234') print "Setup finished" From c514fe3edd809857ee482239f2383fa5511f02e2 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 13 Sep 2013 00:17:32 +0200 Subject: [PATCH 0081/1535] Binary pb2 file --- bitkeylib/trezor_pb2.py | 513 +++++++++++++++++++++++++++------------- 1 file changed, 350 insertions(+), 163 deletions(-) diff --git a/bitkeylib/trezor_pb2.py b/bitkeylib/trezor_pb2.py index 0fcc36e36..024944f89 100644 --- a/bitkeylib/trezor_pb2.py +++ b/bitkeylib/trezor_pb2.py @@ -11,7 +11,7 @@ from google.protobuf import descriptor_pb2 DESCRIPTOR = descriptor.FileDescriptor( name='trezor.proto', package='', - serialized_pb='\n\x0ctrezor.proto\"\x0c\n\nInitialize\"[\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"K\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\t\n\x07GetUUID\"\x14\n\x04UUID\x12\x0c\n\x04UUID\x18\x01 \x02(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\" \n\x0bSetMaxFeeKb\x12\x11\n\tmaxfee_kb\x18\x01 \x02(\x04\"\x14\n\x12GetMasterPublicKey\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\'\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x02(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01') + serialized_pb='\n\x0ctrezor.proto\"{\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\x0c\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x12\n\nchain_code\x18\x05 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x06 \x02(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x02 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x03 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x04 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x05 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\x80\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x1f\n\x08settings\x18\x04 \x01(\x0b\x32\r.SettingsType\x12\x15\n\rserial_number\x18\x05 \x01(\x0c\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"K\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"\x14\n\x12GetMasterPublicKey\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01') _SCRIPTTYPE = descriptor.EnumDescriptor( name='ScriptType', @@ -30,8 +30,8 @@ _SCRIPTTYPE = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1317, - serialized_end=1368, + serialized_start=1750, + serialized_end=1801, ) @@ -52,8 +52,8 @@ _REQUESTTYPE = descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1370, - serialized_end=1410, + serialized_start=1803, + serialized_end=1843, ) @@ -64,6 +64,160 @@ TXOUTPUT = 1 +_XPRVTYPE = descriptor.Descriptor( + name='XprvType', + full_name='XprvType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='version', full_name='XprvType.version', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='depth', full_name='XprvType.depth', index=1, + number=2, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='fingerprint', full_name='XprvType.fingerprint', index=2, + number=3, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='child_num', full_name='XprvType.child_num', index=3, + number=4, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='chain_code', full_name='XprvType.chain_code', index=4, + number=5, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='private_key', full_name='XprvType.private_key', index=5, + number=6, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=16, + serialized_end=139, +) + + +_COINTYPE = descriptor.Descriptor( + name='CoinType', + full_name='CoinType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='coin_name', full_name='CoinType.coin_name', index=0, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='coin_shortcut', full_name='CoinType.coin_shortcut', index=1, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='address_type', full_name='CoinType.address_type', index=2, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='maxfee_kb', full_name='CoinType.maxfee_kb', index=3, + number=5, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=141, + serialized_end=234, +) + + +_SETTINGSTYPE = descriptor.Descriptor( + name='SettingsType', + full_name='SettingsType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='language', full_name='SettingsType.language', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='coin', full_name='SettingsType.coin', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='label', full_name='SettingsType.label', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=236, + serialized_end=308, +) + + _INITIALIZE = descriptor.Descriptor( name='Initialize', full_name='Initialize', @@ -80,8 +234,8 @@ _INITIALIZE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=16, - serialized_end=28, + serialized_start=310, + serialized_end=322, ) @@ -114,9 +268,58 @@ _FEATURES = descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='maxfee_kb', full_name='Features.maxfee_kb', index=3, - number=4, type=4, cpp_type=4, label=1, - has_default_value=False, default_value=0, + name='settings', full_name='Features.settings', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='serial_number', full_name='Features.serial_number', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=325, + serialized_end=453, +) + + +_APPLYSETTINGS = descriptor.Descriptor( + name='ApplySettings', + full_name='ApplySettings', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='language', full_name='ApplySettings.language', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='coin_shortcut', full_name='ApplySettings.coin_shortcut', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='label', full_name='ApplySettings.label', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -129,8 +332,8 @@ _FEATURES = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=30, - serialized_end=121, + serialized_start=455, + serialized_end=526, ) @@ -157,8 +360,8 @@ _PING = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=123, - serialized_end=146, + serialized_start=528, + serialized_end=551, ) @@ -185,8 +388,8 @@ _DEBUGLINKDECISION = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=148, - serialized_end=183, + serialized_start=553, + serialized_end=588, ) @@ -234,8 +437,8 @@ _DEBUGLINKGETSTATE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=185, - serialized_end=263, + serialized_start=590, + serialized_end=668, ) @@ -283,8 +486,8 @@ _DEBUGLINKSTATE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=265, - serialized_end=340, + serialized_start=670, + serialized_end=745, ) @@ -304,8 +507,8 @@ _DEBUGLINKSTOP = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=342, - serialized_end=357, + serialized_start=747, + serialized_end=762, ) @@ -332,8 +535,8 @@ _SUCCESS = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=359, - serialized_end=385, + serialized_start=764, + serialized_end=790, ) @@ -367,57 +570,8 @@ _FAILURE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=387, - serialized_end=427, -) - - -_GETUUID = descriptor.Descriptor( - name='GetUUID', - full_name='GetUUID', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=429, - serialized_end=438, -) - - -_UUID = descriptor.Descriptor( - name='UUID', - full_name='UUID', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='UUID', full_name='UUID.UUID', index=0, - number=1, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=440, - serialized_end=460, + serialized_start=792, + serialized_end=832, ) @@ -437,8 +591,8 @@ _BUTTONREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=462, - serialized_end=477, + serialized_start=834, + serialized_end=849, ) @@ -458,8 +612,8 @@ _BUTTONACK = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=479, - serialized_end=490, + serialized_start=851, + serialized_end=862, ) @@ -479,8 +633,8 @@ _BUTTONCANCEL = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=492, - serialized_end=506, + serialized_start=864, + serialized_end=878, ) @@ -507,8 +661,8 @@ _PINMATRIXREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=508, - serialized_end=543, + serialized_start=880, + serialized_end=915, ) @@ -535,8 +689,8 @@ _PINMATRIXACK = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=545, - serialized_end=572, + serialized_start=917, + serialized_end=944, ) @@ -556,8 +710,8 @@ _PINMATRIXCANCEL = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=574, - serialized_end=591, + serialized_start=946, + serialized_end=963, ) @@ -584,8 +738,8 @@ _GETENTROPY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=593, - serialized_end=619, + serialized_start=965, + serialized_end=991, ) @@ -612,36 +766,8 @@ _ENTROPY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=621, - serialized_end=647, -) - - -_SETMAXFEEKB = descriptor.Descriptor( - name='SetMaxFeeKb', - full_name='SetMaxFeeKb', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='maxfee_kb', full_name='SetMaxFeeKb.maxfee_kb', index=0, - number=1, type=4, cpp_type=4, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=649, - serialized_end=681, + serialized_start=993, + serialized_end=1019, ) @@ -661,8 +787,8 @@ _GETMASTERPUBLICKEY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=683, - serialized_end=703, + serialized_start=1021, + serialized_end=1041, ) @@ -689,8 +815,8 @@ _MASTERPUBLICKEY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=705, - serialized_end=735, + serialized_start=1043, + serialized_end=1073, ) @@ -717,8 +843,8 @@ _GETADDRESS = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=737, - serialized_end=768, + serialized_start=1075, + serialized_end=1106, ) @@ -745,8 +871,8 @@ _ADDRESS = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=770, - serialized_end=796, + serialized_start=1108, + serialized_end=1134, ) @@ -759,14 +885,21 @@ _LOADDEVICE = descriptor.Descriptor( fields=[ descriptor.FieldDescriptor( name='seed', full_name='LoadDevice.seed', index=0, - number=1, type=12, cpp_type=9, label=2, + number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), descriptor.FieldDescriptor( - name='pin', full_name='LoadDevice.pin', index=1, - number=2, type=12, cpp_type=9, label=1, + name='xprv', full_name='LoadDevice.xprv', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='pin', full_name='LoadDevice.pin', index=2, + number=3, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -780,8 +913,8 @@ _LOADDEVICE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=798, - serialized_end=837, + serialized_start=1136, + serialized_end=1200, ) @@ -808,8 +941,8 @@ _RESETDEVICE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=839, - serialized_end=868, + serialized_start=1202, + serialized_end=1231, ) @@ -843,8 +976,43 @@ _SIGNTX = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=870, - serialized_end=923, + serialized_start=1233, + serialized_end=1286, +) + + +_SIMPLESIGNTX = descriptor.Descriptor( + name='SimpleSignTx', + full_name='SimpleSignTx', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='inputs', full_name='SimpleSignTx.inputs', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='outputs', full_name='SimpleSignTx.outputs', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1288, + serialized_end=1356, ) @@ -899,8 +1067,8 @@ _TXREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=926, - serialized_end=1060, + serialized_start=1359, + serialized_end=1493, ) @@ -962,8 +1130,8 @@ _TXINPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1062, - serialized_end=1180, + serialized_start=1495, + serialized_end=1613, ) @@ -1025,14 +1193,23 @@ _TXOUTPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1183, - serialized_end=1315, + serialized_start=1616, + serialized_end=1748, ) +_SETTINGSTYPE.fields_by_name['coin'].message_type = _COINTYPE +_FEATURES.fields_by_name['settings'].message_type = _SETTINGSTYPE +_LOADDEVICE.fields_by_name['xprv'].message_type = _XPRVTYPE +_SIMPLESIGNTX.fields_by_name['inputs'].message_type = _TXINPUT +_SIMPLESIGNTX.fields_by_name['outputs'].message_type = _TXOUTPUT _TXREQUEST.fields_by_name['request_type'].enum_type = _REQUESTTYPE _TXOUTPUT.fields_by_name['script_type'].enum_type = _SCRIPTTYPE +DESCRIPTOR.message_types_by_name['XprvType'] = _XPRVTYPE +DESCRIPTOR.message_types_by_name['CoinType'] = _COINTYPE +DESCRIPTOR.message_types_by_name['SettingsType'] = _SETTINGSTYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE DESCRIPTOR.message_types_by_name['Features'] = _FEATURES +DESCRIPTOR.message_types_by_name['ApplySettings'] = _APPLYSETTINGS DESCRIPTOR.message_types_by_name['Ping'] = _PING DESCRIPTOR.message_types_by_name['DebugLinkDecision'] = _DEBUGLINKDECISION DESCRIPTOR.message_types_by_name['DebugLinkGetState'] = _DEBUGLINKGETSTATE @@ -1040,8 +1217,6 @@ DESCRIPTOR.message_types_by_name['DebugLinkState'] = _DEBUGLINKSTATE DESCRIPTOR.message_types_by_name['DebugLinkStop'] = _DEBUGLINKSTOP DESCRIPTOR.message_types_by_name['Success'] = _SUCCESS DESCRIPTOR.message_types_by_name['Failure'] = _FAILURE -DESCRIPTOR.message_types_by_name['GetUUID'] = _GETUUID -DESCRIPTOR.message_types_by_name['UUID'] = _UUID DESCRIPTOR.message_types_by_name['ButtonRequest'] = _BUTTONREQUEST DESCRIPTOR.message_types_by_name['ButtonAck'] = _BUTTONACK DESCRIPTOR.message_types_by_name['ButtonCancel'] = _BUTTONCANCEL @@ -1050,7 +1225,6 @@ DESCRIPTOR.message_types_by_name['PinMatrixAck'] = _PINMATRIXACK DESCRIPTOR.message_types_by_name['PinMatrixCancel'] = _PINMATRIXCANCEL DESCRIPTOR.message_types_by_name['GetEntropy'] = _GETENTROPY DESCRIPTOR.message_types_by_name['Entropy'] = _ENTROPY -DESCRIPTOR.message_types_by_name['SetMaxFeeKb'] = _SETMAXFEEKB DESCRIPTOR.message_types_by_name['GetMasterPublicKey'] = _GETMASTERPUBLICKEY DESCRIPTOR.message_types_by_name['MasterPublicKey'] = _MASTERPUBLICKEY DESCRIPTOR.message_types_by_name['GetAddress'] = _GETADDRESS @@ -1058,10 +1232,29 @@ DESCRIPTOR.message_types_by_name['Address'] = _ADDRESS DESCRIPTOR.message_types_by_name['LoadDevice'] = _LOADDEVICE DESCRIPTOR.message_types_by_name['ResetDevice'] = _RESETDEVICE DESCRIPTOR.message_types_by_name['SignTx'] = _SIGNTX +DESCRIPTOR.message_types_by_name['SimpleSignTx'] = _SIMPLESIGNTX DESCRIPTOR.message_types_by_name['TxRequest'] = _TXREQUEST DESCRIPTOR.message_types_by_name['TxInput'] = _TXINPUT DESCRIPTOR.message_types_by_name['TxOutput'] = _TXOUTPUT +class XprvType(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _XPRVTYPE + + # @@protoc_insertion_point(class_scope:XprvType) + +class CoinType(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _COINTYPE + + # @@protoc_insertion_point(class_scope:CoinType) + +class SettingsType(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SETTINGSTYPE + + # @@protoc_insertion_point(class_scope:SettingsType) + class Initialize(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _INITIALIZE @@ -1074,6 +1267,12 @@ class Features(message.Message): # @@protoc_insertion_point(class_scope:Features) +class ApplySettings(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _APPLYSETTINGS + + # @@protoc_insertion_point(class_scope:ApplySettings) + class Ping(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _PING @@ -1116,18 +1315,6 @@ class Failure(message.Message): # @@protoc_insertion_point(class_scope:Failure) -class GetUUID(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _GETUUID - - # @@protoc_insertion_point(class_scope:GetUUID) - -class UUID(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _UUID - - # @@protoc_insertion_point(class_scope:UUID) - class ButtonRequest(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _BUTTONREQUEST @@ -1176,12 +1363,6 @@ class Entropy(message.Message): # @@protoc_insertion_point(class_scope:Entropy) -class SetMaxFeeKb(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _SETMAXFEEKB - - # @@protoc_insertion_point(class_scope:SetMaxFeeKb) - class GetMasterPublicKey(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _GETMASTERPUBLICKEY @@ -1224,6 +1405,12 @@ class SignTx(message.Message): # @@protoc_insertion_point(class_scope:SignTx) +class SimpleSignTx(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SIMPLESIGNTX + + # @@protoc_insertion_point(class_scope:SimpleSignTx) + class TxRequest(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _TXREQUEST From d273cdf86bb99d6a14152740e4979e788a7eec3b Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 13 Sep 2013 05:27:21 +0200 Subject: [PATCH 0082/1535] Added unit tests for BTC, tBTC & LTC address generation --- tests/test_addresses.py | 42 ++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/tests/test_addresses.py b/tests/test_addresses.py index 9cb665142..cbe759c92 100644 --- a/tests/test_addresses.py +++ b/tests/test_addresses.py @@ -1,28 +1,32 @@ import unittest import common -# FIXME: This test implements Electrum algorithm only +class TestAddresses(common.TrezorTest): + def test_btc(self): + self.client.load_device(seed=self.mnemonic1, pin='') + self.client.apply_settings(coin_shortcut='BTC') -class TestAddresses(common.BitkeyTest): - def test_address(self): - self.bitkey.load_device( - seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - pin='') + self.assertEqual(self.client.get_address([]), '1GBDQapuquKZGPxWTB39s5bayLDTv5sD77') + self.assertEqual(self.client.get_address([1]), '13HWRT9JtftSF6uv65eMrQowHn3CioKegP') + self.assertEqual(self.client.get_address([0, 1]), '1GnnT11aZeH6QZCtT7EjCvRF3EXHoY3owE') + self.assertEqual(self.client.get_address([9, 0]), '1KeRRK74ARTxnby8dYsm2UreAx5tBGbbY7') + self.assertEqual(self.client.get_address([0, 9999999]), '1JeDAdRMxeuWCQ8ohWySCD5KEPoN2sEanK') - self.assertEqual(self.bitkey.get_address([0, 0]), "1KqYyzL53R8oA1LdYvyv7m6JUryFfGJDpa") - self.assertEqual(self.bitkey.get_address([2, 0]), "13MzKU6YjjdyiW3dZJDa5VU4AWGczQsdYD") - self.assertEqual(self.bitkey.get_address([3, 0]), "1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv") - self.assertEqual(self.bitkey.get_address([9, 0]), "1C9DHmWBpvGcFKXEiWWC3EK3EY5Bj79nze") + def test_ltc(self): + self.client.load_device(seed=self.mnemonic1, pin='') + self.client.apply_settings(coin_shortcut='LTC') - def test_change_address(self): - self.bitkey.load_device( - seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - pin='') + self.assertEqual(self.client.get_address([]), 'LaQAfo8jvZZcXCefdK2T96fMBYak5XomhR') + self.assertEqual(self.client.get_address([1]), 'LMWTgfT8yL8VVuc5GDdf8RshVzQUw9AoUK') + self.assertEqual(self.client.get_address([0, 1]), 'Lb1jiDKQeJX9fMu3dFE2UwV1FStZwvijfE') + self.assertEqual(self.client.get_address([9, 0]), 'LdsNgXQtF5i23QfHogs4JVvQPATAFbfWYA') + self.assertEqual(self.client.get_address([0, 9999999]), 'LcsARqjC3K9ZTCpxsexjUE95ScAeEPqR69') - self.assertEqual(self.bitkey.get_address([0, 1]), "17GpAFnkHRjWKePkX4kxHaHy49V8EHTr7i") - self.assertEqual(self.bitkey.get_address([2, 1]), "1MVgq4XaMX7PmohkYzFEisH1D7uxTiPbFK") - self.assertEqual(self.bitkey.get_address([3, 1]), "1M5NSqrUmmkZqokpHsJd5xm74YG6kjVcz4") - self.assertEqual(self.bitkey.get_address([9, 1]), "1BXUkUsc5gGSzYUAEebg5WZWtRGPNW4NQ9") + def test_tbtc(self): + self.client.load_device(seed=self.mnemonic1, pin='') + self.client.apply_settings(coin_shortcut='tBTC') + self.assertEqual(self.client.get_address([111, 42]), 'mypL2oDrCj4196uuvtC6QJnsetu3YMUdB7') + if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() From 4530dc3684ef8e87c6e1e71c1d13ca7f0fab5500 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 13 Sep 2013 05:28:29 +0200 Subject: [PATCH 0083/1535] All current tests passed --- tests/test_basic.py | 20 ++++++++++---------- tests/test_protect_call.py | 24 ++++++++++-------------- tests/test_signtx.py | 36 ++++++++++++++++++------------------ 3 files changed, 38 insertions(+), 42 deletions(-) diff --git a/tests/test_basic.py b/tests/test_basic.py index 6ff7d65a8..85a310872 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -1,7 +1,7 @@ import unittest import common -from bitkeylib import proto +from trezorlib import proto ''' TODO: @@ -12,29 +12,29 @@ from bitkeylib import proto ''' -class TestBasic(common.BitkeyTest): +class TestBasic(common.TrezorTest): def test_features(self): - features = self.bitkey.call(proto.Initialize()) + features = self.client.call(proto.Initialize()) # Result is the same as reported by BitkeyClient class - self.assertEqual(features, self.bitkey.features) + self.assertEqual(features, self.client.features) def test_ping(self): - ping = self.bitkey.call(proto.Ping(message='ahoj!')) + ping = self.client.call(proto.Ping(message='ahoj!')) # Ping results in Success(message='Ahoj!') self.assertEqual(ping, proto.Success(message='ahoj!')) def test_uuid(self): - uuid1 = self.bitkey.get_uuid() - self.bitkey.init_device() - uuid2 = self.bitkey.get_uuid() + uuid1 = self.client.get_serial_number() + self.client.init_device() + uuid2 = self.client.get_serial_number() # UUID must be longer than 10 characters - self.assertEqual(len(uuid1), 9) + self.assertEqual(len(uuid1), 12) # Every resulf of UUID must be the same self.assertEqual(uuid1, uuid2) if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index 12066b433..03c662bdc 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -1,35 +1,31 @@ import unittest import common -from bitkeylib.client import CallException, PinException -from bitkeylib import proto +from trezorlib.client import CallException, PinException +from trezorlib import proto -class TestProtectCall(common.BitkeyTest): +class TestProtectCall(common.TrezorTest): def _some_protected_call(self): # This method perform any call which have protection in the device entropy_len = 10 - entropy = self.bitkey.get_entropy(entropy_len) + entropy = self.client.get_entropy(entropy_len) self.assertEqual(len(entropy), entropy_len) def test_no_protection(self): - self.bitkey.load_device( - seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - pin='') + self.client.load_device(seed=self.mnemonic1, pin='') - self.assertEqual(self.bitkey.debuglink.read_pin()[0], '') + self.assertEqual(self.client.debuglink.read_pin()[0], '') self._some_protected_call() def test_pin(self): - self.bitkey.load_device( - seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', - pin='2345') + self.client.load_device(seed=self.mnemonic1, pin=self.pin2) - self.assertEqual(self.bitkey.debuglink.read_pin()[0], '2345') + self.assertEqual(self.client.debuglink.read_pin()[0], self.pin2) self._some_protected_call() def test_incorrect_pin(self): - self.bitkey.setup_debuglink(button=True, pin_correct=False) + self.client.setup_debuglink(button=True, pin_correct=False) self.assertRaises(PinException, self._some_protected_call) if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 73322423c..9b651013a 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -2,7 +2,7 @@ import unittest import common import binascii -import bitkeylib.trezor_pb2 as proto +import trezorlib.trezor_pb2 as proto ''' ./electrum -w ~/.electrum-bitkey mktx 1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv 0.001 @@ -16,7 +16,7 @@ a62964699995f6e018cfbeb7a71a66d4c64fa38875d79ead0a9ac66f59c1c8b3a3ffffffff 0250c30000000000001976a91444ce5c6789b0bb0e8a9ab9a4769fe181cb274c4688aca086 0100000000001976a9149e03078026388661b197129a43f0f64f88379ce688ac00000000 ''' -class TestSignTx(common.BitkeyTest): +class TestSignTx(common.TrezorTest): def test_signtx(self): expected_tx = '01000000012de70f7d6ffed0db70f8882f3fca90db9bb09f0e99bce27468c23d3c994fcd56' \ '010000008b4830450221009b985e14d53cfeed3496846db6ddaa77a0206138d0df4c2ccd3b' \ @@ -27,7 +27,7 @@ class TestSignTx(common.BitkeyTest): '0100000000001976a9149e03078026388661b197129a43f0f64f88379ce688ac00000000' inp1 = proto.TxInput(index=0, - address_n=[1,0], + address_n=[1, 0], amount=200000, # 0.002 BTC prev_hash=binascii.unhexlify('56cd4f993c3dc26874e2bc990e9fb09bdb90ca3f2f88f870dbd0fe6f7d0fe72d'), prev_index=1, @@ -35,7 +35,7 @@ class TestSignTx(common.BitkeyTest): ) out1 = proto.TxOutput(index=0, - address='17GpAFnkHRjWKePkX4kxHaHy49V8EHTr7i', + address='1GnnT11aZeH6QZCtT7EjCvRF3EXHoY3owE', address_n=[0, 1], amount=50000, # 0.0005 BTC script_type=proto.PAYTOADDRESS, @@ -50,7 +50,7 @@ class TestSignTx(common.BitkeyTest): #script_args= ) - print binascii.hexlify(self.bitkey.sign_tx([inp1], [out1, out2])[1]) + print binascii.hexlify(self.client.sign_tx([inp1], [out1, out2])[1]) ''' def test_workflow(self): @@ -87,11 +87,11 @@ class TestSignTx(common.BitkeyTest): # Prepare and send initial message tx = proto.SignTx() tx.algo = proto.ELECTRUM - tx.random = self.bitkey._get_local_entropy() + tx.random = self.client._get_local_entropy() tx.inputs_count = 2 tx.outputs_count = 2 - res = self.bitkey.call(tx) + res = self.client.call(tx) self.assertIsInstance(res, proto.TxRequest) self.assertEqual(res.request_type, proto.TXINPUT) self.assertEqual(res.request_index, 0) @@ -99,28 +99,28 @@ class TestSignTx(common.BitkeyTest): self.assertEqual(res.serialized_tx, '') # FIRST SIGNATURE - res = self.bitkey.call(inp1) + res = self.client.call(inp1) self.assertIsInstance(res, proto.TxRequest) self.assertEqual(res.request_type, proto.TXINPUT) self.assertEqual(res.request_index, 1) self.assertEqual(res.signature, '') self.assertEqual(res.serialized_tx, '') - res = self.bitkey.call(inp2) + res = self.client.call(inp2) self.assertIsInstance(res, proto.TxRequest) self.assertEqual(res.request_type, proto.TXOUTPUT) self.assertEqual(res.request_index, 0) self.assertEqual(res.signature, '') self.assertEqual(res.serialized_tx, '') - res = self.bitkey.call(out1) + res = self.client.call(out1) self.assertIsInstance(res, proto.TxRequest) self.assertEqual(res.request_type, proto.TXOUTPUT) self.assertEqual(res.request_index, 1) self.assertEqual(res.signature, '') self.assertEqual(res.serialized_tx, '') - res = self.bitkey.call(out2) + res = self.client.call(out2) self.assertIsInstance(res, proto.TxRequest) self.assertEqual(res.request_type, proto.TXINPUT) self.assertEqual(res.request_index, 0) @@ -129,28 +129,28 @@ class TestSignTx(common.BitkeyTest): serialized += res.serialized_tx # SECOND SIGNATURE - res = self.bitkey.call(inp1) + res = self.client.call(inp1) self.assertIsInstance(res, proto.TxRequest) self.assertEqual(res.request_type, proto.TXINPUT) self.assertEqual(res.request_index, 1) self.assertEqual(res.signature, '') self.assertEqual(res.serialized_tx, '') - res = self.bitkey.call(inp2) + res = self.client.call(inp2) self.assertIsInstance(res, proto.TxRequest) self.assertEqual(res.request_type, proto.TXOUTPUT) self.assertEqual(res.request_index, 0) self.assertEqual(res.signature, '') self.assertEqual(res.serialized_tx, '') - res = self.bitkey.call(out1) + res = self.client.call(out1) self.assertIsInstance(res, proto.TxRequest) self.assertEqual(res.request_type, proto.TXOUTPUT) self.assertEqual(res.request_index, 1) self.assertEqual(res.signature, '') self.assertEqual(res.serialized_tx, '') - res = self.bitkey.call(out2) + res = self.client.call(out2) self.assertIsInstance(res, proto.TxRequest) self.assertEqual(res.request_type, proto.TXOUTPUT) self.assertEqual(res.request_index, 0) @@ -159,7 +159,7 @@ class TestSignTx(common.BitkeyTest): serialized += res.serialized_tx # FINALIZING OUTPUTS - res = self.bitkey.call(out1) + res = self.client.call(out1) self.assertIsInstance(res, proto.TxRequest) self.assertEqual(res.request_type, proto.TXOUTPUT) self.assertEqual(res.request_index, 1) @@ -167,7 +167,7 @@ class TestSignTx(common.BitkeyTest): self.assertNotEqual(res.serialized_tx, '') serialized += res.serialized_tx - res = self.bitkey.call(out2) + res = self.client.call(out2) self.assertIsInstance(res, proto.TxRequest) self.assertEqual(res.request_type, proto.TXOUTPUT) self.assertEqual(res.request_index, -1) @@ -179,4 +179,4 @@ class TestSignTx(common.BitkeyTest): ''' if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() From c692f6078275d23a0a382f655ec4849b85bbeba2 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 13 Sep 2013 05:28:56 +0200 Subject: [PATCH 0084/1535] Refactored module structure --- tests/common.py | 30 ++++++++++++++++++------------ tests/config.py | 6 +++--- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/tests/common.py b/tests/common.py index ea6ec263f..b1861e390 100644 --- a/tests/common.py +++ b/tests/common.py @@ -1,26 +1,32 @@ import unittest import config -from bitkeylib.client import BitkeyClient -from bitkeylib.debuglink import DebugLink -from bitkeylib import proto +from trezorlib.client import TrezorClient +from trezorlib.debuglink import DebugLink +from trezorlib import proto -class BitkeyTest(unittest.TestCase): +class TrezorTest(unittest.TestCase): def setUp(self): self.debug_transport = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS) self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) - self.bitkey = BitkeyClient(self.transport, DebugLink(self.debug_transport), debug=True) - - self.bitkey.setup_debuglink(button=True, pin_correct=True) - - self.bitkey.load_device( - seed='soda country ghost glove unusual dose blouse cope bless medal block car', - pin='1234') + self.client = TrezorClient(self.transport, DebugLink(self.debug_transport), debug=True) + + self.mnemonic1 = 'panda tree planet type cinnamon digital always essence grocery poor tree slot' + self.mnemonic2 = 'glory vanish past debate cricket extra receive spring scatter rebound bat expect' + self.pin1 = '1234' + self.pin2 = '43211' + + self.client.setup_debuglink(button=True, pin_correct=True) + self.client.load_device( + seed=self.mnemonic1, + pin=self.pin1) + + self.client.apply_settings(label='unit testing', coin_shortcut='BTC', language='english') + print "Setup finished" print "--------------" def tearDown(self): - self.bitkey.init_device() self.debug_transport.close() self.transport.close() diff --git a/tests/config.py b/tests/config.py index 1f3e48587..4656c3953 100644 --- a/tests/config.py +++ b/tests/config.py @@ -1,9 +1,9 @@ import sys sys.path = ['../',] + sys.path -from bitkeylib.transport_pipe import PipeTransport -from bitkeylib.transport_hid import HidTransport -from bitkeylib.transport_socket import SocketTransportClient +from trezorlib.transport_pipe import PipeTransport +from trezorlib.transport_hid import HidTransport +from trezorlib.transport_socket import SocketTransportClient TRANSPORT = PipeTransport TRANSPORT_ARGS = ('../../trezor-emu/pipe.trezor', False) From 004ce33e4076db8dce18f44ac6923ca6b53f8e77 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 13 Sep 2013 05:29:58 +0200 Subject: [PATCH 0085/1535] Updated project link, changed repo name --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f29ddfad5..ba312076a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -bitkeylib-python +trezorlib-python ================ -Client side implementation for Trezor-compatible Bitcoin hardware wallets. See http://trezor.bitcoin.cz for more information. +Client side implementation for Trezor-compatible Bitcoin hardware wallets. See http://bitcointrezor.com for more information. From 18d5f9f3d6dee0b3c43ef2664347a8dc21ab24c6 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 13 Sep 2013 05:31:24 +0200 Subject: [PATCH 0086/1535] ApplySettings triggers init_device to reload Features structure --- trezorlib/client.py | 249 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 trezorlib/client.py diff --git a/trezorlib/client.py b/trezorlib/client.py new file mode 100644 index 000000000..6f44ac628 --- /dev/null +++ b/trezorlib/client.py @@ -0,0 +1,249 @@ +import os +import time + +import trezor_pb2 as proto + +def show_message(message): + print "MESSAGE FROM DEVICE:", message + +def show_input(input_text, message=None): + if message: + print "QUESTION FROM DEVICE:", message + return raw_input(input_text) + +class CallException(Exception): + pass + +class PinException(CallException): + pass + +class TrezorClient(object): + + def __init__(self, transport, debuglink=None, + message_func=show_message, input_func=show_input, debug=False): + self.transport = transport + self.debuglink = debuglink + + self.message_func = message_func + self.input_func = input_func + self.debug = debug + + self.setup_debuglink() + self.init_device() + + def _get_local_entropy(self): + return os.urandom(32) + + def init_device(self): + self.master_public_key = None + self.features = self.call(proto.Initialize()) + + def get_master_public_key(self): + if self.master_public_key: + return self.master_public_key + + self.master_public_key = self.call(proto.GetMasterPublicKey()).key + return self.master_public_key + + def get_address(self, n): + return self.call(proto.GetAddress(address_n=n)).address + + def get_entropy(self, size): + return self.call(proto.GetEntropy(size=size)).entropy + + def ping(self, msg): + return self.call(proto.Ping(message=msg)).message + + def get_serial_number(self): + return self.features.serial_number + + def apply_settings(self, label=None, coin_shortcut=None, language=None): + settings = proto.ApplySettings() + if label: + settings.label = label + if coin_shortcut: + settings.coin_shortcut = coin_shortcut + if language: + settings.language = language + + out = self.call(settings).message + self.init_device() # Reload Features + + return out + + def _pprint(self, msg): + return "<%s>:\n%s" % (msg.__class__.__name__, msg) + + def setup_debuglink(self, button=None, pin_correct=False): + self.debug_button = button + self.debug_pin = pin_correct + + def call(self, msg): + if self.debug: + print '----------------------' + print "Sending", self._pprint(msg) + + try: + self.transport.session_begin() + + self.transport.write(msg) + resp = self.transport.read_blocking() + + if isinstance(resp, proto.ButtonRequest): + if self.debuglink and self.debug_button: + print "Pressing button", self.debug_button + self.debuglink.press_button(self.debug_button) + + return self.call(proto.ButtonAck()) + + if isinstance(resp, proto.PinMatrixRequest): + if self.debuglink: + if self.debug_pin: + pin = self.debuglink.read_pin_encoded() + msg2 = proto.PinMatrixAck(pin=pin) + else: + msg2 = proto.PinMatrixAck(pin='444444222222') + else: + pin = self.input_func("PIN required: ", resp.message) + msg2 = proto.PinMatrixAck(pin=pin) + + return self.call(msg2) + + finally: + self.transport.session_end() + + if isinstance(resp, proto.Failure): + self.message_func(resp.message) + + if resp.code == 4: + raise CallException("Action cancelled by user") + + elif resp.code == 6: + raise PinException("PIN is invalid") + + raise CallException(resp.code, resp.message) + + if self.debug: + print "Received", self._pprint(resp) + + return resp + + def sign_tx(self, inputs, outputs): + ''' + inputs: list of TxInput + outputs: list of TxOutput + + proto.TxInput(index=0, + address_n=0, + amount=0, + prev_hash='', + prev_index=0, + #script_sig= + ) + proto.TxOutput(index=0, + address='1Bitkey', + #address_n=[], + amount=100000000, + script_type=proto.PAYTOADDRESS, + #script_args= + ) + ''' + + start = time.time() + + try: + self.transport.session_begin() + + # Prepare and send initial message + tx = proto.SignTx() + tx.inputs_count = len(inputs) + tx.outputs_count = len(outputs) + res = self.call(tx) + + # Prepare structure for signatures + signatures = [None]*len(inputs) + serialized_tx = '' + + counter = 0 + while True: + counter += 1 + + if isinstance(res, proto.Failure): + raise CallException("Signing failed") + + if not isinstance(res, proto.TxRequest): + raise CallException("Unexpected message") + + # If there's some part of signed transaction, let's add it + if res.serialized_tx: + print "!!! RECEIVED PART OF SERIALIED TX (%d BYTES)" % len(res.serialized_tx) + serialized_tx += res.serialized_tx + + if res.signed_index >= 0 and res.signature: + print "!!! SIGNED INPUT", res.signed_index + signatures[res.signed_index] = res.signature + + if res.request_index < 0: + # Device didn't ask for more information, finish workflow + break + + # Device asked for one more information, let's process it. + if res.request_type == proto.TXOUTPUT: + res = self.call(outputs[res.request_index]) + continue + + elif res.request_type == proto.TXINPUT: + print "REQUESTING", res.request_index + res = self.call(inputs[res.request_index]) + continue + + finally: + self.transport.session_end() + + print "SIGNED IN %.03f SECONDS, CALLED %d MESSAGES, %d BYTES" % \ + (time.time() - start, counter, len(serialized_tx)) + + return (signatures, serialized_tx) + + #print "PBDATA", tx.SerializeToString().encode('hex') + + ################# + ################# + ################# + + ''' + signatures = [('add550d6ba9ab7e01d37e17658f98b6e901208d241f24b08197b5e20dfa7f29f095ae01acbfa5c4281704a64053dcb80e9b089ecbe09f5871d67725803e36edd', '3045022100dced96eeb43836bc95676879eac303eabf39802e513f4379a517475c259da12502201fd36c90ecd91a32b2ca8fed2e1755a7f2a89c2d520eb0da10147802bc7ca217')] + + s_inputs = [] + for i in range(len(inputs)): + addr, v, p_hash, p_pos, p_scriptPubKey, _, _ = inputs[i] + pubkey = signatures[i][0].decode('hex') + sig = signatures[i][1].decode('hex') + s_inputs.append((addr, v, p_hash, p_pos, p_scriptPubKey, pubkey, sig)) + + return s_inputs + + s_inputs = [] + for i in range(len(inputs)): + addr, v, p_hash, p_pos, p_scriptPubKey, _, _ = inputs[i] + private_key = ecdsa.SigningKey.from_string( self.get_private_key(addr, password), curve = SECP256k1 ) + public_key = private_key.get_verifying_key() + pubkey = public_key.to_string() + tx = filter( raw_tx( inputs, outputs, for_sig = i ) ) + sig = private_key.sign_digest( Hash( tx.decode('hex') ), sigencode = ecdsa.util.sigencode_der ) + assert public_key.verify_digest( sig, Hash( tx.decode('hex') ), sigdecode = ecdsa.util.sigdecode_der) + s_inputs.append( (addr, v, p_hash, p_pos, p_scriptPubKey, pubkey, sig) ) + return s_inputs + ''' + + def reset_device(self): + # Begin with device reset workflow + raise Exception("Not implemented") + resp = self.call(proto.ResetDevice(random=self._get_local_entropy())) + self.init_device() + return isinstance(resp, proto.Success) + + def load_device(self, seed, pin): + resp = self.call(proto.LoadDevice(seed=seed, pin=pin)) + self.init_device() + return isinstance(resp, proto.Success) From 9fd31217241d9978c66d3533a46789b4d11c2885 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 13 Sep 2013 05:32:27 +0200 Subject: [PATCH 0087/1535] Fixed project name --- trezorlib/transport_pipe.py | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 trezorlib/transport_pipe.py diff --git a/trezorlib/transport_pipe.py b/trezorlib/transport_pipe.py new file mode 100644 index 000000000..74b526de4 --- /dev/null +++ b/trezorlib/transport_pipe.py @@ -0,0 +1,59 @@ +'''TransportFake implements fake wire transport over local named pipe. +Use this transport for talking with trezor simulator.''' + +import os +from select import select +from transport import Transport + +class PipeTransport(Transport): + def __init__(self, device, is_device, *args, **kwargs): + self.is_device = is_device # Set True if act as device + + super(PipeTransport, self).__init__(device, *args, **kwargs) + + def _open(self): + if self.is_device: + self.filename_read = self.device+'.to' + self.filename_write = self.device+'.from' + + os.mkfifo(self.filename_read, 0600) + os.mkfifo(self.filename_write, 0600) + else: + self.filename_read = self.device+'.from' + self.filename_write = self.device+'.to' + + if not os.path.exists(self.filename_write): + raise Exception("Not connected") + + self.write_fd = os.open(self.filename_write, os.O_RDWR)#|os.O_NONBLOCK) + self.write_f = os.fdopen(self.write_fd, 'w+') + + self.read_fd = os.open(self.filename_read, os.O_RDWR)#|os.O_NONBLOCK) + self.read_f = os.fdopen(self.read_fd, 'rb') + + def _close(self): + self.read_f.close() + self.write_f.close() + if self.is_device: + os.unlink(self.filename_read) + os.unlink(self.filename_write) + + def ready_to_read(self): + rlist, _, _ = select([self.read_f], [], [], 0) + return len(rlist) > 0 + + def _write(self, msg): + try: + self.write_f.write(msg) + self.write_f.flush() + except OSError: + print "Error while writing to socket" + raise + + def _read(self): + try: + (msg_type, datalen) = self._read_headers(self.read_f) + return (msg_type, self.read_f.read(datalen)) + except IOError: + print "Failed to read from device" + raise From 66cede8e18eaadfd3d0bd59684c5424964224ca3 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 13 Sep 2013 05:32:58 +0200 Subject: [PATCH 0088/1535] Fixed path to module --- protobuf/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protobuf/build.sh b/protobuf/build.sh index c9fd0e9dd..3c75ba205 100755 --- a/protobuf/build.sh +++ b/protobuf/build.sh @@ -2,4 +2,4 @@ cd `dirname $0` -protoc --python_out=../bitkeylib/ trezor.proto +protoc --python_out=../trezorlib/ trezor.proto From 333182f062e96d9a58218ae6588feb832386831e Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 13 Sep 2013 05:33:20 +0200 Subject: [PATCH 0089/1535] Module renamed from bitkeylib to trezorlib --- cmd.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/cmd.py b/cmd.py index b5567d327..2d3dee56c 100755 --- a/cmd.py +++ b/cmd.py @@ -3,12 +3,12 @@ import binascii import argparse import json -from bitkeylib.client import BitkeyClient -from bitkeylib.debuglink import DebugLink -from bitkeylib.protobuf_json import pb2json +from trezorlib.client import TrezorClient +from trezorlib.debuglink import DebugLink +from trezorlib.protobuf_json import pb2json def parse_args(commands): - parser = argparse.ArgumentParser(description='Commandline tool for Bitkey devices.') + parser = argparse.ArgumentParser(description='Commandline tool for Trezor devices.') parser.add_argument('-t', '--transport', dest='transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Transport used for talking with the device") parser.add_argument('-p', '--path', dest='path', default='', help="Path used by the transport (usually serial port)") parser.add_argument('-dt', '--debuglink-transport', dest='debuglink_transport', choices=['usb', 'serial', 'pipe', 'socket'], default='socket', help="Debuglink transport") @@ -41,7 +41,7 @@ def parse_args(commands): def get_transport(transport_string, path): if transport_string == 'usb': - from bitkeylib.transport_hid import HidTransport + from trezorlib.transport_hid import HidTransport if path == '': try: @@ -52,19 +52,19 @@ def get_transport(transport_string, path): return HidTransport(path) if transport_string == 'serial': - from bitkeylib.transport_serial import SerialTransport + from trezorlib.transport_serial import SerialTransport return SerialTransport(path) if transport_string == 'pipe': - from bitkeylib.transport_pipe import PipeTransport + from trezorlib.transport_pipe import PipeTransport return PipeTransport(path, is_device=False) if transport_string == 'socket': - from bitkeylib.transport_socket import SocketTransportClient + from trezorlib.transport_socket import SocketTransportClient return SocketTransportClient(path) if transport_string == 'fake': - from bitkeylib.transport_fake import FakeTransport + from trezorlib.transport_fake import FakeTransport return FakeTransport(path) raise NotImplemented("Unknown transport") @@ -149,7 +149,7 @@ class Commands(object): ) def list_usb(): - from bitkeylib.transport_hid import HidTransport + from trezorlib.transport_hid import HidTransport devices = HidTransport.enumerate() return devices @@ -172,7 +172,7 @@ def main(): else: debuglink = None - client = BitkeyClient(transport, debuglink=debuglink) + client = TrezorClient(transport, debuglink=debuglink) client.setup_debuglink(button=True, pin_correct=True) cmds = Commands(client) From 98bb17299bfcf5c15e3df46d17f05a98d218fae1 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 13 Sep 2013 05:37:23 +0200 Subject: [PATCH 0090/1535] Module renamed to trezorlib --- bitkeylib/client.py | 245 ------------------- bitkeylib/transport_pipe.py | 59 ----- {bitkeylib => trezorlib}/__init__.py | 0 {bitkeylib => trezorlib}/debuglink.py | 0 {bitkeylib => trezorlib}/mapping.py | 0 trezorlib/protobuf_json.py | 139 +++++++++++ {bitkeylib => trezorlib}/transport.py | 0 {bitkeylib => trezorlib}/transport_fake.py | 0 {bitkeylib => trezorlib}/transport_hid.py | 0 {bitkeylib => trezorlib}/transport_serial.py | 0 {bitkeylib => trezorlib}/transport_socket.py | 0 {bitkeylib => trezorlib}/trezor_pb2.py | 0 12 files changed, 139 insertions(+), 304 deletions(-) delete mode 100644 bitkeylib/client.py delete mode 100644 bitkeylib/transport_pipe.py rename {bitkeylib => trezorlib}/__init__.py (100%) rename {bitkeylib => trezorlib}/debuglink.py (100%) rename {bitkeylib => trezorlib}/mapping.py (100%) create mode 100644 trezorlib/protobuf_json.py rename {bitkeylib => trezorlib}/transport.py (100%) rename {bitkeylib => trezorlib}/transport_fake.py (100%) rename {bitkeylib => trezorlib}/transport_hid.py (100%) rename {bitkeylib => trezorlib}/transport_serial.py (100%) rename {bitkeylib => trezorlib}/transport_socket.py (100%) rename {bitkeylib => trezorlib}/trezor_pb2.py (100%) diff --git a/bitkeylib/client.py b/bitkeylib/client.py deleted file mode 100644 index 24c5a554c..000000000 --- a/bitkeylib/client.py +++ /dev/null @@ -1,245 +0,0 @@ -import os -import time - -import trezor_pb2 as proto - -def show_message(message): - print "MESSAGE FROM DEVICE:", message - -def show_input(input_text, message=None): - if message: - print "QUESTION FROM DEVICE:", message - return raw_input(input_text) - -class CallException(Exception): - pass - -class PinException(CallException): - pass - -class BitkeyClient(object): - - def __init__(self, transport, debuglink=None, - message_func=show_message, input_func=show_input, debug=False): - self.transport = transport - self.debuglink = debuglink - - self.message_func = message_func - self.input_func = input_func - self.debug = debug - - self.setup_debuglink() - self.init_device() - - def _get_local_entropy(self): - return os.urandom(32) - - def init_device(self): - self.master_public_key = None - self.features = self.call(proto.Initialize()) - - def get_master_public_key(self): - if self.master_public_key: - return self.master_public_key - - self.master_public_key = self.call(proto.GetMasterPublicKey()).key - return self.master_public_key - - def get_address(self, n): - return self.call(proto.GetAddress(address_n=n)).address - - def get_entropy(self, size): - return self.call(proto.GetEntropy(size=size)).entropy - - def ping(self, msg): - return self.call(proto.Ping(message=msg)).message - - def get_serial_number(self): - return self.features.serial_number - - def apply_settings(self, label=None, coin_shortcut=None, language=None): - settings = proto.ApplySettings() - if label: - settings.label = label - if coin_shortcut: - settings.coin_shortcut = coin_shortcut - if language: - settings.language = language - return self.call(settings).message - - def _pprint(self, msg): - return "<%s>:\n%s" % (msg.__class__.__name__, msg) - - def setup_debuglink(self, button=None, pin_correct=False): - self.debug_button = button - self.debug_pin = pin_correct - - def call(self, msg): - if self.debug: - print '----------------------' - print "Sending", self._pprint(msg) - - try: - self.transport.session_begin() - - self.transport.write(msg) - resp = self.transport.read_blocking() - - if isinstance(resp, proto.ButtonRequest): - if self.debuglink and self.debug_button: - print "Pressing button", self.debug_button - self.debuglink.press_button(self.debug_button) - - return self.call(proto.ButtonAck()) - - if isinstance(resp, proto.PinMatrixRequest): - if self.debuglink: - if self.debug_pin: - pin = self.debuglink.read_pin_encoded() - msg2 = proto.PinMatrixAck(pin=pin) - else: - msg2 = proto.PinMatrixAck(pin='444444222222') - else: - pin = self.input_func("PIN required: ", resp.message) - msg2 = proto.PinMatrixAck(pin=pin) - - return self.call(msg2) - - finally: - self.transport.session_end() - - if isinstance(resp, proto.Failure): - self.message_func(resp.message) - - if resp.code == 4: - raise CallException("Action cancelled by user") - - elif resp.code == 6: - raise PinException("PIN is invalid") - - raise CallException(resp.code, resp.message) - - if self.debug: - print "Received", self._pprint(resp) - - return resp - - def sign_tx(self, inputs, outputs): - ''' - inputs: list of TxInput - outputs: list of TxOutput - - proto.TxInput(index=0, - address_n=0, - amount=0, - prev_hash='', - prev_index=0, - #script_sig= - ) - proto.TxOutput(index=0, - address='1Bitkey', - #address_n=[], - amount=100000000, - script_type=proto.PAYTOADDRESS, - #script_args= - ) - ''' - - start = time.time() - - try: - self.transport.session_begin() - - # Prepare and send initial message - tx = proto.SignTx() - tx.inputs_count = len(inputs) - tx.outputs_count = len(outputs) - res = self.call(tx) - - # Prepare structure for signatures - signatures = [None]*len(inputs) - serialized_tx = '' - - counter = 0 - while True: - counter += 1 - - if isinstance(res, proto.Failure): - raise CallException("Signing failed") - - if not isinstance(res, proto.TxRequest): - raise CallException("Unexpected message") - - # If there's some part of signed transaction, let's add it - if res.serialized_tx: - print "!!! RECEIVED PART OF SERIALIED TX (%d BYTES)" % len(res.serialized_tx) - serialized_tx += res.serialized_tx - - if res.signed_index >= 0 and res.signature: - print "!!! SIGNED INPUT", res.signed_index - signatures[res.signed_index] = res.signature - - if res.request_index < 0: - # Device didn't ask for more information, finish workflow - break - - # Device asked for one more information, let's process it. - if res.request_type == proto.TXOUTPUT: - res = self.call(outputs[res.request_index]) - continue - - elif res.request_type == proto.TXINPUT: - print "REQUESTING", res.request_index - res = self.call(inputs[res.request_index]) - continue - - finally: - self.transport.session_end() - - print "SIGNED IN %.03f SECONDS, CALLED %d MESSAGES, %d BYTES" % \ - (time.time() - start, counter, len(serialized_tx)) - - return (signatures, serialized_tx) - - #print "PBDATA", tx.SerializeToString().encode('hex') - - ################# - ################# - ################# - - ''' - signatures = [('add550d6ba9ab7e01d37e17658f98b6e901208d241f24b08197b5e20dfa7f29f095ae01acbfa5c4281704a64053dcb80e9b089ecbe09f5871d67725803e36edd', '3045022100dced96eeb43836bc95676879eac303eabf39802e513f4379a517475c259da12502201fd36c90ecd91a32b2ca8fed2e1755a7f2a89c2d520eb0da10147802bc7ca217')] - - s_inputs = [] - for i in range(len(inputs)): - addr, v, p_hash, p_pos, p_scriptPubKey, _, _ = inputs[i] - pubkey = signatures[i][0].decode('hex') - sig = signatures[i][1].decode('hex') - s_inputs.append((addr, v, p_hash, p_pos, p_scriptPubKey, pubkey, sig)) - - return s_inputs - - s_inputs = [] - for i in range(len(inputs)): - addr, v, p_hash, p_pos, p_scriptPubKey, _, _ = inputs[i] - private_key = ecdsa.SigningKey.from_string( self.get_private_key(addr, password), curve = SECP256k1 ) - public_key = private_key.get_verifying_key() - pubkey = public_key.to_string() - tx = filter( raw_tx( inputs, outputs, for_sig = i ) ) - sig = private_key.sign_digest( Hash( tx.decode('hex') ), sigencode = ecdsa.util.sigencode_der ) - assert public_key.verify_digest( sig, Hash( tx.decode('hex') ), sigdecode = ecdsa.util.sigdecode_der) - s_inputs.append( (addr, v, p_hash, p_pos, p_scriptPubKey, pubkey, sig) ) - return s_inputs - ''' - - def reset_device(self): - # Begin with device reset workflow - raise Exception("Not implemented") - resp = self.call(proto.ResetDevice(random=self._get_local_entropy())) - self.init_device() - return isinstance(resp, proto.Success) - - def load_device(self, seed, pin): - resp = self.call(proto.LoadDevice(seed=seed, pin=pin)) - self.init_device() - return isinstance(resp, proto.Success) diff --git a/bitkeylib/transport_pipe.py b/bitkeylib/transport_pipe.py deleted file mode 100644 index ee27857d8..000000000 --- a/bitkeylib/transport_pipe.py +++ /dev/null @@ -1,59 +0,0 @@ -'''TransportFake implements fake wire transport over local named pipe. -Use this transport for talking with bitkey simulator.''' - -import os -from select import select -from transport import Transport - -class PipeTransport(Transport): - def __init__(self, device, is_device, *args, **kwargs): - self.is_device = is_device # Set True if act as device - - super(PipeTransport, self).__init__(device, *args, **kwargs) - - def _open(self): - if self.is_device: - self.filename_read = self.device+'.to' - self.filename_write = self.device+'.from' - - os.mkfifo(self.filename_read, 0600) - os.mkfifo(self.filename_write, 0600) - else: - self.filename_read = self.device+'.from' - self.filename_write = self.device+'.to' - - if not os.path.exists(self.filename_write): - raise Exception("Not connected") - - self.write_fd = os.open(self.filename_write, os.O_RDWR)#|os.O_NONBLOCK) - self.write_f = os.fdopen(self.write_fd, 'w+') - - self.read_fd = os.open(self.filename_read, os.O_RDWR)#|os.O_NONBLOCK) - self.read_f = os.fdopen(self.read_fd, 'rb') - - def _close(self): - self.read_f.close() - self.write_f.close() - if self.is_device: - os.unlink(self.filename_read) - os.unlink(self.filename_write) - - def ready_to_read(self): - rlist, _, _ = select([self.read_f], [], [], 0) - return len(rlist) > 0 - - def _write(self, msg): - try: - self.write_f.write(msg) - self.write_f.flush() - except OSError: - print "Error while writing to socket" - raise - - def _read(self): - try: - (msg_type, datalen) = self._read_headers(self.read_f) - return (msg_type, self.read_f.read(datalen)) - except IOError: - print "Failed to read from device" - raise \ No newline at end of file diff --git a/bitkeylib/__init__.py b/trezorlib/__init__.py similarity index 100% rename from bitkeylib/__init__.py rename to trezorlib/__init__.py diff --git a/bitkeylib/debuglink.py b/trezorlib/debuglink.py similarity index 100% rename from bitkeylib/debuglink.py rename to trezorlib/debuglink.py diff --git a/bitkeylib/mapping.py b/trezorlib/mapping.py similarity index 100% rename from bitkeylib/mapping.py rename to trezorlib/mapping.py diff --git a/trezorlib/protobuf_json.py b/trezorlib/protobuf_json.py new file mode 100644 index 000000000..146468efa --- /dev/null +++ b/trezorlib/protobuf_json.py @@ -0,0 +1,139 @@ +# JSON serialization support for Google's protobuf Messages +# Copyright (c) 2009, Paul Dovbush +# All rights reserved. +# http://code.google.com/p/protobuf-json/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +''' +Provide serialization and de-serialization of Google's protobuf Messages into/from JSON format. +''' + +# groups are deprecated and not supported; +# Note that preservation of unknown fields is currently not available for Python (c) google docs +# extensions is not supported from 0.0.5 (due to gpb2.3 changes) + +__version__ = '0.0.5' +__author__ = 'Paul Dovbush ' + + +import json # py2.6+ TODO: add support for other JSON serialization modules +from google.protobuf.descriptor import FieldDescriptor as FD + + +class ParseError(Exception): pass + + +def json2pb(pb, js): + ''' convert JSON string to google.protobuf.descriptor instance ''' + for field in pb.DESCRIPTOR.fields: + if field.name not in js: + continue + if field.type == FD.TYPE_MESSAGE: + pass + elif field.type in _js2ftype: + ftype = _js2ftype[field.type] + else: + raise ParseError("Field %s.%s of type '%d' is not supported" % (pb.__class__.__name__, field.name, field.type,)) + value = js[field.name] + if field.label == FD.LABEL_REPEATED: + pb_value = getattr(pb, field.name, None) + for v in value: + if field.type == FD.TYPE_MESSAGE: + json2pb(pb_value.add(), v) + else: + pb_value.append(ftype(v)) + else: + if field.type == FD.TYPE_MESSAGE: + json2pb(getattr(pb, field.name, None), value) + else: + setattr(pb, field.name, ftype(value)) + return pb + + + +def pb2json(pb): + ''' convert google.protobuf.descriptor instance to JSON string ''' + js = {} + # fields = pb.DESCRIPTOR.fields #all fields + fields = pb.ListFields() # only filled (including extensions) + for field, value in fields: + if field.type == FD.TYPE_MESSAGE: + ftype = pb2json + elif field.type in _ftype2js: + ftype = _ftype2js[field.type] + else: + raise ParseError("Field %s.%s of type '%d' is not supported" % (pb.__class__.__name__, field.name, field.type,)) + if field.label == FD.LABEL_REPEATED: + js_value = [] + for v in value: + js_value.append(ftype(v)) + else: + js_value = ftype(value) + js[field.name] = js_value + return js + + +_ftype2js = { + FD.TYPE_DOUBLE: float, + FD.TYPE_FLOAT: float, + FD.TYPE_INT64: long, + FD.TYPE_UINT64: long, + FD.TYPE_INT32: int, + FD.TYPE_FIXED64: float, + FD.TYPE_FIXED32: float, + FD.TYPE_BOOL: bool, + FD.TYPE_STRING: unicode, + # FD.TYPE_MESSAGE: pb2json, #handled specially + FD.TYPE_BYTES: lambda x: x.encode('string_escape'), + FD.TYPE_UINT32: int, + FD.TYPE_ENUM: int, + FD.TYPE_SFIXED32: float, + FD.TYPE_SFIXED64: float, + FD.TYPE_SINT32: int, + FD.TYPE_SINT64: long, +} + +_js2ftype = { + FD.TYPE_DOUBLE: float, + FD.TYPE_FLOAT: float, + FD.TYPE_INT64: long, + FD.TYPE_UINT64: long, + FD.TYPE_INT32: int, + FD.TYPE_FIXED64: float, + FD.TYPE_FIXED32: float, + FD.TYPE_BOOL: bool, + FD.TYPE_STRING: unicode, + # FD.TYPE_MESSAGE: json2pb, #handled specially + FD.TYPE_BYTES: lambda x: x.decode('string_escape'), + FD.TYPE_UINT32: int, + FD.TYPE_ENUM: int, + FD.TYPE_SFIXED32: float, + FD.TYPE_SFIXED64: float, + FD.TYPE_SINT32: int, + FD.TYPE_SINT64: long, +} diff --git a/bitkeylib/transport.py b/trezorlib/transport.py similarity index 100% rename from bitkeylib/transport.py rename to trezorlib/transport.py diff --git a/bitkeylib/transport_fake.py b/trezorlib/transport_fake.py similarity index 100% rename from bitkeylib/transport_fake.py rename to trezorlib/transport_fake.py diff --git a/bitkeylib/transport_hid.py b/trezorlib/transport_hid.py similarity index 100% rename from bitkeylib/transport_hid.py rename to trezorlib/transport_hid.py diff --git a/bitkeylib/transport_serial.py b/trezorlib/transport_serial.py similarity index 100% rename from bitkeylib/transport_serial.py rename to trezorlib/transport_serial.py diff --git a/bitkeylib/transport_socket.py b/trezorlib/transport_socket.py similarity index 100% rename from bitkeylib/transport_socket.py rename to trezorlib/transport_socket.py diff --git a/bitkeylib/trezor_pb2.py b/trezorlib/trezor_pb2.py similarity index 100% rename from bitkeylib/trezor_pb2.py rename to trezorlib/trezor_pb2.py From ae9444a83b0c061f9d14c9f1494eae3865a710c6 Mon Sep 17 00:00:00 2001 From: slush0 Date: Wed, 25 Sep 2013 01:14:54 +0200 Subject: [PATCH 0091/1535] Fixes bug with aligning the magic --- trezorlib/transport.py | 6 ++++-- trezorlib/transport_hid.py | 11 ++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/trezorlib/transport.py b/trezorlib/transport.py index c7e806074..f2aaeb065 100644 --- a/trezorlib/transport.py +++ b/trezorlib/transport.py @@ -81,11 +81,13 @@ class Transport(object): # Align cursor to the beginning of the header ("##") c = read_f.read(1) + i = 0 while c != '#': - if c == '': + i += 1 + if i >= 64: # timeout raise Exception("Timed out while waiting for the magic character") - print "Warning: Aligning to magic characters" + #print "Aligning to magic characters" c = read_f.read(1) if read_f.read(1) != "#": diff --git a/trezorlib/transport_hid.py b/trezorlib/transport_hid.py index 19186bad6..885bfae7e 100644 --- a/trezorlib/transport_hid.py +++ b/trezorlib/transport_hid.py @@ -1,6 +1,7 @@ '''USB HID implementation of Transport.''' import hid +import time from transport import Transport, NotImplementedException DEVICE_IDS = [ @@ -40,6 +41,7 @@ class HidTransport(Transport): self.buffer = '' path = self.device.split(':') self.hid = hid.device(int(path[0], 16), int(path[1], 16))#, path[2]) + self.hid.set_nonblocking(True) self.hid.send_feature_report([0x41, 0x01]) # enable UART self.hid.send_feature_report([0x43, 0x03]) # purge TX/RX FIFOs @@ -54,8 +56,8 @@ class HidTransport(Transport): def _write(self, msg): msg = bytearray(msg) while len(msg): - # Report ID, data padded to 62 bytes - self.hid.write([63,] + list(msg[:63]) + [0]*(63-len(msg[0:63]))) + # Report ID, data padded to 63 bytes + self.hid.write([63, ] + list(msg[:63]) + [0] * (63 - len(msg[:63]))) msg = msg[63:] def _read(self): @@ -65,6 +67,9 @@ class HidTransport(Transport): def _raw_read(self, length): while len(self.buffer) < length: data = self.hid.read(64) + if not len(data): + time.sleep(0.05) + continue report_id = data[0] @@ -73,7 +78,7 @@ class HidTransport(Transport): raise Exception("Not implemented") # Payload received, skip the report ID - self.buffer += str(bytearray(data[1:64])) + self.buffer += str(bytearray(data[1:])) ret = self.buffer[:length] self.buffer = self.buffer[length:] From 0634d6bbb4a78d083a6575caf8ba85325774b3d7 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 7 Oct 2013 22:00:17 +0200 Subject: [PATCH 0092/1535] Qt4 widget for Pin matrix --- trezorlib/pinmatrix.py | 73 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 trezorlib/pinmatrix.py diff --git a/trezorlib/pinmatrix.py b/trezorlib/pinmatrix.py new file mode 100644 index 000000000..1ae17f505 --- /dev/null +++ b/trezorlib/pinmatrix.py @@ -0,0 +1,73 @@ +import sys +from PyQt4.Qt import QApplication, QWidget, QGridLayout, QVBoxLayout +from PyQt4.QtGui import QPushButton, QLineEdit, QSizePolicy +from PyQt4.QtCore import QObject, SIGNAL + +class PinButton(QPushButton): + def __init__(self, password, encoded_value): + super(PinButton, self).__init__() + self.password = password + self.encoded_value = encoded_value + + QObject.connect(self, SIGNAL('clicked()'), self._pressed) + + def _pressed(self): + self.password.setText(self.password.text() + str(self.encoded_value)) + self.password.setFocus() + +class PinMatrixWidget(QWidget): + ''' + Displays widget with nine blank buttons and password box. + Encodes button clicks into sequence of numbers for passing + into PinAck messages of Trezor. + ''' + def __init__(self, parent=None): + super(PinMatrixWidget, self).__init__(parent) + + self.buttons = [] + + self.password = QLineEdit() + self.password.setEchoMode(QLineEdit.Password) + + grid = QGridLayout() + grid.setSpacing(0) + for x in range(9): + button = PinButton(self.password, x + 1) + button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + self.buttons.append(button) + grid.addWidget(button, x / 3, x % 3) + + vbox = QVBoxLayout() + vbox.addLayout(grid) + vbox.addWidget(self.password) + + self.setLayout(vbox) + self.move(300, 150) + + def get_value(self): + return self.password.text() + +if __name__ == '__main__': + ''' + Demo application showing PinMatrix widget in action + ''' + a = QApplication(sys.argv) + + matrix = PinMatrixWidget() + + def clicked(): + print "PinMatrix value is", matrix.get_value() + sys.exit() + + ok = QPushButton('OK') + QObject.connect(ok, SIGNAL('clicked()'), clicked) + + vbox = QVBoxLayout() + vbox.addWidget(matrix) + vbox.addWidget(ok) + + w = QWidget() + w.setLayout(vbox) + w.show() + + a.exec_() From 12955a0c0cb3a16b40437fa3b99c41450b6eaf10 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 7 Oct 2013 23:27:02 +0200 Subject: [PATCH 0093/1535] Allow only [1-9]+ in Pin matrix --- trezorlib/pinmatrix.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/trezorlib/pinmatrix.py b/trezorlib/pinmatrix.py index 1ae17f505..12cfd5eb7 100644 --- a/trezorlib/pinmatrix.py +++ b/trezorlib/pinmatrix.py @@ -1,7 +1,7 @@ import sys from PyQt4.Qt import QApplication, QWidget, QGridLayout, QVBoxLayout -from PyQt4.QtGui import QPushButton, QLineEdit, QSizePolicy -from PyQt4.QtCore import QObject, SIGNAL +from PyQt4.QtGui import QPushButton, QLineEdit, QSizePolicy, QRegExpValidator +from PyQt4.QtCore import QObject, SIGNAL, QRegExp class PinButton(QPushButton): def __init__(self, password, encoded_value): @@ -27,6 +27,7 @@ class PinMatrixWidget(QWidget): self.buttons = [] self.password = QLineEdit() + self.password.setValidator(QRegExpValidator(QRegExp('[1-9]+'), None)) self.password.setEchoMode(QLineEdit.Password) grid = QGridLayout() From f7f04b0482c64069e2ae4878b377e65b8ee33c7e Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 7 Oct 2013 23:27:56 +0200 Subject: [PATCH 0094/1535] Introduce pin_input message to trigger PinMatrix widget --- trezorlib/client.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 6f44ac628..fab17c900 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -11,6 +11,9 @@ def show_input(input_text, message=None): print "QUESTION FROM DEVICE:", message return raw_input(input_text) +def pin_func(input_text, message=None): + return show_input(input_text, message) + class CallException(Exception): pass @@ -20,12 +23,13 @@ class PinException(CallException): class TrezorClient(object): def __init__(self, transport, debuglink=None, - message_func=show_message, input_func=show_input, debug=False): + message_func=show_message, input_func=show_input, pin_func=pin_func, debug=False): self.transport = transport self.debuglink = debuglink self.message_func = message_func self.input_func = input_func + self.pin_func = pin_func self.debug = debug self.setup_debuglink() @@ -104,7 +108,7 @@ class TrezorClient(object): else: msg2 = proto.PinMatrixAck(pin='444444222222') else: - pin = self.input_func("PIN required: ", resp.message) + pin = self.pin_func("PIN required: ", resp.message) msg2 = proto.PinMatrixAck(pin=pin) return self.call(msg2) From e5d19d64a79040826082145a59ca99713a66de9e Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 7 Oct 2013 23:28:48 +0200 Subject: [PATCH 0095/1535] Use PinMatrixWidget if graphic mode is enabled --- cmd.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/cmd.py b/cmd.py index 2d3dee56c..0d6466a48 100755 --- a/cmd.py +++ b/cmd.py @@ -1,11 +1,14 @@ #!/usr/bin/python +import os import binascii import argparse import json +import threading -from trezorlib.client import TrezorClient +from trezorlib.client import TrezorClient, pin_func from trezorlib.debuglink import DebugLink from trezorlib.protobuf_json import pb2json +from trezorlib.pinmatrix import PinMatrixWidget def parse_args(commands): parser = argparse.ArgumentParser(description='Commandline tool for Trezor devices.') @@ -152,7 +155,61 @@ def list_usb(): from trezorlib.transport_hid import HidTransport devices = HidTransport.enumerate() return devices - + +class PinMatrixThread(threading.Thread): + ''' + Hacked PinMatrixWidget into command line tool :-). + ''' + def __init__(self, input_text, message): + super(PinMatrixThread, self).__init__() + self.input_text = input_text + self.message = message + self.pin_value = '' + + def run(self): + import sys + from PyQt4.Qt import QApplication, QWidget, QVBoxLayout + from PyQt4.QtGui import QPushButton, QLabel + from PyQt4.QtCore import QObject, SIGNAL + + a = QApplication(sys.argv) + matrix = PinMatrixWidget() + + def clicked(): + self.pin_value = str(matrix.get_value()) + a.closeAllWindows() + + ok = QPushButton('OK') + QObject.connect(ok, SIGNAL('clicked()'), clicked) + + vbox = QVBoxLayout() + vbox.addWidget(QLabel(self.input_text + self.message)) + vbox.addWidget(matrix) + vbox.addWidget(ok) + + w = QWidget() + w.setLayout(vbox) + w.move(100, 100) + w.show() + + a.exec_() + +def qt_pin_func(input_text, message=None): + ''' + This is a hack to display Qt window in non-qt application. + Qt window just asks for PIN and closes itself, which trigger join(). + ''' + if os.getenv('DISPLAY'): + # Let's hope that system is configured properly and this won't crash + t = PinMatrixThread(input_text, message) + t.start() + t.join() + return t.pin_value + else: + # Most likely no X is running, + # let's fallback to default pin_func implementation + return pin_func(input_text, message) + def main(): args = parse_args(Commands) @@ -172,7 +229,7 @@ def main(): else: debuglink = None - client = TrezorClient(transport, debuglink=debuglink) + client = TrezorClient(transport, pin_func=qt_pin_func, debuglink=debuglink) client.setup_debuglink(button=True, pin_correct=True) cmds = Commands(client) From a69c820f5b664424b7c75ab93538ed176d755633 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 8 Oct 2013 00:18:44 +0200 Subject: [PATCH 0096/1535] Disable focus on buttons --- trezorlib/pinmatrix.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/trezorlib/pinmatrix.py b/trezorlib/pinmatrix.py index 12cfd5eb7..9bb3699f1 100644 --- a/trezorlib/pinmatrix.py +++ b/trezorlib/pinmatrix.py @@ -1,7 +1,7 @@ import sys from PyQt4.Qt import QApplication, QWidget, QGridLayout, QVBoxLayout from PyQt4.QtGui import QPushButton, QLineEdit, QSizePolicy, QRegExpValidator -from PyQt4.QtCore import QObject, SIGNAL, QRegExp +from PyQt4.QtCore import QObject, SIGNAL, QRegExp, Qt class PinButton(QPushButton): def __init__(self, password, encoded_value): @@ -35,6 +35,7 @@ class PinMatrixWidget(QWidget): for x in range(9): button = PinButton(self.password, x + 1) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + button.setFocusPolicy(Qt.NoFocus) self.buttons.append(button) grid.addWidget(button, x / 3, x % 3) From 2a1a1e61e4f4af12b34f0701a76cbb1e75a4031f Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 8 Oct 2013 01:43:16 +0200 Subject: [PATCH 0097/1535] Simplified PinMatrix widget --- trezorlib/pinmatrix.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/trezorlib/pinmatrix.py b/trezorlib/pinmatrix.py index 9bb3699f1..545df0087 100644 --- a/trezorlib/pinmatrix.py +++ b/trezorlib/pinmatrix.py @@ -24,8 +24,6 @@ class PinMatrixWidget(QWidget): def __init__(self, parent=None): super(PinMatrixWidget, self).__init__(parent) - self.buttons = [] - self.password = QLineEdit() self.password.setValidator(QRegExpValidator(QRegExp('[1-9]+'), None)) self.password.setEchoMode(QLineEdit.Password) @@ -36,15 +34,12 @@ class PinMatrixWidget(QWidget): button = PinButton(self.password, x + 1) button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) button.setFocusPolicy(Qt.NoFocus) - self.buttons.append(button) grid.addWidget(button, x / 3, x % 3) vbox = QVBoxLayout() vbox.addLayout(grid) vbox.addWidget(self.password) - self.setLayout(vbox) - self.move(300, 150) def get_value(self): return self.password.text() @@ -70,6 +65,7 @@ if __name__ == '__main__': w = QWidget() w.setLayout(vbox) + w.move(100, 100) w.show() a.exec_() From b827bc987713994cdc756d51b4c6caff5f49caed Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 8 Oct 2013 20:28:38 +0200 Subject: [PATCH 0098/1535] Imported new protobuf from trezor-emu --- protobuf/build.sh | 2 +- protobuf/trezor.proto | 215 +++++++++++++++++++++++++++++++----------- 2 files changed, 163 insertions(+), 54 deletions(-) diff --git a/protobuf/build.sh b/protobuf/build.sh index 3c75ba205..e9d9bdfbb 100755 --- a/protobuf/build.sh +++ b/protobuf/build.sh @@ -2,4 +2,4 @@ cd `dirname $0` -protoc --python_out=../trezorlib/ trezor.proto +protoc --python_out=../trezorlib/ -I/usr/include -I. trezor.proto diff --git a/protobuf/trezor.proto b/protobuf/trezor.proto index 6e8702cc8..82dba712e 100644 --- a/protobuf/trezor.proto +++ b/protobuf/trezor.proto @@ -1,11 +1,67 @@ /* This file describes Protocol buffers messages for bitcoin hardware wallet devices. - Author: Marek "slush" Palatinus + Author: Marek Palatinus - Version: 0.4 + Version: 0.5 */ +import "google/protobuf/descriptor.proto"; + +/* + Mapping between Trezor wire identifier (int) and protobuf message +*/ +enum MessageType { + MessageType_Initialize = 0; + MessageType_Ping = 1; + MessageType_Success = 2; + MessageType_Failure = 3; + MessageType_ChangePin = 4; + MessageType_WipeDevice = 5; + MessageType_GetEntropy = 9; + MessageType_Entropy = 10; + MessageType_GetMasterPublicKey = 11; + MessageType_MasterPublicKey = 12; + MessageType_LoadDevice = 13; + MessageType_ResetDevice = 14; + MessageType_SignTx = 15; + MessageType_SimpleSignTx = 16; + MessageType_Features = 17; + MessageType_PinMatrixRequest = 18; + MessageType_PinMatrixAck = 19; + MessageType_PinMatrixCancel = 20; + MessageType_TxRequest = 21; + MessageType_TxInput = 23; + MessageType_TxOutput = 24; + MessageType_ApplySettings = 25; + MessageType_ButtonRequest = 26; + MessageType_ButtonAck = 27; + MessageType_ButtonCancel = 28; + MessageType_GetAddress = 29; + MessageType_Address = 30; + MessageType_SettingsType = 31; + MessageType_XprvType = 32; + MessageType_CoinType = 33; + MessageType_XpubType = 34; + MessageType_EntropyRequest = 35; + MessageType_EntropyAck = 36; + MessageType_DebugLinkDecision = 100; + MessageType_DebugLinkGetState = 101; + MessageType_DebugLinkState = 102; + MessageType_DebugLinkStop = 103; +} + +// Such option indicates that the message field has binary payload +extend google.protobuf.FieldOptions { + optional bool binary = 50001; +} + + +// **************************************************************************** +// +// Definition of custom field types +// + // Specifies which script will be used for given transaction output. enum ScriptType { PAYTOADDRESS = 0; @@ -21,19 +77,29 @@ enum RequestType { // Structure for BIP32-encoded node // Used for imports into the device message XprvType { - required bytes version = 1; + required uint32 version = 1; + required uint32 depth = 2; + required uint32 fingerprint = 3; + required uint32 child_num = 4; + required bytes chain_code = 5 [(binary) = true]; + required bytes private_key = 6 [(binary) = true]; +} + +// Structure returned by GetMasterPublicKey +message XpubType { + required uint32 version = 1; required uint32 depth = 2; required uint32 fingerprint = 3; required uint32 child_num = 4; - required bytes chain_code = 5; - required bytes private_key = 6; + required bytes chain_code = 5 [(binary) = true]; + required bytes public_key = 6 [(binary) = true]; } message CoinType { - optional bytes coin_name = 2; - optional bytes coin_shortcut = 3; - optional uint32 address_type = 4; - optional uint64 maxfee_kb = 5; + optional bytes coin_name = 1; + optional bytes coin_shortcut = 2; + optional uint32 address_type = 3; + optional uint64 maxfee_kb = 4; } message SettingsType { @@ -42,6 +108,11 @@ message SettingsType { optional bytes label = 3; // Human readable wallet name } +// **************************************************************************** +// +// Basic message +// + // Reset device to default state and ask for device details // // Response: Features @@ -54,7 +125,9 @@ message Features { optional uint32 major_version = 2; // Major version of the device, e.g. 1 optional uint32 minor_version = 3; // Minor version of the device, e.g. 0 optional SettingsType settings = 4; // User-level settings of the device - optional bytes serial_number = 5; // Device's unique identifier + optional bytes device_id = 5 [(binary) = true]; // Device's unique identifier + optional bytes mpk_hash = 6 [(binary) = true]; // Hash of master public key (sha256(XpubType.public_key).digest()) + optional bool pin_protection = 7; // True if Trezor is covered by PIN } // Overwrites only filled fields of the structure @@ -64,6 +137,12 @@ message ApplySettings { optional bytes label = 3; } +// Starts workflow for setting/changing the PIN +// Response: ButtonRequest, PinMatrixRequest +message ChangePin { + optional bool remove = 1; // Set True if want to remove PIN protection +} + // Test if device is live, device will send back the message on success // // Response: None or Success @@ -71,38 +150,6 @@ message Ping { optional bytes message = 1; // Message will be sent back in Success message } -// Virtually "press" the button on the device. -// Message is available only on debugging connection and device must support "debug_link" feature. -// -// Response: Success -message DebugLinkDecision { - required bool yes_no = 1; // True for "confirm", False for "cancel" -} - -// When sent over debug link connection, computer asks for some internal information of the device. -// -// Response: DebugLinkState -message DebugLinkGetState { - optional bool layout = 1; // Request raw buffer of display - optional bool pin = 2; // Request current pin - optional bool matrix = 3; // Request current pin matrix - optional bool seed = 4; // Request current seed -// optional bool state = 5; -} - -// Response object reflecting device's current state. It can be received only over debug link connection. -message DebugLinkState { - optional bytes layout = 1; // Raw buffer of display - optional bytes pin = 2; // Current PIN, blank if PIN is not set/enabled - optional bytes matrix = 3; // Current PIN matrix - optional bytes seed = 4; // Current seed (in mnemonic format) -// optional bytes state = 5; -} - -// Ask device to shutdown/restart -message DebugLinkStop { -} - // Response object defining success of the previous request message Success { optional bytes message = 1; // May contain human readable description of the action or request-specific payload @@ -157,7 +204,7 @@ message GetEntropy { // Response to GetEntropy request contains random data generated by internal HRNG. message Entropy { - required bytes entropy = 1; // Stream of generated bytes + required bytes entropy = 1 [(binary) = true]; // Stream of generated bytes } // Ask device for it's current master public key. This may be used for generating @@ -170,7 +217,7 @@ message GetMasterPublicKey { // Contains master public key derived from device's seed. message MasterPublicKey { - required bytes key = 1; // master public key of requested algorithm in binary format + required XpubType mpk = 1; // BIP32 node public key + chaincode } message GetAddress { @@ -181,9 +228,16 @@ message Address { required bytes address = 1; // Bitcoin address in base58 encoding corresponding to GetAddress(n) call } +// Request device to wipe all sensitive data and settings. +// Device will be turned to uninitialized state. +// +// Response: ButtonRequest +message WipeDevice { +} + // Load seed and related internal settings from computer to the device. Existing seed is overwritten. // -// Response: Success, PinMatrixRequest, Failure +// Response: Success, ButtonRequest, PinMatrixRequest, Failure message LoadDevice { optional bytes seed = 1; // Seed encoded as a mnemonic (12 english words) optional XprvType xprv = 2; @@ -192,13 +246,31 @@ message LoadDevice { // Request device to do full-reset, to generate new seed // and ask user for new settings (PIN). +// Workflow is splitted into ResetDevice/EntropyRequest to be sure +// that entropy provided by device isn't calculated on base of computer provided +// entropy. +// // -// Response: Success, PinMatrixRequest, Failure +// Response: EntropyRequest, PinMatrixRequest, Failure message ResetDevice { - optional bytes random = 7; // Provide additional entropy for seed generation function. - // Recommended to provide 256 bytes of random data. + optional bool display_random = 1; // If set, displays entropy generated by the device used + // for generating the seed *before* asking for additional entropy from computer } +// Asks for additional Entropy from host computer +message EntropyRequest { +} + +// Provide additional entropy for seed generation function. +message EntropyAck { + optional bytes entropy = 1 [(binary) = true]; // Recommended to provide 256 bytes of random data. +} + +// **************************************************************************** +// +// Messages related to transaction signing +// + // Request the device to sign the transaction // // Response: TxRequest, PinMatrixRequest, Failure @@ -232,8 +304,8 @@ message TxRequest { optional int32 request_index = 1; // If >=0, device expects TxInput/TxOutput message from the computer optional RequestType request_type = 2; // Ask for TxInput or TxOutput? optional int32 signed_index = 3; // If >=0, 'signature' contains signed input of this input - optional bytes signature = 4; // If signed_index>=0, represent signature of the signed_index input - optional bytes serialized_tx = 5; // Part of serialized and signed transaction + optional bytes signature = 4 [(binary) = true]; // If signed_index>=0, represent signature of the signed_index input + optional bytes serialized_tx = 5 [(binary) = true]; // Part of serialized and signed transaction } // Transaction onput for SignTx workflow. It is response to TxRequest message sent by device. @@ -243,9 +315,9 @@ message TxInput { required uint32 index = 1; // Position of input in proposed transaction repeated uint32 address_n = 2; // Parameter for address generation algorithm to derive the address from the master public key required uint64 amount = 3; // Amount to spend in satoshis. The rest will be used for transaction fees - required bytes prev_hash = 4; // Hash of previous transaction output to spend by this input + required bytes prev_hash = 4 [(binary) = true]; // Hash of previous transaction output to spend by this input required uint32 prev_index = 5; // Index of previous output to spend - optional bytes script_sig = 6; // Script signature + optional bytes script_sig = 6 [(binary) = true]; // Script signature } // Transaction output for SignTx workflow. It is response to TxRequest message sent by the device. @@ -255,5 +327,42 @@ message TxOutput { repeated uint32 address_n = 3; // Has higher priority than "address". If the output is to myself, specify parameter for address generation algorithm. required uint64 amount = 4; // Amount to send in satoshis required ScriptType script_type = 5;// Select output script type - repeated bytes script_args = 6; // Provide additional parameters for the script (its script-depended) + repeated bytes script_args = 6 [(binary) = true]; // Provide additional parameters for the script (its script-depended) +} + +// **************************************************************************** +// +// Debug* messages are used only on DebugLink interface (separated from USB HID) +// + +// Virtually "press" the button on the device. +// Message is available only on debugging connection and device must support "debug_link" feature. +// +// Response: Success +message DebugLinkDecision { + required bool yes_no = 1; // True for "confirm", False for "cancel" +} + +// When sent over debug link connection, computer asks for some internal information of the device. +// +// Response: DebugLinkState +message DebugLinkGetState { + optional bool layout = 1; // Request raw buffer of display + optional bool pin = 2; // Request current pin + optional bool matrix = 3; // Request current pin matrix + optional bool seed = 4; // Request current seed +// optional bool state = 5; +} + +// Response object reflecting device's current state. It can be received only over debug link connection. +message DebugLinkState { + optional bytes layout = 1 [(binary) = true]; // Raw buffer of display + optional bytes pin = 2; // Current PIN, blank if PIN is not set/enabled + optional bytes matrix = 3; // Current PIN matrix + optional bytes seed = 4; // Current seed (in mnemonic format) +// optional bytes state = 5 [(binary) = true]; +} + +// Ask device to shutdown/restart +message DebugLinkStop { } From 2a41550d92dbf5632217fdbc7d86adc5896de58f Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 8 Oct 2013 20:29:02 +0200 Subject: [PATCH 0099/1535] compiled protobuf --- trezorlib/trezor_pb2.py | 1286 ++++++++++++++++++++++++++------------- 1 file changed, 869 insertions(+), 417 deletions(-) diff --git a/trezorlib/trezor_pb2.py b/trezorlib/trezor_pb2.py index 024944f89..bbb61d333 100644 --- a/trezorlib/trezor_pb2.py +++ b/trezorlib/trezor_pb2.py @@ -1,118 +1,392 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! +# source: trezor.proto -from google.protobuf import descriptor -from google.protobuf import message -from google.protobuf import reflection +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection from google.protobuf import descriptor_pb2 # @@protoc_insertion_point(imports) +import google.protobuf.descriptor_pb2 -DESCRIPTOR = descriptor.FileDescriptor( + +DESCRIPTOR = _descriptor.FileDescriptor( name='trezor.proto', package='', - serialized_pb='\n\x0ctrezor.proto\"{\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\x0c\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x12\n\nchain_code\x18\x05 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x06 \x02(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x02 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x03 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x04 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x05 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\x80\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x1f\n\x08settings\x18\x04 \x01(\x0b\x32\r.SettingsType\x12\x15\n\rserial_number\x18\x05 \x01(\x0c\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"K\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"\x14\n\x12GetMasterPublicKey\"\x1e\n\x0fMasterPublicKey\x12\x0b\n\x03key\x18\x01 \x02(\x0c\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"\x1d\n\x0bResetDevice\x12\x0e\n\x06random\x18\x07 \x01(\x0c\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"v\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x11\n\tprev_hash\x18\x04 \x02(\x0c\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x12\n\nscript_sig\x18\x06 \x01(\x0c\"\x84\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x06 \x03(\x0c*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01') + serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xb2\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x1f\n\x08settings\x18\x04 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xb3\x08\n\x0bMessageType\x12\x1a\n\x16MessageType_Initialize\x10\x00\x12\x14\n\x10MessageType_Ping\x10\x01\x12\x17\n\x13MessageType_Success\x10\x02\x12\x17\n\x13MessageType_Failure\x10\x03\x12\x19\n\x15MessageType_ChangePin\x10\x04\x12\x1a\n\x16MessageType_WipeDevice\x10\x05\x12\x1a\n\x16MessageType_GetEntropy\x10\t\x12\x17\n\x13MessageType_Entropy\x10\n\x12\"\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x12\x1f\n\x1bMessageType_MasterPublicKey\x10\x0c\x12\x1a\n\x16MessageType_LoadDevice\x10\r\x12\x1b\n\x17MessageType_ResetDevice\x10\x0e\x12\x16\n\x12MessageType_SignTx\x10\x0f\x12\x1c\n\x18MessageType_SimpleSignTx\x10\x10\x12\x18\n\x14MessageType_Features\x10\x11\x12 \n\x1cMessageType_PinMatrixRequest\x10\x12\x12\x1c\n\x18MessageType_PinMatrixAck\x10\x13\x12\x1f\n\x1bMessageType_PinMatrixCancel\x10\x14\x12\x19\n\x15MessageType_TxRequest\x10\x15\x12\x17\n\x13MessageType_TxInput\x10\x17\x12\x18\n\x14MessageType_TxOutput\x10\x18\x12\x1d\n\x19MessageType_ApplySettings\x10\x19\x12\x1d\n\x19MessageType_ButtonRequest\x10\x1a\x12\x19\n\x15MessageType_ButtonAck\x10\x1b\x12\x1c\n\x18MessageType_ButtonCancel\x10\x1c\x12\x1a\n\x16MessageType_GetAddress\x10\x1d\x12\x17\n\x13MessageType_Address\x10\x1e\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12\x1e\n\x1aMessageType_EntropyRequest\x10#\x12\x1a\n\x16MessageType_EntropyAck\x10$\x12!\n\x1dMessageType_DebugLinkDecision\x10\x64\x12!\n\x1dMessageType_DebugLinkGetState\x10\x65\x12\x1e\n\x1aMessageType_DebugLinkState\x10\x66\x12\x1d\n\x19MessageType_DebugLinkStop\x10g*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08') -_SCRIPTTYPE = descriptor.EnumDescriptor( +_MESSAGETYPE = _descriptor.EnumDescriptor( + name='MessageType', + full_name='MessageType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='MessageType_Initialize', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_Ping', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_Success', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_Failure', index=3, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_ChangePin', index=4, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_WipeDevice', index=5, number=5, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_GetEntropy', index=6, number=9, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_Entropy', index=7, number=10, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_GetMasterPublicKey', index=8, number=11, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_MasterPublicKey', index=9, number=12, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_LoadDevice', index=10, number=13, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_ResetDevice', index=11, number=14, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_SignTx', index=12, number=15, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_SimpleSignTx', index=13, number=16, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_Features', index=14, number=17, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_PinMatrixRequest', index=15, number=18, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_PinMatrixAck', index=16, number=19, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_PinMatrixCancel', index=17, number=20, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_TxRequest', index=18, number=21, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_TxInput', index=19, number=23, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_TxOutput', index=20, number=24, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_ApplySettings', index=21, number=25, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_ButtonRequest', index=22, number=26, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_ButtonAck', index=23, number=27, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_ButtonCancel', index=24, number=28, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_GetAddress', index=25, number=29, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_Address', index=26, number=30, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_SettingsType', index=27, number=31, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_XprvType', index=28, number=32, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_CoinType', index=29, number=33, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_XpubType', index=30, number=34, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_EntropyRequest', index=31, number=35, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_EntropyAck', index=32, number=36, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_DebugLinkDecision', index=33, number=100, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_DebugLinkGetState', index=34, number=101, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_DebugLinkState', index=35, number=102, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_DebugLinkStop', index=36, number=103, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=2145, + serialized_end=3220, +) + +MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) +_SCRIPTTYPE = _descriptor.EnumDescriptor( name='ScriptType', full_name='ScriptType', filename=None, file=DESCRIPTOR, values=[ - descriptor.EnumValueDescriptor( + _descriptor.EnumValueDescriptor( name='PAYTOADDRESS', index=0, number=0, options=None, type=None), - descriptor.EnumValueDescriptor( + _descriptor.EnumValueDescriptor( name='PAYTOSCRIPTHASH', index=1, number=1, options=None, type=None), ], containing_type=None, options=None, - serialized_start=1750, - serialized_end=1801, + serialized_start=3222, + serialized_end=3273, ) - -_REQUESTTYPE = descriptor.EnumDescriptor( +ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) +_REQUESTTYPE = _descriptor.EnumDescriptor( name='RequestType', full_name='RequestType', filename=None, file=DESCRIPTOR, values=[ - descriptor.EnumValueDescriptor( + _descriptor.EnumValueDescriptor( name='TXINPUT', index=0, number=0, options=None, type=None), - descriptor.EnumValueDescriptor( + _descriptor.EnumValueDescriptor( name='TXOUTPUT', index=1, number=1, options=None, type=None), ], containing_type=None, options=None, - serialized_start=1803, - serialized_end=1843, + serialized_start=3275, + serialized_end=3315, ) - +RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) +MessageType_Initialize = 0 +MessageType_Ping = 1 +MessageType_Success = 2 +MessageType_Failure = 3 +MessageType_ChangePin = 4 +MessageType_WipeDevice = 5 +MessageType_GetEntropy = 9 +MessageType_Entropy = 10 +MessageType_GetMasterPublicKey = 11 +MessageType_MasterPublicKey = 12 +MessageType_LoadDevice = 13 +MessageType_ResetDevice = 14 +MessageType_SignTx = 15 +MessageType_SimpleSignTx = 16 +MessageType_Features = 17 +MessageType_PinMatrixRequest = 18 +MessageType_PinMatrixAck = 19 +MessageType_PinMatrixCancel = 20 +MessageType_TxRequest = 21 +MessageType_TxInput = 23 +MessageType_TxOutput = 24 +MessageType_ApplySettings = 25 +MessageType_ButtonRequest = 26 +MessageType_ButtonAck = 27 +MessageType_ButtonCancel = 28 +MessageType_GetAddress = 29 +MessageType_Address = 30 +MessageType_SettingsType = 31 +MessageType_XprvType = 32 +MessageType_CoinType = 33 +MessageType_XpubType = 34 +MessageType_EntropyRequest = 35 +MessageType_EntropyAck = 36 +MessageType_DebugLinkDecision = 100 +MessageType_DebugLinkGetState = 101 +MessageType_DebugLinkState = 102 +MessageType_DebugLinkStop = 103 PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 TXINPUT = 0 TXOUTPUT = 1 +BINARY_FIELD_NUMBER = 50001 +binary = _descriptor.FieldDescriptor( + name='binary', full_name='binary', index=0, + number=50001, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) -_XPRVTYPE = descriptor.Descriptor( +_XPRVTYPE = _descriptor.Descriptor( name='XprvType', full_name='XprvType', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='version', full_name='XprvType.version', index=0, - number=1, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", + number=1, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='depth', full_name='XprvType.depth', index=1, number=2, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='fingerprint', full_name='XprvType.fingerprint', index=2, number=3, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='child_num', full_name='XprvType.child_num', index=3, number=4, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='chain_code', full_name='XprvType.chain_code', index=4, number=5, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( name='private_key', full_name='XprvType.private_key', index=5, number=6, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=51, + serialized_end=186, +) + + +_XPUBTYPE = _descriptor.Descriptor( + name='XpubType', + full_name='XpubType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='version', full_name='XpubType.version', index=0, + number=1, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='depth', full_name='XpubType.depth', index=1, + number=2, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='fingerprint', full_name='XpubType.fingerprint', index=2, + number=3, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='child_num', full_name='XpubType.child_num', index=3, + number=4, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='chain_code', full_name='XpubType.chain_code', index=4, + number=5, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( + name='public_key', full_name='XpubType.public_key', index=5, + number=6, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), ], extensions=[ ], @@ -122,42 +396,42 @@ _XPRVTYPE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=16, - serialized_end=139, + serialized_start=189, + serialized_end=323, ) -_COINTYPE = descriptor.Descriptor( +_COINTYPE = _descriptor.Descriptor( name='CoinType', full_name='CoinType', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='coin_name', full_name='CoinType.coin_name', index=0, - number=2, type=12, cpp_type=9, label=1, + number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='coin_shortcut', full_name='CoinType.coin_shortcut', index=1, - number=3, type=12, cpp_type=9, label=1, + number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='address_type', full_name='CoinType.address_type', index=2, - number=4, type=13, cpp_type=3, label=1, + number=3, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='maxfee_kb', full_name='CoinType.maxfee_kb', index=3, - number=5, type=4, cpp_type=4, label=1, + number=4, type=4, cpp_type=4, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -171,33 +445,33 @@ _COINTYPE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=141, - serialized_end=234, + serialized_start=325, + serialized_end=418, ) -_SETTINGSTYPE = descriptor.Descriptor( +_SETTINGSTYPE = _descriptor.Descriptor( name='SettingsType', full_name='SettingsType', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='language', full_name='SettingsType.language', index=0, number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='coin', full_name='SettingsType.coin', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='label', full_name='SettingsType.label', index=2, number=3, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", @@ -213,12 +487,12 @@ _SETTINGSTYPE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=236, - serialized_end=308, + serialized_start=420, + serialized_end=492, ) -_INITIALIZE = descriptor.Descriptor( +_INITIALIZE = _descriptor.Descriptor( name='Initialize', full_name='Initialize', filename=None, @@ -234,52 +508,66 @@ _INITIALIZE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=310, - serialized_end=322, + serialized_start=494, + serialized_end=506, ) -_FEATURES = descriptor.Descriptor( +_FEATURES = _descriptor.Descriptor( name='Features', full_name='Features', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='vendor', full_name='Features.vendor', index=0, number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='major_version', full_name='Features.major_version', index=1, number=2, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='minor_version', full_name='Features.minor_version', index=2, number=3, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='settings', full_name='Features.settings', index=3, number=4, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( - name='serial_number', full_name='Features.serial_number', index=4, + _descriptor.FieldDescriptor( + name='device_id', full_name='Features.device_id', index=4, number=5, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( + name='mpk_hash', full_name='Features.mpk_hash', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( + name='pin_protection', full_name='Features.pin_protection', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, options=None), ], extensions=[ @@ -290,33 +578,33 @@ _FEATURES = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=325, - serialized_end=453, + serialized_start=509, + serialized_end=687, ) -_APPLYSETTINGS = descriptor.Descriptor( +_APPLYSETTINGS = _descriptor.Descriptor( name='ApplySettings', full_name='ApplySettings', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='language', full_name='ApplySettings.language', index=0, number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='coin_shortcut', full_name='ApplySettings.coin_shortcut', index=1, number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='label', full_name='ApplySettings.label', index=2, number=3, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", @@ -332,102 +620,25 @@ _APPLYSETTINGS = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=455, - serialized_end=526, + serialized_start=689, + serialized_end=760, ) -_PING = descriptor.Descriptor( - name='Ping', - full_name='Ping', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='message', full_name='Ping.message', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=528, - serialized_end=551, -) - - -_DEBUGLINKDECISION = descriptor.Descriptor( - name='DebugLinkDecision', - full_name='DebugLinkDecision', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - descriptor.FieldDescriptor( - name='yes_no', full_name='DebugLinkDecision.yes_no', index=0, - number=1, type=8, cpp_type=7, label=2, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=553, - serialized_end=588, -) - - -_DEBUGLINKGETSTATE = descriptor.Descriptor( - name='DebugLinkGetState', - full_name='DebugLinkGetState', +_CHANGEPIN = _descriptor.Descriptor( + name='ChangePin', + full_name='ChangePin', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( - name='layout', full_name='DebugLinkGetState.layout', index=0, + _descriptor.FieldDescriptor( + name='remove', full_name='ChangePin.remove', index=0, number=1, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( - name='pin', full_name='DebugLinkGetState.pin', index=1, - number=2, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='matrix', full_name='DebugLinkGetState.matrix', index=2, - number=3, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='seed', full_name='DebugLinkGetState.seed', index=3, - number=4, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -437,67 +648,25 @@ _DEBUGLINKGETSTATE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=590, - serialized_end=668, + serialized_start=762, + serialized_end=789, ) -_DEBUGLINKSTATE = descriptor.Descriptor( - name='DebugLinkState', - full_name='DebugLinkState', +_PING = _descriptor.Descriptor( + name='Ping', + full_name='Ping', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( - name='layout', full_name='DebugLinkState.layout', index=0, + _descriptor.FieldDescriptor( + name='message', full_name='Ping.message', index=0, number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( - name='pin', full_name='DebugLinkState.pin', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='matrix', full_name='DebugLinkState.matrix', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( - name='seed', full_name='DebugLinkState.seed', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=670, - serialized_end=745, -) - - -_DEBUGLINKSTOP = descriptor.Descriptor( - name='DebugLinkStop', - full_name='DebugLinkStop', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ ], extensions=[ ], @@ -507,19 +676,19 @@ _DEBUGLINKSTOP = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=747, - serialized_end=762, + serialized_start=791, + serialized_end=814, ) -_SUCCESS = descriptor.Descriptor( +_SUCCESS = _descriptor.Descriptor( name='Success', full_name='Success', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='message', full_name='Success.message', index=0, number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", @@ -535,26 +704,26 @@ _SUCCESS = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=764, - serialized_end=790, + serialized_start=816, + serialized_end=842, ) -_FAILURE = descriptor.Descriptor( +_FAILURE = _descriptor.Descriptor( name='Failure', full_name='Failure', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='code', full_name='Failure.code', index=0, number=1, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='message', full_name='Failure.message', index=1, number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", @@ -570,12 +739,12 @@ _FAILURE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=792, - serialized_end=832, + serialized_start=844, + serialized_end=884, ) -_BUTTONREQUEST = descriptor.Descriptor( +_BUTTONREQUEST = _descriptor.Descriptor( name='ButtonRequest', full_name='ButtonRequest', filename=None, @@ -591,12 +760,12 @@ _BUTTONREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=834, - serialized_end=849, + serialized_start=886, + serialized_end=901, ) -_BUTTONACK = descriptor.Descriptor( +_BUTTONACK = _descriptor.Descriptor( name='ButtonAck', full_name='ButtonAck', filename=None, @@ -612,12 +781,12 @@ _BUTTONACK = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=851, - serialized_end=862, + serialized_start=903, + serialized_end=914, ) -_BUTTONCANCEL = descriptor.Descriptor( +_BUTTONCANCEL = _descriptor.Descriptor( name='ButtonCancel', full_name='ButtonCancel', filename=None, @@ -633,19 +802,19 @@ _BUTTONCANCEL = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=864, - serialized_end=878, + serialized_start=916, + serialized_end=930, ) -_PINMATRIXREQUEST = descriptor.Descriptor( +_PINMATRIXREQUEST = _descriptor.Descriptor( name='PinMatrixRequest', full_name='PinMatrixRequest', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='message', full_name='PinMatrixRequest.message', index=0, number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", @@ -661,19 +830,19 @@ _PINMATRIXREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=880, - serialized_end=915, + serialized_start=932, + serialized_end=967, ) -_PINMATRIXACK = descriptor.Descriptor( +_PINMATRIXACK = _descriptor.Descriptor( name='PinMatrixAck', full_name='PinMatrixAck', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='pin', full_name='PinMatrixAck.pin', index=0, number=1, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", @@ -689,12 +858,12 @@ _PINMATRIXACK = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=917, - serialized_end=944, + serialized_start=969, + serialized_end=996, ) -_PINMATRIXCANCEL = descriptor.Descriptor( +_PINMATRIXCANCEL = _descriptor.Descriptor( name='PinMatrixCancel', full_name='PinMatrixCancel', filename=None, @@ -710,19 +879,19 @@ _PINMATRIXCANCEL = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=946, - serialized_end=963, + serialized_start=998, + serialized_end=1015, ) -_GETENTROPY = descriptor.Descriptor( +_GETENTROPY = _descriptor.Descriptor( name='GetEntropy', full_name='GetEntropy', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='size', full_name='GetEntropy.size', index=0, number=1, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, @@ -738,25 +907,25 @@ _GETENTROPY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=965, - serialized_end=991, + serialized_start=1017, + serialized_end=1043, ) -_ENTROPY = descriptor.Descriptor( +_ENTROPY = _descriptor.Descriptor( name='Entropy', full_name='Entropy', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='entropy', full_name='Entropy.entropy', index=0, number=1, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None), + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), ], extensions=[ ], @@ -766,12 +935,12 @@ _ENTROPY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=993, - serialized_end=1019, + serialized_start=1045, + serialized_end=1077, ) -_GETMASTERPUBLICKEY = descriptor.Descriptor( +_GETMASTERPUBLICKEY = _descriptor.Descriptor( name='GetMasterPublicKey', full_name='GetMasterPublicKey', filename=None, @@ -787,22 +956,22 @@ _GETMASTERPUBLICKEY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1021, - serialized_end=1041, + serialized_start=1079, + serialized_end=1099, ) -_MASTERPUBLICKEY = descriptor.Descriptor( +_MASTERPUBLICKEY = _descriptor.Descriptor( name='MasterPublicKey', full_name='MasterPublicKey', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( - name='key', full_name='MasterPublicKey.key', index=0, - number=1, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", + _descriptor.FieldDescriptor( + name='mpk', full_name='MasterPublicKey.mpk', index=0, + number=1, type=11, cpp_type=10, label=2, + has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -815,19 +984,19 @@ _MASTERPUBLICKEY = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1043, - serialized_end=1073, + serialized_start=1101, + serialized_end=1142, ) -_GETADDRESS = descriptor.Descriptor( +_GETADDRESS = _descriptor.Descriptor( name='GetAddress', full_name='GetAddress', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='address_n', full_name='GetAddress.address_n', index=0, number=1, type=13, cpp_type=3, label=3, has_default_value=False, default_value=[], @@ -843,19 +1012,19 @@ _GETADDRESS = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1075, - serialized_end=1106, + serialized_start=1144, + serialized_end=1175, ) -_ADDRESS = descriptor.Descriptor( +_ADDRESS = _descriptor.Descriptor( name='Address', full_name='Address', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='address', full_name='Address.address', index=0, number=1, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", @@ -871,33 +1040,54 @@ _ADDRESS = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1108, - serialized_end=1134, + serialized_start=1177, + serialized_end=1203, +) + + +_WIPEDEVICE = _descriptor.Descriptor( + name='WipeDevice', + full_name='WipeDevice', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1205, + serialized_end=1217, ) -_LOADDEVICE = descriptor.Descriptor( +_LOADDEVICE = _descriptor.Descriptor( name='LoadDevice', full_name='LoadDevice', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='seed', full_name='LoadDevice.seed', index=0, number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='xprv', full_name='LoadDevice.xprv', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='pin', full_name='LoadDevice.pin', index=2, number=3, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", @@ -913,22 +1103,22 @@ _LOADDEVICE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1136, - serialized_end=1200, + serialized_start=1219, + serialized_end=1283, ) -_RESETDEVICE = descriptor.Descriptor( +_RESETDEVICE = _descriptor.Descriptor( name='ResetDevice', full_name='ResetDevice', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( - name='random', full_name='ResetDevice.random', index=0, - number=7, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + _descriptor.FieldDescriptor( + name='display_random', full_name='ResetDevice.display_random', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -941,26 +1131,75 @@ _RESETDEVICE = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1202, - serialized_end=1231, + serialized_start=1285, + serialized_end=1322, +) + + +_ENTROPYREQUEST = _descriptor.Descriptor( + name='EntropyRequest', + full_name='EntropyRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1324, + serialized_end=1340, +) + + +_ENTROPYACK = _descriptor.Descriptor( + name='EntropyAck', + full_name='EntropyAck', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='entropy', full_name='EntropyAck.entropy', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1342, + serialized_end=1377, ) -_SIGNTX = descriptor.Descriptor( +_SIGNTX = _descriptor.Descriptor( name='SignTx', full_name='SignTx', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='outputs_count', full_name='SignTx.outputs_count', index=0, number=3, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='inputs_count', full_name='SignTx.inputs_count', index=1, number=5, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, @@ -976,26 +1215,26 @@ _SIGNTX = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1233, - serialized_end=1286, + serialized_start=1379, + serialized_end=1432, ) -_SIMPLESIGNTX = descriptor.Descriptor( +_SIMPLESIGNTX = _descriptor.Descriptor( name='SimpleSignTx', full_name='SimpleSignTx', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='inputs', full_name='SimpleSignTx.inputs', index=0, number=1, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='outputs', full_name='SimpleSignTx.outputs', index=1, number=2, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], @@ -1011,53 +1250,53 @@ _SIMPLESIGNTX = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1288, - serialized_end=1356, + serialized_start=1434, + serialized_end=1502, ) -_TXREQUEST = descriptor.Descriptor( +_TXREQUEST = _descriptor.Descriptor( name='TxRequest', full_name='TxRequest', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='request_index', full_name='TxRequest.request_index', index=0, number=1, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='request_type', full_name='TxRequest.request_type', index=1, number=2, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='signed_index', full_name='TxRequest.signed_index', index=2, number=3, type=5, cpp_type=1, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='signature', full_name='TxRequest.signature', index=3, number=4, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( name='serialized_tx', full_name='TxRequest.serialized_tx', index=4, number=5, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None), + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), ], extensions=[ ], @@ -1067,60 +1306,60 @@ _TXREQUEST = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1359, - serialized_end=1493, + serialized_start=1505, + serialized_end=1651, ) -_TXINPUT = descriptor.Descriptor( +_TXINPUT = _descriptor.Descriptor( name='TxInput', full_name='TxInput', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='index', full_name='TxInput.index', index=0, number=1, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='address_n', full_name='TxInput.address_n', index=1, number=2, type=13, cpp_type=3, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='amount', full_name='TxInput.amount', index=2, number=3, type=4, cpp_type=4, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='prev_hash', full_name='TxInput.prev_hash', index=3, number=4, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None), - descriptor.FieldDescriptor( + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( name='prev_index', full_name='TxInput.prev_index', index=4, number=5, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='script_sig', full_name='TxInput.script_sig', index=5, number=6, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None), + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), ], extensions=[ ], @@ -1130,60 +1369,207 @@ _TXINPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1495, - serialized_end=1613, + serialized_start=1654, + serialized_end=1784, ) -_TXOUTPUT = descriptor.Descriptor( +_TXOUTPUT = _descriptor.Descriptor( name='TxOutput', full_name='TxOutput', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='index', full_name='TxOutput.index', index=0, number=1, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='address', full_name='TxOutput.address', index=1, number=2, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='address_n', full_name='TxOutput.address_n', index=2, number=3, type=13, cpp_type=3, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='amount', full_name='TxOutput.amount', index=3, number=4, type=4, cpp_type=4, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='script_type', full_name='TxOutput.script_type', index=4, number=5, type=14, cpp_type=8, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( + _descriptor.FieldDescriptor( name='script_args', full_name='TxOutput.script_args', index=5, number=6, type=12, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1787, + serialized_end=1925, +) + + +_DEBUGLINKDECISION = _descriptor.Descriptor( + name='DebugLinkDecision', + full_name='DebugLinkDecision', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='yes_no', full_name='DebugLinkDecision.yes_no', index=0, + number=1, type=8, cpp_type=7, label=2, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1927, + serialized_end=1962, +) + + +_DEBUGLINKGETSTATE = _descriptor.Descriptor( + name='DebugLinkGetState', + full_name='DebugLinkGetState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='layout', full_name='DebugLinkGetState.layout', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pin', full_name='DebugLinkGetState.pin', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='matrix', full_name='DebugLinkGetState.matrix', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='seed', full_name='DebugLinkGetState.seed', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1964, + serialized_end=2042, +) + + +_DEBUGLINKSTATE = _descriptor.Descriptor( + name='DebugLinkState', + full_name='DebugLinkState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='layout', full_name='DebugLinkState.layout', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( + name='pin', full_name='DebugLinkState.pin', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='matrix', full_name='DebugLinkState.matrix', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='seed', full_name='DebugLinkState.seed', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=2044, + serialized_end=2125, +) + + +_DEBUGLINKSTOP = _descriptor.Descriptor( + name='DebugLinkStop', + full_name='DebugLinkStop', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ ], extensions=[ ], @@ -1193,28 +1579,27 @@ _TXOUTPUT = descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1616, - serialized_end=1748, + serialized_start=2127, + serialized_end=2142, ) _SETTINGSTYPE.fields_by_name['coin'].message_type = _COINTYPE _FEATURES.fields_by_name['settings'].message_type = _SETTINGSTYPE +_MASTERPUBLICKEY.fields_by_name['mpk'].message_type = _XPUBTYPE _LOADDEVICE.fields_by_name['xprv'].message_type = _XPRVTYPE _SIMPLESIGNTX.fields_by_name['inputs'].message_type = _TXINPUT _SIMPLESIGNTX.fields_by_name['outputs'].message_type = _TXOUTPUT _TXREQUEST.fields_by_name['request_type'].enum_type = _REQUESTTYPE _TXOUTPUT.fields_by_name['script_type'].enum_type = _SCRIPTTYPE DESCRIPTOR.message_types_by_name['XprvType'] = _XPRVTYPE +DESCRIPTOR.message_types_by_name['XpubType'] = _XPUBTYPE DESCRIPTOR.message_types_by_name['CoinType'] = _COINTYPE DESCRIPTOR.message_types_by_name['SettingsType'] = _SETTINGSTYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE DESCRIPTOR.message_types_by_name['Features'] = _FEATURES DESCRIPTOR.message_types_by_name['ApplySettings'] = _APPLYSETTINGS +DESCRIPTOR.message_types_by_name['ChangePin'] = _CHANGEPIN DESCRIPTOR.message_types_by_name['Ping'] = _PING -DESCRIPTOR.message_types_by_name['DebugLinkDecision'] = _DEBUGLINKDECISION -DESCRIPTOR.message_types_by_name['DebugLinkGetState'] = _DEBUGLINKGETSTATE -DESCRIPTOR.message_types_by_name['DebugLinkState'] = _DEBUGLINKSTATE -DESCRIPTOR.message_types_by_name['DebugLinkStop'] = _DEBUGLINKSTOP DESCRIPTOR.message_types_by_name['Success'] = _SUCCESS DESCRIPTOR.message_types_by_name['Failure'] = _FAILURE DESCRIPTOR.message_types_by_name['ButtonRequest'] = _BUTTONREQUEST @@ -1229,204 +1614,271 @@ DESCRIPTOR.message_types_by_name['GetMasterPublicKey'] = _GETMASTERPUBLICKEY DESCRIPTOR.message_types_by_name['MasterPublicKey'] = _MASTERPUBLICKEY DESCRIPTOR.message_types_by_name['GetAddress'] = _GETADDRESS DESCRIPTOR.message_types_by_name['Address'] = _ADDRESS +DESCRIPTOR.message_types_by_name['WipeDevice'] = _WIPEDEVICE DESCRIPTOR.message_types_by_name['LoadDevice'] = _LOADDEVICE DESCRIPTOR.message_types_by_name['ResetDevice'] = _RESETDEVICE +DESCRIPTOR.message_types_by_name['EntropyRequest'] = _ENTROPYREQUEST +DESCRIPTOR.message_types_by_name['EntropyAck'] = _ENTROPYACK DESCRIPTOR.message_types_by_name['SignTx'] = _SIGNTX DESCRIPTOR.message_types_by_name['SimpleSignTx'] = _SIMPLESIGNTX DESCRIPTOR.message_types_by_name['TxRequest'] = _TXREQUEST DESCRIPTOR.message_types_by_name['TxInput'] = _TXINPUT DESCRIPTOR.message_types_by_name['TxOutput'] = _TXOUTPUT +DESCRIPTOR.message_types_by_name['DebugLinkDecision'] = _DEBUGLINKDECISION +DESCRIPTOR.message_types_by_name['DebugLinkGetState'] = _DEBUGLINKGETSTATE +DESCRIPTOR.message_types_by_name['DebugLinkState'] = _DEBUGLINKSTATE +DESCRIPTOR.message_types_by_name['DebugLinkStop'] = _DEBUGLINKSTOP -class XprvType(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class XprvType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _XPRVTYPE - + # @@protoc_insertion_point(class_scope:XprvType) -class CoinType(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class XpubType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _XPUBTYPE + + # @@protoc_insertion_point(class_scope:XpubType) + +class CoinType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _COINTYPE - + # @@protoc_insertion_point(class_scope:CoinType) -class SettingsType(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class SettingsType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _SETTINGSTYPE - + # @@protoc_insertion_point(class_scope:SettingsType) -class Initialize(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class Initialize(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _INITIALIZE - + # @@protoc_insertion_point(class_scope:Initialize) -class Features(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class Features(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _FEATURES - + # @@protoc_insertion_point(class_scope:Features) -class ApplySettings(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class ApplySettings(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _APPLYSETTINGS - - # @@protoc_insertion_point(class_scope:ApplySettings) -class Ping(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _PING - - # @@protoc_insertion_point(class_scope:Ping) + # @@protoc_insertion_point(class_scope:ApplySettings) -class DebugLinkDecision(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _DEBUGLINKDECISION - - # @@protoc_insertion_point(class_scope:DebugLinkDecision) +class ChangePin(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _CHANGEPIN -class DebugLinkGetState(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _DEBUGLINKGETSTATE - - # @@protoc_insertion_point(class_scope:DebugLinkGetState) + # @@protoc_insertion_point(class_scope:ChangePin) -class DebugLinkState(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _DEBUGLINKSTATE - - # @@protoc_insertion_point(class_scope:DebugLinkState) +class Ping(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _PING -class DebugLinkStop(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType - DESCRIPTOR = _DEBUGLINKSTOP - - # @@protoc_insertion_point(class_scope:DebugLinkStop) + # @@protoc_insertion_point(class_scope:Ping) -class Success(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class Success(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _SUCCESS - + # @@protoc_insertion_point(class_scope:Success) -class Failure(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class Failure(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _FAILURE - + # @@protoc_insertion_point(class_scope:Failure) -class ButtonRequest(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class ButtonRequest(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _BUTTONREQUEST - + # @@protoc_insertion_point(class_scope:ButtonRequest) -class ButtonAck(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class ButtonAck(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _BUTTONACK - + # @@protoc_insertion_point(class_scope:ButtonAck) -class ButtonCancel(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class ButtonCancel(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _BUTTONCANCEL - + # @@protoc_insertion_point(class_scope:ButtonCancel) -class PinMatrixRequest(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class PinMatrixRequest(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _PINMATRIXREQUEST - + # @@protoc_insertion_point(class_scope:PinMatrixRequest) -class PinMatrixAck(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class PinMatrixAck(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _PINMATRIXACK - + # @@protoc_insertion_point(class_scope:PinMatrixAck) -class PinMatrixCancel(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class PinMatrixCancel(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _PINMATRIXCANCEL - + # @@protoc_insertion_point(class_scope:PinMatrixCancel) -class GetEntropy(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class GetEntropy(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _GETENTROPY - + # @@protoc_insertion_point(class_scope:GetEntropy) -class Entropy(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class Entropy(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _ENTROPY - + # @@protoc_insertion_point(class_scope:Entropy) -class GetMasterPublicKey(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class GetMasterPublicKey(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _GETMASTERPUBLICKEY - + # @@protoc_insertion_point(class_scope:GetMasterPublicKey) -class MasterPublicKey(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class MasterPublicKey(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _MASTERPUBLICKEY - + # @@protoc_insertion_point(class_scope:MasterPublicKey) -class GetAddress(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class GetAddress(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _GETADDRESS - + # @@protoc_insertion_point(class_scope:GetAddress) -class Address(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class Address(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _ADDRESS - + # @@protoc_insertion_point(class_scope:Address) -class LoadDevice(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class WipeDevice(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _WIPEDEVICE + + # @@protoc_insertion_point(class_scope:WipeDevice) + +class LoadDevice(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _LOADDEVICE - + # @@protoc_insertion_point(class_scope:LoadDevice) -class ResetDevice(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class ResetDevice(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _RESETDEVICE - + # @@protoc_insertion_point(class_scope:ResetDevice) -class SignTx(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class EntropyRequest(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _ENTROPYREQUEST + + # @@protoc_insertion_point(class_scope:EntropyRequest) + +class EntropyAck(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _ENTROPYACK + + # @@protoc_insertion_point(class_scope:EntropyAck) + +class SignTx(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _SIGNTX - + # @@protoc_insertion_point(class_scope:SignTx) -class SimpleSignTx(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class SimpleSignTx(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _SIMPLESIGNTX - + # @@protoc_insertion_point(class_scope:SimpleSignTx) -class TxRequest(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class TxRequest(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _TXREQUEST - + # @@protoc_insertion_point(class_scope:TxRequest) -class TxInput(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class TxInput(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _TXINPUT - + # @@protoc_insertion_point(class_scope:TxInput) -class TxOutput(message.Message): - __metaclass__ = reflection.GeneratedProtocolMessageType +class TxOutput(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _TXOUTPUT - + # @@protoc_insertion_point(class_scope:TxOutput) +class DebugLinkDecision(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DEBUGLINKDECISION + + # @@protoc_insertion_point(class_scope:DebugLinkDecision) + +class DebugLinkGetState(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DEBUGLINKGETSTATE + + # @@protoc_insertion_point(class_scope:DebugLinkGetState) + +class DebugLinkState(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DEBUGLINKSTATE + + # @@protoc_insertion_point(class_scope:DebugLinkState) + +class DebugLinkStop(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DEBUGLINKSTOP + + # @@protoc_insertion_point(class_scope:DebugLinkStop) + +google.protobuf.descriptor_pb2.FieldOptions.RegisterExtension(binary) + +_XPRVTYPE.fields_by_name['chain_code'].has_options = True +_XPRVTYPE.fields_by_name['chain_code']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_XPRVTYPE.fields_by_name['private_key'].has_options = True +_XPRVTYPE.fields_by_name['private_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_XPUBTYPE.fields_by_name['chain_code'].has_options = True +_XPUBTYPE.fields_by_name['chain_code']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_XPUBTYPE.fields_by_name['public_key'].has_options = True +_XPUBTYPE.fields_by_name['public_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_FEATURES.fields_by_name['device_id'].has_options = True +_FEATURES.fields_by_name['device_id']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_FEATURES.fields_by_name['mpk_hash'].has_options = True +_FEATURES.fields_by_name['mpk_hash']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_ENTROPY.fields_by_name['entropy'].has_options = True +_ENTROPY.fields_by_name['entropy']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_ENTROPYACK.fields_by_name['entropy'].has_options = True +_ENTROPYACK.fields_by_name['entropy']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_TXREQUEST.fields_by_name['signature'].has_options = True +_TXREQUEST.fields_by_name['signature']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_TXREQUEST.fields_by_name['serialized_tx'].has_options = True +_TXREQUEST.fields_by_name['serialized_tx']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_TXINPUT.fields_by_name['prev_hash'].has_options = True +_TXINPUT.fields_by_name['prev_hash']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_TXINPUT.fields_by_name['script_sig'].has_options = True +_TXINPUT.fields_by_name['script_sig']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_TXOUTPUT.fields_by_name['script_args'].has_options = True +_TXOUTPUT.fields_by_name['script_args']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_DEBUGLINKSTATE.fields_by_name['layout'].has_options = True +_DEBUGLINKSTATE.fields_by_name['layout']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') # @@protoc_insertion_point(module_scope) From 83e8dd1c0efa254605ed277cce4763a8f2a7bde8 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 8 Oct 2013 20:32:40 +0200 Subject: [PATCH 0100/1535] Mapping now uses MessageType enum from protobuf --- trezorlib/mapping.py | 59 +++++++++----------------------------------- 1 file changed, 11 insertions(+), 48 deletions(-) diff --git a/trezorlib/mapping.py b/trezorlib/mapping.py index af4e03d9d..6221c6189 100644 --- a/trezorlib/mapping.py +++ b/trezorlib/mapping.py @@ -1,46 +1,16 @@ import trezor_pb2 as proto -map_type_to_class = { - 0: proto.Initialize, - 1: proto.Ping, - 2: proto.Success, - 3: proto.Failure, - #4: proto.GetUID, - #5: proto.UUID, - 9: proto.GetEntropy, - 10: proto.Entropy, - 11: proto.GetMasterPublicKey, - 12: proto.MasterPublicKey, - 13: proto.LoadDevice, - 14: proto.ResetDevice, - 15: proto.SignTx, - 16: proto.SimpleSignTx, - 17: proto.Features, - 18: proto.PinMatrixRequest, - 19: proto.PinMatrixAck, - 20: proto.PinMatrixCancel, - 21: proto.TxRequest, - # 22: proto.OutputRequest, - 23: proto.TxInput, - 24: proto.TxOutput, - 25: proto.ApplySettings, - 26: proto.ButtonRequest, - 27: proto.ButtonAck, - 28: proto.ButtonCancel, - 29: proto.GetAddress, - 30: proto.Address, - 31: proto.SettingsType, - 32: proto.XprvType, - 33: proto.CoinType, - 100: proto.DebugLinkDecision, - 101: proto.DebugLinkGetState, - 102: proto.DebugLinkState, - 103: proto.DebugLinkStop, -} - +map_type_to_class = {} map_class_to_type = {} +def build_map(): + for msg_type, i in proto.MessageType.items(): + msg_name = msg_type.replace('MessageType_', '') + msg_class = getattr(proto, msg_name) + map_type_to_class[i] = msg_class + map_class_to_type[msg_class] = i + def get_type(msg): return map_class_to_type[msg.__class__] @@ -48,23 +18,16 @@ def get_type(msg): def get_class(t): return map_type_to_class[t] - -def build_index(): - for k, v in map_type_to_class.items(): - map_class_to_type[v] = k - - def check_missing(): from google.protobuf import reflection - types = [proto.__dict__[item] for item in dir(proto) - if issubclass(proto.__dict__[item].__class__, reflection.GeneratedProtocolMessageType)] + types = [getattr(proto, item) for item in dir(proto) + if issubclass(getattr(proto, item).__class__, reflection.GeneratedProtocolMessageType)] missing = list(set(types) - set(map_type_to_class.values())) if len(missing): raise Exception("Following protobuf messages are not defined in mapping: %s" % missing) - +build_map() check_missing() -build_index() From 5d32d7f20e4a9a29f8a52d79e118b1174e408c89 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 8 Oct 2013 20:33:09 +0200 Subject: [PATCH 0101/1535] Seeds reflect changes in BIP39 wordlist --- tests/common.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/common.py b/tests/common.py index b1861e390..67367ab4b 100644 --- a/tests/common.py +++ b/tests/common.py @@ -11,8 +11,8 @@ class TrezorTest(unittest.TestCase): self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) self.client = TrezorClient(self.transport, DebugLink(self.debug_transport), debug=True) - self.mnemonic1 = 'panda tree planet type cinnamon digital always essence grocery poor tree slot' - self.mnemonic2 = 'glory vanish past debate cricket extra receive spring scatter rebound bat expect' + self.mnemonic1 = 'juice enrich pool orbit brick prevent system chronic people industry insane private' + self.mnemonic2 = 'bark depend buffalo library lonely syrup exact trip kitten yellow arch into damage phone toy wild color soon suit move opinion type replace donate' self.pin1 = '1234' self.pin2 = '43211' From 69fa23ff571ce24a4ed82bc2dc6b2be5ce41a820 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 8 Oct 2013 20:33:39 +0200 Subject: [PATCH 0102/1535] Fixed GetMPK, get_device_id --- trezorlib/client.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index fab17c900..f24b7a0aa 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -46,7 +46,7 @@ class TrezorClient(object): if self.master_public_key: return self.master_public_key - self.master_public_key = self.call(proto.GetMasterPublicKey()).key + self.master_public_key = self.call(proto.GetMasterPublicKey()).mpk return self.master_public_key def get_address(self, n): @@ -58,8 +58,8 @@ class TrezorClient(object): def ping(self, msg): return self.call(proto.Ping(message=msg)).message - def get_serial_number(self): - return self.features.serial_number + def get_device_id(self): + return self.features.device_id def apply_settings(self, label=None, coin_shortcut=None, language=None): settings = proto.ApplySettings() From 7f541b43ad220a1395f07fdfdf43af568b1971f0 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 8 Oct 2013 20:33:58 +0200 Subject: [PATCH 0103/1535] Fixed GetMPK --- cmd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd.py b/cmd.py index 0d6466a48..bf6eaee57 100755 --- a/cmd.py +++ b/cmd.py @@ -97,7 +97,7 @@ class Commands(object): return self.client.ping(args.msg) def get_master_public_key(self, args): - return binascii.hexlify(self.client.get_master_public_key()) + return self.client.get_master_public_key() def get_serial_number(self, args): return binascii.hexlify(self.client.get_serial_number()) From 851fa37a0a31d6689833fabe3cc8ebe6db5c7203 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 8 Oct 2013 20:34:21 +0200 Subject: [PATCH 0104/1535] serial_number -> device_id --- tests/test_basic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_basic.py b/tests/test_basic.py index 85a310872..e25a47951 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -26,9 +26,9 @@ class TestBasic(common.TrezorTest): self.assertEqual(ping, proto.Success(message='ahoj!')) def test_uuid(self): - uuid1 = self.client.get_serial_number() + uuid1 = self.client.get_device_id() self.client.init_device() - uuid2 = self.client.get_serial_number() + uuid2 = self.client.get_device_id() # UUID must be longer than 10 characters self.assertEqual(len(uuid1), 12) From 42419a129af78d79113474dcf182794d67936fcd Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 8 Oct 2013 20:34:38 +0200 Subject: [PATCH 0105/1535] Profiles for pipe transport / USB hid --- tests/config.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/tests/config.py b/tests/config.py index 4656c3953..02aa19084 100644 --- a/tests/config.py +++ b/tests/config.py @@ -5,17 +5,22 @@ from trezorlib.transport_pipe import PipeTransport from trezorlib.transport_hid import HidTransport from trezorlib.transport_socket import SocketTransportClient -TRANSPORT = PipeTransport -TRANSPORT_ARGS = ('../../trezor-emu/pipe.trezor', False) +use_pipe = True +if use_pipe: -#TRANSPORT = HidTransport -#TRANSPORT_ARGS = ('0x10c4:0xea80:000868D3', False) + TRANSPORT = PipeTransport + TRANSPORT_ARGS = ('../../trezor-emu/pipe.trezor', False) -#TRANSPORT = SocketTransportClient -#TRANSPORT_ARGS = ('trezor.dyn:3000', False) + DEBUG_TRANSPORT = PipeTransport + DEBUG_TRANSPORT_ARGS = ('../../trezor-emu/pipe.trezor_debug', False) -DEBUG_TRANSPORT = PipeTransport -DEBUG_TRANSPORT_ARGS = ('../../trezor-emu/pipe.trezor_debug', False) +else: + + TRANSPORT = HidTransport + TRANSPORT_ARGS = ('0x10c4:0xea80:000868D3', False) + + DEBUG_TRANSPORT = SocketTransportClient + DEBUG_TRANSPORT_ARGS = ('trezor.bo:2000', False) #DEBUG_TRANSPORT = SocketTransportClient #DEBUG_TRANSPORT_ARGS = ('trezor.dyn:2000', False) From 4e5c3740aa882a0b87aab58ff0eceb8c91f24a02 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 8 Oct 2013 22:13:03 +0200 Subject: [PATCH 0106/1535] Added strength indicator (weak / fine / strong / ultimate) --- trezorlib/pinmatrix.py | 46 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/trezorlib/pinmatrix.py b/trezorlib/pinmatrix.py index 545df0087..162bc7d34 100644 --- a/trezorlib/pinmatrix.py +++ b/trezorlib/pinmatrix.py @@ -1,6 +1,8 @@ import sys -from PyQt4.Qt import QApplication, QWidget, QGridLayout, QVBoxLayout -from PyQt4.QtGui import QPushButton, QLineEdit, QSizePolicy, QRegExpValidator +import math +import operator +from PyQt4.Qt import QApplication, QWidget, QGridLayout, QVBoxLayout, QHBoxLayout +from PyQt4.QtGui import QPushButton, QLineEdit, QSizePolicy, QRegExpValidator, QLabel from PyQt4.QtCore import QObject, SIGNAL, QRegExp, Qt class PinButton(QPushButton): @@ -20,13 +22,21 @@ class PinMatrixWidget(QWidget): Displays widget with nine blank buttons and password box. Encodes button clicks into sequence of numbers for passing into PinAck messages of Trezor. + + show_strength=True may be useful for entering new PIN ''' - def __init__(self, parent=None): + def __init__(self, show_strength=True, parent=None): super(PinMatrixWidget, self).__init__(parent) self.password = QLineEdit() self.password.setValidator(QRegExpValidator(QRegExp('[1-9]+'), None)) self.password.setEchoMode(QLineEdit.Password) + QObject.connect(self.password, SIGNAL('textChanged(QString)'), self._password_changed) + + self.strength = QLabel() + self.strength.setMinimumWidth(75) + self.strength.setAlignment(Qt.AlignCenter) + self._set_strength(0) grid = QGridLayout() grid.setSpacing(0) @@ -36,11 +46,38 @@ class PinMatrixWidget(QWidget): button.setFocusPolicy(Qt.NoFocus) grid.addWidget(button, x / 3, x % 3) + hbox = QHBoxLayout() + hbox.addWidget(self.password) + if show_strength: + hbox.addWidget(self.strength) + vbox = QVBoxLayout() vbox.addLayout(grid) - vbox.addWidget(self.password) + vbox.addLayout(hbox) self.setLayout(vbox) + def _set_strength(self, strength): + if strength < 3000: + self.strength.setText('weak') + self.strength.setStyleSheet("QLabel { color : #d00; }") + elif strength < 60000: + self.strength.setText('fine') + self.strength.setStyleSheet("QLabel { color : #db0; }") + elif strength < 360000: + self.strength.setText('strong') + self.strength.setStyleSheet("QLabel { color : #0a0; }") + else: + self.strength.setText('ULTIMATE') + self.strength.setStyleSheet("QLabel { color : #000; font-weight: bold;}") + + def _password_changed(self, password): + self._set_strength(self.get_strength()) + + def get_strength(self): + digits = len(set(str(self.password.text()))) + strength = math.factorial(9) / math.factorial(9 - digits) + return strength + def get_value(self): return self.password.text() @@ -54,6 +91,7 @@ if __name__ == '__main__': def clicked(): print "PinMatrix value is", matrix.get_value() + print "Possible button combinations:", matrix.get_strength() sys.exit() ok = QPushButton('OK') From b8ddd0279aefcf67d5583d3da974b4cf731ee50e Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 10 Oct 2013 17:18:02 +0200 Subject: [PATCH 0107/1535] Test of PIN cancel function --- tests/test_protect_call.py | 4 ++++ trezorlib/client.py | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index 03c662bdc..db32a2f42 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -26,6 +26,10 @@ class TestProtectCall(common.TrezorTest): def test_incorrect_pin(self): self.client.setup_debuglink(button=True, pin_correct=False) self.assertRaises(PinException, self._some_protected_call) + + def test_cancelled_pin(self): + self.client.setup_debuglink(button=True, pin_correct=-1) # PIN cancel + self.assertRaises(PinException, self._some_protected_call) if __name__ == '__main__': unittest.main() diff --git a/trezorlib/client.py b/trezorlib/client.py index f24b7a0aa..ccb058c53 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -102,11 +102,14 @@ class TrezorClient(object): if isinstance(resp, proto.PinMatrixRequest): if self.debuglink: - if self.debug_pin: + if self.debug_pin == 1: pin = self.debuglink.read_pin_encoded() msg2 = proto.PinMatrixAck(pin=pin) + elif self.debug_pin == -1: + msg2 = proto.PinMatrixCancel() else: msg2 = proto.PinMatrixAck(pin='444444222222') + else: pin = self.pin_func("PIN required: ", resp.message) msg2 = proto.PinMatrixAck(pin=pin) @@ -118,7 +121,7 @@ class TrezorClient(object): if isinstance(resp, proto.Failure): self.message_func(resp.message) - + if resp.code == 4: raise CallException("Action cancelled by user") From 121e1896430f57a89e5c17785eb971a6a700ad6c Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 11 Oct 2013 03:51:45 +0200 Subject: [PATCH 0108/1535] Implemented test of pin exponential backoff --- tests/test_protect_call.py | 34 +++++++++++++++++++++++++++++++++- trezorlib/client.py | 7 ++++++- trezorlib/debuglink.py | 5 ++++- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index db32a2f42..0ad07fb75 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -1,3 +1,4 @@ +import time import unittest import common @@ -10,7 +11,7 @@ class TestProtectCall(common.TrezorTest): entropy_len = 10 entropy = self.client.get_entropy(entropy_len) self.assertEqual(len(entropy), entropy_len) - + def test_no_protection(self): self.client.load_device(seed=self.mnemonic1, pin='') @@ -30,6 +31,37 @@ class TestProtectCall(common.TrezorTest): def test_cancelled_pin(self): self.client.setup_debuglink(button=True, pin_correct=-1) # PIN cancel self.assertRaises(PinException, self._some_protected_call) + + def test_exponential_backoff_with_reboot(self): + self.client.setup_debuglink(button=True, pin_correct=False) + def test_backoff(attempts, start): + expected = 1.8 ** attempts + got = time.time() - start + + msg = "Pin delay expected to be at least %s seconds, got %s" % (expected, got) + print msg + self.assertLessEqual(expected, got, msg) + + for attempt in range(1, 6): + start = time.time() + self.assertRaises(PinException, self._some_protected_call) + test_backoff(attempt, start) + + # Unplug Trezor now + self.client.debuglink.stop() + self.client.close() + + # Give it some time to reboot (it may take some time on RPi) + boot_delay = 5 + start = time.time() + time.sleep(boot_delay) + + # Connect to Trezor again + self.setUp() + print "Expected reboot time %s seconds" % (1.8 ** attempt) + print "Rebooted in %s seconds" % (time.time() - start) + self.assertLessEqual(1.8 ** attempt, time.time() - start, "Bootup took less than expected!") + if __name__ == '__main__': unittest.main() diff --git a/trezorlib/client.py b/trezorlib/client.py index ccb058c53..0d28cf1a6 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -41,7 +41,12 @@ class TrezorClient(object): def init_device(self): self.master_public_key = None self.features = self.call(proto.Initialize()) - + + def close(self): + self.transport.close() + if self.debuglink: + self.debuglink.transport.close() + def get_master_public_key(self): if self.master_public_key: return self.master_public_key diff --git a/trezorlib/debuglink.py b/trezorlib/debuglink.py index d32f7cbcf..0c7dc550d 100644 --- a/trezorlib/debuglink.py +++ b/trezorlib/debuglink.py @@ -45,4 +45,7 @@ class DebugLink(object): self.press_button(True) def press_no(self): - self.press_button(False) \ No newline at end of file + self.press_button(False) + + def stop(self): + self.transport.write(proto.DebugLinkStop()) From 32ed99fba3ea1c0285c3a1f3b99fe8ef6876bbca Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 11 Oct 2013 04:28:07 +0200 Subject: [PATCH 0109/1535] Changed Features message, introduced FirmwareUpdate --- protobuf/trezor.proto | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/protobuf/trezor.proto b/protobuf/trezor.proto index 82dba712e..2cc530ac6 100644 --- a/protobuf/trezor.proto +++ b/protobuf/trezor.proto @@ -18,6 +18,7 @@ enum MessageType { MessageType_Failure = 3; MessageType_ChangePin = 4; MessageType_WipeDevice = 5; + MessageType_FirmwareUpdate = 6; MessageType_GetEntropy = 9; MessageType_Entropy = 10; MessageType_GetMasterPublicKey = 11; @@ -121,13 +122,15 @@ message Initialize { // Response object for Initialize. message Features { - optional bytes vendor = 1; // Name of the manufacturer, e.g. "trezor" + optional bytes vendor = 1; // Name of the manufacturer, e.g. "bitcointrezor.com" optional uint32 major_version = 2; // Major version of the device, e.g. 1 optional uint32 minor_version = 3; // Minor version of the device, e.g. 0 - optional SettingsType settings = 4; // User-level settings of the device - optional bytes device_id = 5 [(binary) = true]; // Device's unique identifier - optional bytes mpk_hash = 6 [(binary) = true]; // Hash of master public key (sha256(XpubType.public_key).digest()) - optional bool pin_protection = 7; // True if Trezor is covered by PIN + optional uint32 bugfix_version = 4; + optional bool bootloader_mode = 5; + optional SettingsType settings = 6; // User-level settings of the device + optional bytes device_id = 7 [(binary) = true]; // Device's unique identifier + optional bytes mpk_hash = 8 [(binary) = true]; // Hash of master public key (sha256(XpubType.public_key).digest()) + optional bool pin_protection = 9; // True if Trezor is covered by PIN } // Overwrites only filled fields of the structure @@ -330,6 +333,16 @@ message TxOutput { repeated bytes script_args = 6 [(binary) = true]; // Provide additional parameters for the script (its script-depended) } +// **************************************************************************** +// +// Bootloader messages +// + +message FirmwareUpdate { + optional bool force = 1; // Force update, suppress message about wiping storage area + optional bytes payload = 2 [(binary) = true]; // Firmware to flash into device +} + // **************************************************************************** // // Debug* messages are used only on DebugLink interface (separated from USB HID) From 4807ad2fc447585a06fe7d8914a3b80c4b14af33 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 11 Oct 2013 04:28:26 +0200 Subject: [PATCH 0110/1535] Compiled protobuf --- trezorlib/trezor_pb2.py | 281 ++++++++++++++++++++++++---------------- 1 file changed, 172 insertions(+), 109 deletions(-) diff --git a/trezorlib/trezor_pb2.py b/trezorlib/trezor_pb2.py index bbb61d333..337414b88 100644 --- a/trezorlib/trezor_pb2.py +++ b/trezorlib/trezor_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='trezor.proto', package='', - serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xb2\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x1f\n\x08settings\x18\x04 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xb3\x08\n\x0bMessageType\x12\x1a\n\x16MessageType_Initialize\x10\x00\x12\x14\n\x10MessageType_Ping\x10\x01\x12\x17\n\x13MessageType_Success\x10\x02\x12\x17\n\x13MessageType_Failure\x10\x03\x12\x19\n\x15MessageType_ChangePin\x10\x04\x12\x1a\n\x16MessageType_WipeDevice\x10\x05\x12\x1a\n\x16MessageType_GetEntropy\x10\t\x12\x17\n\x13MessageType_Entropy\x10\n\x12\"\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x12\x1f\n\x1bMessageType_MasterPublicKey\x10\x0c\x12\x1a\n\x16MessageType_LoadDevice\x10\r\x12\x1b\n\x17MessageType_ResetDevice\x10\x0e\x12\x16\n\x12MessageType_SignTx\x10\x0f\x12\x1c\n\x18MessageType_SimpleSignTx\x10\x10\x12\x18\n\x14MessageType_Features\x10\x11\x12 \n\x1cMessageType_PinMatrixRequest\x10\x12\x12\x1c\n\x18MessageType_PinMatrixAck\x10\x13\x12\x1f\n\x1bMessageType_PinMatrixCancel\x10\x14\x12\x19\n\x15MessageType_TxRequest\x10\x15\x12\x17\n\x13MessageType_TxInput\x10\x17\x12\x18\n\x14MessageType_TxOutput\x10\x18\x12\x1d\n\x19MessageType_ApplySettings\x10\x19\x12\x1d\n\x19MessageType_ButtonRequest\x10\x1a\x12\x19\n\x15MessageType_ButtonAck\x10\x1b\x12\x1c\n\x18MessageType_ButtonCancel\x10\x1c\x12\x1a\n\x16MessageType_GetAddress\x10\x1d\x12\x17\n\x13MessageType_Address\x10\x1e\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12\x1e\n\x1aMessageType_EntropyRequest\x10#\x12\x1a\n\x16MessageType_EntropyAck\x10$\x12!\n\x1dMessageType_DebugLinkDecision\x10\x64\x12!\n\x1dMessageType_DebugLinkGetState\x10\x65\x12\x1e\n\x1aMessageType_DebugLinkState\x10\x66\x12\x1d\n\x19MessageType_DebugLinkStop\x10g*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08') + serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x0e\x46irmwareUpdate\x12\r\n\x05\x66orce\x18\x01 \x01(\x08\x12\x15\n\x07payload\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xd3\x08\n\x0bMessageType\x12\x1a\n\x16MessageType_Initialize\x10\x00\x12\x14\n\x10MessageType_Ping\x10\x01\x12\x17\n\x13MessageType_Success\x10\x02\x12\x17\n\x13MessageType_Failure\x10\x03\x12\x19\n\x15MessageType_ChangePin\x10\x04\x12\x1a\n\x16MessageType_WipeDevice\x10\x05\x12\x1e\n\x1aMessageType_FirmwareUpdate\x10\x06\x12\x1a\n\x16MessageType_GetEntropy\x10\t\x12\x17\n\x13MessageType_Entropy\x10\n\x12\"\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x12\x1f\n\x1bMessageType_MasterPublicKey\x10\x0c\x12\x1a\n\x16MessageType_LoadDevice\x10\r\x12\x1b\n\x17MessageType_ResetDevice\x10\x0e\x12\x16\n\x12MessageType_SignTx\x10\x0f\x12\x1c\n\x18MessageType_SimpleSignTx\x10\x10\x12\x18\n\x14MessageType_Features\x10\x11\x12 \n\x1cMessageType_PinMatrixRequest\x10\x12\x12\x1c\n\x18MessageType_PinMatrixAck\x10\x13\x12\x1f\n\x1bMessageType_PinMatrixCancel\x10\x14\x12\x19\n\x15MessageType_TxRequest\x10\x15\x12\x17\n\x13MessageType_TxInput\x10\x17\x12\x18\n\x14MessageType_TxOutput\x10\x18\x12\x1d\n\x19MessageType_ApplySettings\x10\x19\x12\x1d\n\x19MessageType_ButtonRequest\x10\x1a\x12\x19\n\x15MessageType_ButtonAck\x10\x1b\x12\x1c\n\x18MessageType_ButtonCancel\x10\x1c\x12\x1a\n\x16MessageType_GetAddress\x10\x1d\x12\x17\n\x13MessageType_Address\x10\x1e\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12\x1e\n\x1aMessageType_EntropyRequest\x10#\x12\x1a\n\x16MessageType_EntropyAck\x10$\x12!\n\x1dMessageType_DebugLinkDecision\x10\x64\x12!\n\x1dMessageType_DebugLinkGetState\x10\x65\x12\x1e\n\x1aMessageType_DebugLinkState\x10\x66\x12\x1d\n\x19MessageType_DebugLinkStop\x10g*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -48,134 +48,138 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_GetEntropy', index=6, number=9, + name='MessageType_FirmwareUpdate', index=6, number=6, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_Entropy', index=7, number=10, + name='MessageType_GetEntropy', index=7, number=9, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_GetMasterPublicKey', index=8, number=11, + name='MessageType_Entropy', index=8, number=10, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_MasterPublicKey', index=9, number=12, + name='MessageType_GetMasterPublicKey', index=9, number=11, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_LoadDevice', index=10, number=13, + name='MessageType_MasterPublicKey', index=10, number=12, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ResetDevice', index=11, number=14, + name='MessageType_LoadDevice', index=11, number=13, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_SignTx', index=12, number=15, + name='MessageType_ResetDevice', index=12, number=14, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_SimpleSignTx', index=13, number=16, + name='MessageType_SignTx', index=13, number=15, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_Features', index=14, number=17, + name='MessageType_SimpleSignTx', index=14, number=16, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PinMatrixRequest', index=15, number=18, + name='MessageType_Features', index=15, number=17, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PinMatrixAck', index=16, number=19, + name='MessageType_PinMatrixRequest', index=16, number=18, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PinMatrixCancel', index=17, number=20, + name='MessageType_PinMatrixAck', index=17, number=19, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxRequest', index=18, number=21, + name='MessageType_PinMatrixCancel', index=18, number=20, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxInput', index=19, number=23, + name='MessageType_TxRequest', index=19, number=21, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxOutput', index=20, number=24, + name='MessageType_TxInput', index=20, number=23, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ApplySettings', index=21, number=25, + name='MessageType_TxOutput', index=21, number=24, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonRequest', index=22, number=26, + name='MessageType_ApplySettings', index=22, number=25, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonAck', index=23, number=27, + name='MessageType_ButtonRequest', index=23, number=26, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonCancel', index=24, number=28, + name='MessageType_ButtonAck', index=24, number=27, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_GetAddress', index=25, number=29, + name='MessageType_ButtonCancel', index=25, number=28, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_Address', index=26, number=30, + name='MessageType_GetAddress', index=26, number=29, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_SettingsType', index=27, number=31, + name='MessageType_Address', index=27, number=30, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_XprvType', index=28, number=32, + name='MessageType_SettingsType', index=28, number=31, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_CoinType', index=29, number=33, + name='MessageType_XprvType', index=29, number=32, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_XpubType', index=30, number=34, + name='MessageType_CoinType', index=30, number=33, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyRequest', index=31, number=35, + name='MessageType_XpubType', index=31, number=34, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyAck', index=32, number=36, + name='MessageType_EntropyRequest', index=32, number=35, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkDecision', index=33, number=100, + name='MessageType_EntropyAck', index=33, number=36, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkGetState', index=34, number=101, + name='MessageType_DebugLinkDecision', index=34, number=100, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkState', index=35, number=102, + name='MessageType_DebugLinkGetState', index=35, number=101, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkStop', index=36, number=103, + name='MessageType_DebugLinkState', index=36, number=102, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_DebugLinkStop', index=37, number=103, options=None, type=None), ], containing_type=None, options=None, - serialized_start=2145, - serialized_end=3220, + serialized_start=2250, + serialized_end=3357, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -196,8 +200,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3222, - serialized_end=3273, + serialized_start=3359, + serialized_end=3410, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -218,8 +222,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3275, - serialized_end=3315, + serialized_start=3412, + serialized_end=3452, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -229,6 +233,7 @@ MessageType_Success = 2 MessageType_Failure = 3 MessageType_ChangePin = 4 MessageType_WipeDevice = 5 +MessageType_FirmwareUpdate = 6 MessageType_GetEntropy = 9 MessageType_Entropy = 10 MessageType_GetMasterPublicKey = 11 @@ -542,29 +547,43 @@ _FEATURES = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='settings', full_name='Features.settings', index=3, - number=4, type=11, cpp_type=10, label=1, + name='bugfix_version', full_name='Features.bugfix_version', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bootloader_mode', full_name='Features.bootloader_mode', index=4, + number=5, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='settings', full_name='Features.settings', index=5, + number=6, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='device_id', full_name='Features.device_id', index=4, - number=5, type=12, cpp_type=9, label=1, + name='device_id', full_name='Features.device_id', index=6, + number=7, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), _descriptor.FieldDescriptor( - name='mpk_hash', full_name='Features.mpk_hash', index=5, - number=6, type=12, cpp_type=9, label=1, + name='mpk_hash', full_name='Features.mpk_hash', index=7, + number=8, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), _descriptor.FieldDescriptor( - name='pin_protection', full_name='Features.pin_protection', index=6, - number=7, type=8, cpp_type=7, label=1, + name='pin_protection', full_name='Features.pin_protection', index=8, + number=9, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -579,7 +598,7 @@ _FEATURES = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=509, - serialized_end=687, + serialized_end=736, ) @@ -620,8 +639,8 @@ _APPLYSETTINGS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=689, - serialized_end=760, + serialized_start=738, + serialized_end=809, ) @@ -648,8 +667,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=762, - serialized_end=789, + serialized_start=811, + serialized_end=838, ) @@ -676,8 +695,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=791, - serialized_end=814, + serialized_start=840, + serialized_end=863, ) @@ -704,8 +723,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=816, - serialized_end=842, + serialized_start=865, + serialized_end=891, ) @@ -739,8 +758,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=844, - serialized_end=884, + serialized_start=893, + serialized_end=933, ) @@ -760,8 +779,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=886, - serialized_end=901, + serialized_start=935, + serialized_end=950, ) @@ -781,8 +800,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=903, - serialized_end=914, + serialized_start=952, + serialized_end=963, ) @@ -802,8 +821,8 @@ _BUTTONCANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=916, - serialized_end=930, + serialized_start=965, + serialized_end=979, ) @@ -830,8 +849,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=932, - serialized_end=967, + serialized_start=981, + serialized_end=1016, ) @@ -858,8 +877,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=969, - serialized_end=996, + serialized_start=1018, + serialized_end=1045, ) @@ -879,8 +898,8 @@ _PINMATRIXCANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=998, - serialized_end=1015, + serialized_start=1047, + serialized_end=1064, ) @@ -907,8 +926,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1017, - serialized_end=1043, + serialized_start=1066, + serialized_end=1092, ) @@ -935,8 +954,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1045, - serialized_end=1077, + serialized_start=1094, + serialized_end=1126, ) @@ -956,8 +975,8 @@ _GETMASTERPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1079, - serialized_end=1099, + serialized_start=1128, + serialized_end=1148, ) @@ -984,8 +1003,8 @@ _MASTERPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1101, - serialized_end=1142, + serialized_start=1150, + serialized_end=1191, ) @@ -1012,8 +1031,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1144, - serialized_end=1175, + serialized_start=1193, + serialized_end=1224, ) @@ -1040,8 +1059,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1177, - serialized_end=1203, + serialized_start=1226, + serialized_end=1252, ) @@ -1061,8 +1080,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1205, - serialized_end=1217, + serialized_start=1254, + serialized_end=1266, ) @@ -1103,8 +1122,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1219, - serialized_end=1283, + serialized_start=1268, + serialized_end=1332, ) @@ -1131,8 +1150,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1285, - serialized_end=1322, + serialized_start=1334, + serialized_end=1371, ) @@ -1152,8 +1171,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1324, - serialized_end=1340, + serialized_start=1373, + serialized_end=1389, ) @@ -1180,8 +1199,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1342, - serialized_end=1377, + serialized_start=1391, + serialized_end=1426, ) @@ -1215,8 +1234,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1379, - serialized_end=1432, + serialized_start=1428, + serialized_end=1481, ) @@ -1250,8 +1269,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1434, - serialized_end=1502, + serialized_start=1483, + serialized_end=1551, ) @@ -1306,8 +1325,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1505, - serialized_end=1651, + serialized_start=1554, + serialized_end=1700, ) @@ -1369,8 +1388,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1654, - serialized_end=1784, + serialized_start=1703, + serialized_end=1833, ) @@ -1432,8 +1451,43 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1787, - serialized_end=1925, + serialized_start=1836, + serialized_end=1974, +) + + +_FIRMWAREUPDATE = _descriptor.Descriptor( + name='FirmwareUpdate', + full_name='FirmwareUpdate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='force', full_name='FirmwareUpdate.force', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='payload', full_name='FirmwareUpdate.payload', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1976, + serialized_end=2030, ) @@ -1460,8 +1514,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1927, - serialized_end=1962, + serialized_start=2032, + serialized_end=2067, ) @@ -1509,8 +1563,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1964, - serialized_end=2042, + serialized_start=2069, + serialized_end=2147, ) @@ -1558,8 +1612,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2044, - serialized_end=2125, + serialized_start=2149, + serialized_end=2230, ) @@ -1579,8 +1633,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2127, - serialized_end=2142, + serialized_start=2232, + serialized_end=2247, ) _SETTINGSTYPE.fields_by_name['coin'].message_type = _COINTYPE @@ -1624,6 +1678,7 @@ DESCRIPTOR.message_types_by_name['SimpleSignTx'] = _SIMPLESIGNTX DESCRIPTOR.message_types_by_name['TxRequest'] = _TXREQUEST DESCRIPTOR.message_types_by_name['TxInput'] = _TXINPUT DESCRIPTOR.message_types_by_name['TxOutput'] = _TXOUTPUT +DESCRIPTOR.message_types_by_name['FirmwareUpdate'] = _FIRMWAREUPDATE DESCRIPTOR.message_types_by_name['DebugLinkDecision'] = _DEBUGLINKDECISION DESCRIPTOR.message_types_by_name['DebugLinkGetState'] = _DEBUGLINKGETSTATE DESCRIPTOR.message_types_by_name['DebugLinkState'] = _DEBUGLINKSTATE @@ -1827,6 +1882,12 @@ class TxOutput(_message.Message): # @@protoc_insertion_point(class_scope:TxOutput) +class FirmwareUpdate(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _FIRMWAREUPDATE + + # @@protoc_insertion_point(class_scope:FirmwareUpdate) + class DebugLinkDecision(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _DEBUGLINKDECISION @@ -1879,6 +1940,8 @@ _TXINPUT.fields_by_name['script_sig'].has_options = True _TXINPUT.fields_by_name['script_sig']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _TXOUTPUT.fields_by_name['script_args'].has_options = True _TXOUTPUT.fields_by_name['script_args']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_FIRMWAREUPDATE.fields_by_name['payload'].has_options = True +_FIRMWAREUPDATE.fields_by_name['payload']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _DEBUGLINKSTATE.fields_by_name['layout'].has_options = True _DEBUGLINKSTATE.fields_by_name['layout']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') # @@protoc_insertion_point(module_scope) From 1f7bfa556ae3c061e9d65db4c9abf595c4a0d453 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 11 Oct 2013 06:19:06 +0200 Subject: [PATCH 0111/1535] Bootup test tuned also for RPi --- tests/test_protect_call.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index 0ad07fb75..b15826e0c 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -53,15 +53,17 @@ class TestProtectCall(common.TrezorTest): self.client.close() # Give it some time to reboot (it may take some time on RPi) - boot_delay = 5 - start = time.time() + boot_delay = 20 time.sleep(boot_delay) # Connect to Trezor again + start = time.time() self.setUp() - print "Expected reboot time %s seconds" % (1.8 ** attempt) - print "Rebooted in %s seconds" % (time.time() - start) - self.assertLessEqual(1.8 ** attempt, time.time() - start, "Bootup took less than expected!") + expected = 1.8 ** attempt / 2 # This test isn't accurate, let's expect at least some delay + took = time.time() - start + print "Expected reboot time at least %s seconds" % expected + print "Rebooted in %s seconds" % took + self.assertLessEqual(expected, time.time() - start, "Bootup took %s seconds, expected %s seconds or more!" % (took, expected)) if __name__ == '__main__': unittest.main() From 80a794cdfd953917ddc235906d81dae58fd41d74 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 12 Oct 2013 17:40:17 +0200 Subject: [PATCH 0112/1535] Using FailureType for Failure messages --- protobuf/trezor.proto | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/protobuf/trezor.proto b/protobuf/trezor.proto index 2cc530ac6..f34fd3f0f 100644 --- a/protobuf/trezor.proto +++ b/protobuf/trezor.proto @@ -63,6 +63,17 @@ extend google.protobuf.FieldOptions { // Definition of custom field types // +enum FailureType { + Failure_UnexpectedMessage = 1; + Failure_ButtonExpected = 2; + Failure_SyntaxError = 3; + Failure_ActionCancelled = 4; + Failure_PinExpected = 5; + Failure_PinCancelled = 6; + Failure_PinInvalid = 7; + Failure_FirmwareDataIncompatibility = 99; +} + // Specifies which script will be used for given transaction output. enum ScriptType { PAYTOADDRESS = 0; @@ -160,7 +171,7 @@ message Success { // Response object defining failure of the previous request message Failure { - optional int32 code = 1; // May contain computer-readable definition of the error state + optional FailureType code = 1; // May contain computer-readable definition of the error state optional bytes message = 2; // May contain human-readable message of the error state } From e33be1965eeb0724a64c5b499a8deb748b5a1703 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 12 Oct 2013 17:40:30 +0200 Subject: [PATCH 0113/1535] Compilled protobuf --- trezorlib/trezor_pb2.py | 183 ++++++++++++++++++++++++++-------------- 1 file changed, 119 insertions(+), 64 deletions(-) diff --git a/trezorlib/trezor_pb2.py b/trezorlib/trezor_pb2.py index 337414b88..3dcd5f52d 100644 --- a/trezorlib/trezor_pb2.py +++ b/trezorlib/trezor_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='trezor.proto', package='', - serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"(\n\x07\x46\x61ilure\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x05\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x0e\x46irmwareUpdate\x12\r\n\x05\x66orce\x18\x01 \x01(\x08\x12\x15\n\x07payload\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xd3\x08\n\x0bMessageType\x12\x1a\n\x16MessageType_Initialize\x10\x00\x12\x14\n\x10MessageType_Ping\x10\x01\x12\x17\n\x13MessageType_Success\x10\x02\x12\x17\n\x13MessageType_Failure\x10\x03\x12\x19\n\x15MessageType_ChangePin\x10\x04\x12\x1a\n\x16MessageType_WipeDevice\x10\x05\x12\x1e\n\x1aMessageType_FirmwareUpdate\x10\x06\x12\x1a\n\x16MessageType_GetEntropy\x10\t\x12\x17\n\x13MessageType_Entropy\x10\n\x12\"\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x12\x1f\n\x1bMessageType_MasterPublicKey\x10\x0c\x12\x1a\n\x16MessageType_LoadDevice\x10\r\x12\x1b\n\x17MessageType_ResetDevice\x10\x0e\x12\x16\n\x12MessageType_SignTx\x10\x0f\x12\x1c\n\x18MessageType_SimpleSignTx\x10\x10\x12\x18\n\x14MessageType_Features\x10\x11\x12 \n\x1cMessageType_PinMatrixRequest\x10\x12\x12\x1c\n\x18MessageType_PinMatrixAck\x10\x13\x12\x1f\n\x1bMessageType_PinMatrixCancel\x10\x14\x12\x19\n\x15MessageType_TxRequest\x10\x15\x12\x17\n\x13MessageType_TxInput\x10\x17\x12\x18\n\x14MessageType_TxOutput\x10\x18\x12\x1d\n\x19MessageType_ApplySettings\x10\x19\x12\x1d\n\x19MessageType_ButtonRequest\x10\x1a\x12\x19\n\x15MessageType_ButtonAck\x10\x1b\x12\x1c\n\x18MessageType_ButtonCancel\x10\x1c\x12\x1a\n\x16MessageType_GetAddress\x10\x1d\x12\x17\n\x13MessageType_Address\x10\x1e\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12\x1e\n\x1aMessageType_EntropyRequest\x10#\x12\x1a\n\x16MessageType_EntropyAck\x10$\x12!\n\x1dMessageType_DebugLinkDecision\x10\x64\x12!\n\x1dMessageType_DebugLinkGetState\x10\x65\x12\x1e\n\x1aMessageType_DebugLinkState\x10\x66\x12\x1d\n\x19MessageType_DebugLinkStop\x10g*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08') + serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x0e\x46irmwareUpdate\x12\r\n\x05\x66orce\x18\x01 \x01(\x08\x12\x15\n\x07payload\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xd3\x08\n\x0bMessageType\x12\x1a\n\x16MessageType_Initialize\x10\x00\x12\x14\n\x10MessageType_Ping\x10\x01\x12\x17\n\x13MessageType_Success\x10\x02\x12\x17\n\x13MessageType_Failure\x10\x03\x12\x19\n\x15MessageType_ChangePin\x10\x04\x12\x1a\n\x16MessageType_WipeDevice\x10\x05\x12\x1e\n\x1aMessageType_FirmwareUpdate\x10\x06\x12\x1a\n\x16MessageType_GetEntropy\x10\t\x12\x17\n\x13MessageType_Entropy\x10\n\x12\"\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x12\x1f\n\x1bMessageType_MasterPublicKey\x10\x0c\x12\x1a\n\x16MessageType_LoadDevice\x10\r\x12\x1b\n\x17MessageType_ResetDevice\x10\x0e\x12\x16\n\x12MessageType_SignTx\x10\x0f\x12\x1c\n\x18MessageType_SimpleSignTx\x10\x10\x12\x18\n\x14MessageType_Features\x10\x11\x12 \n\x1cMessageType_PinMatrixRequest\x10\x12\x12\x1c\n\x18MessageType_PinMatrixAck\x10\x13\x12\x1f\n\x1bMessageType_PinMatrixCancel\x10\x14\x12\x19\n\x15MessageType_TxRequest\x10\x15\x12\x17\n\x13MessageType_TxInput\x10\x17\x12\x18\n\x14MessageType_TxOutput\x10\x18\x12\x1d\n\x19MessageType_ApplySettings\x10\x19\x12\x1d\n\x19MessageType_ButtonRequest\x10\x1a\x12\x19\n\x15MessageType_ButtonAck\x10\x1b\x12\x1c\n\x18MessageType_ButtonCancel\x10\x1c\x12\x1a\n\x16MessageType_GetAddress\x10\x1d\x12\x17\n\x13MessageType_Address\x10\x1e\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12\x1e\n\x1aMessageType_EntropyRequest\x10#\x12\x1a\n\x16MessageType_EntropyAck\x10$\x12!\n\x1dMessageType_DebugLinkDecision\x10\x64\x12!\n\x1dMessageType_DebugLinkGetState\x10\x65\x12\x1e\n\x1aMessageType_DebugLinkState\x10\x66\x12\x1d\n\x19MessageType_DebugLinkStop\x10g*\xf2\x01\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\'\n#Failure_FirmwareDataIncompatibility\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -178,11 +178,57 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2250, - serialized_end=3357, + serialized_start=2264, + serialized_end=3371, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) +_FAILURETYPE = _descriptor.EnumDescriptor( + name='FailureType', + full_name='FailureType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='Failure_UnexpectedMessage', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_ButtonExpected', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_SyntaxError', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_ActionCancelled', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_PinExpected', index=4, number=5, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_PinCancelled', index=5, number=6, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_PinInvalid', index=6, number=7, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_FirmwareDataIncompatibility', index=7, number=99, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=3374, + serialized_end=3616, +) + +FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) _SCRIPTTYPE = _descriptor.EnumDescriptor( name='ScriptType', full_name='ScriptType', @@ -200,8 +246,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3359, - serialized_end=3410, + serialized_start=3618, + serialized_end=3669, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -222,8 +268,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3412, - serialized_end=3452, + serialized_start=3671, + serialized_end=3711, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -265,6 +311,14 @@ MessageType_DebugLinkDecision = 100 MessageType_DebugLinkGetState = 101 MessageType_DebugLinkState = 102 MessageType_DebugLinkStop = 103 +Failure_UnexpectedMessage = 1 +Failure_ButtonExpected = 2 +Failure_SyntaxError = 3 +Failure_ActionCancelled = 4 +Failure_PinExpected = 5 +Failure_PinCancelled = 6 +Failure_PinInvalid = 7 +Failure_FirmwareDataIncompatibility = 99 PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 TXINPUT = 0 @@ -737,8 +791,8 @@ _FAILURE = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='code', full_name='Failure.code', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -759,7 +813,7 @@ _FAILURE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=893, - serialized_end=933, + serialized_end=947, ) @@ -779,8 +833,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=935, - serialized_end=950, + serialized_start=949, + serialized_end=964, ) @@ -800,8 +854,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=952, - serialized_end=963, + serialized_start=966, + serialized_end=977, ) @@ -821,8 +875,8 @@ _BUTTONCANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=965, - serialized_end=979, + serialized_start=979, + serialized_end=993, ) @@ -849,8 +903,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=981, - serialized_end=1016, + serialized_start=995, + serialized_end=1030, ) @@ -877,8 +931,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1018, - serialized_end=1045, + serialized_start=1032, + serialized_end=1059, ) @@ -898,8 +952,8 @@ _PINMATRIXCANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1047, - serialized_end=1064, + serialized_start=1061, + serialized_end=1078, ) @@ -926,8 +980,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1066, - serialized_end=1092, + serialized_start=1080, + serialized_end=1106, ) @@ -954,8 +1008,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1094, - serialized_end=1126, + serialized_start=1108, + serialized_end=1140, ) @@ -975,8 +1029,8 @@ _GETMASTERPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1128, - serialized_end=1148, + serialized_start=1142, + serialized_end=1162, ) @@ -1003,8 +1057,8 @@ _MASTERPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1150, - serialized_end=1191, + serialized_start=1164, + serialized_end=1205, ) @@ -1031,8 +1085,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1193, - serialized_end=1224, + serialized_start=1207, + serialized_end=1238, ) @@ -1059,8 +1113,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1226, - serialized_end=1252, + serialized_start=1240, + serialized_end=1266, ) @@ -1080,8 +1134,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1254, - serialized_end=1266, + serialized_start=1268, + serialized_end=1280, ) @@ -1122,8 +1176,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1268, - serialized_end=1332, + serialized_start=1282, + serialized_end=1346, ) @@ -1150,8 +1204,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1334, - serialized_end=1371, + serialized_start=1348, + serialized_end=1385, ) @@ -1171,8 +1225,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1373, - serialized_end=1389, + serialized_start=1387, + serialized_end=1403, ) @@ -1199,8 +1253,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1391, - serialized_end=1426, + serialized_start=1405, + serialized_end=1440, ) @@ -1234,8 +1288,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1428, - serialized_end=1481, + serialized_start=1442, + serialized_end=1495, ) @@ -1269,8 +1323,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1483, - serialized_end=1551, + serialized_start=1497, + serialized_end=1565, ) @@ -1325,8 +1379,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1554, - serialized_end=1700, + serialized_start=1568, + serialized_end=1714, ) @@ -1388,8 +1442,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1703, - serialized_end=1833, + serialized_start=1717, + serialized_end=1847, ) @@ -1451,8 +1505,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1836, - serialized_end=1974, + serialized_start=1850, + serialized_end=1988, ) @@ -1486,8 +1540,8 @@ _FIRMWAREUPDATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1976, - serialized_end=2030, + serialized_start=1990, + serialized_end=2044, ) @@ -1514,8 +1568,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2032, - serialized_end=2067, + serialized_start=2046, + serialized_end=2081, ) @@ -1563,8 +1617,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2069, - serialized_end=2147, + serialized_start=2083, + serialized_end=2161, ) @@ -1612,8 +1666,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2149, - serialized_end=2230, + serialized_start=2163, + serialized_end=2244, ) @@ -1633,12 +1687,13 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2232, - serialized_end=2247, + serialized_start=2246, + serialized_end=2261, ) _SETTINGSTYPE.fields_by_name['coin'].message_type = _COINTYPE _FEATURES.fields_by_name['settings'].message_type = _SETTINGSTYPE +_FAILURE.fields_by_name['code'].enum_type = _FAILURETYPE _MASTERPUBLICKEY.fields_by_name['mpk'].message_type = _XPUBTYPE _LOADDEVICE.fields_by_name['xprv'].message_type = _XPRVTYPE _SIMPLESIGNTX.fields_by_name['inputs'].message_type = _TXINPUT From 02f6dd96816150b8a5c16241a4e387e97692c574 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 12 Oct 2013 17:40:48 +0200 Subject: [PATCH 0114/1535] Command firmware_update --- cmd.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/cmd.py b/cmd.py index bf6eaee57..311bcf577 100755 --- a/cmd.py +++ b/cmd.py @@ -112,7 +112,15 @@ class Commands(object): seed = ' '.join(args.seed) return self.client.load_device(seed, args.pin) - + + def firmware_update(self, args): + fp = open(args.file, 'r') + if fp.read(4) != 'TRZR': + raise Exception("Trezor firmware header expected") + + fp.seek(0) + return self.client.firmware_update(fp=open(args.file, 'r'), force=args.force) + list.help = 'List connected Trezor USB devices' ping.help = 'Send ping message' get_address.help = 'Get bitcoin address in base58 encoding' @@ -123,7 +131,8 @@ class Commands(object): set_label.help = 'Set new wallet label' set_coin.help = 'Switch device to another crypto currency' load_device.help = 'Load custom configuration to the device' - + firmware_update.help = 'Upload new firmware to device (must be in bootloader mode)' + get_address.arguments = ( (('n',), {'metavar': 'N', 'type': int, 'nargs': '+'}), ) @@ -151,6 +160,11 @@ class Commands(object): (('-n', '--pin'), {'type': str, 'default': ''}), ) + firmware_update.arguments = ( + (('-f', '--file'), {'type': str}), + (('-o', '--force'), {'type': bool, 'default': False}) + ) + def list_usb(): from trezorlib.transport_hid import HidTransport devices = HidTransport.enumerate() From 0b54b50ba254e12f5c1b3a85ecad33cfec04c6cf Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 12 Oct 2013 17:41:55 +0200 Subject: [PATCH 0115/1535] firmware_update command --- trezorlib/client.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 0d28cf1a6..097e8a466 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -127,10 +127,10 @@ class TrezorClient(object): if isinstance(resp, proto.Failure): self.message_func(resp.message) - if resp.code == 4: + if resp.code == proto.Failure_ActionCancelled: raise CallException("Action cancelled by user") - elif resp.code == 6: + elif resp.code == proto.Failure_PinInvalid: raise PinException("PIN is invalid") raise CallException(resp.code, resp.message) @@ -259,3 +259,16 @@ class TrezorClient(object): resp = self.call(proto.LoadDevice(seed=seed, pin=pin)) self.init_device() return isinstance(resp, proto.Success) + + def firmware_update(self, fp, force=False): + if self.features.bootloader_mode == False: + raise Exception("Device must be in bootloader mode") + + resp = self.call(proto.FirmwareUpdate(force=force, payload=fp.read())) + if isinstance(resp, proto.Success): + return True + + elif isinstance(resp, proto.Failure) and resp.code == proto.Failure_FirmwareDataIncompatibility: + return False + + raise Exception("Unexpected result " % resp) From 57151ce1b3bcf405e7cf5e1b4205f032993134da Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 19 Oct 2013 14:00:58 +0200 Subject: [PATCH 0116/1535] fix usb ids --- trezorlib/transport_hid.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/trezorlib/transport_hid.py b/trezorlib/transport_hid.py index 885bfae7e..b6ee9f253 100644 --- a/trezorlib/transport_hid.py +++ b/trezorlib/transport_hid.py @@ -5,9 +5,9 @@ import time from transport import Transport, NotImplementedException DEVICE_IDS = [ - (0x1cbe, 0xcaf3), # Trezor (0x10c4, 0xea80), # Trezor Pi - (0x08f7, 0x0002), # EasyTemp + (0x534c, 0x0000), # Trezor - Bootloader Mode + (0x534c, 0x0001), # Trezor - Regular Mode ] class FakeRead(object): From 2587eff8fdb16acfebfb8f4f3b06a91563a5990d Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 19 Oct 2013 14:19:09 +0200 Subject: [PATCH 0117/1535] use new hidapi api --- cmd.py | 2 ++ trezorlib/transport_hid.py | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd.py b/cmd.py index 311bcf577..bed3a5be0 100755 --- a/cmd.py +++ b/cmd.py @@ -114,6 +114,8 @@ class Commands(object): return self.client.load_device(seed, args.pin) def firmware_update(self, args): + if not args.file: + raise Exception("Must provide firmware filename") fp = open(args.file, 'r') if fp.read(4) != 'TRZR': raise Exception("Trezor firmware header expected") diff --git a/trezorlib/transport_hid.py b/trezorlib/transport_hid.py index b6ee9f253..98af59520 100644 --- a/trezorlib/transport_hid.py +++ b/trezorlib/transport_hid.py @@ -40,7 +40,8 @@ class HidTransport(Transport): def _open(self): self.buffer = '' path = self.device.split(':') - self.hid = hid.device(int(path[0], 16), int(path[1], 16))#, path[2]) + self.hid = hid.device() + self.hid.open(int(path[0], 16), int(path[1], 16)) self.hid.set_nonblocking(True) self.hid.send_feature_report([0x41, 0x01]) # enable UART self.hid.send_feature_report([0x43, 0x03]) # purge TX/RX FIFOs From 624d500c8401d836222b9e50df6fc8441b11fecb Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 20 Oct 2013 16:00:30 +0200 Subject: [PATCH 0118/1535] use required fields for bootloader firmwareupload message --- protobuf/trezor.proto | 4 ++-- trezorlib/trezor_pb2.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/protobuf/trezor.proto b/protobuf/trezor.proto index f34fd3f0f..617ec56e7 100644 --- a/protobuf/trezor.proto +++ b/protobuf/trezor.proto @@ -350,8 +350,8 @@ message TxOutput { // message FirmwareUpdate { - optional bool force = 1; // Force update, suppress message about wiping storage area - optional bytes payload = 2 [(binary) = true]; // Firmware to flash into device + required bool force = 1; // Force update, suppress message about wiping storage area + required bytes payload = 2 [(binary) = true]; // Firmware to flash into device } // **************************************************************************** diff --git a/trezorlib/trezor_pb2.py b/trezorlib/trezor_pb2.py index 3dcd5f52d..260387955 100644 --- a/trezorlib/trezor_pb2.py +++ b/trezorlib/trezor_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='trezor.proto', package='', - serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x0e\x46irmwareUpdate\x12\r\n\x05\x66orce\x18\x01 \x01(\x08\x12\x15\n\x07payload\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xd3\x08\n\x0bMessageType\x12\x1a\n\x16MessageType_Initialize\x10\x00\x12\x14\n\x10MessageType_Ping\x10\x01\x12\x17\n\x13MessageType_Success\x10\x02\x12\x17\n\x13MessageType_Failure\x10\x03\x12\x19\n\x15MessageType_ChangePin\x10\x04\x12\x1a\n\x16MessageType_WipeDevice\x10\x05\x12\x1e\n\x1aMessageType_FirmwareUpdate\x10\x06\x12\x1a\n\x16MessageType_GetEntropy\x10\t\x12\x17\n\x13MessageType_Entropy\x10\n\x12\"\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x12\x1f\n\x1bMessageType_MasterPublicKey\x10\x0c\x12\x1a\n\x16MessageType_LoadDevice\x10\r\x12\x1b\n\x17MessageType_ResetDevice\x10\x0e\x12\x16\n\x12MessageType_SignTx\x10\x0f\x12\x1c\n\x18MessageType_SimpleSignTx\x10\x10\x12\x18\n\x14MessageType_Features\x10\x11\x12 \n\x1cMessageType_PinMatrixRequest\x10\x12\x12\x1c\n\x18MessageType_PinMatrixAck\x10\x13\x12\x1f\n\x1bMessageType_PinMatrixCancel\x10\x14\x12\x19\n\x15MessageType_TxRequest\x10\x15\x12\x17\n\x13MessageType_TxInput\x10\x17\x12\x18\n\x14MessageType_TxOutput\x10\x18\x12\x1d\n\x19MessageType_ApplySettings\x10\x19\x12\x1d\n\x19MessageType_ButtonRequest\x10\x1a\x12\x19\n\x15MessageType_ButtonAck\x10\x1b\x12\x1c\n\x18MessageType_ButtonCancel\x10\x1c\x12\x1a\n\x16MessageType_GetAddress\x10\x1d\x12\x17\n\x13MessageType_Address\x10\x1e\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12\x1e\n\x1aMessageType_EntropyRequest\x10#\x12\x1a\n\x16MessageType_EntropyAck\x10$\x12!\n\x1dMessageType_DebugLinkDecision\x10\x64\x12!\n\x1dMessageType_DebugLinkGetState\x10\x65\x12\x1e\n\x1aMessageType_DebugLinkState\x10\x66\x12\x1d\n\x19MessageType_DebugLinkStop\x10g*\xf2\x01\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\'\n#Failure_FirmwareDataIncompatibility\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08') + serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x0e\x46irmwareUpdate\x12\r\n\x05\x66orce\x18\x01 \x02(\x08\x12\x15\n\x07payload\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xd3\x08\n\x0bMessageType\x12\x1a\n\x16MessageType_Initialize\x10\x00\x12\x14\n\x10MessageType_Ping\x10\x01\x12\x17\n\x13MessageType_Success\x10\x02\x12\x17\n\x13MessageType_Failure\x10\x03\x12\x19\n\x15MessageType_ChangePin\x10\x04\x12\x1a\n\x16MessageType_WipeDevice\x10\x05\x12\x1e\n\x1aMessageType_FirmwareUpdate\x10\x06\x12\x1a\n\x16MessageType_GetEntropy\x10\t\x12\x17\n\x13MessageType_Entropy\x10\n\x12\"\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x12\x1f\n\x1bMessageType_MasterPublicKey\x10\x0c\x12\x1a\n\x16MessageType_LoadDevice\x10\r\x12\x1b\n\x17MessageType_ResetDevice\x10\x0e\x12\x16\n\x12MessageType_SignTx\x10\x0f\x12\x1c\n\x18MessageType_SimpleSignTx\x10\x10\x12\x18\n\x14MessageType_Features\x10\x11\x12 \n\x1cMessageType_PinMatrixRequest\x10\x12\x12\x1c\n\x18MessageType_PinMatrixAck\x10\x13\x12\x1f\n\x1bMessageType_PinMatrixCancel\x10\x14\x12\x19\n\x15MessageType_TxRequest\x10\x15\x12\x17\n\x13MessageType_TxInput\x10\x17\x12\x18\n\x14MessageType_TxOutput\x10\x18\x12\x1d\n\x19MessageType_ApplySettings\x10\x19\x12\x1d\n\x19MessageType_ButtonRequest\x10\x1a\x12\x19\n\x15MessageType_ButtonAck\x10\x1b\x12\x1c\n\x18MessageType_ButtonCancel\x10\x1c\x12\x1a\n\x16MessageType_GetAddress\x10\x1d\x12\x17\n\x13MessageType_Address\x10\x1e\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12\x1e\n\x1aMessageType_EntropyRequest\x10#\x12\x1a\n\x16MessageType_EntropyAck\x10$\x12!\n\x1dMessageType_DebugLinkDecision\x10\x64\x12!\n\x1dMessageType_DebugLinkGetState\x10\x65\x12\x1e\n\x1aMessageType_DebugLinkState\x10\x66\x12\x1d\n\x19MessageType_DebugLinkStop\x10g*\xf2\x01\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\'\n#Failure_FirmwareDataIncompatibility\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -1519,14 +1519,14 @@ _FIRMWAREUPDATE = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='force', full_name='FirmwareUpdate.force', index=0, - number=1, type=8, cpp_type=7, label=1, + number=1, type=8, cpp_type=7, label=2, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='payload', full_name='FirmwareUpdate.payload', index=1, - number=2, type=12, cpp_type=9, label=1, + number=2, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, From f863e1e602c0c68c21f2a38c1f90923586788e1a Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 21 Oct 2013 18:30:43 +0200 Subject: [PATCH 0119/1535] drop FirmwareUpdate.force field --- cmd.py | 3 +-- protobuf/trezor.proto | 3 +-- trezorlib/client.py | 4 ++-- trezorlib/trezor_pb2.py | 47 ++++++++++++++++++----------------------- 4 files changed, 24 insertions(+), 33 deletions(-) diff --git a/cmd.py b/cmd.py index bed3a5be0..b9dc23c33 100755 --- a/cmd.py +++ b/cmd.py @@ -121,7 +121,7 @@ class Commands(object): raise Exception("Trezor firmware header expected") fp.seek(0) - return self.client.firmware_update(fp=open(args.file, 'r'), force=args.force) + return self.client.firmware_update(fp=open(args.file, 'r')) list.help = 'List connected Trezor USB devices' ping.help = 'Send ping message' @@ -164,7 +164,6 @@ class Commands(object): firmware_update.arguments = ( (('-f', '--file'), {'type': str}), - (('-o', '--force'), {'type': bool, 'default': False}) ) def list_usb(): diff --git a/protobuf/trezor.proto b/protobuf/trezor.proto index 617ec56e7..4243c2cd5 100644 --- a/protobuf/trezor.proto +++ b/protobuf/trezor.proto @@ -350,8 +350,7 @@ message TxOutput { // message FirmwareUpdate { - required bool force = 1; // Force update, suppress message about wiping storage area - required bytes payload = 2 [(binary) = true]; // Firmware to flash into device + required bytes payload = 1 [(binary) = true]; // Firmware to flash into device } // **************************************************************************** diff --git a/trezorlib/client.py b/trezorlib/client.py index 097e8a466..2d45a9418 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -260,11 +260,11 @@ class TrezorClient(object): self.init_device() return isinstance(resp, proto.Success) - def firmware_update(self, fp, force=False): + def firmware_update(self, fp): if self.features.bootloader_mode == False: raise Exception("Device must be in bootloader mode") - resp = self.call(proto.FirmwareUpdate(force=force, payload=fp.read())) + resp = self.call(proto.FirmwareUpdate(payload=fp.read())) if isinstance(resp, proto.Success): return True diff --git a/trezorlib/trezor_pb2.py b/trezorlib/trezor_pb2.py index 260387955..4bbd8206c 100644 --- a/trezorlib/trezor_pb2.py +++ b/trezorlib/trezor_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='trezor.proto', package='', - serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x0e\x46irmwareUpdate\x12\r\n\x05\x66orce\x18\x01 \x02(\x08\x12\x15\n\x07payload\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xd3\x08\n\x0bMessageType\x12\x1a\n\x16MessageType_Initialize\x10\x00\x12\x14\n\x10MessageType_Ping\x10\x01\x12\x17\n\x13MessageType_Success\x10\x02\x12\x17\n\x13MessageType_Failure\x10\x03\x12\x19\n\x15MessageType_ChangePin\x10\x04\x12\x1a\n\x16MessageType_WipeDevice\x10\x05\x12\x1e\n\x1aMessageType_FirmwareUpdate\x10\x06\x12\x1a\n\x16MessageType_GetEntropy\x10\t\x12\x17\n\x13MessageType_Entropy\x10\n\x12\"\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x12\x1f\n\x1bMessageType_MasterPublicKey\x10\x0c\x12\x1a\n\x16MessageType_LoadDevice\x10\r\x12\x1b\n\x17MessageType_ResetDevice\x10\x0e\x12\x16\n\x12MessageType_SignTx\x10\x0f\x12\x1c\n\x18MessageType_SimpleSignTx\x10\x10\x12\x18\n\x14MessageType_Features\x10\x11\x12 \n\x1cMessageType_PinMatrixRequest\x10\x12\x12\x1c\n\x18MessageType_PinMatrixAck\x10\x13\x12\x1f\n\x1bMessageType_PinMatrixCancel\x10\x14\x12\x19\n\x15MessageType_TxRequest\x10\x15\x12\x17\n\x13MessageType_TxInput\x10\x17\x12\x18\n\x14MessageType_TxOutput\x10\x18\x12\x1d\n\x19MessageType_ApplySettings\x10\x19\x12\x1d\n\x19MessageType_ButtonRequest\x10\x1a\x12\x19\n\x15MessageType_ButtonAck\x10\x1b\x12\x1c\n\x18MessageType_ButtonCancel\x10\x1c\x12\x1a\n\x16MessageType_GetAddress\x10\x1d\x12\x17\n\x13MessageType_Address\x10\x1e\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12\x1e\n\x1aMessageType_EntropyRequest\x10#\x12\x1a\n\x16MessageType_EntropyAck\x10$\x12!\n\x1dMessageType_DebugLinkDecision\x10\x64\x12!\n\x1dMessageType_DebugLinkGetState\x10\x65\x12\x1e\n\x1aMessageType_DebugLinkState\x10\x66\x12\x1d\n\x19MessageType_DebugLinkStop\x10g*\xf2\x01\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\'\n#Failure_FirmwareDataIncompatibility\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08') + serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"\'\n\x0e\x46irmwareUpdate\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xd3\x08\n\x0bMessageType\x12\x1a\n\x16MessageType_Initialize\x10\x00\x12\x14\n\x10MessageType_Ping\x10\x01\x12\x17\n\x13MessageType_Success\x10\x02\x12\x17\n\x13MessageType_Failure\x10\x03\x12\x19\n\x15MessageType_ChangePin\x10\x04\x12\x1a\n\x16MessageType_WipeDevice\x10\x05\x12\x1e\n\x1aMessageType_FirmwareUpdate\x10\x06\x12\x1a\n\x16MessageType_GetEntropy\x10\t\x12\x17\n\x13MessageType_Entropy\x10\n\x12\"\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x12\x1f\n\x1bMessageType_MasterPublicKey\x10\x0c\x12\x1a\n\x16MessageType_LoadDevice\x10\r\x12\x1b\n\x17MessageType_ResetDevice\x10\x0e\x12\x16\n\x12MessageType_SignTx\x10\x0f\x12\x1c\n\x18MessageType_SimpleSignTx\x10\x10\x12\x18\n\x14MessageType_Features\x10\x11\x12 \n\x1cMessageType_PinMatrixRequest\x10\x12\x12\x1c\n\x18MessageType_PinMatrixAck\x10\x13\x12\x1f\n\x1bMessageType_PinMatrixCancel\x10\x14\x12\x19\n\x15MessageType_TxRequest\x10\x15\x12\x17\n\x13MessageType_TxInput\x10\x17\x12\x18\n\x14MessageType_TxOutput\x10\x18\x12\x1d\n\x19MessageType_ApplySettings\x10\x19\x12\x1d\n\x19MessageType_ButtonRequest\x10\x1a\x12\x19\n\x15MessageType_ButtonAck\x10\x1b\x12\x1c\n\x18MessageType_ButtonCancel\x10\x1c\x12\x1a\n\x16MessageType_GetAddress\x10\x1d\x12\x17\n\x13MessageType_Address\x10\x1e\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12\x1e\n\x1aMessageType_EntropyRequest\x10#\x12\x1a\n\x16MessageType_EntropyAck\x10$\x12!\n\x1dMessageType_DebugLinkDecision\x10\x64\x12!\n\x1dMessageType_DebugLinkGetState\x10\x65\x12\x1e\n\x1aMessageType_DebugLinkState\x10\x66\x12\x1d\n\x19MessageType_DebugLinkStop\x10g*\xf2\x01\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\'\n#Failure_FirmwareDataIncompatibility\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -178,8 +178,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2264, - serialized_end=3371, + serialized_start=2249, + serialized_end=3356, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -224,8 +224,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3374, - serialized_end=3616, + serialized_start=3359, + serialized_end=3601, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -246,8 +246,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3618, - serialized_end=3669, + serialized_start=3603, + serialized_end=3654, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -268,8 +268,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3671, - serialized_end=3711, + serialized_start=3656, + serialized_end=3696, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -1518,15 +1518,8 @@ _FIRMWAREUPDATE = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='force', full_name='FirmwareUpdate.force', index=0, - number=1, type=8, cpp_type=7, label=2, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='payload', full_name='FirmwareUpdate.payload', index=1, - number=2, type=12, cpp_type=9, label=2, + name='payload', full_name='FirmwareUpdate.payload', index=0, + number=1, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -1541,7 +1534,7 @@ _FIRMWAREUPDATE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=1990, - serialized_end=2044, + serialized_end=2029, ) @@ -1568,8 +1561,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2046, - serialized_end=2081, + serialized_start=2031, + serialized_end=2066, ) @@ -1617,8 +1610,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2083, - serialized_end=2161, + serialized_start=2068, + serialized_end=2146, ) @@ -1666,8 +1659,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2163, - serialized_end=2244, + serialized_start=2148, + serialized_end=2229, ) @@ -1687,8 +1680,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2246, - serialized_end=2261, + serialized_start=2231, + serialized_end=2246, ) _SETTINGSTYPE.fields_by_name['coin'].message_type = _COINTYPE From c01830462a8e5692da74c862f966596ab2c000c8 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 22 Oct 2013 11:29:33 +0200 Subject: [PATCH 0120/1535] add FirmwareErase message --- protobuf/trezor.proto | 10 ++- trezorlib/client.py | 8 +- trezorlib/trezor_pb2.py | 161 ++++++++++++++++++++++++---------------- 3 files changed, 110 insertions(+), 69 deletions(-) diff --git a/protobuf/trezor.proto b/protobuf/trezor.proto index 4243c2cd5..089a53ac3 100644 --- a/protobuf/trezor.proto +++ b/protobuf/trezor.proto @@ -18,7 +18,8 @@ enum MessageType { MessageType_Failure = 3; MessageType_ChangePin = 4; MessageType_WipeDevice = 5; - MessageType_FirmwareUpdate = 6; + MessageType_FirmwareErase = 6; + MessageType_FirmwareUpload = 7; MessageType_GetEntropy = 9; MessageType_Entropy = 10; MessageType_GetMasterPublicKey = 11; @@ -71,7 +72,7 @@ enum FailureType { Failure_PinExpected = 5; Failure_PinCancelled = 6; Failure_PinInvalid = 7; - Failure_FirmwareDataIncompatibility = 99; + Failure_FirmwareError = 99; } // Specifies which script will be used for given transaction output. @@ -349,7 +350,10 @@ message TxOutput { // Bootloader messages // -message FirmwareUpdate { +message FirmwareErase { +} + +message FirmwareUpload { required bytes payload = 1 [(binary) = true]; // Firmware to flash into device } diff --git a/trezorlib/client.py b/trezorlib/client.py index 2d45a9418..b95937372 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -264,11 +264,15 @@ class TrezorClient(object): if self.features.bootloader_mode == False: raise Exception("Device must be in bootloader mode") - resp = self.call(proto.FirmwareUpdate(payload=fp.read())) + resp = self.call(proto.FirmwareErase()) + if isinstance(resp, proto.Failure) and resp.code == proto.Failure_FirmwareError: + return False + + resp = self.call(proto.FirmwareUpload(payload=fp.read())) if isinstance(resp, proto.Success): return True - elif isinstance(resp, proto.Failure) and resp.code == proto.Failure_FirmwareDataIncompatibility: + elif isinstance(resp, proto.Failure) and resp.code == proto.Failure_FirmwareError: return False raise Exception("Unexpected result " % resp) diff --git a/trezorlib/trezor_pb2.py b/trezorlib/trezor_pb2.py index 4bbd8206c..8655b6d9d 100644 --- a/trezorlib/trezor_pb2.py +++ b/trezorlib/trezor_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='trezor.proto', package='', - serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"\'\n\x0e\x46irmwareUpdate\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xd3\x08\n\x0bMessageType\x12\x1a\n\x16MessageType_Initialize\x10\x00\x12\x14\n\x10MessageType_Ping\x10\x01\x12\x17\n\x13MessageType_Success\x10\x02\x12\x17\n\x13MessageType_Failure\x10\x03\x12\x19\n\x15MessageType_ChangePin\x10\x04\x12\x1a\n\x16MessageType_WipeDevice\x10\x05\x12\x1e\n\x1aMessageType_FirmwareUpdate\x10\x06\x12\x1a\n\x16MessageType_GetEntropy\x10\t\x12\x17\n\x13MessageType_Entropy\x10\n\x12\"\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x12\x1f\n\x1bMessageType_MasterPublicKey\x10\x0c\x12\x1a\n\x16MessageType_LoadDevice\x10\r\x12\x1b\n\x17MessageType_ResetDevice\x10\x0e\x12\x16\n\x12MessageType_SignTx\x10\x0f\x12\x1c\n\x18MessageType_SimpleSignTx\x10\x10\x12\x18\n\x14MessageType_Features\x10\x11\x12 \n\x1cMessageType_PinMatrixRequest\x10\x12\x12\x1c\n\x18MessageType_PinMatrixAck\x10\x13\x12\x1f\n\x1bMessageType_PinMatrixCancel\x10\x14\x12\x19\n\x15MessageType_TxRequest\x10\x15\x12\x17\n\x13MessageType_TxInput\x10\x17\x12\x18\n\x14MessageType_TxOutput\x10\x18\x12\x1d\n\x19MessageType_ApplySettings\x10\x19\x12\x1d\n\x19MessageType_ButtonRequest\x10\x1a\x12\x19\n\x15MessageType_ButtonAck\x10\x1b\x12\x1c\n\x18MessageType_ButtonCancel\x10\x1c\x12\x1a\n\x16MessageType_GetAddress\x10\x1d\x12\x17\n\x13MessageType_Address\x10\x1e\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12\x1e\n\x1aMessageType_EntropyRequest\x10#\x12\x1a\n\x16MessageType_EntropyAck\x10$\x12!\n\x1dMessageType_DebugLinkDecision\x10\x64\x12!\n\x1dMessageType_DebugLinkGetState\x10\x65\x12\x1e\n\x1aMessageType_DebugLinkState\x10\x66\x12\x1d\n\x19MessageType_DebugLinkStop\x10g*\xf2\x01\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\'\n#Failure_FirmwareDataIncompatibility\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08') + serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xf2\x08\n\x0bMessageType\x12\x1a\n\x16MessageType_Initialize\x10\x00\x12\x14\n\x10MessageType_Ping\x10\x01\x12\x17\n\x13MessageType_Success\x10\x02\x12\x17\n\x13MessageType_Failure\x10\x03\x12\x19\n\x15MessageType_ChangePin\x10\x04\x12\x1a\n\x16MessageType_WipeDevice\x10\x05\x12\x1d\n\x19MessageType_FirmwareErase\x10\x06\x12\x1e\n\x1aMessageType_FirmwareUpload\x10\x07\x12\x1a\n\x16MessageType_GetEntropy\x10\t\x12\x17\n\x13MessageType_Entropy\x10\n\x12\"\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x12\x1f\n\x1bMessageType_MasterPublicKey\x10\x0c\x12\x1a\n\x16MessageType_LoadDevice\x10\r\x12\x1b\n\x17MessageType_ResetDevice\x10\x0e\x12\x16\n\x12MessageType_SignTx\x10\x0f\x12\x1c\n\x18MessageType_SimpleSignTx\x10\x10\x12\x18\n\x14MessageType_Features\x10\x11\x12 \n\x1cMessageType_PinMatrixRequest\x10\x12\x12\x1c\n\x18MessageType_PinMatrixAck\x10\x13\x12\x1f\n\x1bMessageType_PinMatrixCancel\x10\x14\x12\x19\n\x15MessageType_TxRequest\x10\x15\x12\x17\n\x13MessageType_TxInput\x10\x17\x12\x18\n\x14MessageType_TxOutput\x10\x18\x12\x1d\n\x19MessageType_ApplySettings\x10\x19\x12\x1d\n\x19MessageType_ButtonRequest\x10\x1a\x12\x19\n\x15MessageType_ButtonAck\x10\x1b\x12\x1c\n\x18MessageType_ButtonCancel\x10\x1c\x12\x1a\n\x16MessageType_GetAddress\x10\x1d\x12\x17\n\x13MessageType_Address\x10\x1e\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12\x1e\n\x1aMessageType_EntropyRequest\x10#\x12\x1a\n\x16MessageType_EntropyAck\x10$\x12!\n\x1dMessageType_DebugLinkDecision\x10\x64\x12!\n\x1dMessageType_DebugLinkGetState\x10\x65\x12\x1e\n\x1aMessageType_DebugLinkState\x10\x66\x12\x1d\n\x19MessageType_DebugLinkStop\x10g*\xe4\x01\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -48,138 +48,142 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_FirmwareUpdate', index=6, number=6, + name='MessageType_FirmwareErase', index=6, number=6, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_GetEntropy', index=7, number=9, + name='MessageType_FirmwareUpload', index=7, number=7, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_Entropy', index=8, number=10, + name='MessageType_GetEntropy', index=8, number=9, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_GetMasterPublicKey', index=9, number=11, + name='MessageType_Entropy', index=9, number=10, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_MasterPublicKey', index=10, number=12, + name='MessageType_GetMasterPublicKey', index=10, number=11, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_LoadDevice', index=11, number=13, + name='MessageType_MasterPublicKey', index=11, number=12, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ResetDevice', index=12, number=14, + name='MessageType_LoadDevice', index=12, number=13, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_SignTx', index=13, number=15, + name='MessageType_ResetDevice', index=13, number=14, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_SimpleSignTx', index=14, number=16, + name='MessageType_SignTx', index=14, number=15, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_Features', index=15, number=17, + name='MessageType_SimpleSignTx', index=15, number=16, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PinMatrixRequest', index=16, number=18, + name='MessageType_Features', index=16, number=17, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PinMatrixAck', index=17, number=19, + name='MessageType_PinMatrixRequest', index=17, number=18, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PinMatrixCancel', index=18, number=20, + name='MessageType_PinMatrixAck', index=18, number=19, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxRequest', index=19, number=21, + name='MessageType_PinMatrixCancel', index=19, number=20, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxInput', index=20, number=23, + name='MessageType_TxRequest', index=20, number=21, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxOutput', index=21, number=24, + name='MessageType_TxInput', index=21, number=23, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ApplySettings', index=22, number=25, + name='MessageType_TxOutput', index=22, number=24, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonRequest', index=23, number=26, + name='MessageType_ApplySettings', index=23, number=25, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonAck', index=24, number=27, + name='MessageType_ButtonRequest', index=24, number=26, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonCancel', index=25, number=28, + name='MessageType_ButtonAck', index=25, number=27, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_GetAddress', index=26, number=29, + name='MessageType_ButtonCancel', index=26, number=28, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_Address', index=27, number=30, + name='MessageType_GetAddress', index=27, number=29, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_SettingsType', index=28, number=31, + name='MessageType_Address', index=28, number=30, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_XprvType', index=29, number=32, + name='MessageType_SettingsType', index=29, number=31, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_CoinType', index=30, number=33, + name='MessageType_XprvType', index=30, number=32, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_XpubType', index=31, number=34, + name='MessageType_CoinType', index=31, number=33, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyRequest', index=32, number=35, + name='MessageType_XpubType', index=32, number=34, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyAck', index=33, number=36, + name='MessageType_EntropyRequest', index=33, number=35, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkDecision', index=34, number=100, + name='MessageType_EntropyAck', index=34, number=36, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkGetState', index=35, number=101, + name='MessageType_DebugLinkDecision', index=35, number=100, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkState', index=36, number=102, + name='MessageType_DebugLinkGetState', index=36, number=101, options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkStop', index=37, number=103, + name='MessageType_DebugLinkState', index=37, number=102, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_DebugLinkStop', index=38, number=103, options=None, type=None), ], containing_type=None, options=None, - serialized_start=2249, - serialized_end=3356, + serialized_start=2266, + serialized_end=3404, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -218,14 +222,14 @@ _FAILURETYPE = _descriptor.EnumDescriptor( options=None, type=None), _descriptor.EnumValueDescriptor( - name='Failure_FirmwareDataIncompatibility', index=7, number=99, + name='Failure_FirmwareError', index=7, number=99, options=None, type=None), ], containing_type=None, options=None, - serialized_start=3359, - serialized_end=3601, + serialized_start=3407, + serialized_end=3635, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -246,8 +250,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3603, - serialized_end=3654, + serialized_start=3637, + serialized_end=3688, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -268,8 +272,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3656, - serialized_end=3696, + serialized_start=3690, + serialized_end=3730, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -279,7 +283,8 @@ MessageType_Success = 2 MessageType_Failure = 3 MessageType_ChangePin = 4 MessageType_WipeDevice = 5 -MessageType_FirmwareUpdate = 6 +MessageType_FirmwareErase = 6 +MessageType_FirmwareUpload = 7 MessageType_GetEntropy = 9 MessageType_Entropy = 10 MessageType_GetMasterPublicKey = 11 @@ -318,7 +323,7 @@ Failure_ActionCancelled = 4 Failure_PinExpected = 5 Failure_PinCancelled = 6 Failure_PinInvalid = 7 -Failure_FirmwareDataIncompatibility = 99 +Failure_FirmwareError = 99 PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 TXINPUT = 0 @@ -1510,15 +1515,36 @@ _TXOUTPUT = _descriptor.Descriptor( ) -_FIRMWAREUPDATE = _descriptor.Descriptor( - name='FirmwareUpdate', - full_name='FirmwareUpdate', +_FIRMWAREERASE = _descriptor.Descriptor( + name='FirmwareErase', + full_name='FirmwareErase', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1990, + serialized_end=2005, +) + + +_FIRMWAREUPLOAD = _descriptor.Descriptor( + name='FirmwareUpload', + full_name='FirmwareUpload', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='payload', full_name='FirmwareUpdate.payload', index=0, + name='payload', full_name='FirmwareUpload.payload', index=0, number=1, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, @@ -1533,8 +1559,8 @@ _FIRMWAREUPDATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1990, - serialized_end=2029, + serialized_start=2007, + serialized_end=2046, ) @@ -1561,8 +1587,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2031, - serialized_end=2066, + serialized_start=2048, + serialized_end=2083, ) @@ -1610,8 +1636,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2068, - serialized_end=2146, + serialized_start=2085, + serialized_end=2163, ) @@ -1659,8 +1685,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2148, - serialized_end=2229, + serialized_start=2165, + serialized_end=2246, ) @@ -1680,8 +1706,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2231, - serialized_end=2246, + serialized_start=2248, + serialized_end=2263, ) _SETTINGSTYPE.fields_by_name['coin'].message_type = _COINTYPE @@ -1726,7 +1752,8 @@ DESCRIPTOR.message_types_by_name['SimpleSignTx'] = _SIMPLESIGNTX DESCRIPTOR.message_types_by_name['TxRequest'] = _TXREQUEST DESCRIPTOR.message_types_by_name['TxInput'] = _TXINPUT DESCRIPTOR.message_types_by_name['TxOutput'] = _TXOUTPUT -DESCRIPTOR.message_types_by_name['FirmwareUpdate'] = _FIRMWAREUPDATE +DESCRIPTOR.message_types_by_name['FirmwareErase'] = _FIRMWAREERASE +DESCRIPTOR.message_types_by_name['FirmwareUpload'] = _FIRMWAREUPLOAD DESCRIPTOR.message_types_by_name['DebugLinkDecision'] = _DEBUGLINKDECISION DESCRIPTOR.message_types_by_name['DebugLinkGetState'] = _DEBUGLINKGETSTATE DESCRIPTOR.message_types_by_name['DebugLinkState'] = _DEBUGLINKSTATE @@ -1930,11 +1957,17 @@ class TxOutput(_message.Message): # @@protoc_insertion_point(class_scope:TxOutput) -class FirmwareUpdate(_message.Message): +class FirmwareErase(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _FIRMWAREERASE + + # @@protoc_insertion_point(class_scope:FirmwareErase) + +class FirmwareUpload(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _FIRMWAREUPDATE + DESCRIPTOR = _FIRMWAREUPLOAD - # @@protoc_insertion_point(class_scope:FirmwareUpdate) + # @@protoc_insertion_point(class_scope:FirmwareUpload) class DebugLinkDecision(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType @@ -1988,8 +2021,8 @@ _TXINPUT.fields_by_name['script_sig'].has_options = True _TXINPUT.fields_by_name['script_sig']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _TXOUTPUT.fields_by_name['script_args'].has_options = True _TXOUTPUT.fields_by_name['script_args']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_FIRMWAREUPDATE.fields_by_name['payload'].has_options = True -_FIRMWAREUPDATE.fields_by_name['payload']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_FIRMWAREUPLOAD.fields_by_name['payload'].has_options = True +_FIRMWAREUPLOAD.fields_by_name['payload']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _DEBUGLINKSTATE.fields_by_name['layout'].has_options = True _DEBUGLINKSTATE.fields_by_name['layout']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') # @@protoc_insertion_point(module_scope) From 817cd6ea865b53e62ef652811f0963fd1be42a86 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 22 Oct 2013 16:22:04 +0200 Subject: [PATCH 0121/1535] use same product id for bootloader mode as well --- trezorlib/transport_hid.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/trezorlib/transport_hid.py b/trezorlib/transport_hid.py index 98af59520..8b407bb54 100644 --- a/trezorlib/transport_hid.py +++ b/trezorlib/transport_hid.py @@ -6,8 +6,7 @@ from transport import Transport, NotImplementedException DEVICE_IDS = [ (0x10c4, 0xea80), # Trezor Pi - (0x534c, 0x0000), # Trezor - Bootloader Mode - (0x534c, 0x0001), # Trezor - Regular Mode + (0x534c, 0x0001), # Trezor ] class FakeRead(object): From ed0813682c5909e201129c5462b4eea0a48947de Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 24 Oct 2013 19:29:11 +0200 Subject: [PATCH 0122/1535] protobuf files cleanup --- {protobuf => protob}/build.sh | 0 {protobuf => protob}/trezor.proto | 213 +++++++++++++++--------------- 2 files changed, 107 insertions(+), 106 deletions(-) rename {protobuf => protob}/build.sh (100%) rename {protobuf => protob}/trezor.proto (58%) diff --git a/protobuf/build.sh b/protob/build.sh similarity index 100% rename from protobuf/build.sh rename to protob/build.sh diff --git a/protobuf/trezor.proto b/protob/trezor.proto similarity index 58% rename from protobuf/trezor.proto rename to protob/trezor.proto index 089a53ac3..168d7182e 100644 --- a/protobuf/trezor.proto +++ b/protob/trezor.proto @@ -1,8 +1,8 @@ /* - This file describes Protocol buffers messages for bitcoin hardware wallet devices. - + Messages for TREZOR communication + Author: Marek Palatinus - + Version: 0.5 */ @@ -12,45 +12,45 @@ import "google/protobuf/descriptor.proto"; Mapping between Trezor wire identifier (int) and protobuf message */ enum MessageType { - MessageType_Initialize = 0; - MessageType_Ping = 1; - MessageType_Success = 2; - MessageType_Failure = 3; - MessageType_ChangePin = 4; - MessageType_WipeDevice = 5; - MessageType_FirmwareErase = 6; - MessageType_FirmwareUpload = 7; - MessageType_GetEntropy = 9; - MessageType_Entropy = 10; - MessageType_GetMasterPublicKey = 11; - MessageType_MasterPublicKey = 12; - MessageType_LoadDevice = 13; - MessageType_ResetDevice = 14; - MessageType_SignTx = 15; - MessageType_SimpleSignTx = 16; - MessageType_Features = 17; - MessageType_PinMatrixRequest = 18; - MessageType_PinMatrixAck = 19; - MessageType_PinMatrixCancel = 20; - MessageType_TxRequest = 21; - MessageType_TxInput = 23; - MessageType_TxOutput = 24; - MessageType_ApplySettings = 25; - MessageType_ButtonRequest = 26; - MessageType_ButtonAck = 27; - MessageType_ButtonCancel = 28; - MessageType_GetAddress = 29; - MessageType_Address = 30; - MessageType_SettingsType = 31; - MessageType_XprvType = 32; - MessageType_CoinType = 33; - MessageType_XpubType = 34; - MessageType_EntropyRequest = 35; - MessageType_EntropyAck = 36; - MessageType_DebugLinkDecision = 100; - MessageType_DebugLinkGetState = 101; - MessageType_DebugLinkState = 102; - MessageType_DebugLinkStop = 103; + MessageType_Initialize = 0; + MessageType_Ping = 1; + MessageType_Success = 2; + MessageType_Failure = 3; + MessageType_ChangePin = 4; + MessageType_WipeDevice = 5; + MessageType_FirmwareErase = 6; + MessageType_FirmwareUpload = 7; + MessageType_GetEntropy = 9; + MessageType_Entropy = 10; + MessageType_GetMasterPublicKey = 11; + MessageType_MasterPublicKey = 12; + MessageType_LoadDevice = 13; + MessageType_ResetDevice = 14; + MessageType_SignTx = 15; + MessageType_SimpleSignTx = 16; + MessageType_Features = 17; + MessageType_PinMatrixRequest = 18; + MessageType_PinMatrixAck = 19; + MessageType_PinMatrixCancel = 20; + MessageType_TxRequest = 21; + MessageType_TxInput = 23; + MessageType_TxOutput = 24; + MessageType_ApplySettings = 25; + MessageType_ButtonRequest = 26; + MessageType_ButtonAck = 27; + MessageType_ButtonCancel = 28; + MessageType_GetAddress = 29; + MessageType_Address = 30; + MessageType_SettingsType = 31; + MessageType_XprvType = 32; + MessageType_CoinType = 33; + MessageType_XpubType = 34; + MessageType_EntropyRequest = 35; + MessageType_EntropyAck = 36; + MessageType_DebugLinkDecision = 100; + MessageType_DebugLinkGetState = 101; + MessageType_DebugLinkState = 102; + MessageType_DebugLinkStop = 103; } // Such option indicates that the message field has binary payload @@ -75,16 +75,16 @@ enum FailureType { Failure_FirmwareError = 99; } -// Specifies which script will be used for given transaction output. +// Specifies which script will be used for given transaction output. enum ScriptType { - PAYTOADDRESS = 0; - PAYTOSCRIPTHASH = 1; -} + PAYTOADDRESS = 0; + PAYTOSCRIPTHASH = 1; +} // Specifies which kind of information is required by transaction signing process enum RequestType { - TXINPUT = 0; - TXOUTPUT = 1; + TXINPUT = 0; + TXOUTPUT = 1; } // Structure for BIP32-encoded node @@ -116,7 +116,7 @@ message CoinType { } message SettingsType { - optional bytes language = 1; // Trezor uses 'english' as default + optional bytes language = 1; // Trezor uses 'english' as default optional CoinType coin = 2; optional bytes label = 3; // Human readable wallet name } @@ -134,15 +134,15 @@ message Initialize { // Response object for Initialize. message Features { - optional bytes vendor = 1; // Name of the manufacturer, e.g. "bitcointrezor.com" - optional uint32 major_version = 2; // Major version of the device, e.g. 1 - optional uint32 minor_version = 3; // Minor version of the device, e.g. 0 - optional uint32 bugfix_version = 4; - optional bool bootloader_mode = 5; - optional SettingsType settings = 6; // User-level settings of the device - optional bytes device_id = 7 [(binary) = true]; // Device's unique identifier - optional bytes mpk_hash = 8 [(binary) = true]; // Hash of master public key (sha256(XpubType.public_key).digest()) - optional bool pin_protection = 9; // True if Trezor is covered by PIN + optional bytes vendor = 1; // Name of the manufacturer, e.g. "bitcointrezor.com" + optional uint32 major_version = 2; // Major version of the device, e.g. 1 + optional uint32 minor_version = 3; // Minor version of the device, e.g. 0 + optional uint32 bugfix_version = 4; + optional bool bootloader_mode = 5; + optional SettingsType settings = 6; // User-level settings of the device + optional bytes device_id = 7 [(binary) = true]; // Device's unique identifier + optional bytes mpk_hash = 8 [(binary) = true]; // Hash of master public key (sha256(XpubType.public_key).digest()) + optional bool pin_protection = 9; // True if Trezor is covered by PIN } // Overwrites only filled fields of the structure @@ -155,25 +155,25 @@ message ApplySettings { // Starts workflow for setting/changing the PIN // Response: ButtonRequest, PinMatrixRequest message ChangePin { - optional bool remove = 1; // Set True if want to remove PIN protection + optional bool remove = 1; // Set True if want to remove PIN protection } // Test if device is live, device will send back the message on success // // Response: None or Success message Ping { - optional bytes message = 1; // Message will be sent back in Success message + optional bytes message = 1; // Message will be sent back in Success message } // Response object defining success of the previous request message Success { - optional bytes message = 1; // May contain human readable description of the action or request-specific payload + optional bytes message = 1; // May contain human readable description of the action or request-specific payload } // Response object defining failure of the previous request message Failure { - optional FailureType code = 1; // May contain computer-readable definition of the error state - optional bytes message = 2; // May contain human-readable message of the error state + optional FailureType code = 1; // May contain computer-readable definition of the error state + optional bytes message = 2; // May contain human-readable message of the error state } // Message can be sent by the *device* as a resopnse to any request. @@ -190,18 +190,18 @@ message ButtonAck { // Computer want to cancel current action (don't wait to HW button press) message ButtonCancel { } - + // Message can be sent by the *device* as a response to any request. // Message asks computer to send back PinMatrixAck with the password encoded in pin matrix scheme. // // Response: PinMatrixAck, PinMatrixCancel message PinMatrixRequest { - optional bytes message = 1; // Human readable message + optional bytes message = 1; // Human readable message } // Message is sent by the computer as a response to PinMatrixRequest previously sent by the device. message PinMatrixAck { - required bytes pin = 1; // User must write down the password for accessing the device. + required bytes pin = 1; // User must write down the password for accessing the device. } // Message is sent as a response to PinMatrixRequest by the computer, asking the device to cancel @@ -214,12 +214,12 @@ message PinMatrixCancel { // // Response: PinMatrixRequest, Entropy, Failure message GetEntropy { - required uint32 size = 1; // Size of randomly generated buffer + required uint32 size = 1; // Size of randomly generated buffer } // Response to GetEntropy request contains random data generated by internal HRNG. message Entropy { - required bytes entropy = 1 [(binary) = true]; // Stream of generated bytes + required bytes entropy = 1 [(binary) = true]; // Stream of generated bytes } // Ask device for it's current master public key. This may be used for generating @@ -232,15 +232,15 @@ message GetMasterPublicKey { // Contains master public key derived from device's seed. message MasterPublicKey { - required XpubType mpk = 1; // BIP32 node public key + chaincode + required XpubType mpk = 1; // BIP32 node public key + chaincode } message GetAddress { - repeated uint32 address_n = 1; // Parameter for address generation algorithm to derive the address from the master public key + repeated uint32 address_n = 1; // Parameter for address generation algorithm to derive the address from the master public key } message Address { - required bytes address = 1; // Bitcoin address in base58 encoding corresponding to GetAddress(n) call + required bytes address = 1; // Bitcoin address in base58 encoding corresponding to GetAddress(n) call } // Request device to wipe all sensitive data and settings. @@ -254,22 +254,23 @@ message WipeDevice { // // Response: Success, ButtonRequest, PinMatrixRequest, Failure message LoadDevice { - optional bytes seed = 1; // Seed encoded as a mnemonic (12 english words) - optional XprvType xprv = 2; - optional bytes pin = 3; // Set PIN protection for important actions + optional bytes seed = 1; // Seed encoded as a mnemonic (12 english words) + optional XprvType xprv = 2; + optional bytes pin = 3; // Set PIN protection for important actions } // Request device to do full-reset, to generate new seed // and ask user for new settings (PIN). // Workflow is splitted into ResetDevice/EntropyRequest to be sure // that entropy provided by device isn't calculated on base of computer provided -// entropy. +// entropy. +// // -// // Response: EntropyRequest, PinMatrixRequest, Failure message ResetDevice { - optional bool display_random = 1; // If set, displays entropy generated by the device used - // for generating the seed *before* asking for additional entropy from computer + optional bool display_random = 1; // If set, displays entropy generated by the device used + // for generating the seed *before* asking + // for additional entropy from computer } // Asks for additional Entropy from host computer @@ -290,15 +291,15 @@ message EntropyAck { // // Response: TxRequest, PinMatrixRequest, Failure message SignTx { - required uint32 outputs_count = 3; // Count of outputs of the transaction - required uint32 inputs_count = 5; // Count of inputs of the transaction + required uint32 outputs_count = 3; // Count of outputs of the transaction + required uint32 inputs_count = 5; // Count of inputs of the transaction } // Request a simplified workflow of signing. // This method doesn't support streaming, // so there may be hardware limits // in number of inputs and outputs. -// +// // This simplified workflow should not be used // in production, it is designed mainly for debug purposes. // @@ -307,42 +308,42 @@ message SignTx { // // Response: Success, PinMatrixRequest, Failure message SimpleSignTx { - repeated TxInput inputs = 1; - repeated TxOutput outputs = 2; + repeated TxInput inputs = 1; + repeated TxOutput outputs = 2; } // Sent by the device as a response for SignTx. Device asks for information for signing transaction. // If request_index is set, device asks for TxInput/TxOutput message (depends on request_type) // with details of index's input. -// If signed_index is set, 'signature' contains signed input of signed_index's input. +// If signed_index is set, 'signature' contains signed input of signed_index's input. message TxRequest { - optional int32 request_index = 1; // If >=0, device expects TxInput/TxOutput message from the computer - optional RequestType request_type = 2; // Ask for TxInput or TxOutput? - optional int32 signed_index = 3; // If >=0, 'signature' contains signed input of this input + optional int32 request_index = 1; // If >=0, device expects TxInput/TxOutput message from the computer + optional RequestType request_type = 2; // Ask for TxInput or TxOutput? + optional int32 signed_index = 3; // If >=0, 'signature' contains signed input of this input optional bytes signature = 4 [(binary) = true]; // If signed_index>=0, represent signature of the signed_index input - optional bytes serialized_tx = 5 [(binary) = true]; // Part of serialized and signed transaction + optional bytes serialized_tx = 5 [(binary) = true]; // Part of serialized and signed transaction } // Transaction onput for SignTx workflow. It is response to TxRequest message sent by device. // // Response: TxRequest, Failure message TxInput { - required uint32 index = 1; // Position of input in proposed transaction - repeated uint32 address_n = 2; // Parameter for address generation algorithm to derive the address from the master public key - required uint64 amount = 3; // Amount to spend in satoshis. The rest will be used for transaction fees - required bytes prev_hash = 4 [(binary) = true]; // Hash of previous transaction output to spend by this input - required uint32 prev_index = 5; // Index of previous output to spend - optional bytes script_sig = 6 [(binary) = true]; // Script signature + required uint32 index = 1; // Position of input in proposed transaction + repeated uint32 address_n = 2; // Parameter for address generation algorithm to derive the address from the master public key + required uint64 amount = 3; // Amount to spend in satoshis. The rest will be used for transaction fees + required bytes prev_hash = 4 [(binary) = true]; // Hash of previous transaction output to spend by this input + required uint32 prev_index = 5; // Index of previous output to spend + optional bytes script_sig = 6 [(binary) = true]; // Script signature } // Transaction output for SignTx workflow. It is response to TxRequest message sent by the device. message TxOutput { - required uint32 index = 1; // Position of output in proposed transaction - required bytes address = 2; // Target bitcoin address in base58 encoding - repeated uint32 address_n = 3; // Has higher priority than "address". If the output is to myself, specify parameter for address generation algorithm. - required uint64 amount = 4; // Amount to send in satoshis - required ScriptType script_type = 5;// Select output script type - repeated bytes script_args = 6 [(binary) = true]; // Provide additional parameters for the script (its script-depended) + required uint32 index = 1; // Position of output in proposed transaction + required bytes address = 2; // Target bitcoin address in base58 encoding + repeated uint32 address_n = 3; // Has higher priority than "address". If the output is to myself, specify parameter for address generation algorithm. + required uint64 amount = 4; // Amount to send in satoshis + required ScriptType script_type = 5; // Select output script type + repeated bytes script_args = 6 [(binary) = true]; // Provide additional parameters for the script (its script-depended) } // **************************************************************************** @@ -354,7 +355,7 @@ message FirmwareErase { } message FirmwareUpload { - required bytes payload = 1 [(binary) = true]; // Firmware to flash into device + required bytes payload = 1 [(binary) = true]; // Firmware to flash into device } // **************************************************************************** @@ -367,7 +368,7 @@ message FirmwareUpload { // // Response: Success message DebugLinkDecision { - required bool yes_no = 1; // True for "confirm", False for "cancel" + required bool yes_no = 1; // True for "confirm", False for "cancel" } // When sent over debug link connection, computer asks for some internal information of the device. @@ -383,10 +384,10 @@ message DebugLinkGetState { // Response object reflecting device's current state. It can be received only over debug link connection. message DebugLinkState { - optional bytes layout = 1 [(binary) = true]; // Raw buffer of display - optional bytes pin = 2; // Current PIN, blank if PIN is not set/enabled - optional bytes matrix = 3; // Current PIN matrix - optional bytes seed = 4; // Current seed (in mnemonic format) + optional bytes layout = 1 [(binary) = true]; // Raw buffer of display + optional bytes pin = 2; // Current PIN, blank if PIN is not set/enabled + optional bytes matrix = 3; // Current PIN matrix + optional bytes seed = 4; // Current seed (in mnemonic format) // optional bytes state = 5 [(binary) = true]; } From de5bcf6dc5fa46ed34cae51df792553d3161f7b6 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 29 Oct 2013 15:30:29 +0100 Subject: [PATCH 0123/1535] add wire_in/wire_out enum options to protobuf --- protob/trezor.proto | 87 +++++++++--------- trezorlib/trezor_pb2.py | 194 +++++++++++++++++++++++++++++++--------- 2 files changed, 196 insertions(+), 85 deletions(-) diff --git a/protob/trezor.proto b/protob/trezor.proto index 168d7182e..72481cd3e 100644 --- a/protob/trezor.proto +++ b/protob/trezor.proto @@ -8,57 +8,62 @@ import "google/protobuf/descriptor.proto"; +extend google.protobuf.FieldOptions { + optional bool binary = 50001; // message field has binary payload +} + +extend google.protobuf.EnumValueOptions { + optional bool wire_in = 50002; // message can be transmitted via wire from PC to TREZOR + optional bool wire_out = 50003; // message can be transmitted via wire from TREZOR to PC + optional bool wire_debug_in = 50004; // message can be transmitted via debug wire from PC to TREZOR + optional bool wire_debug_out = 50005; // message can be transmitted via debug wire from TREZOR to PC +} + /* Mapping between Trezor wire identifier (int) and protobuf message */ enum MessageType { - MessageType_Initialize = 0; - MessageType_Ping = 1; - MessageType_Success = 2; - MessageType_Failure = 3; - MessageType_ChangePin = 4; - MessageType_WipeDevice = 5; - MessageType_FirmwareErase = 6; - MessageType_FirmwareUpload = 7; - MessageType_GetEntropy = 9; - MessageType_Entropy = 10; - MessageType_GetMasterPublicKey = 11; - MessageType_MasterPublicKey = 12; - MessageType_LoadDevice = 13; - MessageType_ResetDevice = 14; - MessageType_SignTx = 15; - MessageType_SimpleSignTx = 16; - MessageType_Features = 17; - MessageType_PinMatrixRequest = 18; - MessageType_PinMatrixAck = 19; - MessageType_PinMatrixCancel = 20; - MessageType_TxRequest = 21; - MessageType_TxInput = 23; - MessageType_TxOutput = 24; - MessageType_ApplySettings = 25; - MessageType_ButtonRequest = 26; - MessageType_ButtonAck = 27; - MessageType_ButtonCancel = 28; - MessageType_GetAddress = 29; - MessageType_Address = 30; + MessageType_Initialize = 0 [(wire_in) = true]; + MessageType_Ping = 1 [(wire_in) = true]; + MessageType_Success = 2 [(wire_out) = true]; + MessageType_Failure = 3 [(wire_out) = true]; + MessageType_ChangePin = 4 [(wire_in) = true]; + MessageType_WipeDevice = 5 [(wire_in) = true]; + MessageType_FirmwareErase = 6 [(wire_in) = true]; + MessageType_FirmwareUpload = 7 [(wire_in) = true]; + MessageType_GetEntropy = 9 [(wire_in) = true]; + MessageType_Entropy = 10 [(wire_out) = true]; + MessageType_GetMasterPublicKey = 11 [(wire_in) = true]; + MessageType_MasterPublicKey = 12 [(wire_out) = true]; + MessageType_LoadDevice = 13 [(wire_in) = true]; + MessageType_ResetDevice = 14 [(wire_in) = true]; + MessageType_SignTx = 15 [(wire_in) = true]; + MessageType_SimpleSignTx = 16 [(wire_in) = true]; + MessageType_Features = 17 [(wire_out) = true]; + MessageType_PinMatrixRequest = 18 [(wire_out) = true]; + MessageType_PinMatrixAck = 19 [(wire_in) = true]; + MessageType_PinMatrixCancel = 20 [(wire_in) = true]; + MessageType_TxRequest = 21 [(wire_out) = true]; + MessageType_TxInput = 23 [(wire_in) = true]; + MessageType_TxOutput = 24 [(wire_in) = true]; + MessageType_ApplySettings = 25 [(wire_in) = true]; + MessageType_ButtonRequest = 26 [(wire_out) = true]; + MessageType_ButtonAck = 27 [(wire_in) = true]; + MessageType_ButtonCancel = 28 [(wire_in) = true]; + MessageType_GetAddress = 29 [(wire_in) = true]; + MessageType_Address = 30 [(wire_out) = true]; MessageType_SettingsType = 31; MessageType_XprvType = 32; MessageType_CoinType = 33; MessageType_XpubType = 34; - MessageType_EntropyRequest = 35; - MessageType_EntropyAck = 36; - MessageType_DebugLinkDecision = 100; - MessageType_DebugLinkGetState = 101; - MessageType_DebugLinkState = 102; - MessageType_DebugLinkStop = 103; + MessageType_EntropyRequest = 35 [(wire_out) = true]; + MessageType_EntropyAck = 36 [(wire_in) = true]; + MessageType_DebugLinkDecision = 100 [(wire_debug_in) = true]; + MessageType_DebugLinkGetState = 101 [(wire_debug_in) = true]; + MessageType_DebugLinkState = 102 [(wire_debug_out) = true]; + MessageType_DebugLinkStop = 103 [(wire_debug_in) = true]; } -// Such option indicates that the message field has binary payload -extend google.protobuf.FieldOptions { - optional bool binary = 50001; -} - - // **************************************************************************** // // Definition of custom field types diff --git a/trezorlib/trezor_pb2.py b/trezorlib/trezor_pb2.py index 8655b6d9d..3bb15fc7c 100644 --- a/trezorlib/trezor_pb2.py +++ b/trezorlib/trezor_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='trezor.proto', package='', - serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xf2\x08\n\x0bMessageType\x12\x1a\n\x16MessageType_Initialize\x10\x00\x12\x14\n\x10MessageType_Ping\x10\x01\x12\x17\n\x13MessageType_Success\x10\x02\x12\x17\n\x13MessageType_Failure\x10\x03\x12\x19\n\x15MessageType_ChangePin\x10\x04\x12\x1a\n\x16MessageType_WipeDevice\x10\x05\x12\x1d\n\x19MessageType_FirmwareErase\x10\x06\x12\x1e\n\x1aMessageType_FirmwareUpload\x10\x07\x12\x1a\n\x16MessageType_GetEntropy\x10\t\x12\x17\n\x13MessageType_Entropy\x10\n\x12\"\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x12\x1f\n\x1bMessageType_MasterPublicKey\x10\x0c\x12\x1a\n\x16MessageType_LoadDevice\x10\r\x12\x1b\n\x17MessageType_ResetDevice\x10\x0e\x12\x16\n\x12MessageType_SignTx\x10\x0f\x12\x1c\n\x18MessageType_SimpleSignTx\x10\x10\x12\x18\n\x14MessageType_Features\x10\x11\x12 \n\x1cMessageType_PinMatrixRequest\x10\x12\x12\x1c\n\x18MessageType_PinMatrixAck\x10\x13\x12\x1f\n\x1bMessageType_PinMatrixCancel\x10\x14\x12\x19\n\x15MessageType_TxRequest\x10\x15\x12\x17\n\x13MessageType_TxInput\x10\x17\x12\x18\n\x14MessageType_TxOutput\x10\x18\x12\x1d\n\x19MessageType_ApplySettings\x10\x19\x12\x1d\n\x19MessageType_ButtonRequest\x10\x1a\x12\x19\n\x15MessageType_ButtonAck\x10\x1b\x12\x1c\n\x18MessageType_ButtonCancel\x10\x1c\x12\x1a\n\x16MessageType_GetAddress\x10\x1d\x12\x17\n\x13MessageType_Address\x10\x1e\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12\x1e\n\x1aMessageType_EntropyRequest\x10#\x12\x1a\n\x16MessageType_EntropyAck\x10$\x12!\n\x1dMessageType_DebugLinkDecision\x10\x64\x12!\n\x1dMessageType_DebugLinkGetState\x10\x65\x12\x1e\n\x1aMessageType_DebugLinkState\x10\x66\x12\x1d\n\x19MessageType_DebugLinkStop\x10g*\xe4\x01\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08') + serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xc4\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12(\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12%\n\x1bMessageType_MasterPublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12%\n\x1bMessageType_PinMatrixCancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ButtonCancel\x10\x1c\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01*\xe4\x01\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -25,119 +25,119 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( values=[ _descriptor.EnumValueDescriptor( name='MessageType_Initialize', index=0, number=0, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_Ping', index=1, number=1, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_Success', index=2, number=2, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_Failure', index=3, number=3, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_ChangePin', index=4, number=4, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_WipeDevice', index=5, number=5, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_FirmwareErase', index=6, number=6, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_FirmwareUpload', index=7, number=7, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_GetEntropy', index=8, number=9, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_Entropy', index=9, number=10, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_GetMasterPublicKey', index=10, number=11, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_MasterPublicKey', index=11, number=12, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_LoadDevice', index=12, number=13, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_ResetDevice', index=13, number=14, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_SignTx', index=14, number=15, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_SimpleSignTx', index=15, number=16, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_Features', index=16, number=17, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_PinMatrixRequest', index=17, number=18, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_PinMatrixAck', index=18, number=19, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_PinMatrixCancel', index=19, number=20, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_TxRequest', index=20, number=21, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_TxInput', index=21, number=23, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_TxOutput', index=22, number=24, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_ApplySettings', index=23, number=25, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_ButtonRequest', index=24, number=26, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_ButtonAck', index=25, number=27, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_ButtonCancel', index=26, number=28, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_GetAddress', index=27, number=29, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_Address', index=28, number=30, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_SettingsType', index=29, number=31, @@ -157,33 +157,33 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( type=None), _descriptor.EnumValueDescriptor( name='MessageType_EntropyRequest', index=33, number=35, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_EntropyAck', index=34, number=36, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_DebugLinkDecision', index=35, number=100, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_DebugLinkGetState', index=36, number=101, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_DebugLinkState', index=37, number=102, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_DebugLinkStop', index=38, number=103, - options=None, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), ], containing_type=None, options=None, serialized_start=2266, - serialized_end=3404, + serialized_end=3614, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -228,8 +228,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3407, - serialized_end=3635, + serialized_start=3617, + serialized_end=3845, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -250,8 +250,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3637, - serialized_end=3688, + serialized_start=3847, + serialized_end=3898, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -272,8 +272,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3690, - serialized_end=3730, + serialized_start=3900, + serialized_end=3940, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -337,6 +337,38 @@ binary = _descriptor.FieldDescriptor( message_type=None, enum_type=None, containing_type=None, is_extension=True, extension_scope=None, options=None) +WIRE_IN_FIELD_NUMBER = 50002 +wire_in = _descriptor.FieldDescriptor( + name='wire_in', full_name='wire_in', index=1, + number=50002, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +WIRE_OUT_FIELD_NUMBER = 50003 +wire_out = _descriptor.FieldDescriptor( + name='wire_out', full_name='wire_out', index=2, + number=50003, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +WIRE_DEBUG_IN_FIELD_NUMBER = 50004 +wire_debug_in = _descriptor.FieldDescriptor( + name='wire_debug_in', full_name='wire_debug_in', index=3, + number=50004, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +WIRE_DEBUG_OUT_FIELD_NUMBER = 50005 +wire_debug_out = _descriptor.FieldDescriptor( + name='wire_debug_out', full_name='wire_debug_out', index=4, + number=50005, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) _XPRVTYPE = _descriptor.Descriptor( @@ -1994,7 +2026,81 @@ class DebugLinkStop(_message.Message): # @@protoc_insertion_point(class_scope:DebugLinkStop) google.protobuf.descriptor_pb2.FieldOptions.RegisterExtension(binary) - +google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_in) +google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_out) +google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_in) +google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_out) + +_MESSAGETYPE.values_by_name["MessageType_Initialize"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_Initialize"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_Ping"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_Ping"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_Success"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_Success"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_Failure"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_Failure"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_ChangePin"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_ChangePin"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_WipeDevice"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_WipeDevice"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_FirmwareErase"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_FirmwareErase"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_FirmwareUpload"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_FirmwareUpload"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_GetEntropy"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_GetEntropy"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_Entropy"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_Entropy"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_GetMasterPublicKey"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_GetMasterPublicKey"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_MasterPublicKey"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_MasterPublicKey"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_LoadDevice"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_LoadDevice"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_ResetDevice"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_ResetDevice"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_SignTx"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_SignTx"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_SimpleSignTx"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_SimpleSignTx"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_Features"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_Features"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_PinMatrixRequest"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_PinMatrixRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_PinMatrixAck"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_PinMatrixAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_PinMatrixCancel"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_PinMatrixCancel"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_TxRequest"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_TxRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_TxInput"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_TxInput"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_TxOutput"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_TxOutput"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_ApplySettings"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_ApplySettings"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_ButtonRequest"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_ButtonRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_ButtonAck"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_ButtonAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_ButtonCancel"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_ButtonCancel"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_GetAddress"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_GetAddress"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_Address"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_Address"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_EntropyRequest"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_EntropyRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_EntropyAck"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_EntropyAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_DebugLinkDecision"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_DebugLinkDecision"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_DebugLinkGetState"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_DebugLinkGetState"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_DebugLinkState"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_DebugLinkState"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_DebugLinkStop"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_DebugLinkStop"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001') _XPRVTYPE.fields_by_name['chain_code'].has_options = True _XPRVTYPE.fields_by_name['chain_code']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _XPRVTYPE.fields_by_name['private_key'].has_options = True From 039bcee3f25975961c54eadc2c68832ab27edb91 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 1 Nov 2013 18:13:53 +0100 Subject: [PATCH 0124/1535] udev rules --- trezor-udev.rules | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 trezor-udev.rules diff --git a/trezor-udev.rules b/trezor-udev.rules new file mode 100644 index 000000000..deec1ad34 --- /dev/null +++ b/trezor-udev.rules @@ -0,0 +1,9 @@ +############################################################################### +# TREZOR hardware bitcoin wallet +# http://www.bitcointrezor.com + +# TREZOR +ATTRS{idVendor}=="534c", ATTRS{idProduct}=="0001", MODE="0666", GROUP="dialout" + +# TREZOR RPi Shield +ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea80", MODE="0666", GROUP="dialout" From e2c44d8d6524994feaff25bafef08eaa37a53394 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 13 Nov 2013 19:38:13 +0100 Subject: [PATCH 0125/1535] update udev rules --- trezor-udev.rules | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/trezor-udev.rules b/trezor-udev.rules index deec1ad34..555565ae4 100644 --- a/trezor-udev.rules +++ b/trezor-udev.rules @@ -1,9 +1,8 @@ -############################################################################### -# TREZOR hardware bitcoin wallet -# http://www.bitcointrezor.com +# TREZOR: The Hardware Bitcoin Wallet +# http://bitcointrezor.com/ # TREZOR -ATTRS{idVendor}=="534c", ATTRS{idProduct}=="0001", MODE="0666", GROUP="dialout" +SUBSYSTEM=="usb", ATTR{idVendor}=="534c", ATTR{idProduct}=="0001", MODE="0666", GROUP="dialout", SYMLINK+="trezor%n" -# TREZOR RPi Shield -ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea80", MODE="0666", GROUP="dialout" +# TREZOR Raspberry Pi Shield +SUBSYSTEM=="usb", ATTR{idVendor}=="10c4", ATTR{idProduct}=="ea80", MODE="0666", GROUP="dialout", SYMLINK+="trezor%n" From 12afba83855bac4381f92b95a06b395b134ff7da Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 15 Nov 2013 01:43:05 +0100 Subject: [PATCH 0126/1535] Support for HID debug_link --- cmd.py | 40 ++++++++++++++++++++++++++------------ trezorlib/transport_hid.py | 18 +++++++++-------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/cmd.py b/cmd.py index b9dc23c33..3e1bf2ca0 100755 --- a/cmd.py +++ b/cmd.py @@ -14,8 +14,8 @@ def parse_args(commands): parser = argparse.ArgumentParser(description='Commandline tool for Trezor devices.') parser.add_argument('-t', '--transport', dest='transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Transport used for talking with the device") parser.add_argument('-p', '--path', dest='path', default='', help="Path used by the transport (usually serial port)") - parser.add_argument('-dt', '--debuglink-transport', dest='debuglink_transport', choices=['usb', 'serial', 'pipe', 'socket'], default='socket', help="Debuglink transport") - parser.add_argument('-dp', '--debuglink-path', dest='debuglink_path', default='127.0.0.1:2000', help="Path used by the transport (usually serial port)") + parser.add_argument('-dt', '--debuglink-transport', dest='debuglink_transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Debuglink transport") + parser.add_argument('-dp', '--debuglink-path', dest='debuglink_path', default='', help="Path used by the transport (usually serial port)") parser.add_argument('-j', '--json', dest='json', action='store_true', help="Prints result as json object") parser.add_argument('-d', '--debug', dest='debug', action='store_true', help='Enable low-level debugging') @@ -42,7 +42,7 @@ def parse_args(commands): return parser.parse_args() -def get_transport(transport_string, path): +def get_transport(transport_string, path, **kwargs): if transport_string == 'usb': from trezorlib.transport_hid import HidTransport @@ -52,23 +52,23 @@ def get_transport(transport_string, path): except IndexError: raise Exception("No Trezor found on USB") - return HidTransport(path) + return HidTransport(path, **kwargs) if transport_string == 'serial': from trezorlib.transport_serial import SerialTransport - return SerialTransport(path) + return SerialTransport(path, **kwargs) if transport_string == 'pipe': from trezorlib.transport_pipe import PipeTransport - return PipeTransport(path, is_device=False) + return PipeTransport(path, is_device=False, **kwargs) if transport_string == 'socket': from trezorlib.transport_socket import SocketTransportClient - return SocketTransportClient(path) + return SocketTransportClient(path, **kwargs) if transport_string == 'fake': from trezorlib.transport_fake import FakeTransport - return FakeTransport(path) + return FakeTransport(path, **kwargs) raise NotImplemented("Unknown transport") @@ -96,8 +96,8 @@ class Commands(object): def ping(self, args): return self.client.ping(args.msg) - def get_master_public_key(self, args): - return self.client.get_master_public_key() + def get_public_node(self, args): + return self.client.get_public_node(args.n) def get_serial_number(self, args): return binascii.hexlify(self.client.get_serial_number()) @@ -113,6 +113,9 @@ class Commands(object): return self.client.load_device(seed, args.pin) + def sign_message(self, args): + return self.client.sign_message(args.n, args.message) + def firmware_update(self, args): if not args.file: raise Exception("Must provide firmware filename") @@ -129,10 +132,11 @@ class Commands(object): get_entropy.help = 'Get example entropy' get_features.help = 'Retrieve device features and settings' get_serial_number.help = 'Get device\'s unique identifier' - get_master_public_key.help = 'Get master public key' + get_public_node.help = 'Get public node of given path' set_label.help = 'Set new wallet label' set_coin.help = 'Switch device to another crypto currency' load_device.help = 'Load custom configuration to the device' + sign_message.help = 'Sign message using address of given path' firmware_update.help = 'Upload new firmware to device (must be in bootloader mode)' get_address.arguments = ( @@ -162,6 +166,15 @@ class Commands(object): (('-n', '--pin'), {'type': str, 'default': ''}), ) + sign_message.arguments = ( + (('n',), {'metavar': 'N', 'type': int, 'nargs': '+'}), + (('message',), {'type': str}), + ) + + get_public_node.arguments = ( + (('n',), {'metavar': 'N', 'type': int, 'nargs': '+'}), + ) + firmware_update.arguments = ( (('-f', '--file'), {'type': str}), ) @@ -239,7 +252,10 @@ def main(): transport = get_transport(args.transport, args.path) if args.debug: - debuglink_transport = get_transport(args.debuglink_transport, args.debuglink_path) + if args.debuglink_transport == 'usb' and args.debuglink_path == '': + debuglink_transport = get_transport('usb', args.path, debug_link=True) + else: + debuglink_transport = get_transport(args.debuglink_transport, args.debuglink_path) debuglink = DebugLink(debuglink_transport) else: debuglink = None diff --git a/trezorlib/transport_hid.py b/trezorlib/transport_hid.py index 8b407bb54..f58b01ebd 100644 --- a/trezorlib/transport_hid.py +++ b/trezorlib/transport_hid.py @@ -5,8 +5,8 @@ import time from transport import Transport, NotImplementedException DEVICE_IDS = [ - (0x10c4, 0xea80), # Trezor Pi - (0x534c, 0x0001), # Trezor + (0x10c4, 0xea80), # Shield + (0x534c, 0x0001), # Trezor ] class FakeRead(object): @@ -21,6 +21,8 @@ class HidTransport(Transport): def __init__(self, device, *args, **kwargs): self.hid = None self.buffer = '' + if bool(kwargs.get('debug_link')): + device = device[:-2] + '01' super(HidTransport, self).__init__(device, *args, **kwargs) @classmethod @@ -29,18 +31,18 @@ class HidTransport(Transport): for d in hid.enumerate(0, 0): vendor_id = d.get('vendor_id') product_id = d.get('product_id') - serial_number = d.get('serial_number') - - if (vendor_id, product_id) in DEVICE_IDS: - devices.append("0x%04x:0x%04x:%s" % (vendor_id, product_id, serial_number)) + path = d.get('path') + + if (vendor_id, product_id) in DEVICE_IDS and path.endswith(':00'): + devices.append(path) return devices def _open(self): self.buffer = '' - path = self.device.split(':') + print self.device self.hid = hid.device() - self.hid.open(int(path[0], 16), int(path[1], 16)) + self.hid.open_path(self.device) self.hid.set_nonblocking(True) self.hid.send_feature_report([0x41, 0x01]) # enable UART self.hid.send_feature_report([0x43, 0x03]) # purge TX/RX FIFOs From 27206657438d1e463a3c6225608bbdd37b414eee Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 22 Nov 2013 17:33:33 +0100 Subject: [PATCH 0127/1535] use trezor-common submodule --- .gitmodules | 3 + build_pb.sh | 3 + protob/build.sh | 5 - protob/trezor.proto | 401 ------------------------------- trezor-common | 1 + trezor-udev.rules | 8 - trezorlib/__init__.py | 2 +- trezorlib/trezor_pb2.py | 517 +++++++++++++++++++++------------------- 8 files changed, 281 insertions(+), 659 deletions(-) create mode 100644 .gitmodules create mode 100755 build_pb.sh delete mode 100755 protob/build.sh delete mode 100644 protob/trezor.proto create mode 160000 trezor-common delete mode 100644 trezor-udev.rules diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..d22c9dbfa --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "trezor-common"] + path = trezor-common + url = https://github.com/trezor/trezor-common.git diff --git a/build_pb.sh b/build_pb.sh new file mode 100755 index 000000000..53461d5d7 --- /dev/null +++ b/build_pb.sh @@ -0,0 +1,3 @@ +#!/bin/bash +cd ./trezor-common/protob +protoc --python_out=../../trezorlib/ -I/usr/include -I. -I. trezor.proto diff --git a/protob/build.sh b/protob/build.sh deleted file mode 100755 index e9d9bdfbb..000000000 --- a/protob/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -cd `dirname $0` - -protoc --python_out=../trezorlib/ -I/usr/include -I. trezor.proto diff --git a/protob/trezor.proto b/protob/trezor.proto deleted file mode 100644 index 72481cd3e..000000000 --- a/protob/trezor.proto +++ /dev/null @@ -1,401 +0,0 @@ -/* - Messages for TREZOR communication - - Author: Marek Palatinus - - Version: 0.5 -*/ - -import "google/protobuf/descriptor.proto"; - -extend google.protobuf.FieldOptions { - optional bool binary = 50001; // message field has binary payload -} - -extend google.protobuf.EnumValueOptions { - optional bool wire_in = 50002; // message can be transmitted via wire from PC to TREZOR - optional bool wire_out = 50003; // message can be transmitted via wire from TREZOR to PC - optional bool wire_debug_in = 50004; // message can be transmitted via debug wire from PC to TREZOR - optional bool wire_debug_out = 50005; // message can be transmitted via debug wire from TREZOR to PC -} - -/* - Mapping between Trezor wire identifier (int) and protobuf message -*/ -enum MessageType { - MessageType_Initialize = 0 [(wire_in) = true]; - MessageType_Ping = 1 [(wire_in) = true]; - MessageType_Success = 2 [(wire_out) = true]; - MessageType_Failure = 3 [(wire_out) = true]; - MessageType_ChangePin = 4 [(wire_in) = true]; - MessageType_WipeDevice = 5 [(wire_in) = true]; - MessageType_FirmwareErase = 6 [(wire_in) = true]; - MessageType_FirmwareUpload = 7 [(wire_in) = true]; - MessageType_GetEntropy = 9 [(wire_in) = true]; - MessageType_Entropy = 10 [(wire_out) = true]; - MessageType_GetMasterPublicKey = 11 [(wire_in) = true]; - MessageType_MasterPublicKey = 12 [(wire_out) = true]; - MessageType_LoadDevice = 13 [(wire_in) = true]; - MessageType_ResetDevice = 14 [(wire_in) = true]; - MessageType_SignTx = 15 [(wire_in) = true]; - MessageType_SimpleSignTx = 16 [(wire_in) = true]; - MessageType_Features = 17 [(wire_out) = true]; - MessageType_PinMatrixRequest = 18 [(wire_out) = true]; - MessageType_PinMatrixAck = 19 [(wire_in) = true]; - MessageType_PinMatrixCancel = 20 [(wire_in) = true]; - MessageType_TxRequest = 21 [(wire_out) = true]; - MessageType_TxInput = 23 [(wire_in) = true]; - MessageType_TxOutput = 24 [(wire_in) = true]; - MessageType_ApplySettings = 25 [(wire_in) = true]; - MessageType_ButtonRequest = 26 [(wire_out) = true]; - MessageType_ButtonAck = 27 [(wire_in) = true]; - MessageType_ButtonCancel = 28 [(wire_in) = true]; - MessageType_GetAddress = 29 [(wire_in) = true]; - MessageType_Address = 30 [(wire_out) = true]; - MessageType_SettingsType = 31; - MessageType_XprvType = 32; - MessageType_CoinType = 33; - MessageType_XpubType = 34; - MessageType_EntropyRequest = 35 [(wire_out) = true]; - MessageType_EntropyAck = 36 [(wire_in) = true]; - MessageType_DebugLinkDecision = 100 [(wire_debug_in) = true]; - MessageType_DebugLinkGetState = 101 [(wire_debug_in) = true]; - MessageType_DebugLinkState = 102 [(wire_debug_out) = true]; - MessageType_DebugLinkStop = 103 [(wire_debug_in) = true]; -} - -// **************************************************************************** -// -// Definition of custom field types -// - -enum FailureType { - Failure_UnexpectedMessage = 1; - Failure_ButtonExpected = 2; - Failure_SyntaxError = 3; - Failure_ActionCancelled = 4; - Failure_PinExpected = 5; - Failure_PinCancelled = 6; - Failure_PinInvalid = 7; - Failure_FirmwareError = 99; -} - -// Specifies which script will be used for given transaction output. -enum ScriptType { - PAYTOADDRESS = 0; - PAYTOSCRIPTHASH = 1; -} - -// Specifies which kind of information is required by transaction signing process -enum RequestType { - TXINPUT = 0; - TXOUTPUT = 1; -} - -// Structure for BIP32-encoded node -// Used for imports into the device -message XprvType { - required uint32 version = 1; - required uint32 depth = 2; - required uint32 fingerprint = 3; - required uint32 child_num = 4; - required bytes chain_code = 5 [(binary) = true]; - required bytes private_key = 6 [(binary) = true]; -} - -// Structure returned by GetMasterPublicKey -message XpubType { - required uint32 version = 1; - required uint32 depth = 2; - required uint32 fingerprint = 3; - required uint32 child_num = 4; - required bytes chain_code = 5 [(binary) = true]; - required bytes public_key = 6 [(binary) = true]; -} - -message CoinType { - optional bytes coin_name = 1; - optional bytes coin_shortcut = 2; - optional uint32 address_type = 3; - optional uint64 maxfee_kb = 4; -} - -message SettingsType { - optional bytes language = 1; // Trezor uses 'english' as default - optional CoinType coin = 2; - optional bytes label = 3; // Human readable wallet name -} - -// **************************************************************************** -// -// Basic message -// - -// Reset device to default state and ask for device details -// -// Response: Features -message Initialize { -} - -// Response object for Initialize. -message Features { - optional bytes vendor = 1; // Name of the manufacturer, e.g. "bitcointrezor.com" - optional uint32 major_version = 2; // Major version of the device, e.g. 1 - optional uint32 minor_version = 3; // Minor version of the device, e.g. 0 - optional uint32 bugfix_version = 4; - optional bool bootloader_mode = 5; - optional SettingsType settings = 6; // User-level settings of the device - optional bytes device_id = 7 [(binary) = true]; // Device's unique identifier - optional bytes mpk_hash = 8 [(binary) = true]; // Hash of master public key (sha256(XpubType.public_key).digest()) - optional bool pin_protection = 9; // True if Trezor is covered by PIN -} - -// Overwrites only filled fields of the structure -message ApplySettings { - optional bytes language = 1; - optional bytes coin_shortcut = 2; - optional bytes label = 3; -} - -// Starts workflow for setting/changing the PIN -// Response: ButtonRequest, PinMatrixRequest -message ChangePin { - optional bool remove = 1; // Set True if want to remove PIN protection -} - -// Test if device is live, device will send back the message on success -// -// Response: None or Success -message Ping { - optional bytes message = 1; // Message will be sent back in Success message -} - -// Response object defining success of the previous request -message Success { - optional bytes message = 1; // May contain human readable description of the action or request-specific payload -} - -// Response object defining failure of the previous request -message Failure { - optional FailureType code = 1; // May contain computer-readable definition of the error state - optional bytes message = 2; // May contain human-readable message of the error state -} - -// Message can be sent by the *device* as a resopnse to any request. -// Device is waiting for HW button press. No action is required from computer -// Computer should respond with ButtonAck message or ButtonCancel to cancel -// the original request. -message ButtonRequest { -} - -// Computer agrees to wait for HW button press. -message ButtonAck { -} - -// Computer want to cancel current action (don't wait to HW button press) -message ButtonCancel { -} - -// Message can be sent by the *device* as a response to any request. -// Message asks computer to send back PinMatrixAck with the password encoded in pin matrix scheme. -// -// Response: PinMatrixAck, PinMatrixCancel -message PinMatrixRequest { - optional bytes message = 1; // Human readable message -} - -// Message is sent by the computer as a response to PinMatrixRequest previously sent by the device. -message PinMatrixAck { - required bytes pin = 1; // User must write down the password for accessing the device. -} - -// Message is sent as a response to PinMatrixRequest by the computer, asking the device to cancel -// pending action and reset to the default state. -message PinMatrixCancel { -} - -// Request a sample of random data generated by hardware RNG. May be used -// for tests of internal RNG. -// -// Response: PinMatrixRequest, Entropy, Failure -message GetEntropy { - required uint32 size = 1; // Size of randomly generated buffer -} - -// Response to GetEntropy request contains random data generated by internal HRNG. -message Entropy { - required bytes entropy = 1 [(binary) = true]; // Stream of generated bytes -} - -// Ask device for it's current master public key. This may be used for generating -// public keys on the computer independently to the device. API doesn't provide -// any other way how to get bitcoin addresses from the device. -// -// Response: MasterPublicKey, Failure -message GetMasterPublicKey { -} - -// Contains master public key derived from device's seed. -message MasterPublicKey { - required XpubType mpk = 1; // BIP32 node public key + chaincode -} - -message GetAddress { - repeated uint32 address_n = 1; // Parameter for address generation algorithm to derive the address from the master public key -} - -message Address { - required bytes address = 1; // Bitcoin address in base58 encoding corresponding to GetAddress(n) call -} - -// Request device to wipe all sensitive data and settings. -// Device will be turned to uninitialized state. -// -// Response: ButtonRequest -message WipeDevice { -} - -// Load seed and related internal settings from computer to the device. Existing seed is overwritten. -// -// Response: Success, ButtonRequest, PinMatrixRequest, Failure -message LoadDevice { - optional bytes seed = 1; // Seed encoded as a mnemonic (12 english words) - optional XprvType xprv = 2; - optional bytes pin = 3; // Set PIN protection for important actions -} - -// Request device to do full-reset, to generate new seed -// and ask user for new settings (PIN). -// Workflow is splitted into ResetDevice/EntropyRequest to be sure -// that entropy provided by device isn't calculated on base of computer provided -// entropy. -// -// -// Response: EntropyRequest, PinMatrixRequest, Failure -message ResetDevice { - optional bool display_random = 1; // If set, displays entropy generated by the device used - // for generating the seed *before* asking - // for additional entropy from computer -} - -// Asks for additional Entropy from host computer -message EntropyRequest { -} - -// Provide additional entropy for seed generation function. -message EntropyAck { - optional bytes entropy = 1 [(binary) = true]; // Recommended to provide 256 bytes of random data. -} - -// **************************************************************************** -// -// Messages related to transaction signing -// - -// Request the device to sign the transaction -// -// Response: TxRequest, PinMatrixRequest, Failure -message SignTx { - required uint32 outputs_count = 3; // Count of outputs of the transaction - required uint32 inputs_count = 5; // Count of inputs of the transaction -} - -// Request a simplified workflow of signing. -// This method doesn't support streaming, -// so there may be hardware limits -// in number of inputs and outputs. -// -// This simplified workflow should not be used -// in production, it is designed mainly for debug purposes. -// -// When everything is fine, Success.message contains -// serialized transaction. -// -// Response: Success, PinMatrixRequest, Failure -message SimpleSignTx { - repeated TxInput inputs = 1; - repeated TxOutput outputs = 2; -} - -// Sent by the device as a response for SignTx. Device asks for information for signing transaction. -// If request_index is set, device asks for TxInput/TxOutput message (depends on request_type) -// with details of index's input. -// If signed_index is set, 'signature' contains signed input of signed_index's input. -message TxRequest { - optional int32 request_index = 1; // If >=0, device expects TxInput/TxOutput message from the computer - optional RequestType request_type = 2; // Ask for TxInput or TxOutput? - optional int32 signed_index = 3; // If >=0, 'signature' contains signed input of this input - optional bytes signature = 4 [(binary) = true]; // If signed_index>=0, represent signature of the signed_index input - optional bytes serialized_tx = 5 [(binary) = true]; // Part of serialized and signed transaction -} - -// Transaction onput for SignTx workflow. It is response to TxRequest message sent by device. -// -// Response: TxRequest, Failure -message TxInput { - required uint32 index = 1; // Position of input in proposed transaction - repeated uint32 address_n = 2; // Parameter for address generation algorithm to derive the address from the master public key - required uint64 amount = 3; // Amount to spend in satoshis. The rest will be used for transaction fees - required bytes prev_hash = 4 [(binary) = true]; // Hash of previous transaction output to spend by this input - required uint32 prev_index = 5; // Index of previous output to spend - optional bytes script_sig = 6 [(binary) = true]; // Script signature -} - -// Transaction output for SignTx workflow. It is response to TxRequest message sent by the device. -message TxOutput { - required uint32 index = 1; // Position of output in proposed transaction - required bytes address = 2; // Target bitcoin address in base58 encoding - repeated uint32 address_n = 3; // Has higher priority than "address". If the output is to myself, specify parameter for address generation algorithm. - required uint64 amount = 4; // Amount to send in satoshis - required ScriptType script_type = 5; // Select output script type - repeated bytes script_args = 6 [(binary) = true]; // Provide additional parameters for the script (its script-depended) -} - -// **************************************************************************** -// -// Bootloader messages -// - -message FirmwareErase { -} - -message FirmwareUpload { - required bytes payload = 1 [(binary) = true]; // Firmware to flash into device -} - -// **************************************************************************** -// -// Debug* messages are used only on DebugLink interface (separated from USB HID) -// - -// Virtually "press" the button on the device. -// Message is available only on debugging connection and device must support "debug_link" feature. -// -// Response: Success -message DebugLinkDecision { - required bool yes_no = 1; // True for "confirm", False for "cancel" -} - -// When sent over debug link connection, computer asks for some internal information of the device. -// -// Response: DebugLinkState -message DebugLinkGetState { - optional bool layout = 1; // Request raw buffer of display - optional bool pin = 2; // Request current pin - optional bool matrix = 3; // Request current pin matrix - optional bool seed = 4; // Request current seed -// optional bool state = 5; -} - -// Response object reflecting device's current state. It can be received only over debug link connection. -message DebugLinkState { - optional bytes layout = 1 [(binary) = true]; // Raw buffer of display - optional bytes pin = 2; // Current PIN, blank if PIN is not set/enabled - optional bytes matrix = 3; // Current PIN matrix - optional bytes seed = 4; // Current seed (in mnemonic format) -// optional bytes state = 5 [(binary) = true]; -} - -// Ask device to shutdown/restart -message DebugLinkStop { -} diff --git a/trezor-common b/trezor-common new file mode 160000 index 000000000..fccebb724 --- /dev/null +++ b/trezor-common @@ -0,0 +1 @@ +Subproject commit fccebb724cc8446cb2040f5468a2e451463e38ab diff --git a/trezor-udev.rules b/trezor-udev.rules deleted file mode 100644 index 555565ae4..000000000 --- a/trezor-udev.rules +++ /dev/null @@ -1,8 +0,0 @@ -# TREZOR: The Hardware Bitcoin Wallet -# http://bitcointrezor.com/ - -# TREZOR -SUBSYSTEM=="usb", ATTR{idVendor}=="534c", ATTR{idProduct}=="0001", MODE="0666", GROUP="dialout", SYMLINK+="trezor%n" - -# TREZOR Raspberry Pi Shield -SUBSYSTEM=="usb", ATTR{idVendor}=="10c4", ATTR{idProduct}=="ea80", MODE="0666", GROUP="dialout", SYMLINK+="trezor%n" diff --git a/trezorlib/__init__.py b/trezorlib/__init__.py index a0c8359d4..c171386e3 100644 --- a/trezorlib/__init__.py +++ b/trezorlib/__init__.py @@ -1,6 +1,6 @@ try: import trezor_pb2 as proto except ImportError: - print "trezor_pb2.py not found. Please run /protobuf/build.sh to generate it!" + print "Source trezor_pb2.py not found. Make sure python-protobuf is installed and run build_pb.sh to generate it." import sys sys.exit() diff --git a/trezorlib/trezor_pb2.py b/trezorlib/trezor_pb2.py index 3bb15fc7c..50d269118 100644 --- a/trezorlib/trezor_pb2.py +++ b/trezorlib/trezor_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='trezor.proto', package='', - serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\x87\x01\n\x08XprvType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x86\x01\n\x08XpubType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x14\n\x12GetMasterPublicKey\")\n\x0fMasterPublicKey\x12\x16\n\x03mpk\x18\x01 \x02(\x0b\x32\t.XpubType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"@\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x17\n\x04xprv\x18\x02 \x01(\x0b\x32\t.XprvType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x82\x01\n\x07TxInput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12\x17\n\tprev_hash\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x05 \x02(\r\x12\x18\n\nscript_sig\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8a\x01\n\x08TxOutput\x12\r\n\x05index\x18\x01 \x02(\r\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x02(\x0c\x12\x11\n\taddress_n\x18\x03 \x03(\r\x12\x0e\n\x06\x61mount\x18\x04 \x02(\x04\x12 \n\x0bscript_type\x18\x05 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x06 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xc4\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12(\n\x1eMessageType_GetMasterPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12%\n\x1bMessageType_MasterPublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12%\n\x1bMessageType_PinMatrixCancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ButtonCancel\x10\x1c\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x18\n\x14MessageType_XprvType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12\x18\n\x14MessageType_XpubType\x10\"\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01*\xe4\x01\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08') + serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\xa3\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"%\n\tPublicKey\x12\x18\n\x03mpk\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"B\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x81\x01\n\x07TxInput\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"{\n\x08TxOutput\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"\xc0\x01\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x18\n\x06inputs\x18\x02 \x03(\x0b\x32\x08.TxInput\x12-\n\x07outputs\x18\x03 \x03(\x0b\x32\x1c.TransactionType.TxOutputBin\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30\x1a:\n\x0bTxOutputBin\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xc1\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12%\n\x1bMessageType_PinMatrixCancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ButtonCancel\x10\x1c\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x1a\n\x16MessageType_HDNodeType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x1bMessageType_TransactionType\x10%\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01*\xe4\x01\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -64,11 +64,11 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_GetMasterPublicKey', index=10, number=11, + name='MessageType_GetPublicKey', index=10, number=11, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_MasterPublicKey', index=11, number=12, + name='MessageType_PublicKey', index=11, number=12, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( @@ -144,7 +144,7 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_XprvType', index=30, number=32, + name='MessageType_HDNodeType', index=30, number=32, options=None, type=None), _descriptor.EnumValueDescriptor( @@ -152,17 +152,17 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=None, type=None), _descriptor.EnumValueDescriptor( - name='MessageType_XpubType', index=32, number=34, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='MessageType_EntropyRequest', index=33, number=35, + name='MessageType_EntropyRequest', index=32, number=35, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyAck', index=34, number=36, + name='MessageType_EntropyAck', index=33, number=36, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_TransactionType', index=34, number=37, + options=None, + type=None), _descriptor.EnumValueDescriptor( name='MessageType_DebugLinkDecision', index=35, number=100, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), @@ -182,8 +182,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2266, - serialized_end=3614, + serialized_start=2346, + serialized_end=3691, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -228,8 +228,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3617, - serialized_end=3845, + serialized_start=3694, + serialized_end=3922, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -250,8 +250,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3847, - serialized_end=3898, + serialized_start=3924, + serialized_end=3975, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -272,8 +272,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3900, - serialized_end=3940, + serialized_start=3977, + serialized_end=4017, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -287,8 +287,8 @@ MessageType_FirmwareErase = 6 MessageType_FirmwareUpload = 7 MessageType_GetEntropy = 9 MessageType_Entropy = 10 -MessageType_GetMasterPublicKey = 11 -MessageType_MasterPublicKey = 12 +MessageType_GetPublicKey = 11 +MessageType_PublicKey = 12 MessageType_LoadDevice = 13 MessageType_ResetDevice = 14 MessageType_SignTx = 15 @@ -307,11 +307,11 @@ MessageType_ButtonCancel = 28 MessageType_GetAddress = 29 MessageType_Address = 30 MessageType_SettingsType = 31 -MessageType_XprvType = 32 +MessageType_HDNodeType = 32 MessageType_CoinType = 33 -MessageType_XpubType = 34 MessageType_EntropyRequest = 35 MessageType_EntropyAck = 36 +MessageType_TransactionType = 37 MessageType_DebugLinkDecision = 100 MessageType_DebugLinkGetState = 101 MessageType_DebugLinkState = 102 @@ -371,114 +371,58 @@ wire_debug_out = _descriptor.FieldDescriptor( options=None) -_XPRVTYPE = _descriptor.Descriptor( - name='XprvType', - full_name='XprvType', +_HDNODETYPE = _descriptor.Descriptor( + name='HDNodeType', + full_name='HDNodeType', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='version', full_name='XprvType.version', index=0, + name='version', full_name='HDNodeType.version', index=0, number=1, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='depth', full_name='XprvType.depth', index=1, + name='depth', full_name='HDNodeType.depth', index=1, number=2, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='fingerprint', full_name='XprvType.fingerprint', index=2, + name='fingerprint', full_name='HDNodeType.fingerprint', index=2, number=3, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='child_num', full_name='XprvType.child_num', index=3, + name='child_num', full_name='HDNodeType.child_num', index=3, number=4, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='chain_code', full_name='XprvType.chain_code', index=4, + name='chain_code', full_name='HDNodeType.chain_code', index=4, number=5, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), _descriptor.FieldDescriptor( - name='private_key', full_name='XprvType.private_key', index=5, - number=6, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=51, - serialized_end=186, -) - - -_XPUBTYPE = _descriptor.Descriptor( - name='XpubType', - full_name='XpubType', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='version', full_name='XpubType.version', index=0, - number=1, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='depth', full_name='XpubType.depth', index=1, - number=2, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='fingerprint', full_name='XpubType.fingerprint', index=2, - number=3, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='child_num', full_name='XpubType.child_num', index=3, - number=4, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='chain_code', full_name='XpubType.chain_code', index=4, - number=5, type=12, cpp_type=9, label=2, + name='private_key', full_name='HDNodeType.private_key', index=5, + number=6, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), _descriptor.FieldDescriptor( - name='public_key', full_name='XpubType.public_key', index=5, - number=6, type=12, cpp_type=9, label=2, + name='public_key', full_name='HDNodeType.public_key', index=6, + number=7, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -492,8 +436,8 @@ _XPUBTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=189, - serialized_end=323, + serialized_start=51, + serialized_end=214, ) @@ -541,8 +485,8 @@ _COINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=325, - serialized_end=418, + serialized_start=216, + serialized_end=309, ) @@ -583,8 +527,8 @@ _SETTINGSTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=420, - serialized_end=492, + serialized_start=311, + serialized_end=383, ) @@ -604,8 +548,8 @@ _INITIALIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=494, - serialized_end=506, + serialized_start=385, + serialized_end=397, ) @@ -688,8 +632,8 @@ _FEATURES = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=509, - serialized_end=736, + serialized_start=400, + serialized_end=627, ) @@ -730,8 +674,8 @@ _APPLYSETTINGS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=738, - serialized_end=809, + serialized_start=629, + serialized_end=700, ) @@ -758,8 +702,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=811, - serialized_end=838, + serialized_start=702, + serialized_end=729, ) @@ -786,8 +730,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=840, - serialized_end=863, + serialized_start=731, + serialized_end=754, ) @@ -814,8 +758,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=865, - serialized_end=891, + serialized_start=756, + serialized_end=782, ) @@ -849,8 +793,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=893, - serialized_end=947, + serialized_start=784, + serialized_end=838, ) @@ -870,8 +814,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=949, - serialized_end=964, + serialized_start=840, + serialized_end=855, ) @@ -891,8 +835,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=966, - serialized_end=977, + serialized_start=857, + serialized_end=868, ) @@ -912,8 +856,8 @@ _BUTTONCANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=979, - serialized_end=993, + serialized_start=870, + serialized_end=884, ) @@ -940,8 +884,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=995, - serialized_end=1030, + serialized_start=886, + serialized_end=921, ) @@ -968,8 +912,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1032, - serialized_end=1059, + serialized_start=923, + serialized_end=950, ) @@ -989,8 +933,8 @@ _PINMATRIXCANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1061, - serialized_end=1078, + serialized_start=952, + serialized_end=969, ) @@ -1017,8 +961,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1080, - serialized_end=1106, + serialized_start=971, + serialized_end=997, ) @@ -1045,18 +989,25 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1108, - serialized_end=1140, + serialized_start=999, + serialized_end=1031, ) -_GETMASTERPUBLICKEY = _descriptor.Descriptor( - name='GetMasterPublicKey', - full_name='GetMasterPublicKey', +_GETPUBLICKEY = _descriptor.Descriptor( + name='GetPublicKey', + full_name='GetPublicKey', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ + _descriptor.FieldDescriptor( + name='address_n', full_name='GetPublicKey.address_n', index=0, + number=1, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -1066,20 +1017,20 @@ _GETMASTERPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1142, - serialized_end=1162, + serialized_start=1033, + serialized_end=1066, ) -_MASTERPUBLICKEY = _descriptor.Descriptor( - name='MasterPublicKey', - full_name='MasterPublicKey', +_PUBLICKEY = _descriptor.Descriptor( + name='PublicKey', + full_name='PublicKey', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='mpk', full_name='MasterPublicKey.mpk', index=0, + name='mpk', full_name='PublicKey.mpk', index=0, number=1, type=11, cpp_type=10, label=2, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -1094,8 +1045,8 @@ _MASTERPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1164, - serialized_end=1205, + serialized_start=1068, + serialized_end=1105, ) @@ -1122,8 +1073,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1207, - serialized_end=1238, + serialized_start=1107, + serialized_end=1138, ) @@ -1150,8 +1101,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1240, - serialized_end=1266, + serialized_start=1140, + serialized_end=1166, ) @@ -1171,8 +1122,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1268, - serialized_end=1280, + serialized_start=1168, + serialized_end=1180, ) @@ -1191,7 +1142,7 @@ _LOADDEVICE = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='xprv', full_name='LoadDevice.xprv', index=1, + name='node', full_name='LoadDevice.node', index=1, number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -1213,8 +1164,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1282, - serialized_end=1346, + serialized_start=1182, + serialized_end=1248, ) @@ -1241,8 +1192,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1348, - serialized_end=1385, + serialized_start=1250, + serialized_end=1287, ) @@ -1262,8 +1213,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1387, - serialized_end=1403, + serialized_start=1289, + serialized_end=1305, ) @@ -1290,8 +1241,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1405, - serialized_end=1440, + serialized_start=1307, + serialized_end=1342, ) @@ -1325,8 +1276,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1442, - serialized_end=1495, + serialized_start=1344, + serialized_end=1397, ) @@ -1360,8 +1311,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1497, - serialized_end=1565, + serialized_start=1399, + serialized_end=1467, ) @@ -1416,8 +1367,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1568, - serialized_end=1714, + serialized_start=1470, + serialized_end=1616, ) @@ -1429,47 +1380,40 @@ _TXINPUT = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='index', full_name='TxInput.index', index=0, - number=1, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, + name='address_n', full_name='TxInput.address_n', index=0, + number=1, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='address_n', full_name='TxInput.address_n', index=1, - number=2, type=13, cpp_type=3, label=3, - has_default_value=False, default_value=[], + name='prev_hash', full_name='TxInput.prev_hash', index=1, + number=2, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None), + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), _descriptor.FieldDescriptor( - name='amount', full_name='TxInput.amount', index=2, - number=3, type=4, cpp_type=4, label=2, + name='prev_index', full_name='TxInput.prev_index', index=2, + number=3, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='prev_hash', full_name='TxInput.prev_hash', index=3, - number=4, type=12, cpp_type=9, label=2, + name='script_sig', full_name='TxInput.script_sig', index=3, + number=4, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), _descriptor.FieldDescriptor( - name='prev_index', full_name='TxInput.prev_index', index=4, - number=5, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, + name='sequence', full_name='TxInput.sequence', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=4294967295, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - _descriptor.FieldDescriptor( - name='script_sig', full_name='TxInput.script_sig', index=5, - number=6, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), ], extensions=[ ], @@ -1479,8 +1423,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1717, - serialized_end=1847, + serialized_start=1619, + serialized_end=1748, ) @@ -1492,44 +1436,72 @@ _TXOUTPUT = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='index', full_name='TxOutput.index', index=0, - number=1, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, + name='address', full_name='TxOutput.address', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='address', full_name='TxOutput.address', index=1, - number=2, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", + name='address_n', full_name='TxOutput.address_n', index=1, + number=2, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='address_n', full_name='TxOutput.address_n', index=2, - number=3, type=13, cpp_type=3, label=3, - has_default_value=False, default_value=[], + name='amount', full_name='TxOutput.amount', index=2, + number=3, type=4, cpp_type=4, label=2, + has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='amount', full_name='TxOutput.amount', index=3, - number=4, type=4, cpp_type=4, label=2, + name='script_type', full_name='TxOutput.script_type', index=3, + number=4, type=14, cpp_type=8, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='script_type', full_name='TxOutput.script_type', index=4, - number=5, type=14, cpp_type=8, label=2, + name='script_args', full_name='TxOutput.script_args', index=4, + number=5, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1750, + serialized_end=1873, +) + + +_TRANSACTIONTYPE_TXOUTPUTBIN = _descriptor.Descriptor( + name='TxOutputBin', + full_name='TransactionType.TxOutputBin', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='amount', full_name='TransactionType.TxOutputBin.amount', index=0, + number=1, type=4, cpp_type=4, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='script_args', full_name='TxOutput.script_args', index=5, - number=6, type=12, cpp_type=9, label=3, - has_default_value=False, default_value=[], + name='script_pubkey', full_name='TransactionType.TxOutputBin.script_pubkey', index=1, + number=2, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), @@ -1542,8 +1514,56 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1850, - serialized_end=1988, + serialized_start=2010, + serialized_end=2068, +) + +_TRANSACTIONTYPE = _descriptor.Descriptor( + name='TransactionType', + full_name='TransactionType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='version', full_name='TransactionType.version', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='inputs', full_name='TransactionType.inputs', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='outputs', full_name='TransactionType.outputs', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='lock_time', full_name='TransactionType.lock_time', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_TRANSACTIONTYPE_TXOUTPUTBIN, ], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1876, + serialized_end=2068, ) @@ -1563,8 +1583,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1990, - serialized_end=2005, + serialized_start=2070, + serialized_end=2085, ) @@ -1591,8 +1611,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2007, - serialized_end=2046, + serialized_start=2087, + serialized_end=2126, ) @@ -1619,8 +1639,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2048, - serialized_end=2083, + serialized_start=2128, + serialized_end=2163, ) @@ -1668,8 +1688,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2085, - serialized_end=2163, + serialized_start=2165, + serialized_end=2243, ) @@ -1717,8 +1737,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2165, - serialized_end=2246, + serialized_start=2245, + serialized_end=2326, ) @@ -1738,21 +1758,23 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2248, - serialized_end=2263, + serialized_start=2328, + serialized_end=2343, ) _SETTINGSTYPE.fields_by_name['coin'].message_type = _COINTYPE _FEATURES.fields_by_name['settings'].message_type = _SETTINGSTYPE _FAILURE.fields_by_name['code'].enum_type = _FAILURETYPE -_MASTERPUBLICKEY.fields_by_name['mpk'].message_type = _XPUBTYPE -_LOADDEVICE.fields_by_name['xprv'].message_type = _XPRVTYPE +_PUBLICKEY.fields_by_name['mpk'].message_type = _HDNODETYPE +_LOADDEVICE.fields_by_name['node'].message_type = _HDNODETYPE _SIMPLESIGNTX.fields_by_name['inputs'].message_type = _TXINPUT _SIMPLESIGNTX.fields_by_name['outputs'].message_type = _TXOUTPUT _TXREQUEST.fields_by_name['request_type'].enum_type = _REQUESTTYPE _TXOUTPUT.fields_by_name['script_type'].enum_type = _SCRIPTTYPE -DESCRIPTOR.message_types_by_name['XprvType'] = _XPRVTYPE -DESCRIPTOR.message_types_by_name['XpubType'] = _XPUBTYPE +_TRANSACTIONTYPE_TXOUTPUTBIN.containing_type = _TRANSACTIONTYPE; +_TRANSACTIONTYPE.fields_by_name['inputs'].message_type = _TXINPUT +_TRANSACTIONTYPE.fields_by_name['outputs'].message_type = _TRANSACTIONTYPE_TXOUTPUTBIN +DESCRIPTOR.message_types_by_name['HDNodeType'] = _HDNODETYPE DESCRIPTOR.message_types_by_name['CoinType'] = _COINTYPE DESCRIPTOR.message_types_by_name['SettingsType'] = _SETTINGSTYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE @@ -1770,8 +1792,8 @@ DESCRIPTOR.message_types_by_name['PinMatrixAck'] = _PINMATRIXACK DESCRIPTOR.message_types_by_name['PinMatrixCancel'] = _PINMATRIXCANCEL DESCRIPTOR.message_types_by_name['GetEntropy'] = _GETENTROPY DESCRIPTOR.message_types_by_name['Entropy'] = _ENTROPY -DESCRIPTOR.message_types_by_name['GetMasterPublicKey'] = _GETMASTERPUBLICKEY -DESCRIPTOR.message_types_by_name['MasterPublicKey'] = _MASTERPUBLICKEY +DESCRIPTOR.message_types_by_name['GetPublicKey'] = _GETPUBLICKEY +DESCRIPTOR.message_types_by_name['PublicKey'] = _PUBLICKEY DESCRIPTOR.message_types_by_name['GetAddress'] = _GETADDRESS DESCRIPTOR.message_types_by_name['Address'] = _ADDRESS DESCRIPTOR.message_types_by_name['WipeDevice'] = _WIPEDEVICE @@ -1784,6 +1806,7 @@ DESCRIPTOR.message_types_by_name['SimpleSignTx'] = _SIMPLESIGNTX DESCRIPTOR.message_types_by_name['TxRequest'] = _TXREQUEST DESCRIPTOR.message_types_by_name['TxInput'] = _TXINPUT DESCRIPTOR.message_types_by_name['TxOutput'] = _TXOUTPUT +DESCRIPTOR.message_types_by_name['TransactionType'] = _TRANSACTIONTYPE DESCRIPTOR.message_types_by_name['FirmwareErase'] = _FIRMWAREERASE DESCRIPTOR.message_types_by_name['FirmwareUpload'] = _FIRMWAREUPLOAD DESCRIPTOR.message_types_by_name['DebugLinkDecision'] = _DEBUGLINKDECISION @@ -1791,17 +1814,11 @@ DESCRIPTOR.message_types_by_name['DebugLinkGetState'] = _DEBUGLINKGETSTATE DESCRIPTOR.message_types_by_name['DebugLinkState'] = _DEBUGLINKSTATE DESCRIPTOR.message_types_by_name['DebugLinkStop'] = _DEBUGLINKSTOP -class XprvType(_message.Message): - __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _XPRVTYPE - - # @@protoc_insertion_point(class_scope:XprvType) - -class XpubType(_message.Message): +class HDNodeType(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _XPUBTYPE + DESCRIPTOR = _HDNODETYPE - # @@protoc_insertion_point(class_scope:XpubType) + # @@protoc_insertion_point(class_scope:HDNodeType) class CoinType(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType @@ -1905,17 +1922,17 @@ class Entropy(_message.Message): # @@protoc_insertion_point(class_scope:Entropy) -class GetMasterPublicKey(_message.Message): +class GetPublicKey(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _GETMASTERPUBLICKEY + DESCRIPTOR = _GETPUBLICKEY - # @@protoc_insertion_point(class_scope:GetMasterPublicKey) + # @@protoc_insertion_point(class_scope:GetPublicKey) -class MasterPublicKey(_message.Message): +class PublicKey(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _MASTERPUBLICKEY + DESCRIPTOR = _PUBLICKEY - # @@protoc_insertion_point(class_scope:MasterPublicKey) + # @@protoc_insertion_point(class_scope:PublicKey) class GetAddress(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType @@ -1989,6 +2006,18 @@ class TxOutput(_message.Message): # @@protoc_insertion_point(class_scope:TxOutput) +class TransactionType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + + class TxOutputBin(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _TRANSACTIONTYPE_TXOUTPUTBIN + + # @@protoc_insertion_point(class_scope:TransactionType.TxOutputBin) + DESCRIPTOR = _TRANSACTIONTYPE + + # @@protoc_insertion_point(class_scope:TransactionType) + class FirmwareErase(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _FIRMWAREERASE @@ -2051,10 +2080,10 @@ _MESSAGETYPE.values_by_name["MessageType_GetEntropy"].has_options = True _MESSAGETYPE.values_by_name["MessageType_GetEntropy"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_Entropy"].has_options = True _MESSAGETYPE.values_by_name["MessageType_Entropy"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') -_MESSAGETYPE.values_by_name["MessageType_GetMasterPublicKey"].has_options = True -_MESSAGETYPE.values_by_name["MessageType_GetMasterPublicKey"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') -_MESSAGETYPE.values_by_name["MessageType_MasterPublicKey"].has_options = True -_MESSAGETYPE.values_by_name["MessageType_MasterPublicKey"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_GetPublicKey"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_GetPublicKey"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_PublicKey"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_PublicKey"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_LoadDevice"].has_options = True _MESSAGETYPE.values_by_name["MessageType_LoadDevice"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_ResetDevice"].has_options = True @@ -2101,14 +2130,12 @@ _MESSAGETYPE.values_by_name["MessageType_DebugLinkState"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkState"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkStop"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkStop"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001') -_XPRVTYPE.fields_by_name['chain_code'].has_options = True -_XPRVTYPE.fields_by_name['chain_code']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_XPRVTYPE.fields_by_name['private_key'].has_options = True -_XPRVTYPE.fields_by_name['private_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_XPUBTYPE.fields_by_name['chain_code'].has_options = True -_XPUBTYPE.fields_by_name['chain_code']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_XPUBTYPE.fields_by_name['public_key'].has_options = True -_XPUBTYPE.fields_by_name['public_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_HDNODETYPE.fields_by_name['chain_code'].has_options = True +_HDNODETYPE.fields_by_name['chain_code']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_HDNODETYPE.fields_by_name['private_key'].has_options = True +_HDNODETYPE.fields_by_name['private_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_HDNODETYPE.fields_by_name['public_key'].has_options = True +_HDNODETYPE.fields_by_name['public_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _FEATURES.fields_by_name['device_id'].has_options = True _FEATURES.fields_by_name['device_id']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _FEATURES.fields_by_name['mpk_hash'].has_options = True @@ -2127,6 +2154,8 @@ _TXINPUT.fields_by_name['script_sig'].has_options = True _TXINPUT.fields_by_name['script_sig']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _TXOUTPUT.fields_by_name['script_args'].has_options = True _TXOUTPUT.fields_by_name['script_args']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_TRANSACTIONTYPE_TXOUTPUTBIN.fields_by_name['script_pubkey'].has_options = True +_TRANSACTIONTYPE_TXOUTPUTBIN.fields_by_name['script_pubkey']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _FIRMWAREUPLOAD.fields_by_name['payload'].has_options = True _FIRMWAREUPLOAD.fields_by_name['payload']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _DEBUGLINKSTATE.fields_by_name['layout'].has_options = True From 3ec7a7685a9b0bc2bd84253c1cca8603947ca1b2 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 26 Nov 2013 17:29:50 +0100 Subject: [PATCH 0128/1535] Signing messages, splitted protobuf --- cmd.py | 10 + protob/build.sh | 6 + trezorlib/client.py | 38 +- trezorlib/{trezor_pb2.py => messages_pb2.py} | 587 ++++++++++++++++--- trezorlib/types_pb2.py | 557 ++++++++++++++++++ 5 files changed, 1121 insertions(+), 77 deletions(-) create mode 100755 protob/build.sh rename trezorlib/{trezor_pb2.py => messages_pb2.py} (76%) create mode 100644 trezorlib/types_pb2.py diff --git a/cmd.py b/cmd.py index 3e1bf2ca0..920394779 100755 --- a/cmd.py +++ b/cmd.py @@ -116,6 +116,9 @@ class Commands(object): def sign_message(self, args): return self.client.sign_message(args.n, args.message) + def verify_message(self, args): + return self.client.verify_message(args.address, args.signature, args.message) + def firmware_update(self, args): if not args.file: raise Exception("Must provide firmware filename") @@ -137,6 +140,7 @@ class Commands(object): set_coin.help = 'Switch device to another crypto currency' load_device.help = 'Load custom configuration to the device' sign_message.help = 'Sign message using address of given path' + verify_message.help = 'Verify message' firmware_update.help = 'Upload new firmware to device (must be in bootloader mode)' get_address.arguments = ( @@ -171,6 +175,12 @@ class Commands(object): (('message',), {'type': str}), ) + verify_message.arguments = ( + (('address',), {'type': str}), + (('signature',), {'type': str}), + (('message',), {'type': str}), + ) + get_public_node.arguments = ( (('n',), {'metavar': 'N', 'type': int, 'nargs': '+'}), ) diff --git a/protob/build.sh b/protob/build.sh new file mode 100755 index 000000000..2f71587c0 --- /dev/null +++ b/protob/build.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +cd `dirname $0`/../../trezor-common/protob + +protoc --python_out=../../trezor-emu/trezor/ -I/usr/include -I. types.proto +protoc --python_out=../../trezor-emu/trezor/ -I/usr/include -I. messages.proto diff --git a/trezorlib/client.py b/trezorlib/client.py index b95937372..61ee3c417 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -1,6 +1,7 @@ import os import time +import ckd_public import trezor_pb2 as proto def show_message(message): @@ -39,7 +40,6 @@ class TrezorClient(object): return os.urandom(32) def init_device(self): - self.master_public_key = None self.features = self.call(proto.Initialize()) def close(self): @@ -47,12 +47,9 @@ class TrezorClient(object): if self.debuglink: self.debuglink.transport.close() - def get_master_public_key(self): - if self.master_public_key: - return self.master_public_key - - self.master_public_key = self.call(proto.GetMasterPublicKey()).mpk - return self.master_public_key + def get_public_node(self, n): + # print self.bip32_ckd(self.call(proto.GetPublicKey(address_n=n)).node, [2, ]) + return self.call(proto.GetPublicKey(address_n=n)).node def get_address(self, n): return self.call(proto.GetAddress(address_n=n)).address @@ -139,7 +136,20 @@ class TrezorClient(object): print "Received", self._pprint(resp) return resp - + + def sign_message(self, n, message): + return self.call(proto.SignMessage(address_n=n, message=message)) + + def verify_message(self, address, signature, message): + try: + resp = self.call(proto.VerifyMessage(address=address, signature=signature, message=message)) + if isinstance(resp, proto.Success): + return True + except CallException: + pass + + return False + def sign_tx(self, inputs, outputs): ''' inputs: list of TxInput @@ -260,6 +270,18 @@ class TrezorClient(object): self.init_device() return isinstance(resp, proto.Success) + def bip32_ckd(self, public_node, n): + if not isinstance(n, list): + raise Exception('Parameter must be a list') + + node = proto.HDNodeType() + node.CopyFrom(public_node) + + for i in n: + node.CopyFrom(ckd_public.get_subnode(node, i)) + + return node + def firmware_update(self, fp): if self.features.bootloader_mode == False: raise Exception("Device must be in bootloader mode") diff --git a/trezorlib/trezor_pb2.py b/trezorlib/messages_pb2.py similarity index 76% rename from trezorlib/trezor_pb2.py rename to trezorlib/messages_pb2.py index 50d269118..f3c3dfc5b 100644 --- a/trezorlib/trezor_pb2.py +++ b/trezorlib/messages_pb2.py @@ -1,5 +1,5 @@ # Generated by the protocol buffer compiler. DO NOT EDIT! -# source: trezor.proto +# source: messages.proto from google.protobuf.internal import enum_type_wrapper from google.protobuf import descriptor as _descriptor @@ -9,13 +9,17 @@ from google.protobuf import descriptor_pb2 # @@protoc_insertion_point(imports) -import google.protobuf.descriptor_pb2 +import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( - name='trezor.proto', + name='messages.proto', package='', +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\xa3\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"%\n\tPublicKey\x12\x18\n\x03mpk\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"B\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x81\x01\n\x07TxInput\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"{\n\x08TxOutput\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"\xc0\x01\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x18\n\x06inputs\x18\x02 \x03(\x0b\x32\x08.TxInput\x12-\n\x07outputs\x18\x03 \x03(\x0b\x32\x1c.TransactionType.TxOutputBin\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30\x1a:\n\x0bTxOutputBin\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xc1\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12%\n\x1bMessageType_PinMatrixCancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ButtonCancel\x10\x1c\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x1a\n\x16MessageType_HDNodeType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x1bMessageType_TransactionType\x10%\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01*\xe4\x01\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08') +======= + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"M\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x13\n\x05label\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"B\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"7\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xdd\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -100,7 +104,7 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PinMatrixCancel', index=19, number=20, + name='MessageType_Cancel', index=19, number=20, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( @@ -128,35 +132,52 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonCancel', index=26, number=28, + name='MessageType_GetAddress', index=26, number=29, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_GetAddress', index=27, number=29, - options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), + name='MessageType_Address', index=27, number=30, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_Address', index=28, number=30, + name='MessageType_EntropyRequest', index=28, number=35, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_SettingsType', index=29, number=31, - options=None, + name='MessageType_EntropyAck', index=29, number=36, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( +<<<<<<< HEAD:trezorlib/trezor_pb2.py name='MessageType_HDNodeType', index=30, number=32, options=None, +======= + name='MessageType_SignMessage', index=30, number=38, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py type=None), _descriptor.EnumValueDescriptor( - name='MessageType_CoinType', index=31, number=33, - options=None, + name='MessageType_VerifyMessage', index=31, number=39, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( +<<<<<<< HEAD:trezorlib/trezor_pb2.py name='MessageType_EntropyRequest', index=32, number=35, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( name='MessageType_EntropyAck', index=33, number=36, +======= + name='MessageType_MessageSignature', index=32, number=40, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_PassphraseRequest', index=33, number=41, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_PassphraseAck', index=34, number=42, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( @@ -182,6 +203,7 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=2346, serialized_end=3691, ) @@ -277,6 +299,13 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) +======= + serialized_start=1897, + serialized_end=3270, +) + +MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py MessageType_Initialize = 0 MessageType_Ping = 1 MessageType_Success = 2 @@ -296,26 +325,36 @@ MessageType_SimpleSignTx = 16 MessageType_Features = 17 MessageType_PinMatrixRequest = 18 MessageType_PinMatrixAck = 19 -MessageType_PinMatrixCancel = 20 +MessageType_Cancel = 20 MessageType_TxRequest = 21 MessageType_TxInput = 23 MessageType_TxOutput = 24 MessageType_ApplySettings = 25 MessageType_ButtonRequest = 26 MessageType_ButtonAck = 27 -MessageType_ButtonCancel = 28 MessageType_GetAddress = 29 MessageType_Address = 30 +<<<<<<< HEAD:trezorlib/trezor_pb2.py MessageType_SettingsType = 31 MessageType_HDNodeType = 32 MessageType_CoinType = 33 MessageType_EntropyRequest = 35 MessageType_EntropyAck = 36 MessageType_TransactionType = 37 +======= +MessageType_EntropyRequest = 35 +MessageType_EntropyAck = 36 +MessageType_SignMessage = 38 +MessageType_VerifyMessage = 39 +MessageType_MessageSignature = 40 +MessageType_PassphraseRequest = 41 +MessageType_PassphraseAck = 42 +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py MessageType_DebugLinkDecision = 100 MessageType_DebugLinkGetState = 101 MessageType_DebugLinkState = 102 MessageType_DebugLinkStop = 103 +<<<<<<< HEAD:trezorlib/trezor_pb2.py Failure_UnexpectedMessage = 1 Failure_ButtonExpected = 2 Failure_SyntaxError = 3 @@ -530,6 +569,9 @@ _SETTINGSTYPE = _descriptor.Descriptor( serialized_start=311, serialized_end=383, ) +======= + +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py _INITIALIZE = _descriptor.Descriptor( @@ -548,8 +590,13 @@ _INITIALIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=385, serialized_end=397, +======= + serialized_start=31, + serialized_end=43, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -596,30 +643,44 @@ _FEATURES = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='settings', full_name='Features.settings', index=5, - number=6, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, + name='device_id', full_name='Features.device_id', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( + name='pin_protection', full_name='Features.pin_protection', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='device_id', full_name='Features.device_id', index=6, - number=7, type=12, cpp_type=9, label=1, + name='passphrase_protection', full_name='Features.passphrase_protection', index=7, + number=8, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='language', full_name='Features.language', index=8, + number=9, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), _descriptor.FieldDescriptor( - name='mpk_hash', full_name='Features.mpk_hash', index=7, - number=8, type=12, cpp_type=9, label=1, + name='label', full_name='Features.label', index=9, + number=10, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), _descriptor.FieldDescriptor( - name='pin_protection', full_name='Features.pin_protection', index=8, - number=9, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, + name='coins', full_name='Features.coins', index=10, + number=11, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -632,8 +693,13 @@ _FEATURES = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=400, serialized_end=627, +======= + serialized_start=46, + serialized_end=312, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -664,7 +730,7 @@ _APPLYSETTINGS = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None), + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), ], extensions=[ ], @@ -674,8 +740,13 @@ _APPLYSETTINGS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=629, serialized_end=700, +======= + serialized_start=314, + serialized_end=391, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -702,8 +773,13 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=702, serialized_end=729, +======= + serialized_start=393, + serialized_end=420, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -730,8 +806,13 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=731, serialized_end=754, +======= + serialized_start=422, + serialized_end=445, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -758,8 +839,13 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=756, serialized_end=782, +======= + serialized_start=447, + serialized_end=473, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -793,8 +879,13 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=784, serialized_end=838, +======= + serialized_start=475, + serialized_end=529, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -814,8 +905,13 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=840, serialized_end=855, +======= + serialized_start=531, + serialized_end=546, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -835,18 +931,30 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=857, serialized_end=868, +======= + serialized_start=548, + serialized_end=559, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) -_BUTTONCANCEL = _descriptor.Descriptor( - name='ButtonCancel', - full_name='ButtonCancel', +_PINMATRIXREQUEST = _descriptor.Descriptor( + name='PinMatrixRequest', + full_name='PinMatrixRequest', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ + _descriptor.FieldDescriptor( + name='message', full_name='PinMatrixRequest.message', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -856,21 +964,26 @@ _BUTTONCANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=870, serialized_end=884, +======= + serialized_start=561, + serialized_end=596, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) -_PINMATRIXREQUEST = _descriptor.Descriptor( - name='PinMatrixRequest', - full_name='PinMatrixRequest', +_PINMATRIXACK = _descriptor.Descriptor( + name='PinMatrixAck', + full_name='PinMatrixAck', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='message', full_name='PinMatrixRequest.message', index=0, - number=1, type=12, cpp_type=9, label=1, + name='pin', full_name='PinMatrixAck.pin', index=0, + number=1, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -884,25 +997,44 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=886, serialized_end=921, +======= + serialized_start=598, + serialized_end=625, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) -_PINMATRIXACK = _descriptor.Descriptor( - name='PinMatrixAck', - full_name='PinMatrixAck', +_CANCEL = _descriptor.Descriptor( + name='Cancel', + full_name='Cancel', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=627, + serialized_end=635, +) + + +_PASSPHRASEREQUEST = _descriptor.Descriptor( + name='PassphraseRequest', + full_name='PassphraseRequest', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ - _descriptor.FieldDescriptor( - name='pin', full_name='PinMatrixAck.pin', index=0, - number=1, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -912,18 +1044,30 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=923, serialized_end=950, +======= + serialized_start=637, + serialized_end=656, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) -_PINMATRIXCANCEL = _descriptor.Descriptor( - name='PinMatrixCancel', - full_name='PinMatrixCancel', +_PASSPHRASEACK = _descriptor.Descriptor( + name='PassphraseAck', + full_name='PassphraseAck', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ + _descriptor.FieldDescriptor( + name='passphrase', full_name='PassphraseAck.passphrase', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), ], extensions=[ ], @@ -933,8 +1077,13 @@ _PINMATRIXCANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=952, serialized_end=969, +======= + serialized_start=658, + serialized_end=699, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -961,8 +1110,13 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=971, serialized_end=997, +======= + serialized_start=701, + serialized_end=727, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -989,8 +1143,13 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=999, serialized_end=1031, +======= + serialized_start=729, + serialized_end=761, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1017,8 +1176,13 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=1033, serialized_end=1066, +======= + serialized_start=763, + serialized_end=796, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1030,7 +1194,11 @@ _PUBLICKEY = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( +<<<<<<< HEAD:trezorlib/trezor_pb2.py name='mpk', full_name='PublicKey.mpk', index=0, +======= + name='node', full_name='PublicKey.node', index=0, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py number=1, type=11, cpp_type=10, label=2, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -1045,8 +1213,13 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=1068, serialized_end=1105, +======= + serialized_start=798, + serialized_end=836, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1073,8 +1246,13 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=1107, serialized_end=1138, +======= + serialized_start=838, + serialized_end=869, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1101,8 +1279,13 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=1140, serialized_end=1166, +======= + serialized_start=871, + serialized_end=897, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1122,8 +1305,13 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=1168, serialized_end=1180, +======= + serialized_start=899, + serialized_end=911, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1164,8 +1352,13 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=1182, serialized_end=1248, +======= + serialized_start=913, + serialized_end=979, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1192,8 +1385,13 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=1250, serialized_end=1287, +======= + serialized_start=981, + serialized_end=1018, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1213,8 +1411,13 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=1289, serialized_end=1305, +======= + serialized_start=1020, + serialized_end=1036, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1241,8 +1444,125 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=1307, serialized_end=1342, +======= + serialized_start=1038, + serialized_end=1073, +) + + +_SIGNMESSAGE = _descriptor.Descriptor( + name='SignMessage', + full_name='SignMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='address_n', full_name='SignMessage.address_n', index=0, + number=1, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message', full_name='SignMessage.message', index=1, + number=2, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1075, + serialized_end=1130, +) + + +_VERIFYMESSAGE = _descriptor.Descriptor( + name='VerifyMessage', + full_name='VerifyMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='address', full_name='VerifyMessage.address', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='signature', full_name='VerifyMessage.signature', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message', full_name='VerifyMessage.message', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1132, + serialized_end=1206, +) + + +_MESSAGESIGNATURE = _descriptor.Descriptor( + name='MessageSignature', + full_name='MessageSignature', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='address', full_name='MessageSignature.address', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='signature', full_name='MessageSignature.signature', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1208, + serialized_end=1262, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1276,8 +1596,13 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=1344, serialized_end=1397, +======= + serialized_start=1264, + serialized_end=1317, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1311,8 +1636,13 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=1399, serialized_end=1467, +======= + serialized_start=1319, + serialized_end=1387, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1367,8 +1697,13 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=1470, serialized_end=1616, +======= + serialized_start=1390, + serialized_end=1536, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1380,6 +1715,7 @@ _TXINPUT = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( +<<<<<<< HEAD:trezorlib/trezor_pb2.py name='address_n', full_name='TxInput.address_n', index=0, number=1, type=13, cpp_type=3, label=3, has_default_value=False, default_value=[], @@ -1411,6 +1747,11 @@ _TXINPUT = _descriptor.Descriptor( name='sequence', full_name='TxInput.sequence', index=4, number=5, type=13, cpp_type=3, label=1, has_default_value=True, default_value=4294967295, +======= + name='input', full_name='TxInput.input', index=0, + number=1, type=11, cpp_type=10, label=2, + has_default_value=False, default_value=None, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1423,8 +1764,13 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=1619, serialized_end=1748, +======= + serialized_start=1538, + serialized_end=1576, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1436,6 +1782,7 @@ _TXOUTPUT = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( +<<<<<<< HEAD:trezorlib/trezor_pb2.py name='address', full_name='TxOutput.address', index=0, number=1, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", @@ -1505,6 +1852,14 @@ _TRANSACTIONTYPE_TXOUTPUTBIN = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), +======= + name='output', full_name='TxOutput.output', index=0, + number=1, type=11, cpp_type=10, label=2, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ], extensions=[ ], @@ -1514,6 +1869,7 @@ _TRANSACTIONTYPE_TXOUTPUTBIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=2010, serialized_end=2068, ) @@ -1564,6 +1920,10 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( extension_ranges=[], serialized_start=1876, serialized_end=2068, +======= + serialized_start=1578, + serialized_end=1619, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1583,8 +1943,13 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=2070, serialized_end=2085, +======= + serialized_start=1621, + serialized_end=1636, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1611,8 +1976,13 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=2087, serialized_end=2126, +======= + serialized_start=1638, + serialized_end=1677, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1639,8 +2009,13 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=2128, serialized_end=2163, +======= + serialized_start=1679, + serialized_end=1714, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1688,8 +2063,13 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=2165, serialized_end=2243, +======= + serialized_start=1716, + serialized_end=1794, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1737,8 +2117,13 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=2245, serialized_end=2326, +======= + serialized_start=1796, + serialized_end=1877, +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1758,6 +2143,7 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], +<<<<<<< HEAD:trezorlib/trezor_pb2.py serialized_start=2328, serialized_end=2343, ) @@ -1777,6 +2163,21 @@ _TRANSACTIONTYPE.fields_by_name['outputs'].message_type = _TRANSACTIONTYPE_TXOUT DESCRIPTOR.message_types_by_name['HDNodeType'] = _HDNODETYPE DESCRIPTOR.message_types_by_name['CoinType'] = _COINTYPE DESCRIPTOR.message_types_by_name['SettingsType'] = _SETTINGSTYPE +======= + serialized_start=1879, + serialized_end=1894, +) + +_FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE +_FAILURE.fields_by_name['code'].enum_type = types_pb2._FAILURETYPE +_PUBLICKEY.fields_by_name['node'].message_type = types_pb2._HDNODETYPE +_LOADDEVICE.fields_by_name['node'].message_type = types_pb2._HDNODETYPE +_SIMPLESIGNTX.fields_by_name['inputs'].message_type = _TXINPUT +_SIMPLESIGNTX.fields_by_name['outputs'].message_type = _TXOUTPUT +_TXREQUEST.fields_by_name['request_type'].enum_type = types_pb2._REQUESTTYPE +_TXINPUT.fields_by_name['input'].message_type = types_pb2._TXINPUTTYPE +_TXOUTPUT.fields_by_name['output'].message_type = types_pb2._TXOUTPUTTYPE +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE DESCRIPTOR.message_types_by_name['Features'] = _FEATURES DESCRIPTOR.message_types_by_name['ApplySettings'] = _APPLYSETTINGS @@ -1786,10 +2187,11 @@ DESCRIPTOR.message_types_by_name['Success'] = _SUCCESS DESCRIPTOR.message_types_by_name['Failure'] = _FAILURE DESCRIPTOR.message_types_by_name['ButtonRequest'] = _BUTTONREQUEST DESCRIPTOR.message_types_by_name['ButtonAck'] = _BUTTONACK -DESCRIPTOR.message_types_by_name['ButtonCancel'] = _BUTTONCANCEL DESCRIPTOR.message_types_by_name['PinMatrixRequest'] = _PINMATRIXREQUEST DESCRIPTOR.message_types_by_name['PinMatrixAck'] = _PINMATRIXACK -DESCRIPTOR.message_types_by_name['PinMatrixCancel'] = _PINMATRIXCANCEL +DESCRIPTOR.message_types_by_name['Cancel'] = _CANCEL +DESCRIPTOR.message_types_by_name['PassphraseRequest'] = _PASSPHRASEREQUEST +DESCRIPTOR.message_types_by_name['PassphraseAck'] = _PASSPHRASEACK DESCRIPTOR.message_types_by_name['GetEntropy'] = _GETENTROPY DESCRIPTOR.message_types_by_name['Entropy'] = _ENTROPY DESCRIPTOR.message_types_by_name['GetPublicKey'] = _GETPUBLICKEY @@ -1801,6 +2203,9 @@ DESCRIPTOR.message_types_by_name['LoadDevice'] = _LOADDEVICE DESCRIPTOR.message_types_by_name['ResetDevice'] = _RESETDEVICE DESCRIPTOR.message_types_by_name['EntropyRequest'] = _ENTROPYREQUEST DESCRIPTOR.message_types_by_name['EntropyAck'] = _ENTROPYACK +DESCRIPTOR.message_types_by_name['SignMessage'] = _SIGNMESSAGE +DESCRIPTOR.message_types_by_name['VerifyMessage'] = _VERIFYMESSAGE +DESCRIPTOR.message_types_by_name['MessageSignature'] = _MESSAGESIGNATURE DESCRIPTOR.message_types_by_name['SignTx'] = _SIGNTX DESCRIPTOR.message_types_by_name['SimpleSignTx'] = _SIMPLESIGNTX DESCRIPTOR.message_types_by_name['TxRequest'] = _TXREQUEST @@ -1814,6 +2219,7 @@ DESCRIPTOR.message_types_by_name['DebugLinkGetState'] = _DEBUGLINKGETSTATE DESCRIPTOR.message_types_by_name['DebugLinkState'] = _DEBUGLINKSTATE DESCRIPTOR.message_types_by_name['DebugLinkStop'] = _DEBUGLINKSTOP +<<<<<<< HEAD:trezorlib/trezor_pb2.py class HDNodeType(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _HDNODETYPE @@ -1832,6 +2238,8 @@ class SettingsType(_message.Message): # @@protoc_insertion_point(class_scope:SettingsType) +======= +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py class Initialize(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _INITIALIZE @@ -1886,12 +2294,6 @@ class ButtonAck(_message.Message): # @@protoc_insertion_point(class_scope:ButtonAck) -class ButtonCancel(_message.Message): - __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _BUTTONCANCEL - - # @@protoc_insertion_point(class_scope:ButtonCancel) - class PinMatrixRequest(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _PINMATRIXREQUEST @@ -1904,11 +2306,23 @@ class PinMatrixAck(_message.Message): # @@protoc_insertion_point(class_scope:PinMatrixAck) -class PinMatrixCancel(_message.Message): +class Cancel(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _CANCEL + + # @@protoc_insertion_point(class_scope:Cancel) + +class PassphraseRequest(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _PASSPHRASEREQUEST + + # @@protoc_insertion_point(class_scope:PassphraseRequest) + +class PassphraseAck(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _PINMATRIXCANCEL + DESCRIPTOR = _PASSPHRASEACK - # @@protoc_insertion_point(class_scope:PinMatrixCancel) + # @@protoc_insertion_point(class_scope:PassphraseAck) class GetEntropy(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType @@ -1976,6 +2390,24 @@ class EntropyAck(_message.Message): # @@protoc_insertion_point(class_scope:EntropyAck) +class SignMessage(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SIGNMESSAGE + + # @@protoc_insertion_point(class_scope:SignMessage) + +class VerifyMessage(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _VERIFYMESSAGE + + # @@protoc_insertion_point(class_scope:VerifyMessage) + +class MessageSignature(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _MESSAGESIGNATURE + + # @@protoc_insertion_point(class_scope:MessageSignature) + class SignTx(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _SIGNTX @@ -2054,11 +2486,6 @@ class DebugLinkStop(_message.Message): # @@protoc_insertion_point(class_scope:DebugLinkStop) -google.protobuf.descriptor_pb2.FieldOptions.RegisterExtension(binary) -google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_in) -google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_out) -google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_in) -google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_out) _MESSAGETYPE.values_by_name["MessageType_Initialize"].has_options = True _MESSAGETYPE.values_by_name["MessageType_Initialize"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') @@ -2098,8 +2525,8 @@ _MESSAGETYPE.values_by_name["MessageType_PinMatrixRequest"].has_options = True _MESSAGETYPE.values_by_name["MessageType_PinMatrixRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_PinMatrixAck"].has_options = True _MESSAGETYPE.values_by_name["MessageType_PinMatrixAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') -_MESSAGETYPE.values_by_name["MessageType_PinMatrixCancel"].has_options = True -_MESSAGETYPE.values_by_name["MessageType_PinMatrixCancel"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_Cancel"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_Cancel"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_TxRequest"].has_options = True _MESSAGETYPE.values_by_name["MessageType_TxRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_TxInput"].has_options = True @@ -2112,8 +2539,6 @@ _MESSAGETYPE.values_by_name["MessageType_ButtonRequest"].has_options = True _MESSAGETYPE.values_by_name["MessageType_ButtonRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_ButtonAck"].has_options = True _MESSAGETYPE.values_by_name["MessageType_ButtonAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') -_MESSAGETYPE.values_by_name["MessageType_ButtonCancel"].has_options = True -_MESSAGETYPE.values_by_name["MessageType_ButtonCancel"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_GetAddress"].has_options = True _MESSAGETYPE.values_by_name["MessageType_GetAddress"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_Address"].has_options = True @@ -2122,6 +2547,16 @@ _MESSAGETYPE.values_by_name["MessageType_EntropyRequest"].has_options = True _MESSAGETYPE.values_by_name["MessageType_EntropyRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_EntropyAck"].has_options = True _MESSAGETYPE.values_by_name["MessageType_EntropyAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_SignMessage"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_SignMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_VerifyMessage"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_VerifyMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_MessageSignature"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_MessageSignature"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_PassphraseRequest"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_PassphraseRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_PassphraseAck"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_PassphraseAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkDecision"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkDecision"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkGetState"].has_options = True @@ -2130,24 +2565,36 @@ _MESSAGETYPE.values_by_name["MessageType_DebugLinkState"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkState"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkStop"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkStop"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001') +<<<<<<< HEAD:trezorlib/trezor_pb2.py _HDNODETYPE.fields_by_name['chain_code'].has_options = True _HDNODETYPE.fields_by_name['chain_code']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _HDNODETYPE.fields_by_name['private_key'].has_options = True _HDNODETYPE.fields_by_name['private_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _HDNODETYPE.fields_by_name['public_key'].has_options = True _HDNODETYPE.fields_by_name['public_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +======= +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py _FEATURES.fields_by_name['device_id'].has_options = True _FEATURES.fields_by_name['device_id']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_FEATURES.fields_by_name['mpk_hash'].has_options = True -_FEATURES.fields_by_name['mpk_hash']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_FEATURES.fields_by_name['label'].has_options = True +_FEATURES.fields_by_name['label']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_APPLYSETTINGS.fields_by_name['label'].has_options = True +_APPLYSETTINGS.fields_by_name['label']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_PASSPHRASEACK.fields_by_name['passphrase'].has_options = True +_PASSPHRASEACK.fields_by_name['passphrase']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _ENTROPY.fields_by_name['entropy'].has_options = True _ENTROPY.fields_by_name['entropy']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _ENTROPYACK.fields_by_name['entropy'].has_options = True _ENTROPYACK.fields_by_name['entropy']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_SIGNMESSAGE.fields_by_name['message'].has_options = True +_SIGNMESSAGE.fields_by_name['message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_VERIFYMESSAGE.fields_by_name['message'].has_options = True +_VERIFYMESSAGE.fields_by_name['message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _TXREQUEST.fields_by_name['signature'].has_options = True _TXREQUEST.fields_by_name['signature']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _TXREQUEST.fields_by_name['serialized_tx'].has_options = True _TXREQUEST.fields_by_name['serialized_tx']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +<<<<<<< HEAD:trezorlib/trezor_pb2.py _TXINPUT.fields_by_name['prev_hash'].has_options = True _TXINPUT.fields_by_name['prev_hash']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _TXINPUT.fields_by_name['script_sig'].has_options = True @@ -2156,6 +2603,8 @@ _TXOUTPUT.fields_by_name['script_args'].has_options = True _TXOUTPUT.fields_by_name['script_args']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _TRANSACTIONTYPE_TXOUTPUTBIN.fields_by_name['script_pubkey'].has_options = True _TRANSACTIONTYPE_TXOUTPUTBIN.fields_by_name['script_pubkey']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +======= +>>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py _FIRMWAREUPLOAD.fields_by_name['payload'].has_options = True _FIRMWAREUPLOAD.fields_by_name['payload']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _DEBUGLINKSTATE.fields_by_name['layout'].has_options = True diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py new file mode 100644 index 000000000..a924d0fb9 --- /dev/null +++ b/trezorlib/types_pb2.py @@ -0,0 +1,557 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: types.proto + +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + + +import google.protobuf.descriptor_pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='types.proto', + package='', + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x82\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08') + +_FAILURETYPE = _descriptor.EnumDescriptor( + name='FailureType', + full_name='FailureType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='Failure_UnexpectedMessage', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_ButtonExpected', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_SyntaxError', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_ActionCancelled', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_PinExpected', index=4, number=5, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_PinCancelled', index=5, number=6, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_PinInvalid', index=6, number=7, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_InvalidSignature', index=7, number=8, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_FirmwareError', index=8, number=99, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=783, + serialized_end=1041, +) + +FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) +_SCRIPTTYPE = _descriptor.EnumDescriptor( + name='ScriptType', + full_name='ScriptType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='PAYTOADDRESS', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PAYTOSCRIPTHASH', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1043, + serialized_end=1094, +) + +ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) +_REQUESTTYPE = _descriptor.EnumDescriptor( + name='RequestType', + full_name='RequestType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='TXINPUT', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='TXOUTPUT', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1096, + serialized_end=1136, +) + +RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) +Failure_UnexpectedMessage = 1 +Failure_ButtonExpected = 2 +Failure_SyntaxError = 3 +Failure_ActionCancelled = 4 +Failure_PinExpected = 5 +Failure_PinCancelled = 6 +Failure_PinInvalid = 7 +Failure_InvalidSignature = 8 +Failure_FirmwareError = 99 +PAYTOADDRESS = 0 +PAYTOSCRIPTHASH = 1 +TXINPUT = 0 +TXOUTPUT = 1 + +BINARY_FIELD_NUMBER = 50001 +binary = _descriptor.FieldDescriptor( + name='binary', full_name='binary', index=0, + number=50001, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +WIRE_IN_FIELD_NUMBER = 50002 +wire_in = _descriptor.FieldDescriptor( + name='wire_in', full_name='wire_in', index=1, + number=50002, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +WIRE_OUT_FIELD_NUMBER = 50003 +wire_out = _descriptor.FieldDescriptor( + name='wire_out', full_name='wire_out', index=2, + number=50003, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +WIRE_DEBUG_IN_FIELD_NUMBER = 50004 +wire_debug_in = _descriptor.FieldDescriptor( + name='wire_debug_in', full_name='wire_debug_in', index=3, + number=50004, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) +WIRE_DEBUG_OUT_FIELD_NUMBER = 50005 +wire_debug_out = _descriptor.FieldDescriptor( + name='wire_debug_out', full_name='wire_debug_out', index=4, + number=50005, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + options=None) + + +_HDNODETYPE = _descriptor.Descriptor( + name='HDNodeType', + full_name='HDNodeType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='version', full_name='HDNodeType.version', index=0, + number=1, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='depth', full_name='HDNodeType.depth', index=1, + number=2, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='fingerprint', full_name='HDNodeType.fingerprint', index=2, + number=3, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='child_num', full_name='HDNodeType.child_num', index=3, + number=4, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='chain_code', full_name='HDNodeType.chain_code', index=4, + number=5, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( + name='private_key', full_name='HDNodeType.private_key', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( + name='public_key', full_name='HDNodeType.public_key', index=6, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( + name='address', full_name='HDNodeType.address', index=7, + number=8, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=50, + serialized_end=230, +) + + +_COINTYPE = _descriptor.Descriptor( + name='CoinType', + full_name='CoinType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='coin_name', full_name='CoinType.coin_name', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='coin_shortcut', full_name='CoinType.coin_shortcut', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='address_type', full_name='CoinType.address_type', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='maxfee_kb', full_name='CoinType.maxfee_kb', index=3, + number=4, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=232, + serialized_end=325, +) + + +_TXINPUTTYPE = _descriptor.Descriptor( + name='TxInputType', + full_name='TxInputType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='address_n', full_name='TxInputType.address_n', index=0, + number=1, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='prev_hash', full_name='TxInputType.prev_hash', index=1, + number=2, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( + name='prev_index', full_name='TxInputType.prev_index', index=2, + number=3, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='script_sig', full_name='TxInputType.script_sig', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( + name='sequence', full_name='TxInputType.sequence', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=4294967295, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=328, + serialized_end=461, +) + + +_TXOUTPUTTYPE = _descriptor.Descriptor( + name='TxOutputType', + full_name='TxOutputType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='address', full_name='TxOutputType.address', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='address_n', full_name='TxOutputType.address_n', index=1, + number=2, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='amount', full_name='TxOutputType.amount', index=2, + number=3, type=4, cpp_type=4, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='script_type', full_name='TxOutputType.script_type', index=3, + number=4, type=14, cpp_type=8, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='script_args', full_name='TxOutputType.script_args', index=4, + number=5, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=463, + serialized_end=590, +) + + +_TXOUTPUTBINTYPE = _descriptor.Descriptor( + name='TxOutputBinType', + full_name='TxOutputBinType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='amount', full_name='TxOutputBinType.amount', index=0, + number=1, type=4, cpp_type=4, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='script_pubkey', full_name='TxOutputBinType.script_pubkey', index=1, + number=2, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=592, + serialized_end=654, +) + + +_TRANSACTIONTYPE = _descriptor.Descriptor( + name='TransactionType', + full_name='TransactionType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='version', full_name='TransactionType.version', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=1, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='inputs', full_name='TransactionType.inputs', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='outputs', full_name='TransactionType.outputs', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='lock_time', full_name='TransactionType.lock_time', index=3, + number=4, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=656, + serialized_end=780, +) + +_TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _SCRIPTTYPE +_TRANSACTIONTYPE.fields_by_name['inputs'].message_type = _TXINPUTTYPE +_TRANSACTIONTYPE.fields_by_name['outputs'].message_type = _TXOUTPUTBINTYPE +DESCRIPTOR.message_types_by_name['HDNodeType'] = _HDNODETYPE +DESCRIPTOR.message_types_by_name['CoinType'] = _COINTYPE +DESCRIPTOR.message_types_by_name['TxInputType'] = _TXINPUTTYPE +DESCRIPTOR.message_types_by_name['TxOutputType'] = _TXOUTPUTTYPE +DESCRIPTOR.message_types_by_name['TxOutputBinType'] = _TXOUTPUTBINTYPE +DESCRIPTOR.message_types_by_name['TransactionType'] = _TRANSACTIONTYPE + +class HDNodeType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _HDNODETYPE + + # @@protoc_insertion_point(class_scope:HDNodeType) + +class CoinType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _COINTYPE + + # @@protoc_insertion_point(class_scope:CoinType) + +class TxInputType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _TXINPUTTYPE + + # @@protoc_insertion_point(class_scope:TxInputType) + +class TxOutputType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _TXOUTPUTTYPE + + # @@protoc_insertion_point(class_scope:TxOutputType) + +class TxOutputBinType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _TXOUTPUTBINTYPE + + # @@protoc_insertion_point(class_scope:TxOutputBinType) + +class TransactionType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _TRANSACTIONTYPE + + # @@protoc_insertion_point(class_scope:TransactionType) + +google.protobuf.descriptor_pb2.FieldOptions.RegisterExtension(binary) +google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_in) +google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_out) +google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_in) +google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_out) + +_HDNODETYPE.fields_by_name['chain_code'].has_options = True +_HDNODETYPE.fields_by_name['chain_code']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_HDNODETYPE.fields_by_name['private_key'].has_options = True +_HDNODETYPE.fields_by_name['private_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_HDNODETYPE.fields_by_name['public_key'].has_options = True +_HDNODETYPE.fields_by_name['public_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_TXINPUTTYPE.fields_by_name['prev_hash'].has_options = True +_TXINPUTTYPE.fields_by_name['prev_hash']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_TXINPUTTYPE.fields_by_name['script_sig'].has_options = True +_TXINPUTTYPE.fields_by_name['script_sig']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_TXOUTPUTTYPE.fields_by_name['script_args'].has_options = True +_TXOUTPUTTYPE.fields_by_name['script_args']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_TXOUTPUTBINTYPE.fields_by_name['script_pubkey'].has_options = True +_TXOUTPUTBINTYPE.fields_by_name['script_pubkey']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +# @@protoc_insertion_point(module_scope) From 37e857965c9c1c34bd8e0c6973ebc94afb283769 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 26 Nov 2013 17:53:54 +0100 Subject: [PATCH 0129/1535] Removed trezor-common --- trezor-common | 1 - 1 file changed, 1 deletion(-) delete mode 160000 trezor-common diff --git a/trezor-common b/trezor-common deleted file mode 160000 index fccebb724..000000000 --- a/trezor-common +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fccebb724cc8446cb2040f5468a2e451463e38ab From a544af7c88a1702c491fa05e6e54aa7b6bf85dc8 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 16 Dec 2013 16:03:38 +0100 Subject: [PATCH 0130/1535] ckd public derivation --- trezorlib/ckd_public.py | 47 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 trezorlib/ckd_public.py diff --git a/trezorlib/ckd_public.py b/trezorlib/ckd_public.py new file mode 100644 index 000000000..eaae85a87 --- /dev/null +++ b/trezorlib/ckd_public.py @@ -0,0 +1,47 @@ +import struct +import hmac +import hashlib +from ecdsa.util import string_to_number +from ecdsa.curves import SECP256k1 + +import trezor_pb2 as proto + +PRIME_DERIVATION_FLAG = 0x80000000 + +def is_prime(n): + return (bool)(n & PRIME_DERIVATION_FLAG) + +def hash_160(public_key): + md = hashlib.new('ripemd160') + md.update(hashlib.sha256(public_key).digest()) + return md.digest() + +def fingerprint(pubkey): + return string_to_number(hash_160(pubkey)[:4]) + +def get_subnode(node, i): + # Public Child key derivation (CKD) algorithm of BIP32 + i_as_bytes = struct.pack(">L", i) + + if is_prime(i): + raise Exception("Prime derivation not supported") + + # Public derivation + data = node.public_key + i_as_bytes + + I64 = hmac.HMAC(key=node.chain_code, msg=data, digestmod=hashlib.sha512).digest() + I_left_as_exponent = string_to_number(I64[:32]) + + node_out = proto.HDNodeType() + node_out.version = node.version + node_out.depth = node.depth + 1 + node_out.child_num = i + node_out.chain_code = I64[32:] + node_out.fingerprint = fingerprint(node.public_key) + + # FIXME + # node_out.public_key = cls._get_pubkey(node_out.private_key) + # x, y = self.public_pair + # the_point = I_left_as_exponent * ecdsa.generator_secp256k1 + ecdsa.Point(ecdsa.generator_secp256k1.curve(), x, y, SECP256k1.generator.order()) + + return node_out From b7a2800b97af31be7003476b20c91eee85c31b81 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 16 Dec 2013 16:04:03 +0100 Subject: [PATCH 0131/1535] Compiled messages --- trezorlib/messages_pb2.py | 749 -------------------------------------- 1 file changed, 749 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index f3c3dfc5b..cc426fd96 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,11 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_pb='\n\x0ctrezor.proto\x1a google/protobuf/descriptor.proto\"\xa3\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"H\n\x0cSettingsType\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x17\n\x04\x63oin\x18\x02 \x01(\x0b\x32\t.CoinType\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x0c\n\nInitialize\"\xe3\x01\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x1f\n\x08settings\x18\x06 \x01(\x0b\x32\r.SettingsType\x12\x17\n\tdevice_id\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x08mpk_hash\x18\x08 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\t \x01(\x08\"G\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\r\n\x05label\x18\x03 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"\x0e\n\x0c\x42uttonCancel\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x11\n\x0fPinMatrixCancel\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"%\n\tPublicKey\x12\x18\n\x03mpk\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"B\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x81\x01\n\x07TxInput\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"{\n\x08TxOutput\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\"\xc0\x01\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x18\n\x06inputs\x18\x02 \x03(\x0b\x32\x08.TxInput\x12-\n\x07outputs\x18\x03 \x03(\x0b\x32\x1c.TransactionType.TxOutputBin\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30\x1a:\n\x0bTxOutputBin\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xc1\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12%\n\x1bMessageType_PinMatrixCancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ButtonCancel\x10\x1c\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12\x1c\n\x18MessageType_SettingsType\x10\x1f\x12\x1a\n\x16MessageType_HDNodeType\x10 \x12\x18\n\x14MessageType_CoinType\x10!\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x1bMessageType_TransactionType\x10%\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01*\xe4\x01\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08') -======= serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"M\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x13\n\x05label\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"B\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"7\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xdd\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -148,26 +144,14 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( -<<<<<<< HEAD:trezorlib/trezor_pb2.py - name='MessageType_HDNodeType', index=30, number=32, - options=None, -======= name='MessageType_SignMessage', index=30, number=38, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py type=None), _descriptor.EnumValueDescriptor( name='MessageType_VerifyMessage', index=31, number=39, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( -<<<<<<< HEAD:trezorlib/trezor_pb2.py - name='MessageType_EntropyRequest', index=32, number=35, - options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), - type=None), - _descriptor.EnumValueDescriptor( - name='MessageType_EntropyAck', index=33, number=36, -======= name='MessageType_MessageSignature', index=32, number=40, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), @@ -177,13 +161,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( type=None), _descriptor.EnumValueDescriptor( name='MessageType_PassphraseAck', index=34, number=42, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), - _descriptor.EnumValueDescriptor( - name='MessageType_TransactionType', index=34, number=37, - options=None, - type=None), _descriptor.EnumValueDescriptor( name='MessageType_DebugLinkDecision', index=35, number=100, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), @@ -203,109 +182,11 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=2346, - serialized_end=3691, -) - -MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) -_FAILURETYPE = _descriptor.EnumDescriptor( - name='FailureType', - full_name='FailureType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='Failure_UnexpectedMessage', index=0, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='Failure_ButtonExpected', index=1, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='Failure_SyntaxError', index=2, number=3, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='Failure_ActionCancelled', index=3, number=4, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='Failure_PinExpected', index=4, number=5, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='Failure_PinCancelled', index=5, number=6, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='Failure_PinInvalid', index=6, number=7, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='Failure_FirmwareError', index=7, number=99, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=3694, - serialized_end=3922, -) - -FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) -_SCRIPTTYPE = _descriptor.EnumDescriptor( - name='ScriptType', - full_name='ScriptType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='PAYTOADDRESS', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='PAYTOSCRIPTHASH', index=1, number=1, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=3924, - serialized_end=3975, -) - -ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) -_REQUESTTYPE = _descriptor.EnumDescriptor( - name='RequestType', - full_name='RequestType', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='TXINPUT', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='TXOUTPUT', index=1, number=1, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=3977, - serialized_end=4017, -) - -RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) -======= serialized_start=1897, serialized_end=3270, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py MessageType_Initialize = 0 MessageType_Ping = 1 MessageType_Success = 2 @@ -334,14 +215,6 @@ MessageType_ButtonRequest = 26 MessageType_ButtonAck = 27 MessageType_GetAddress = 29 MessageType_Address = 30 -<<<<<<< HEAD:trezorlib/trezor_pb2.py -MessageType_SettingsType = 31 -MessageType_HDNodeType = 32 -MessageType_CoinType = 33 -MessageType_EntropyRequest = 35 -MessageType_EntropyAck = 36 -MessageType_TransactionType = 37 -======= MessageType_EntropyRequest = 35 MessageType_EntropyAck = 36 MessageType_SignMessage = 38 @@ -349,229 +222,11 @@ MessageType_VerifyMessage = 39 MessageType_MessageSignature = 40 MessageType_PassphraseRequest = 41 MessageType_PassphraseAck = 42 ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py MessageType_DebugLinkDecision = 100 MessageType_DebugLinkGetState = 101 MessageType_DebugLinkState = 102 MessageType_DebugLinkStop = 103 -<<<<<<< HEAD:trezorlib/trezor_pb2.py -Failure_UnexpectedMessage = 1 -Failure_ButtonExpected = 2 -Failure_SyntaxError = 3 -Failure_ActionCancelled = 4 -Failure_PinExpected = 5 -Failure_PinCancelled = 6 -Failure_PinInvalid = 7 -Failure_FirmwareError = 99 -PAYTOADDRESS = 0 -PAYTOSCRIPTHASH = 1 -TXINPUT = 0 -TXOUTPUT = 1 - -BINARY_FIELD_NUMBER = 50001 -binary = _descriptor.FieldDescriptor( - name='binary', full_name='binary', index=0, - number=50001, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - options=None) -WIRE_IN_FIELD_NUMBER = 50002 -wire_in = _descriptor.FieldDescriptor( - name='wire_in', full_name='wire_in', index=1, - number=50002, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - options=None) -WIRE_OUT_FIELD_NUMBER = 50003 -wire_out = _descriptor.FieldDescriptor( - name='wire_out', full_name='wire_out', index=2, - number=50003, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - options=None) -WIRE_DEBUG_IN_FIELD_NUMBER = 50004 -wire_debug_in = _descriptor.FieldDescriptor( - name='wire_debug_in', full_name='wire_debug_in', index=3, - number=50004, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - options=None) -WIRE_DEBUG_OUT_FIELD_NUMBER = 50005 -wire_debug_out = _descriptor.FieldDescriptor( - name='wire_debug_out', full_name='wire_debug_out', index=4, - number=50005, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - options=None) - - -_HDNODETYPE = _descriptor.Descriptor( - name='HDNodeType', - full_name='HDNodeType', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='version', full_name='HDNodeType.version', index=0, - number=1, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='depth', full_name='HDNodeType.depth', index=1, - number=2, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='fingerprint', full_name='HDNodeType.fingerprint', index=2, - number=3, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='child_num', full_name='HDNodeType.child_num', index=3, - number=4, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='chain_code', full_name='HDNodeType.chain_code', index=4, - number=5, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), - _descriptor.FieldDescriptor( - name='private_key', full_name='HDNodeType.private_key', index=5, - number=6, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), - _descriptor.FieldDescriptor( - name='public_key', full_name='HDNodeType.public_key', index=6, - number=7, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=51, - serialized_end=214, -) - -_COINTYPE = _descriptor.Descriptor( - name='CoinType', - full_name='CoinType', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='coin_name', full_name='CoinType.coin_name', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='coin_shortcut', full_name='CoinType.coin_shortcut', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='address_type', full_name='CoinType.address_type', index=2, - number=3, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='maxfee_kb', full_name='CoinType.maxfee_kb', index=3, - number=4, type=4, cpp_type=4, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=216, - serialized_end=309, -) - - -_SETTINGSTYPE = _descriptor.Descriptor( - name='SettingsType', - full_name='SettingsType', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='language', full_name='SettingsType.language', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='coin', full_name='SettingsType.coin', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='label', full_name='SettingsType.label', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=311, - serialized_end=383, -) -======= - ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py _INITIALIZE = _descriptor.Descriptor( @@ -590,13 +245,8 @@ _INITIALIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=385, - serialized_end=397, -======= serialized_start=31, serialized_end=43, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -693,13 +343,8 @@ _FEATURES = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=400, - serialized_end=627, -======= serialized_start=46, serialized_end=312, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -740,13 +385,8 @@ _APPLYSETTINGS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=629, - serialized_end=700, -======= serialized_start=314, serialized_end=391, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -773,13 +413,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=702, - serialized_end=729, -======= serialized_start=393, serialized_end=420, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -806,13 +441,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=731, - serialized_end=754, -======= serialized_start=422, serialized_end=445, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -839,13 +469,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=756, - serialized_end=782, -======= serialized_start=447, serialized_end=473, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -879,13 +504,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=784, - serialized_end=838, -======= serialized_start=475, serialized_end=529, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -905,13 +525,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=840, - serialized_end=855, -======= serialized_start=531, serialized_end=546, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -931,13 +546,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=857, - serialized_end=868, -======= serialized_start=548, serialized_end=559, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -964,13 +574,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=870, - serialized_end=884, -======= serialized_start=561, serialized_end=596, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -997,13 +602,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=886, - serialized_end=921, -======= serialized_start=598, serialized_end=625, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1044,13 +644,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=923, - serialized_end=950, -======= serialized_start=637, serialized_end=656, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1077,13 +672,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=952, - serialized_end=969, -======= serialized_start=658, serialized_end=699, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1110,13 +700,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=971, - serialized_end=997, -======= serialized_start=701, serialized_end=727, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1143,13 +728,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=999, - serialized_end=1031, -======= serialized_start=729, serialized_end=761, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1176,13 +756,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=1033, - serialized_end=1066, -======= serialized_start=763, serialized_end=796, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1194,11 +769,7 @@ _PUBLICKEY = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( -<<<<<<< HEAD:trezorlib/trezor_pb2.py - name='mpk', full_name='PublicKey.mpk', index=0, -======= name='node', full_name='PublicKey.node', index=0, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py number=1, type=11, cpp_type=10, label=2, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -1213,13 +784,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=1068, - serialized_end=1105, -======= serialized_start=798, serialized_end=836, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1246,13 +812,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=1107, - serialized_end=1138, -======= serialized_start=838, serialized_end=869, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1279,13 +840,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=1140, - serialized_end=1166, -======= serialized_start=871, serialized_end=897, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1305,13 +861,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=1168, - serialized_end=1180, -======= serialized_start=899, serialized_end=911, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1352,13 +903,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=1182, - serialized_end=1248, -======= serialized_start=913, serialized_end=979, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1385,13 +931,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=1250, - serialized_end=1287, -======= serialized_start=981, serialized_end=1018, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1411,13 +952,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=1289, - serialized_end=1305, -======= serialized_start=1020, serialized_end=1036, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1444,10 +980,6 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=1307, - serialized_end=1342, -======= serialized_start=1038, serialized_end=1073, ) @@ -1562,7 +1094,6 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( extension_ranges=[], serialized_start=1208, serialized_end=1262, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1596,13 +1127,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=1344, - serialized_end=1397, -======= serialized_start=1264, serialized_end=1317, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1636,13 +1162,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=1399, - serialized_end=1467, -======= serialized_start=1319, serialized_end=1387, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1697,13 +1218,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=1470, - serialized_end=1616, -======= serialized_start=1390, serialized_end=1536, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1715,43 +1231,9 @@ _TXINPUT = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( -<<<<<<< HEAD:trezorlib/trezor_pb2.py - name='address_n', full_name='TxInput.address_n', index=0, - number=1, type=13, cpp_type=3, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='prev_hash', full_name='TxInput.prev_hash', index=1, - number=2, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), - _descriptor.FieldDescriptor( - name='prev_index', full_name='TxInput.prev_index', index=2, - number=3, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='script_sig', full_name='TxInput.script_sig', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), - _descriptor.FieldDescriptor( - name='sequence', full_name='TxInput.sequence', index=4, - number=5, type=13, cpp_type=3, label=1, - has_default_value=True, default_value=4294967295, -======= name='input', full_name='TxInput.input', index=0, number=1, type=11, cpp_type=10, label=2, has_default_value=False, default_value=None, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1764,13 +1246,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=1619, - serialized_end=1748, -======= serialized_start=1538, serialized_end=1576, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1782,84 +1259,12 @@ _TXOUTPUT = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( -<<<<<<< HEAD:trezorlib/trezor_pb2.py - name='address', full_name='TxOutput.address', index=0, - number=1, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='address_n', full_name='TxOutput.address_n', index=1, - number=2, type=13, cpp_type=3, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='amount', full_name='TxOutput.amount', index=2, - number=3, type=4, cpp_type=4, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='script_type', full_name='TxOutput.script_type', index=3, - number=4, type=14, cpp_type=8, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='script_args', full_name='TxOutput.script_args', index=4, - number=5, type=12, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=1750, - serialized_end=1873, -) - - -_TRANSACTIONTYPE_TXOUTPUTBIN = _descriptor.Descriptor( - name='TxOutputBin', - full_name='TransactionType.TxOutputBin', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='amount', full_name='TransactionType.TxOutputBin.amount', index=0, - number=1, type=4, cpp_type=4, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='script_pubkey', full_name='TransactionType.TxOutputBin.script_pubkey', index=1, - number=2, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), -======= name='output', full_name='TxOutput.output', index=0, number=1, type=11, cpp_type=10, label=2, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ], extensions=[ ], @@ -1869,61 +1274,8 @@ _TRANSACTIONTYPE_TXOUTPUTBIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=2010, - serialized_end=2068, -) - -_TRANSACTIONTYPE = _descriptor.Descriptor( - name='TransactionType', - full_name='TransactionType', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='version', full_name='TransactionType.version', index=0, - number=1, type=13, cpp_type=3, label=1, - has_default_value=True, default_value=1, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='inputs', full_name='TransactionType.inputs', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='outputs', full_name='TransactionType.outputs', index=2, - number=3, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='lock_time', full_name='TransactionType.lock_time', index=3, - number=4, type=13, cpp_type=3, label=1, - has_default_value=True, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[_TRANSACTIONTYPE_TXOUTPUTBIN, ], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=1876, - serialized_end=2068, -======= serialized_start=1578, serialized_end=1619, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1943,13 +1295,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=2070, - serialized_end=2085, -======= serialized_start=1621, serialized_end=1636, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -1976,13 +1323,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=2087, - serialized_end=2126, -======= serialized_start=1638, serialized_end=1677, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -2009,13 +1351,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=2128, - serialized_end=2163, -======= serialized_start=1679, serialized_end=1714, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -2063,13 +1400,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=2165, - serialized_end=2243, -======= serialized_start=1716, serialized_end=1794, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -2117,13 +1449,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=2245, - serialized_end=2326, -======= serialized_start=1796, serialized_end=1877, ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py ) @@ -2143,27 +1470,6 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], -<<<<<<< HEAD:trezorlib/trezor_pb2.py - serialized_start=2328, - serialized_end=2343, -) - -_SETTINGSTYPE.fields_by_name['coin'].message_type = _COINTYPE -_FEATURES.fields_by_name['settings'].message_type = _SETTINGSTYPE -_FAILURE.fields_by_name['code'].enum_type = _FAILURETYPE -_PUBLICKEY.fields_by_name['mpk'].message_type = _HDNODETYPE -_LOADDEVICE.fields_by_name['node'].message_type = _HDNODETYPE -_SIMPLESIGNTX.fields_by_name['inputs'].message_type = _TXINPUT -_SIMPLESIGNTX.fields_by_name['outputs'].message_type = _TXOUTPUT -_TXREQUEST.fields_by_name['request_type'].enum_type = _REQUESTTYPE -_TXOUTPUT.fields_by_name['script_type'].enum_type = _SCRIPTTYPE -_TRANSACTIONTYPE_TXOUTPUTBIN.containing_type = _TRANSACTIONTYPE; -_TRANSACTIONTYPE.fields_by_name['inputs'].message_type = _TXINPUT -_TRANSACTIONTYPE.fields_by_name['outputs'].message_type = _TRANSACTIONTYPE_TXOUTPUTBIN -DESCRIPTOR.message_types_by_name['HDNodeType'] = _HDNODETYPE -DESCRIPTOR.message_types_by_name['CoinType'] = _COINTYPE -DESCRIPTOR.message_types_by_name['SettingsType'] = _SETTINGSTYPE -======= serialized_start=1879, serialized_end=1894, ) @@ -2177,7 +1483,6 @@ _SIMPLESIGNTX.fields_by_name['outputs'].message_type = _TXOUTPUT _TXREQUEST.fields_by_name['request_type'].enum_type = types_pb2._REQUESTTYPE _TXINPUT.fields_by_name['input'].message_type = types_pb2._TXINPUTTYPE _TXOUTPUT.fields_by_name['output'].message_type = types_pb2._TXOUTPUTTYPE ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE DESCRIPTOR.message_types_by_name['Features'] = _FEATURES DESCRIPTOR.message_types_by_name['ApplySettings'] = _APPLYSETTINGS @@ -2211,7 +1516,6 @@ DESCRIPTOR.message_types_by_name['SimpleSignTx'] = _SIMPLESIGNTX DESCRIPTOR.message_types_by_name['TxRequest'] = _TXREQUEST DESCRIPTOR.message_types_by_name['TxInput'] = _TXINPUT DESCRIPTOR.message_types_by_name['TxOutput'] = _TXOUTPUT -DESCRIPTOR.message_types_by_name['TransactionType'] = _TRANSACTIONTYPE DESCRIPTOR.message_types_by_name['FirmwareErase'] = _FIRMWAREERASE DESCRIPTOR.message_types_by_name['FirmwareUpload'] = _FIRMWAREUPLOAD DESCRIPTOR.message_types_by_name['DebugLinkDecision'] = _DEBUGLINKDECISION @@ -2219,27 +1523,6 @@ DESCRIPTOR.message_types_by_name['DebugLinkGetState'] = _DEBUGLINKGETSTATE DESCRIPTOR.message_types_by_name['DebugLinkState'] = _DEBUGLINKSTATE DESCRIPTOR.message_types_by_name['DebugLinkStop'] = _DEBUGLINKSTOP -<<<<<<< HEAD:trezorlib/trezor_pb2.py -class HDNodeType(_message.Message): - __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _HDNODETYPE - - # @@protoc_insertion_point(class_scope:HDNodeType) - -class CoinType(_message.Message): - __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _COINTYPE - - # @@protoc_insertion_point(class_scope:CoinType) - -class SettingsType(_message.Message): - __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _SETTINGSTYPE - - # @@protoc_insertion_point(class_scope:SettingsType) - -======= ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py class Initialize(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _INITIALIZE @@ -2438,18 +1721,6 @@ class TxOutput(_message.Message): # @@protoc_insertion_point(class_scope:TxOutput) -class TransactionType(_message.Message): - __metaclass__ = _reflection.GeneratedProtocolMessageType - - class TxOutputBin(_message.Message): - __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _TRANSACTIONTYPE_TXOUTPUTBIN - - # @@protoc_insertion_point(class_scope:TransactionType.TxOutputBin) - DESCRIPTOR = _TRANSACTIONTYPE - - # @@protoc_insertion_point(class_scope:TransactionType) - class FirmwareErase(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _FIRMWAREERASE @@ -2565,15 +1836,6 @@ _MESSAGETYPE.values_by_name["MessageType_DebugLinkState"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkState"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkStop"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkStop"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001') -<<<<<<< HEAD:trezorlib/trezor_pb2.py -_HDNODETYPE.fields_by_name['chain_code'].has_options = True -_HDNODETYPE.fields_by_name['chain_code']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_HDNODETYPE.fields_by_name['private_key'].has_options = True -_HDNODETYPE.fields_by_name['private_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_HDNODETYPE.fields_by_name['public_key'].has_options = True -_HDNODETYPE.fields_by_name['public_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -======= ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py _FEATURES.fields_by_name['device_id'].has_options = True _FEATURES.fields_by_name['device_id']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _FEATURES.fields_by_name['label'].has_options = True @@ -2594,17 +1856,6 @@ _TXREQUEST.fields_by_name['signature'].has_options = True _TXREQUEST.fields_by_name['signature']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _TXREQUEST.fields_by_name['serialized_tx'].has_options = True _TXREQUEST.fields_by_name['serialized_tx']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -<<<<<<< HEAD:trezorlib/trezor_pb2.py -_TXINPUT.fields_by_name['prev_hash'].has_options = True -_TXINPUT.fields_by_name['prev_hash']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_TXINPUT.fields_by_name['script_sig'].has_options = True -_TXINPUT.fields_by_name['script_sig']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_TXOUTPUT.fields_by_name['script_args'].has_options = True -_TXOUTPUT.fields_by_name['script_args']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_TRANSACTIONTYPE_TXOUTPUTBIN.fields_by_name['script_pubkey'].has_options = True -_TRANSACTIONTYPE_TXOUTPUTBIN.fields_by_name['script_pubkey']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -======= ->>>>>>> Protobuf moved to trezor-common repository:trezorlib/messages_pb2.py _FIRMWAREUPLOAD.fields_by_name['payload'].has_options = True _FIRMWAREUPLOAD.fields_by_name['payload']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _DEBUGLINKSTATE.fields_by_name['layout'].has_options = True From d3df313442dbaa2a84f5950fd2a137f17e5982fe Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 16 Dec 2013 16:26:40 +0100 Subject: [PATCH 0132/1535] cleanup protobuf mess --- build_pb.sh | 9 ++- protob/build.sh | 6 -- tests/test_signtx.py | 2 +- trezorlib/__init__.py | 4 +- trezorlib/ckd_public.py | 2 +- trezorlib/client.py | 2 +- trezorlib/debuglink.py | 2 +- trezorlib/mapping.py | 2 +- trezorlib/messages_pb2.py | 130 ++++++++++++++++++-------------------- 9 files changed, 76 insertions(+), 83 deletions(-) delete mode 100755 protob/build.sh diff --git a/build_pb.sh b/build_pb.sh index 53461d5d7..fd7dac416 100755 --- a/build_pb.sh +++ b/build_pb.sh @@ -1,3 +1,8 @@ #!/bin/bash -cd ./trezor-common/protob -protoc --python_out=../../trezorlib/ -I/usr/include -I. -I. trezor.proto +CURDIR=$(pwd) + +cd $CURDIR/../trezor-common/protob + +for i in messages types ; do + protoc --python_out=$CURDIR/trezorlib/ -I/usr/include -I. $i.proto +done diff --git a/protob/build.sh b/protob/build.sh deleted file mode 100755 index 2f71587c0..000000000 --- a/protob/build.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -cd `dirname $0`/../../trezor-common/protob - -protoc --python_out=../../trezor-emu/trezor/ -I/usr/include -I. types.proto -protoc --python_out=../../trezor-emu/trezor/ -I/usr/include -I. messages.proto diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 9b651013a..1974fe7bf 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -2,7 +2,7 @@ import unittest import common import binascii -import trezorlib.trezor_pb2 as proto +import trezorlib.messages_pb2 as proto ''' ./electrum -w ~/.electrum-bitkey mktx 1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv 0.001 diff --git a/trezorlib/__init__.py b/trezorlib/__init__.py index c171386e3..0364d5c95 100644 --- a/trezorlib/__init__.py +++ b/trezorlib/__init__.py @@ -1,6 +1,6 @@ try: - import trezor_pb2 as proto + import messages_pb2 as proto except ImportError: - print "Source trezor_pb2.py not found. Make sure python-protobuf is installed and run build_pb.sh to generate it." + print "Source messages_pb2.py or types_pb2.py not found. Make sure python-protobuf is installed and run build_pb.sh to generate it." import sys sys.exit() diff --git a/trezorlib/ckd_public.py b/trezorlib/ckd_public.py index eaae85a87..f3cc43e1c 100644 --- a/trezorlib/ckd_public.py +++ b/trezorlib/ckd_public.py @@ -4,7 +4,7 @@ import hashlib from ecdsa.util import string_to_number from ecdsa.curves import SECP256k1 -import trezor_pb2 as proto +import messages_pb2 as proto PRIME_DERIVATION_FLAG = 0x80000000 diff --git a/trezorlib/client.py b/trezorlib/client.py index 61ee3c417..2b3035418 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -2,7 +2,7 @@ import os import time import ckd_public -import trezor_pb2 as proto +import messages_pb2 as proto def show_message(message): print "MESSAGE FROM DEVICE:", message diff --git a/trezorlib/debuglink.py b/trezorlib/debuglink.py index 0c7dc550d..f60a60635 100644 --- a/trezorlib/debuglink.py +++ b/trezorlib/debuglink.py @@ -1,4 +1,4 @@ -import trezor_pb2 as proto +import messages_pb2 as proto from transport import NotImplementedException def pin_info(pin): diff --git a/trezorlib/mapping.py b/trezorlib/mapping.py index 6221c6189..f631ed0b5 100644 --- a/trezorlib/mapping.py +++ b/trezorlib/mapping.py @@ -1,4 +1,4 @@ -import trezor_pb2 as proto +import messages_pb2 as proto map_type_to_class = {} map_class_to_type = {} diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index cc426fd96..3dd1b0063 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"M\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x13\n\x05label\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"B\n\nLoadDevice\x12\x0c\n\x04seed\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"7\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"N\n\x11\x44\x65\x62ugLinkGetState\x12\x0e\n\x06layout\x18\x01 \x01(\x08\x12\x0b\n\x03pin\x18\x02 \x01(\x08\x12\x0e\n\x06matrix\x18\x03 \x01(\x08\x12\x0c\n\x04seed\x18\x04 \x01(\x08\"Q\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x0c\n\x04seed\x18\x04 \x01(\x0c\"\x0f\n\rDebugLinkStop*\xdd\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"M\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x13\n\x05label\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"e\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"7\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop*\xdd\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -182,8 +182,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1897, - serialized_end=3270, + serialized_start=1936, + serialized_end=3309, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -874,7 +874,7 @@ _LOADDEVICE = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='seed', full_name='LoadDevice.seed', index=0, + name='mnemonic', full_name='LoadDevice.mnemonic', index=0, number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, @@ -894,6 +894,13 @@ _LOADDEVICE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='passphrase_protection', full_name='LoadDevice.passphrase_protection', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -904,7 +911,7 @@ _LOADDEVICE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=913, - serialized_end=979, + serialized_end=1014, ) @@ -931,8 +938,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=981, - serialized_end=1018, + serialized_start=1016, + serialized_end=1053, ) @@ -952,8 +959,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1020, - serialized_end=1036, + serialized_start=1055, + serialized_end=1071, ) @@ -980,8 +987,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1038, - serialized_end=1073, + serialized_start=1073, + serialized_end=1108, ) @@ -1015,8 +1022,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1075, - serialized_end=1130, + serialized_start=1110, + serialized_end=1165, ) @@ -1057,8 +1064,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1132, - serialized_end=1206, + serialized_start=1167, + serialized_end=1241, ) @@ -1092,8 +1099,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1208, - serialized_end=1262, + serialized_start=1243, + serialized_end=1297, ) @@ -1127,8 +1134,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1264, - serialized_end=1317, + serialized_start=1299, + serialized_end=1352, ) @@ -1162,8 +1169,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1319, - serialized_end=1387, + serialized_start=1354, + serialized_end=1422, ) @@ -1218,8 +1225,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1390, - serialized_end=1536, + serialized_start=1425, + serialized_end=1571, ) @@ -1246,8 +1253,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1538, - serialized_end=1576, + serialized_start=1573, + serialized_end=1611, ) @@ -1274,8 +1281,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1578, - serialized_end=1619, + serialized_start=1613, + serialized_end=1654, ) @@ -1295,8 +1302,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1621, - serialized_end=1636, + serialized_start=1656, + serialized_end=1671, ) @@ -1323,8 +1330,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1638, - serialized_end=1677, + serialized_start=1673, + serialized_end=1712, ) @@ -1351,8 +1358,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1679, - serialized_end=1714, + serialized_start=1714, + serialized_end=1749, ) @@ -1363,34 +1370,6 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( file=DESCRIPTOR, containing_type=None, fields=[ - _descriptor.FieldDescriptor( - name='layout', full_name='DebugLinkGetState.layout', index=0, - number=1, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='pin', full_name='DebugLinkGetState.pin', index=1, - number=2, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='matrix', full_name='DebugLinkGetState.matrix', index=2, - number=3, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='seed', full_name='DebugLinkGetState.seed', index=3, - number=4, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -1400,8 +1379,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1716, - serialized_end=1794, + serialized_start=1751, + serialized_end=1770, ) @@ -1434,12 +1413,26 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='seed', full_name='DebugLinkState.seed', index=3, + name='mnemonic', full_name='DebugLinkState.mnemonic', index=3, number=4, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='node', full_name='DebugLinkState.node', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='passphrase_protection', full_name='DebugLinkState.passphrase_protection', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -1449,8 +1442,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1796, - serialized_end=1877, + serialized_start=1773, + serialized_end=1916, ) @@ -1470,8 +1463,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1879, - serialized_end=1894, + serialized_start=1918, + serialized_end=1933, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -1483,6 +1476,7 @@ _SIMPLESIGNTX.fields_by_name['outputs'].message_type = _TXOUTPUT _TXREQUEST.fields_by_name['request_type'].enum_type = types_pb2._REQUESTTYPE _TXINPUT.fields_by_name['input'].message_type = types_pb2._TXINPUTTYPE _TXOUTPUT.fields_by_name['output'].message_type = types_pb2._TXOUTPUTTYPE +_DEBUGLINKSTATE.fields_by_name['node'].message_type = types_pb2._HDNODETYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE DESCRIPTOR.message_types_by_name['Features'] = _FEATURES DESCRIPTOR.message_types_by_name['ApplySettings'] = _APPLYSETTINGS From b4ff6139ae708d86527d15dfdfde89a650f2af85 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 16 Dec 2013 18:02:34 +0100 Subject: [PATCH 0133/1535] Refactored code to follow trezor-common structures --- trezorlib/__init__.py | 6 ------ trezorlib/client.py | 17 +++++++++-------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/trezorlib/__init__.py b/trezorlib/__init__.py index 0364d5c95..e69de29bb 100644 --- a/trezorlib/__init__.py +++ b/trezorlib/__init__.py @@ -1,6 +0,0 @@ -try: - import messages_pb2 as proto -except ImportError: - print "Source messages_pb2.py or types_pb2.py not found. Make sure python-protobuf is installed and run build_pb.sh to generate it." - import sys - sys.exit() diff --git a/trezorlib/client.py b/trezorlib/client.py index 2b3035418..22c2375ba 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -3,6 +3,7 @@ import time import ckd_public import messages_pb2 as proto +import types_pb2 as types def show_message(message): print "MESSAGE FROM DEVICE:", message @@ -108,7 +109,7 @@ class TrezorClient(object): pin = self.debuglink.read_pin_encoded() msg2 = proto.PinMatrixAck(pin=pin) elif self.debug_pin == -1: - msg2 = proto.PinMatrixCancel() + msg2 = proto.Cancel() else: msg2 = proto.PinMatrixAck(pin='444444222222') @@ -124,10 +125,10 @@ class TrezorClient(object): if isinstance(resp, proto.Failure): self.message_func(resp.message) - if resp.code == proto.Failure_ActionCancelled: + if resp.code == types.Failure_ActionCancelled: raise CallException("Action cancelled by user") - elif resp.code == proto.Failure_PinInvalid: + elif resp.code == types.Failure_PinInvalid: raise PinException("PIN is invalid") raise CallException(resp.code, resp.message) @@ -210,11 +211,11 @@ class TrezorClient(object): break # Device asked for one more information, let's process it. - if res.request_type == proto.TXOUTPUT: + if res.request_type == types.TXOUTPUT: res = self.call(outputs[res.request_index]) continue - elif res.request_type == proto.TXINPUT: + elif res.request_type == types.TXINPUT: print "REQUESTING", res.request_index res = self.call(inputs[res.request_index]) continue @@ -274,7 +275,7 @@ class TrezorClient(object): if not isinstance(n, list): raise Exception('Parameter must be a list') - node = proto.HDNodeType() + node = types.HDNodeType() node.CopyFrom(public_node) for i in n: @@ -287,14 +288,14 @@ class TrezorClient(object): raise Exception("Device must be in bootloader mode") resp = self.call(proto.FirmwareErase()) - if isinstance(resp, proto.Failure) and resp.code == proto.Failure_FirmwareError: + if isinstance(resp, proto.Failure) and resp.code == types.Failure_FirmwareError: return False resp = self.call(proto.FirmwareUpload(payload=fp.read())) if isinstance(resp, proto.Success): return True - elif isinstance(resp, proto.Failure) and resp.code == proto.Failure_FirmwareError: + elif isinstance(resp, proto.Failure) and resp.code == types.Failure_FirmwareError: return False raise Exception("Unexpected result " % resp) From 56eb483f70af711ce0e1f970776a566e7f2220c4 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 30 Dec 2013 23:34:56 +0100 Subject: [PATCH 0134/1535] Added base58 decoder --- trezorlib/tools.py | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 trezorlib/tools.py diff --git a/trezorlib/tools.py b/trezorlib/tools.py new file mode 100644 index 000000000..3e0837196 --- /dev/null +++ b/trezorlib/tools.py @@ -0,0 +1,55 @@ +__b58chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' +__b58base = len(__b58chars) + + +def b58encode(v): + """ encode v, which is a string of bytes, to base58.""" + + long_value = 0L + for (i, c) in enumerate(v[::-1]): + long_value += (256 ** i) * ord(c) + + result = '' + while long_value >= __b58base: + div, mod = divmod(long_value, __b58base) + result = __b58chars[mod] + result + long_value = div + result = __b58chars[long_value] + result + + # Bitcoin does a little leading-zero-compression: + # leading 0-bytes in the input become leading-1s + nPad = 0 + for c in v: + if c == '\0': + nPad += 1 + else: + break + + return (__b58chars[0] * nPad) + result + + +def b58decode(v, length): + """ decode v into a string of len bytes.""" + long_value = 0L + for (i, c) in enumerate(v[::-1]): + long_value += __b58chars.find(c) * (__b58base ** i) + + result = '' + while long_value >= 256: + div, mod = divmod(long_value, 256) + result = chr(mod) + result + long_value = div + result = chr(long_value) + result + + nPad = 0 + for c in v: + if c == __b58chars[0]: + nPad += 1 + else: + break + + result = chr(0) * nPad + result + if length is not None and len(result) != length: + return None + + return result From e542c2dc29846bd37cb8ede5df02b257f85d4c33 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 30 Dec 2013 23:35:20 +0100 Subject: [PATCH 0135/1535] Fixed load_device, including command line --- cmd.py | 19 ++++++++++-------- tests/common.py | 3 +-- tests/test_basic.py | 8 ++++---- trezorlib/client.py | 49 ++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 62 insertions(+), 17 deletions(-) diff --git a/cmd.py b/cmd.py index 920394779..276eb41d1 100755 --- a/cmd.py +++ b/cmd.py @@ -99,9 +99,6 @@ class Commands(object): def get_public_node(self, args): return self.client.get_public_node(args.n) - def get_serial_number(self, args): - return binascii.hexlify(self.client.get_serial_number()) - def set_label(self, args): return self.client.apply_settings(label=args.label) @@ -109,9 +106,14 @@ class Commands(object): return self.client.apply_settings(coin_shortcut=args.coin_shortcut) def load_device(self, args): - seed = ' '.join(args.seed) + if not args.mnemonic and not args.xprv: + raise Exception("Please provide mnemonic or xprv") + + if args.mnemonic: + mnemonic = ' '.join(args.mnemonic) + return self.client.load_device_by_mnemonic(mnemonic, args.pin, args.passphrase_protection) - return self.client.load_device(seed, args.pin) + return self.client.load_device_by_xprv(args.xprv, args.pin, args.passphrase_protection) def sign_message(self, args): return self.client.sign_message(args.n, args.message) @@ -134,7 +136,6 @@ class Commands(object): get_address.help = 'Get bitcoin address in base58 encoding' get_entropy.help = 'Get example entropy' get_features.help = 'Retrieve device features and settings' - get_serial_number.help = 'Get device\'s unique identifier' get_public_node.help = 'Get public node of given path' set_label.help = 'Set new wallet label' set_coin.help = 'Switch device to another crypto currency' @@ -166,8 +167,10 @@ class Commands(object): ) load_device.arguments = ( - (('-s', '--seed'), {'type': str, 'nargs': '+'}), - (('-n', '--pin'), {'type': str, 'default': ''}), + (('-m', '--mnemonic'), {'type': str, 'nargs': '+'}), + (('-x', '--xprv'), {'type': str}), + (('-p', '--pin'), {'type': str, 'default': ''}), + (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), ) sign_message.arguments = ( diff --git a/tests/common.py b/tests/common.py index 67367ab4b..9cd60e43e 100644 --- a/tests/common.py +++ b/tests/common.py @@ -3,7 +3,6 @@ import config from trezorlib.client import TrezorClient from trezorlib.debuglink import DebugLink -from trezorlib import proto class TrezorTest(unittest.TestCase): def setUp(self): @@ -19,7 +18,7 @@ class TrezorTest(unittest.TestCase): self.client.setup_debuglink(button=True, pin_correct=True) self.client.load_device( - seed=self.mnemonic1, + mnemonic=self.mnemonic1, pin=self.pin1) self.client.apply_settings(label='unit testing', coin_shortcut='BTC', language='english') diff --git a/tests/test_basic.py b/tests/test_basic.py index e25a47951..cfb61e9d0 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -1,7 +1,7 @@ import unittest import common -from trezorlib import proto +from trezorlib import messages_pb2 as messages ''' TODO: @@ -14,16 +14,16 @@ from trezorlib import proto class TestBasic(common.TrezorTest): def test_features(self): - features = self.client.call(proto.Initialize()) + features = self.client.call(messages.Initialize()) # Result is the same as reported by BitkeyClient class self.assertEqual(features, self.client.features) def test_ping(self): - ping = self.client.call(proto.Ping(message='ahoj!')) + ping = self.client.call(messages.Ping(message='ahoj!')) # Ping results in Success(message='Ahoj!') - self.assertEqual(ping, proto.Success(message='ahoj!')) + self.assertEqual(ping, messages.Success(message='ahoj!')) def test_uuid(self): uuid1 = self.client.get_device_id() diff --git a/trezorlib/client.py b/trezorlib/client.py index 22c2375ba..d3440d663 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -2,6 +2,7 @@ import os import time import ckd_public +import tools import messages_pb2 as proto import types_pb2 as types @@ -22,6 +23,8 @@ class CallException(Exception): class PinException(CallException): pass +PRIME_DERIVATION_FLAG = 0x80000000 + class TrezorClient(object): def __init__(self, transport, debuglink=None, @@ -39,6 +42,10 @@ class TrezorClient(object): def _get_local_entropy(self): return os.urandom(32) + + def _convert_prime(self, n): + # Convert minus signs to uint32 with flag + return [ int(abs(x) | PRIME_DERIVATION_FLAG) if x < 0 else x for x in n ] def init_device(self): self.features = self.call(proto.Initialize()) @@ -49,10 +56,11 @@ class TrezorClient(object): self.debuglink.transport.close() def get_public_node(self, n): - # print self.bip32_ckd(self.call(proto.GetPublicKey(address_n=n)).node, [2, ]) + n = self._convert_prime(n) return self.call(proto.GetPublicKey(address_n=n)).node def get_address(self, n): + n = self._convert_prime(n) return self.call(proto.GetAddress(address_n=n)).address def get_entropy(self, size): @@ -139,6 +147,7 @@ class TrezorClient(object): return resp def sign_message(self, n, message): + n = self._convert_prime(n) return self.call(proto.SignMessage(address_n=n, message=message)) def verify_message(self, address, signature, message): @@ -266,8 +275,42 @@ class TrezorClient(object): self.init_device() return isinstance(resp, proto.Success) - def load_device(self, seed, pin): - resp = self.call(proto.LoadDevice(seed=seed, pin=pin)) + def load_device_by_mnemonic(self, mnemonic, pin, passphrase_protection): + resp = self.call(proto.LoadDevice(mnemonic=mnemonic, pin=pin, passphrase_protection=passphrase_protection)) + self.init_device() + return isinstance(resp, proto.Success) + + def load_device_by_xprv(self, xprv, pin, passphrase_protection): + if xprv[0:4] not in ('xprv', 'tprv'): + raise Exception("Unknown type of xprv") + + if len(xprv) < 100 and len(xprv) > 112: + raise Exception("Invalid length of xprv") + + node = types.HDNodeType() + data = tools.b58decode(xprv, None).encode('hex') + + if data[90:92] != '00': + raise Exception("Contain invalid private key") + + # version 0488ade4 + # depth 00 + # fingerprint 00000000 + # child_num 00000000 + # chaincode 873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508 + # privkey 00e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35 + # wtf is this? e77e9d71 + + node.version = int(data[0:8], 16) + node.depth = int(data[8:10], 16) + node.fingerprint = int(data[10:18], 16) + node.child_num = int(data[18:26], 16) + node.chain_code = data[26:90].decode('hex') + node.private_key = data[92:156].decode('hex') # skip 0x00 indicating privkey + print 'wtf is this?', len(data[156:]) + # FIXME + + resp = self.call(proto.LoadDevice(node=node, pin=pin, passphrase_protection=passphrase_protection)) self.init_device() return isinstance(resp, proto.Success) From f0e7c61cdd057cb3bc6af5ce1610dfd04a6bb4db Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 6 Jan 2014 01:54:31 +0100 Subject: [PATCH 0136/1535] Compiled pb --- trezorlib/messages_pb2.py | 131 ++++++++++++++++++++++++++------------ 1 file changed, 92 insertions(+), 39 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 3dd1b0063..67747f35e 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"M\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x13\n\x05label\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"e\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"%\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"7\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop*\xdd\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"M\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x13\n\x05label\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"7\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop*\xdd\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -182,8 +182,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1936, - serialized_end=3309, + serialized_start=2112, + serialized_end=3485, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -901,6 +901,20 @@ _LOADDEVICE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='language', full_name='LoadDevice.language', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=True, default_value="english", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='label', full_name='LoadDevice.label', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), ], extensions=[ ], @@ -910,8 +924,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=913, - serialized_end=1014, + serialized_start=914, + serialized_end=1063, ) @@ -929,6 +943,41 @@ _RESETDEVICE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='strength', full_name='ResetDevice.strength', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=128, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='passphrase_protection', full_name='ResetDevice.passphrase_protection', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pin_protection', full_name='ResetDevice.pin_protection', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='language', full_name='ResetDevice.language', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=True, default_value="english", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='label', full_name='ResetDevice.label', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), ], extensions=[ ], @@ -938,8 +987,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1016, - serialized_end=1053, + serialized_start=1066, + serialized_end=1229, ) @@ -959,8 +1008,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1055, - serialized_end=1071, + serialized_start=1231, + serialized_end=1247, ) @@ -987,8 +1036,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1073, - serialized_end=1108, + serialized_start=1249, + serialized_end=1284, ) @@ -1022,8 +1071,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1110, - serialized_end=1165, + serialized_start=1286, + serialized_end=1341, ) @@ -1064,8 +1113,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1167, - serialized_end=1241, + serialized_start=1343, + serialized_end=1417, ) @@ -1099,8 +1148,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1243, - serialized_end=1297, + serialized_start=1419, + serialized_end=1473, ) @@ -1134,8 +1183,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1299, - serialized_end=1352, + serialized_start=1475, + serialized_end=1528, ) @@ -1169,8 +1218,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1354, - serialized_end=1422, + serialized_start=1530, + serialized_end=1598, ) @@ -1225,8 +1274,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1425, - serialized_end=1571, + serialized_start=1601, + serialized_end=1747, ) @@ -1253,8 +1302,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1573, - serialized_end=1611, + serialized_start=1749, + serialized_end=1787, ) @@ -1281,8 +1330,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1613, - serialized_end=1654, + serialized_start=1789, + serialized_end=1830, ) @@ -1302,8 +1351,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1656, - serialized_end=1671, + serialized_start=1832, + serialized_end=1847, ) @@ -1330,8 +1379,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1673, - serialized_end=1712, + serialized_start=1849, + serialized_end=1888, ) @@ -1358,8 +1407,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1714, - serialized_end=1749, + serialized_start=1890, + serialized_end=1925, ) @@ -1379,8 +1428,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1751, - serialized_end=1770, + serialized_start=1927, + serialized_end=1946, ) @@ -1442,8 +1491,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1773, - serialized_end=1916, + serialized_start=1949, + serialized_end=2092, ) @@ -1463,8 +1512,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1918, - serialized_end=1933, + serialized_start=2094, + serialized_end=2109, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -1840,6 +1889,10 @@ _PASSPHRASEACK.fields_by_name['passphrase'].has_options = True _PASSPHRASEACK.fields_by_name['passphrase']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _ENTROPY.fields_by_name['entropy'].has_options = True _ENTROPY.fields_by_name['entropy']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_LOADDEVICE.fields_by_name['label'].has_options = True +_LOADDEVICE.fields_by_name['label']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_RESETDEVICE.fields_by_name['label'].has_options = True +_RESETDEVICE.fields_by_name['label']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _ENTROPYACK.fields_by_name['entropy'].has_options = True _ENTROPYACK.fields_by_name['entropy']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _SIGNMESSAGE.fields_by_name['message'].has_options = True From dc671173d04dbc8464c36fa25326c0cf373c3ab8 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 6 Jan 2014 01:54:53 +0100 Subject: [PATCH 0137/1535] Implemented ResetDevice --- cmd.py | 20 +++++++++++++++++--- trezorlib/client.py | 38 ++++++++++++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/cmd.py b/cmd.py index 276eb41d1..8b2bb8676 100755 --- a/cmd.py +++ b/cmd.py @@ -111,9 +111,13 @@ class Commands(object): if args.mnemonic: mnemonic = ' '.join(args.mnemonic) - return self.client.load_device_by_mnemonic(mnemonic, args.pin, args.passphrase_protection) + return self.client.load_device_by_mnemonic(mnemonic, args.pin, args.passphrase_protection, args.label) - return self.client.load_device_by_xprv(args.xprv, args.pin, args.passphrase_protection) + else: + return self.client.load_device_by_xprv(args.xprv, args.pin, args.passphrase_protection, args.label) + + def reset_device(self, args): + return self.client.reset_device(True, args.strength, args.passphrase, args.pin, args.label) def sign_message(self, args): return self.client.sign_message(args.n, args.message) @@ -140,6 +144,7 @@ class Commands(object): set_label.help = 'Set new wallet label' set_coin.help = 'Switch device to another crypto currency' load_device.help = 'Load custom configuration to the device' + reset_device.help = 'Perform factory reset of the device and generate new seed' sign_message.help = 'Sign message using address of given path' verify_message.help = 'Verify message' firmware_update.help = 'Upload new firmware to device (must be in bootloader mode)' @@ -171,6 +176,14 @@ class Commands(object): (('-x', '--xprv'), {'type': str}), (('-p', '--pin'), {'type': str, 'default': ''}), (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), + (('-l', '--label'), {'type': str, 'default': ''}), + ) + + reset_device.arguments = ( + (('-t', '--strength'), {'type': int, 'choices': [128, 192, 256], 'default': 128}), + (('-p', '--pin'), {'action': 'store_true', 'default': False}), + (('-r', '--passphrase'), {'action': 'store_true', 'default': False}), + (('-l', '--label'), {'type': str, 'default': ''}), ) sign_message.arguments = ( @@ -214,6 +227,7 @@ class PinMatrixThread(threading.Thread): from PyQt4.QtCore import QObject, SIGNAL a = QApplication(sys.argv) + matrix = PinMatrixWidget() def clicked(): @@ -240,7 +254,7 @@ def qt_pin_func(input_text, message=None): This is a hack to display Qt window in non-qt application. Qt window just asks for PIN and closes itself, which trigger join(). ''' - if os.getenv('DISPLAY'): + if False: # os.getenv('DISPLAY'): # Let's hope that system is configured properly and this won't crash t = PinMatrixThread(input_text, message) t.start() diff --git a/trezorlib/client.py b/trezorlib/client.py index d3440d663..e7423b284 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -1,5 +1,6 @@ import os import time +import binascii import ckd_public import tools @@ -268,19 +269,36 @@ class TrezorClient(object): return s_inputs ''' - def reset_device(self): + def reset_device(self, display_random, strength, passphrase_protection, pin_protection, label): # Begin with device reset workflow - raise Exception("Not implemented") - resp = self.call(proto.ResetDevice(random=self._get_local_entropy())) - self.init_device() + msg = proto.ResetDevice(display_random=display_random, + strength=strength, + language='english', + passphrase_protection=bool(passphrase_protection), + pin_protection=bool(pin_protection), + label=label + ) + print msg + resp = self.call(msg) + if not isinstance(resp, proto.EntropyRequest): + raise Exception("Invalid response, expected EntropyRequest") + + external_entropy = self._get_local_entropy() + print "Computer generated entropy:", binascii.hexlify(external_entropy) + resp = self.call(proto.EntropyAck(entropy=external_entropy)) + + return isinstance(resp, proto.Success) - def load_device_by_mnemonic(self, mnemonic, pin, passphrase_protection): - resp = self.call(proto.LoadDevice(mnemonic=mnemonic, pin=pin, passphrase_protection=passphrase_protection)) + def load_device_by_mnemonic(self, mnemonic, pin, passphrase_protection, label): + resp = self.call(proto.LoadDevice(mnemonic=mnemonic, pin=pin, + passphrase_protection=passphrase_protection, + language='english', + label=label)) self.init_device() return isinstance(resp, proto.Success) - def load_device_by_xprv(self, xprv, pin, passphrase_protection): + def load_device_by_xprv(self, xprv, pin, passphrase_protection, label): if xprv[0:4] not in ('xprv', 'tprv'): raise Exception("Unknown type of xprv") @@ -310,7 +328,11 @@ class TrezorClient(object): print 'wtf is this?', len(data[156:]) # FIXME - resp = self.call(proto.LoadDevice(node=node, pin=pin, passphrase_protection=passphrase_protection)) + resp = self.call(proto.LoadDevice(node=node, + pin=pin, + passphrase_protection=passphrase_protection, + language='english', + label=label)) self.init_device() return isinstance(resp, proto.Success) From 3b19508a9ddad4addb968f7453238b0fab339b3f Mon Sep 17 00:00:00 2001 From: slush0 Date: Wed, 8 Jan 2014 15:59:18 +0100 Subject: [PATCH 0138/1535] xprv checksum --- trezorlib/client.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index e7423b284..a5edb1a1b 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -1,6 +1,7 @@ import os import time import binascii +import hashlib import ckd_public import tools @@ -311,13 +312,17 @@ class TrezorClient(object): if data[90:92] != '00': raise Exception("Contain invalid private key") + checksum = hashlib.sha256(hashlib.sha256(binascii.unhexlify(data[:156])).digest()).hexdigest()[:8] + if checksum != data[156:]: + raise Exception("Checksum doesn't match") + # version 0488ade4 # depth 00 # fingerprint 00000000 # child_num 00000000 # chaincode 873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508 # privkey 00e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35 - # wtf is this? e77e9d71 + # checksum e77e9d71 node.version = int(data[0:8], 16) node.depth = int(data[8:10], 16) @@ -325,9 +330,7 @@ class TrezorClient(object): node.child_num = int(data[18:26], 16) node.chain_code = data[26:90].decode('hex') node.private_key = data[92:156].decode('hex') # skip 0x00 indicating privkey - print 'wtf is this?', len(data[156:]) - # FIXME - + resp = self.call(proto.LoadDevice(node=node, pin=pin, passphrase_protection=passphrase_protection, From 323838d41e153677b1e772056f8cf5eab791eae3 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 9 Jan 2014 17:33:43 +0100 Subject: [PATCH 0139/1535] Compiled pb --- trezorlib/messages_pb2.py | 120 +++++++++++++++++++++++--------------- 1 file changed, 74 insertions(+), 46 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 67747f35e..f09032444 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"M\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x13\n\x05label\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\"\x1f\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"7\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"5\n\x06SignTx\x12\x15\n\routputs_count\x18\x03 \x02(\r\x12\x14\n\x0cinputs_count\x18\x05 \x02(\r\"D\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop*\xdd\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"M\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x13\n\x05label\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"`\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop*\xdd\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -182,8 +182,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2112, - serialized_end=3485, + serialized_start=2224, + serialized_end=3597, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -803,6 +803,13 @@ _GETADDRESS = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='coin_name', full_name='GetAddress.coin_name', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=True, default_value="Bitcoin", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -813,7 +820,7 @@ _GETADDRESS = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=838, - serialized_end=869, + serialized_end=897, ) @@ -840,8 +847,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=871, - serialized_end=897, + serialized_start=899, + serialized_end=925, ) @@ -861,8 +868,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=899, - serialized_end=911, + serialized_start=927, + serialized_end=939, ) @@ -924,8 +931,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=914, - serialized_end=1063, + serialized_start=942, + serialized_end=1091, ) @@ -987,8 +994,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1066, - serialized_end=1229, + serialized_start=1094, + serialized_end=1257, ) @@ -1008,8 +1015,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1231, - serialized_end=1247, + serialized_start=1259, + serialized_end=1275, ) @@ -1036,8 +1043,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1249, - serialized_end=1284, + serialized_start=1277, + serialized_end=1312, ) @@ -1062,6 +1069,13 @@ _SIGNMESSAGE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( + name='coin_name', full_name='SignMessage.coin_name', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=True, default_value="Bitcoin", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -1071,8 +1085,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1286, - serialized_end=1341, + serialized_start=1314, + serialized_end=1397, ) @@ -1113,8 +1127,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1343, - serialized_end=1417, + serialized_start=1399, + serialized_end=1473, ) @@ -1148,8 +1162,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1419, - serialized_end=1473, + serialized_start=1475, + serialized_end=1529, ) @@ -1162,18 +1176,25 @@ _SIGNTX = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='outputs_count', full_name='SignTx.outputs_count', index=0, - number=3, type=13, cpp_type=3, label=2, + number=1, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='inputs_count', full_name='SignTx.inputs_count', index=1, - number=5, type=13, cpp_type=3, label=2, + number=2, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='coin_name', full_name='SignTx.coin_name', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=True, default_value="Bitcoin", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -1183,8 +1204,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1475, - serialized_end=1528, + serialized_start=1531, + serialized_end=1612, ) @@ -1209,6 +1230,13 @@ _SIMPLESIGNTX = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='coin_name', full_name='SimpleSignTx.coin_name', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=True, default_value="Bitcoin", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -1218,8 +1246,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1530, - serialized_end=1598, + serialized_start=1614, + serialized_end=1710, ) @@ -1274,8 +1302,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1601, - serialized_end=1747, + serialized_start=1713, + serialized_end=1859, ) @@ -1302,8 +1330,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1749, - serialized_end=1787, + serialized_start=1861, + serialized_end=1899, ) @@ -1330,8 +1358,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1789, - serialized_end=1830, + serialized_start=1901, + serialized_end=1942, ) @@ -1351,8 +1379,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1832, - serialized_end=1847, + serialized_start=1944, + serialized_end=1959, ) @@ -1379,8 +1407,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1849, - serialized_end=1888, + serialized_start=1961, + serialized_end=2000, ) @@ -1407,8 +1435,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1890, - serialized_end=1925, + serialized_start=2002, + serialized_end=2037, ) @@ -1428,8 +1456,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1927, - serialized_end=1946, + serialized_start=2039, + serialized_end=2058, ) @@ -1491,8 +1519,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1949, - serialized_end=2092, + serialized_start=2061, + serialized_end=2204, ) @@ -1512,8 +1540,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2094, - serialized_end=2109, + serialized_start=2206, + serialized_end=2221, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From 4c55093f6a2493abb1c3fdf8d5b7e942eb8ea121 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 9 Jan 2014 17:33:58 +0100 Subject: [PATCH 0140/1535] pb2json allow extra fields to merge with --- trezorlib/protobuf_json.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/trezorlib/protobuf_json.py b/trezorlib/protobuf_json.py index 146468efa..2704fef6c 100644 --- a/trezorlib/protobuf_json.py +++ b/trezorlib/protobuf_json.py @@ -76,9 +76,8 @@ def json2pb(pb, js): -def pb2json(pb): +def pb2json(pb, js={}): ''' convert google.protobuf.descriptor instance to JSON string ''' - js = {} # fields = pb.DESCRIPTOR.fields #all fields fields = pb.ListFields() # only filled (including extensions) for field, value in fields: From e0ed224656a13723eb871fe3f574e7f03710852f Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 9 Jan 2014 17:34:29 +0100 Subject: [PATCH 0141/1535] cmd allows textual bip32 paths with prime derivation Implemented PassphraseRequest --- cmd.py | 30 ++++++++++++++++-------------- trezorlib/client.py | 37 ++++++++++++++++++++++++++++++++----- 2 files changed, 48 insertions(+), 19 deletions(-) diff --git a/cmd.py b/cmd.py index 8b2bb8676..565449778 100755 --- a/cmd.py +++ b/cmd.py @@ -85,26 +85,28 @@ class Commands(object): pass def get_address(self, args): - return self.client.get_address(args.n) + address_n = self.client.expand_path(args.n) + return self.client.get_address(args.coin, address_n) def get_entropy(self, args): return binascii.hexlify(self.client.get_entropy(args.size)) def get_features(self, args): - return pb2json(self.client.features) + return self.client.features + + def list_coins(self, args): + return [ coin.coin_name for coin in self.client.features.coins ] def ping(self, args): return self.client.ping(args.msg) def get_public_node(self, args): - return self.client.get_public_node(args.n) + address_n = self.client.expand_path(args.n) + return self.client.get_public_node(address_n) def set_label(self, args): return self.client.apply_settings(label=args.label) - def set_coin(self, args): - return self.client.apply_settings(coin_shortcut=args.coin_shortcut) - def load_device(self, args): if not args.mnemonic and not args.xprv: raise Exception("Please provide mnemonic or xprv") @@ -120,7 +122,7 @@ class Commands(object): return self.client.reset_device(True, args.strength, args.passphrase, args.pin, args.label) def sign_message(self, args): - return self.client.sign_message(args.n, args.message) + return pb2json(self.client.sign_message(args.n, args.message), {'message': args.message}) def verify_message(self, args): return self.client.verify_message(args.address, args.signature, args.message) @@ -142,7 +144,7 @@ class Commands(object): get_features.help = 'Retrieve device features and settings' get_public_node.help = 'Get public node of given path' set_label.help = 'Set new wallet label' - set_coin.help = 'Switch device to another crypto currency' + list_coins.help = 'List all supported coin types by the device' load_device.help = 'Load custom configuration to the device' reset_device.help = 'Perform factory reset of the device and generate new seed' sign_message.help = 'Sign message using address of given path' @@ -150,7 +152,9 @@ class Commands(object): firmware_update.help = 'Upload new firmware to device (must be in bootloader mode)' get_address.arguments = ( - (('n',), {'metavar': 'N', 'type': int, 'nargs': '+'}), + (('-c', '--coin'), {'type': str, 'default': 'Bitcoin'}), + # (('n',), {'metavar': 'N', 'type': int, 'nargs': '+'}), + (('-n', '-address'), {'type': str}), ) get_entropy.arguments = ( @@ -159,6 +163,8 @@ class Commands(object): get_features.arguments = () + list_coins.arguments = () + ping.arguments = ( (('msg',), {'type': str}), ) @@ -167,10 +173,6 @@ class Commands(object): (('label',), {'type': str}), ) - set_coin.arguments = ( - (('coin_shortcut',), {'type': str}), - ) - load_device.arguments = ( (('-m', '--mnemonic'), {'type': str, 'nargs': '+'}), (('-x', '--xprv'), {'type': str}), @@ -198,7 +200,7 @@ class Commands(object): ) get_public_node.arguments = ( - (('n',), {'metavar': 'N', 'type': int, 'nargs': '+'}), + (('-n', '-address'), {'type': str}), ) firmware_update.arguments = ( diff --git a/trezorlib/client.py b/trezorlib/client.py index a5edb1a1b..82e0eb726 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -19,6 +19,9 @@ def show_input(input_text, message=None): def pin_func(input_text, message=None): return show_input(input_text, message) +def passphrase_func(input_text): + return show_input(input_text) + class CallException(Exception): pass @@ -30,13 +33,14 @@ PRIME_DERIVATION_FLAG = 0x80000000 class TrezorClient(object): def __init__(self, transport, debuglink=None, - message_func=show_message, input_func=show_input, pin_func=pin_func, debug=False): + message_func=show_message, input_func=show_input, pin_func=pin_func, passphrase_func=passphrase_func, debug=False): self.transport = transport self.debuglink = debuglink self.message_func = message_func self.input_func = input_func self.pin_func = pin_func + self.passphrase_func = passphrase_func self.debug = debug self.setup_debuglink() @@ -49,6 +53,26 @@ class TrezorClient(object): # Convert minus signs to uint32 with flag return [ int(abs(x) | PRIME_DERIVATION_FLAG) if x < 0 else x for x in n ] + def expand_path(self, n): + # Convert string of bip32 path to list of uint32 integers with prime flags + # 0/-1/1' -> [0, 0x80000001, 0x80000001] + n = n.split('/') + path = [] + for x in n: + prime = False + if '\'' in x: + x = x.replace('\'', '') + prime = True + if '-' in x: + prime = True + + if prime: + path.append(abs(int(x)) | PRIME_DERIVATION_FLAG) + else: + path.append(abs(int(x))) + + return path + def init_device(self): self.features = self.call(proto.Initialize()) @@ -58,12 +82,10 @@ class TrezorClient(object): self.debuglink.transport.close() def get_public_node(self, n): - n = self._convert_prime(n) return self.call(proto.GetPublicKey(address_n=n)).node - def get_address(self, n): - n = self._convert_prime(n) - return self.call(proto.GetAddress(address_n=n)).address + def get_address(self, coin_name, n): + return self.call(proto.GetAddress(address_n=n, coin_name=coin_name)).address def get_entropy(self, size): return self.call(proto.GetEntropy(size=size)).entropy @@ -128,6 +150,11 @@ class TrezorClient(object): msg2 = proto.PinMatrixAck(pin=pin) return self.call(msg2) + + if isinstance(resp, proto.PassphraseRequest): + passphrase = self.passphrase_func("Passphrase required: ") + msg2 = proto.PassphraseAck(passphrase=passphrase) + return self.call(msg2) finally: self.transport.session_end() From 981cf2ce7adbfe3269bfdd583a8dc7972e9645aa Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 10 Jan 2014 00:11:03 +0100 Subject: [PATCH 0142/1535] Fixed ApplySettings --- cmd.py | 3 ++- trezorlib/client.py | 22 ++++++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/cmd.py b/cmd.py index 565449778..e5d571a57 100755 --- a/cmd.py +++ b/cmd.py @@ -170,7 +170,8 @@ class Commands(object): ) set_label.arguments = ( - (('label',), {'type': str}), + (('-l', '--label',), {'type': str, 'default': ''}), +# (('-c', '--clear'), {'action': 'store_true', 'default': False}) ) load_device.arguments = ( diff --git a/trezorlib/client.py b/trezorlib/client.py index 82e0eb726..82bf907b8 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -56,20 +56,25 @@ class TrezorClient(object): def expand_path(self, n): # Convert string of bip32 path to list of uint32 integers with prime flags # 0/-1/1' -> [0, 0x80000001, 0x80000001] + if not n: + return [] + n = n.split('/') path = [] for x in n: prime = False - if '\'' in x: + if x.endswith("'"): x = x.replace('\'', '') prime = True - if '-' in x: + if x.startswith('-'): prime = True + + x = abs(int(x)) if prime: - path.append(abs(int(x)) | PRIME_DERIVATION_FLAG) - else: - path.append(abs(int(x))) + x |= PRIME_DERIVATION_FLAG + + path.append(x) return path @@ -96,12 +101,10 @@ class TrezorClient(object): def get_device_id(self): return self.features.device_id - def apply_settings(self, label=None, coin_shortcut=None, language=None): + def apply_settings(self, label=None, language=None): settings = proto.ApplySettings() - if label: + if label != None: settings.label = label - if coin_shortcut: - settings.coin_shortcut = coin_shortcut if language: settings.language = language @@ -306,7 +309,6 @@ class TrezorClient(object): pin_protection=bool(pin_protection), label=label ) - print msg resp = self.call(msg) if not isinstance(resp, proto.EntropyRequest): raise Exception("Invalid response, expected EntropyRequest") From c6db133907f2fde5321d8ca1136309ca4970ffbe Mon Sep 17 00:00:00 2001 From: slush0 Date: Sun, 12 Jan 2014 16:16:07 +0100 Subject: [PATCH 0143/1535] Fixed tests --- tests/common.py | 14 ++++++++----- tests/test_addresses.py | 43 +++++++++++++++++++++++--------------- tests/test_protect_call.py | 20 ++++++++++++++---- 3 files changed, 51 insertions(+), 26 deletions(-) diff --git a/tests/common.py b/tests/common.py index 9cd60e43e..c1454a44e 100644 --- a/tests/common.py +++ b/tests/common.py @@ -10,18 +10,22 @@ class TrezorTest(unittest.TestCase): self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) self.client = TrezorClient(self.transport, DebugLink(self.debug_transport), debug=True) - self.mnemonic1 = 'juice enrich pool orbit brick prevent system chronic people industry insane private' - self.mnemonic2 = 'bark depend buffalo library lonely syrup exact trip kitten yellow arch into damage phone toy wild color soon suit move opinion type replace donate' + self.mnemonic1 = 'alcohol woman abuse must during monitor noble actual mixed trade anger aisle' + self.mnemonic2 = 'owner little vague addict embark decide pink prosper true fork panda embody mixture exchange choose canoe electric jewel' self.pin1 = '1234' self.pin2 = '43211' self.client.setup_debuglink(button=True, pin_correct=True) - self.client.load_device( + self.client.load_device_by_mnemonic( mnemonic=self.mnemonic1, - pin=self.pin1) + pin=self.pin1, + passphrase_protection=False, + label='test', + language='english', + ) - self.client.apply_settings(label='unit testing', coin_shortcut='BTC', language='english') + # self.client.apply_settings(label='unit testing', coin_shortcut='BTC', language='english') print "Setup finished" print "--------------" diff --git a/tests/test_addresses.py b/tests/test_addresses.py index cbe759c92..32839f5ab 100644 --- a/tests/test_addresses.py +++ b/tests/test_addresses.py @@ -3,30 +3,39 @@ import common class TestAddresses(common.TrezorTest): def test_btc(self): - self.client.load_device(seed=self.mnemonic1, pin='') - self.client.apply_settings(coin_shortcut='BTC') + self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, + pin='', + passphrase_protection=False, + label='test', + language='english') - self.assertEqual(self.client.get_address([]), '1GBDQapuquKZGPxWTB39s5bayLDTv5sD77') - self.assertEqual(self.client.get_address([1]), '13HWRT9JtftSF6uv65eMrQowHn3CioKegP') - self.assertEqual(self.client.get_address([0, 1]), '1GnnT11aZeH6QZCtT7EjCvRF3EXHoY3owE') - self.assertEqual(self.client.get_address([9, 0]), '1KeRRK74ARTxnby8dYsm2UreAx5tBGbbY7') - self.assertEqual(self.client.get_address([0, 9999999]), '1JeDAdRMxeuWCQ8ohWySCD5KEPoN2sEanK') + self.assertEqual(self.client.get_address('Bitcoin', []), '1EfKbQupktEMXf4gujJ9kCFo83k1iMqwqK') + self.assertEqual(self.client.get_address('Bitcoin', [1]), '1CK7SJdcb8z9HuvVft3D91HLpLC6KSsGb') + self.assertEqual(self.client.get_address('Bitcoin', [0, -1]), '1JVq66pzRBvqaBRFeU9SPVvg3er4ZDgoMs') + self.assertEqual(self.client.get_address('Bitcoin', [-9, 0]), '1F4YdQdL9ZQwvcNTuy5mjyQxXkyCfMcP2P') + self.assertEqual(self.client.get_address('Bitcoin', [0, 9999999]), '1GS8X3yc7ntzwGw9vXwj9wqmBWZkTFewBV') def test_ltc(self): - self.client.load_device(seed=self.mnemonic1, pin='') - self.client.apply_settings(coin_shortcut='LTC') + self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, + pin='', + passphrase_protection=False, + label='test', + language='english') - self.assertEqual(self.client.get_address([]), 'LaQAfo8jvZZcXCefdK2T96fMBYak5XomhR') - self.assertEqual(self.client.get_address([1]), 'LMWTgfT8yL8VVuc5GDdf8RshVzQUw9AoUK') - self.assertEqual(self.client.get_address([0, 1]), 'Lb1jiDKQeJX9fMu3dFE2UwV1FStZwvijfE') - self.assertEqual(self.client.get_address([9, 0]), 'LdsNgXQtF5i23QfHogs4JVvQPATAFbfWYA') - self.assertEqual(self.client.get_address([0, 9999999]), 'LcsARqjC3K9ZTCpxsexjUE95ScAeEPqR69') + self.assertEqual(self.client.get_address('Litecoin', []), 'LYtGrdDeqYUQnTkr5sHT2DKZLG7Hqg7HTK') + self.assertEqual(self.client.get_address('Litecoin', [1]), 'LKRGNecThFP3Q6c5fosLVA53Z2hUDb1qnE') + self.assertEqual(self.client.get_address('Litecoin', [0, -1]), 'LcinMK8pVrAtpz7Qpc8jfWzSFsDLgLYfG6') + self.assertEqual(self.client.get_address('Litecoin', [-9, 0]), 'LZHVtcwAEDf1BR4d67551zUijyLUpDF9EX') + self.assertEqual(self.client.get_address('Litecoin', [0, 9999999]), 'Laf5nGHSCT94C5dK6fw2RxuXPiw2ZuRR9S') def test_tbtc(self): - self.client.load_device(seed=self.mnemonic1, pin='') - self.client.apply_settings(coin_shortcut='tBTC') + self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, + pin='', + passphrase_protection=False, + label='test', + language='english') - self.assertEqual(self.client.get_address([111, 42]), 'mypL2oDrCj4196uuvtC6QJnsetu3YMUdB7') + self.assertEqual(self.client.get_address('Testnet', [111, 42]), 'moN6aN6NP1KWgnPSqzrrRPvx2x1UtZJssa') if __name__ == '__main__': unittest.main() diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index b15826e0c..e149ffe57 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -2,8 +2,8 @@ import time import unittest import common -from trezorlib.client import CallException, PinException -from trezorlib import proto +from trezorlib.client import PinException +# from trezorlib import messages_pb2 as proto class TestProtectCall(common.TrezorTest): def _some_protected_call(self): @@ -13,13 +13,23 @@ class TestProtectCall(common.TrezorTest): self.assertEqual(len(entropy), entropy_len) def test_no_protection(self): - self.client.load_device(seed=self.mnemonic1, pin='') + self.client.load_device_by_mnemonic( + mnemonic=self.mnemonic1, + pin='', + passphrase_protection=False, + label='test', + language='english', + ) self.assertEqual(self.client.debuglink.read_pin()[0], '') self._some_protected_call() def test_pin(self): - self.client.load_device(seed=self.mnemonic1, pin=self.pin2) + self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, + pin=self.pin2, + passphrase_protection=False, + label='test', + language='english') self.assertEqual(self.client.debuglink.read_pin()[0], self.pin2) self._some_protected_call() @@ -48,6 +58,7 @@ class TestProtectCall(common.TrezorTest): self.assertRaises(PinException, self._some_protected_call) test_backoff(attempt, start) + ''' # Unplug Trezor now self.client.debuglink.stop() self.client.close() @@ -64,6 +75,7 @@ class TestProtectCall(common.TrezorTest): print "Expected reboot time at least %s seconds" % expected print "Rebooted in %s seconds" % took self.assertLessEqual(expected, time.time() - start, "Bootup took %s seconds, expected %s seconds or more!" % (took, expected)) + ''' if __name__ == '__main__': unittest.main() From ca6ab18ae5726b2d27ff300cb3fe455c9633aad4 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sun, 12 Jan 2014 16:17:22 +0100 Subject: [PATCH 0144/1535] Fixes DebugLinkGetState --- trezorlib/debuglink.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/debuglink.py b/trezorlib/debuglink.py index f60a60635..dc1949b71 100644 --- a/trezorlib/debuglink.py +++ b/trezorlib/debuglink.py @@ -15,7 +15,7 @@ class DebugLink(object): self.button_func = button_func def read_pin(self): - self.transport.write(proto.DebugLinkGetState(pin=True, matrix=True)) + self.transport.write(proto.DebugLinkGetState()) obj = self.transport.read_blocking() print "Read PIN:", obj.pin print "Read matrix:", obj.matrix From 6aa8fbd1daac0e8312a1cf923092e4aa63b9b6fc Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 13 Jan 2014 04:44:35 +0100 Subject: [PATCH 0145/1535] Compiled pb --- trezorlib/messages_pb2.py | 177 +++++++++++++++++++------------------- trezorlib/types_pb2.py | 19 ++-- 2 files changed, 101 insertions(+), 95 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index f09032444..2971671e5 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"M\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x13\n\x05label\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"`\n\x0cSimpleSignTx\x12\x18\n\x06inputs\x18\x01 \x03(\x0b\x32\x08.TxInput\x12\x1a\n\x07outputs\x18\x02 \x03(\x0b\x32\t.TxOutput\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop*\xdd\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop*\xdd\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -182,8 +182,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2224, - serialized_end=3597, + serialized_start=2250, + serialized_end=3623, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -363,18 +363,11 @@ _APPLYSETTINGS = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='coin_shortcut', full_name='ApplySettings.coin_shortcut', index=1, + name='label', full_name='ApplySettings.label', index=1, number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='label', full_name='ApplySettings.label', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), ], extensions=[ @@ -386,7 +379,7 @@ _APPLYSETTINGS = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=314, - serialized_end=391, + serialized_end=368, ) @@ -413,8 +406,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=393, - serialized_end=420, + serialized_start=370, + serialized_end=397, ) @@ -441,8 +434,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=422, - serialized_end=445, + serialized_start=399, + serialized_end=422, ) @@ -469,8 +462,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=447, - serialized_end=473, + serialized_start=424, + serialized_end=450, ) @@ -504,8 +497,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=475, - serialized_end=529, + serialized_start=452, + serialized_end=506, ) @@ -525,8 +518,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=531, - serialized_end=546, + serialized_start=508, + serialized_end=523, ) @@ -546,8 +539,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=548, - serialized_end=559, + serialized_start=525, + serialized_end=536, ) @@ -574,8 +567,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=561, - serialized_end=596, + serialized_start=538, + serialized_end=573, ) @@ -602,8 +595,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=598, - serialized_end=625, + serialized_start=575, + serialized_end=602, ) @@ -623,8 +616,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=627, - serialized_end=635, + serialized_start=604, + serialized_end=612, ) @@ -644,8 +637,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=637, - serialized_end=656, + serialized_start=614, + serialized_end=633, ) @@ -672,8 +665,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=658, - serialized_end=699, + serialized_start=635, + serialized_end=676, ) @@ -700,8 +693,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=701, - serialized_end=727, + serialized_start=678, + serialized_end=704, ) @@ -728,8 +721,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=729, - serialized_end=761, + serialized_start=706, + serialized_end=738, ) @@ -756,8 +749,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=763, - serialized_end=796, + serialized_start=740, + serialized_end=773, ) @@ -784,8 +777,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=798, - serialized_end=836, + serialized_start=775, + serialized_end=813, ) @@ -819,8 +812,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=838, - serialized_end=897, + serialized_start=815, + serialized_end=874, ) @@ -847,8 +840,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=899, - serialized_end=925, + serialized_start=876, + serialized_end=902, ) @@ -868,8 +861,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=927, - serialized_end=939, + serialized_start=904, + serialized_end=916, ) @@ -931,8 +924,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=942, - serialized_end=1091, + serialized_start=919, + serialized_end=1068, ) @@ -994,8 +987,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1094, - serialized_end=1257, + serialized_start=1071, + serialized_end=1234, ) @@ -1015,8 +1008,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1259, - serialized_end=1275, + serialized_start=1236, + serialized_end=1252, ) @@ -1043,8 +1036,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1277, - serialized_end=1312, + serialized_start=1254, + serialized_end=1289, ) @@ -1085,8 +1078,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1314, - serialized_end=1397, + serialized_start=1291, + serialized_end=1374, ) @@ -1127,8 +1120,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1399, - serialized_end=1473, + serialized_start=1376, + serialized_end=1450, ) @@ -1162,8 +1155,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1475, - serialized_end=1529, + serialized_start=1452, + serialized_end=1506, ) @@ -1204,8 +1197,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1531, - serialized_end=1612, + serialized_start=1508, + serialized_end=1589, ) @@ -1231,8 +1224,15 @@ _SIMPLESIGNTX = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='coin_name', full_name='SimpleSignTx.coin_name', index=2, - number=3, type=12, cpp_type=9, label=1, + name='transactions', full_name='SimpleSignTx.transactions', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='coin_name', full_name='SimpleSignTx.coin_name', index=3, + number=4, type=12, cpp_type=9, label=1, has_default_value=True, default_value="Bitcoin", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -1246,8 +1246,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1614, - serialized_end=1710, + serialized_start=1592, + serialized_end=1736, ) @@ -1302,8 +1302,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1713, - serialized_end=1859, + serialized_start=1739, + serialized_end=1885, ) @@ -1330,8 +1330,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1861, - serialized_end=1899, + serialized_start=1887, + serialized_end=1925, ) @@ -1358,8 +1358,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1901, - serialized_end=1942, + serialized_start=1927, + serialized_end=1968, ) @@ -1379,8 +1379,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1944, - serialized_end=1959, + serialized_start=1970, + serialized_end=1985, ) @@ -1407,8 +1407,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1961, - serialized_end=2000, + serialized_start=1987, + serialized_end=2026, ) @@ -1435,8 +1435,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2002, - serialized_end=2037, + serialized_start=2028, + serialized_end=2063, ) @@ -1456,8 +1456,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2039, - serialized_end=2058, + serialized_start=2065, + serialized_end=2084, ) @@ -1519,8 +1519,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2061, - serialized_end=2204, + serialized_start=2087, + serialized_end=2230, ) @@ -1540,16 +1540,17 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2206, - serialized_end=2221, + serialized_start=2232, + serialized_end=2247, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE _FAILURE.fields_by_name['code'].enum_type = types_pb2._FAILURETYPE _PUBLICKEY.fields_by_name['node'].message_type = types_pb2._HDNODETYPE _LOADDEVICE.fields_by_name['node'].message_type = types_pb2._HDNODETYPE -_SIMPLESIGNTX.fields_by_name['inputs'].message_type = _TXINPUT -_SIMPLESIGNTX.fields_by_name['outputs'].message_type = _TXOUTPUT +_SIMPLESIGNTX.fields_by_name['inputs'].message_type = types_pb2._TXINPUTTYPE +_SIMPLESIGNTX.fields_by_name['outputs'].message_type = types_pb2._TXOUTPUTTYPE +_SIMPLESIGNTX.fields_by_name['transactions'].message_type = types_pb2._TRANSACTIONTYPE _TXREQUEST.fields_by_name['request_type'].enum_type = types_pb2._REQUESTTYPE _TXINPUT.fields_by_name['input'].message_type = types_pb2._TXINPUTTYPE _TXOUTPUT.fields_by_name['output'].message_type = types_pb2._TXOUTPUTTYPE diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index a924d0fb9..99e8b3a6b 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x82\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x9a\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x16\n\x12\x46\x61ilure_FeeTooHigh\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -56,14 +56,18 @@ _FAILURETYPE = _descriptor.EnumDescriptor( options=None, type=None), _descriptor.EnumValueDescriptor( - name='Failure_FirmwareError', index=8, number=99, + name='Failure_FeeTooHigh', index=8, number=9, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_FirmwareError', index=9, number=99, options=None, type=None), ], containing_type=None, options=None, serialized_start=783, - serialized_end=1041, + serialized_end=1065, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -84,8 +88,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1043, - serialized_end=1094, + serialized_start=1067, + serialized_end=1118, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -106,8 +110,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1096, - serialized_end=1136, + serialized_start=1120, + serialized_end=1160, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -119,6 +123,7 @@ Failure_PinExpected = 5 Failure_PinCancelled = 6 Failure_PinInvalid = 7 Failure_InvalidSignature = 8 +Failure_FeeTooHigh = 9 Failure_FirmwareError = 99 PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 From b9925432cd4ab33e67861f2ffda3379a9e40bf0c Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 13 Jan 2014 04:44:57 +0100 Subject: [PATCH 0146/1535] Basic blockchain.info API SimpleSignTx basic unit test --- cmd.py | 6 +++-- tests/test_signtx.py | 36 +++++++++++++++++++----------- trezorlib/api_blockchain.py | 41 ++++++++++++++++++++++++++++++++++ trezorlib/ckd_public.py | 2 ++ trezorlib/client.py | 44 +++++++++++++++++++++++++++++++------ 5 files changed, 107 insertions(+), 22 deletions(-) create mode 100644 trezorlib/api_blockchain.py diff --git a/cmd.py b/cmd.py index e5d571a57..21dde28e0 100755 --- a/cmd.py +++ b/cmd.py @@ -113,10 +113,12 @@ class Commands(object): if args.mnemonic: mnemonic = ' '.join(args.mnemonic) - return self.client.load_device_by_mnemonic(mnemonic, args.pin, args.passphrase_protection, args.label) + return self.client.load_device_by_mnemonic(mnemonic, args.pin, + args.passphrase_protection, args.label, 'english') else: - return self.client.load_device_by_xprv(args.xprv, args.pin, args.passphrase_protection, args.label) + return self.client.load_device_by_xprv(args.xprv, args.pin, + args.passphrase_protection, args.label, 'english') def reset_device(self, args): return self.client.reset_device(True, args.strength, args.passphrase, args.pin, args.label) diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 1974fe7bf..832e0a747 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -3,20 +3,30 @@ import common import binascii import trezorlib.messages_pb2 as proto +import trezorlib.types_pb2 as proto_types -''' -./electrum -w ~/.electrum-bitkey mktx 1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv 0.001 ---fromaddr 13jqMdrZAzMYkaFqHGv5GbJavdZpoKDkSL --changeaddr 17GpAFnkHRjWKePkX4kxHaHy49V8EHTr7i --fee 0.0005 - -01000000012de70f7d6ffed0db70f8882f3fca90db9bb09f0e99bce27468c23d3c994fcd56 -010000008b4830450221009b985e14d53cfeed3496846db6ddaa77a0206138d0df4c2ccd3b -759e91bae3e1022004c76e10f99ccac8ced761719181a96bae25a74829eab3ecb8f29eb07f -e18f7e01410436ae8595f03a7324d1d1482ede8560a4508c767fbc662559482d5759b32209 -a62964699995f6e018cfbeb7a71a66d4c64fa38875d79ead0a9ac66f59c1c8b3a3ffffffff -0250c30000000000001976a91444ce5c6789b0bb0e8a9ab9a4769fe181cb274c4688aca086 -0100000000001976a9149e03078026388661b197129a43f0f64f88379ce688ac00000000 -''' class TestSignTx(common.TrezorTest): + + def test_simplesigntx(self): + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=380000, + script_type=proto_types.PAYTOADDRESS, + ) + + tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + print binascii.hexlify(tx.serialized_tx) + self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + + ''' def test_signtx(self): expected_tx = '01000000012de70f7d6ffed0db70f8882f3fca90db9bb09f0e99bce27468c23d3c994fcd56' \ '010000008b4830450221009b985e14d53cfeed3496846db6ddaa77a0206138d0df4c2ccd3b' \ @@ -51,7 +61,7 @@ class TestSignTx(common.TrezorTest): ) print binascii.hexlify(self.client.sign_tx([inp1], [out1, out2])[1]) - + ''' ''' def test_workflow(self): inp1 = proto.TxInput(index=0, diff --git a/trezorlib/api_blockchain.py b/trezorlib/api_blockchain.py new file mode 100644 index 000000000..9ceaae226 --- /dev/null +++ b/trezorlib/api_blockchain.py @@ -0,0 +1,41 @@ +''' + Blockchain API implementing Blockchain.info interface +''' +import binascii +import urllib2 +import json + +import types_pb2 as proto_types + +class BlockchainApi(object): + def _raw_tx(self, txhash): + # Download tx data from blockchain.info + f = urllib2.urlopen('http://blockchain.info/rawtx/%s?scripts=true' % txhash) + print 'got', txhash + return json.load(f) + + def submit(self, tx): + raise Exception("Not implemented yet") + + def get_tx(self, txhash): + # Build protobuf transaction structure from blockchain.info + d = self._raw_tx(txhash) + t = proto_types.TransactionType() + + for inp in d['inputs']: + di = self._raw_tx(inp['prev_out']['tx_index']) + i = t.inputs.add() + i.prev_hash = binascii.unhexlify(di['hash']) + i.prev_index = inp['prev_out']['n'] + i.script_sig = binascii.unhexlify(inp['script']) + + for output in d['out']: + o = t.outputs.add() + o.amount = output['value'] + o.script_pubkey = binascii.unhexlify(output['script']) + + return t + +if __name__ == '__main__': + api = BlockchainApi() + print api.get_tx('b9f382b8dfc34accc05491712a1ad8f7f075a02056dc4821d1f60702fb3fdb2f') diff --git a/trezorlib/ckd_public.py b/trezorlib/ckd_public.py index f3cc43e1c..ec5886085 100644 --- a/trezorlib/ckd_public.py +++ b/trezorlib/ckd_public.py @@ -6,6 +6,8 @@ from ecdsa.curves import SECP256k1 import messages_pb2 as proto +# FIXME, this isn't finished yet + PRIME_DERIVATION_FLAG = 0x80000000 def is_prime(n): diff --git a/trezorlib/client.py b/trezorlib/client.py index 82bf907b8..c37c1a18c 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -7,6 +7,7 @@ import ckd_public import tools import messages_pb2 as proto import types_pb2 as types +from api_blockchain import BlockchainApi def show_message(message): print "MESSAGE FROM DEVICE:", message @@ -33,7 +34,9 @@ PRIME_DERIVATION_FLAG = 0x80000000 class TrezorClient(object): def __init__(self, transport, debuglink=None, - message_func=show_message, input_func=show_input, pin_func=pin_func, passphrase_func=passphrase_func, debug=False): + message_func=show_message, input_func=show_input, + pin_func=pin_func, passphrase_func=passphrase_func, + blockchain_api=None, debug=False): self.transport = transport self.debuglink = debuglink @@ -41,8 +44,14 @@ class TrezorClient(object): self.input_func = input_func self.pin_func = pin_func self.passphrase_func = passphrase_func + self.debug = debug + if blockchain_api: + self.blockchain = blockchain_api + else: + self.blockchain = BlockchainApi() + self.setup_debuglink() self.init_device() @@ -90,6 +99,7 @@ class TrezorClient(object): return self.call(proto.GetPublicKey(address_n=n)).node def get_address(self, coin_name, n): + n = self._convert_prime(n) return self.call(proto.GetAddress(address_n=n, coin_name=coin_name)).address def get_entropy(self, size): @@ -168,7 +178,8 @@ class TrezorClient(object): if resp.code == types.Failure_ActionCancelled: raise CallException("Action cancelled by user") - elif resp.code == types.Failure_PinInvalid: + elif resp.code in (types.Failure_PinInvalid, + types.Failure_PinCancelled, types.Failure_PinExpected): raise PinException("PIN is invalid") raise CallException(resp.code, resp.message) @@ -192,7 +203,24 @@ class TrezorClient(object): return False - def sign_tx(self, inputs, outputs): + def simple_sign_tx(self, coin_name, inputs, outputs): + msg = proto.SimpleSignTx() + msg.coin_name = coin_name + msg.inputs.extend(inputs) + msg.outputs.extend(outputs) + + known_hashes = [] + for inp in inputs: + if inp.prev_hash in known_hashes: + continue + + tx = msg.transactions.add() + tx.CopyFrom(self.blockchain.get_tx(binascii.hexlify(inp.prev_hash))) + known_hashes.append(inp.prev_hash) + + return self.call(msg) + + def sign_tx(self, coin_name, inputs, outputs): ''' inputs: list of TxInput outputs: list of TxOutput @@ -300,11 +328,11 @@ class TrezorClient(object): return s_inputs ''' - def reset_device(self, display_random, strength, passphrase_protection, pin_protection, label): + def reset_device(self, display_random, strength, passphrase_protection, pin_protection, label, language): # Begin with device reset workflow msg = proto.ResetDevice(display_random=display_random, strength=strength, - language='english', + language=language, passphrase_protection=bool(passphrase_protection), pin_protection=bool(pin_protection), label=label @@ -320,10 +348,10 @@ class TrezorClient(object): return isinstance(resp, proto.Success) - def load_device_by_mnemonic(self, mnemonic, pin, passphrase_protection, label): + def load_device_by_mnemonic(self, mnemonic, pin, passphrase_protection, label, language): resp = self.call(proto.LoadDevice(mnemonic=mnemonic, pin=pin, passphrase_protection=passphrase_protection, - language='english', + language=language, label=label)) self.init_device() return isinstance(resp, proto.Success) @@ -369,6 +397,8 @@ class TrezorClient(object): return isinstance(resp, proto.Success) def bip32_ckd(self, public_node, n): + raise Exception("Unfinished code") + if not isinstance(n, list): raise Exception('Parameter must be a list') From 20aa0faeb0d22448c8a2fd1a79c232da3d123677 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 14 Jan 2014 11:30:58 +0100 Subject: [PATCH 0147/1535] Compiled pb --- trezorlib/types_pb2.py | 48 +++++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 99e8b3a6b..fc7df6382 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x9a\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x16\n\x12\x46\x61ilure_FeeTooHigh\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x9a\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x16\n\x12\x46\x61ilure_FeeTooHigh\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -66,8 +66,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=783, - serialized_end=1065, + serialized_start=825, + serialized_end=1107, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -88,8 +88,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1067, - serialized_end=1118, + serialized_start=1109, + serialized_end=1160, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -110,8 +110,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1120, - serialized_end=1160, + serialized_start=1162, + serialized_end=1202, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -284,6 +284,20 @@ _COINTYPE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='ser_private', full_name='CoinType.ser_private', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ser_public', full_name='CoinType.ser_public', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -293,8 +307,8 @@ _COINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=232, - serialized_end=325, + serialized_start=233, + serialized_end=367, ) @@ -349,8 +363,8 @@ _TXINPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=328, - serialized_end=461, + serialized_start=370, + serialized_end=503, ) @@ -405,8 +419,8 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=463, - serialized_end=590, + serialized_start=505, + serialized_end=632, ) @@ -440,8 +454,8 @@ _TXOUTPUTBINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=592, - serialized_end=654, + serialized_start=634, + serialized_end=696, ) @@ -489,8 +503,8 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=656, - serialized_end=780, + serialized_start=698, + serialized_end=822, ) _TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _SCRIPTTYPE From 999194fa5938004cb7c99bcf06eb225a5d270fde Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 14 Jan 2014 14:29:13 +0100 Subject: [PATCH 0148/1535] Compiled pb --- trezorlib/messages_pb2.py | 103 ++++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 48 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 2971671e5..8f42c5195 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop*\xdd\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop*\xdd\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -182,8 +182,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2250, - serialized_end=3623, + serialized_start=2278, + serialized_end=3651, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -740,6 +740,13 @@ _GETPUBLICKEY = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='coin_name', full_name='GetPublicKey.coin_name', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=True, default_value="Bitcoin", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -750,7 +757,7 @@ _GETPUBLICKEY = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=740, - serialized_end=773, + serialized_end=801, ) @@ -777,8 +784,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=775, - serialized_end=813, + serialized_start=803, + serialized_end=841, ) @@ -812,8 +819,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=815, - serialized_end=874, + serialized_start=843, + serialized_end=902, ) @@ -840,8 +847,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=876, - serialized_end=902, + serialized_start=904, + serialized_end=930, ) @@ -861,8 +868,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=904, - serialized_end=916, + serialized_start=932, + serialized_end=944, ) @@ -924,8 +931,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=919, - serialized_end=1068, + serialized_start=947, + serialized_end=1096, ) @@ -987,8 +994,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1071, - serialized_end=1234, + serialized_start=1099, + serialized_end=1262, ) @@ -1008,8 +1015,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1236, - serialized_end=1252, + serialized_start=1264, + serialized_end=1280, ) @@ -1036,8 +1043,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1254, - serialized_end=1289, + serialized_start=1282, + serialized_end=1317, ) @@ -1078,8 +1085,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1291, - serialized_end=1374, + serialized_start=1319, + serialized_end=1402, ) @@ -1120,8 +1127,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1376, - serialized_end=1450, + serialized_start=1404, + serialized_end=1478, ) @@ -1155,8 +1162,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1452, - serialized_end=1506, + serialized_start=1480, + serialized_end=1534, ) @@ -1197,8 +1204,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1508, - serialized_end=1589, + serialized_start=1536, + serialized_end=1617, ) @@ -1246,8 +1253,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1592, - serialized_end=1736, + serialized_start=1620, + serialized_end=1764, ) @@ -1302,8 +1309,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1739, - serialized_end=1885, + serialized_start=1767, + serialized_end=1913, ) @@ -1330,8 +1337,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1887, - serialized_end=1925, + serialized_start=1915, + serialized_end=1953, ) @@ -1358,8 +1365,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1927, - serialized_end=1968, + serialized_start=1955, + serialized_end=1996, ) @@ -1379,8 +1386,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1970, - serialized_end=1985, + serialized_start=1998, + serialized_end=2013, ) @@ -1407,8 +1414,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1987, - serialized_end=2026, + serialized_start=2015, + serialized_end=2054, ) @@ -1435,8 +1442,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2028, - serialized_end=2063, + serialized_start=2056, + serialized_end=2091, ) @@ -1456,8 +1463,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2065, - serialized_end=2084, + serialized_start=2093, + serialized_end=2112, ) @@ -1519,8 +1526,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2087, - serialized_end=2230, + serialized_start=2115, + serialized_end=2258, ) @@ -1540,8 +1547,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2232, - serialized_end=2247, + serialized_start=2260, + serialized_end=2275, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From 91b2b637b48a2e5674193a5ac8a6351e468d3689 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 14 Jan 2014 14:29:18 +0100 Subject: [PATCH 0149/1535] BIP32 public CKD --- tests/test_addresses.py | 27 +++++++++++- tests/test_signtx.py | 26 ++++++++++++ trezorlib/ckd_public.py | 74 +++++++++++++++++++++++++------- trezorlib/client.py | 14 ------ trezorlib/msqrt.py | 94 +++++++++++++++++++++++++++++++++++++++++ trezorlib/tools.py | 29 ++++++++++++- 6 files changed, 233 insertions(+), 31 deletions(-) create mode 100644 trezorlib/msqrt.py diff --git a/tests/test_addresses.py b/tests/test_addresses.py index 32839f5ab..de60ffceb 100644 --- a/tests/test_addresses.py +++ b/tests/test_addresses.py @@ -1,5 +1,7 @@ import unittest import common +import trezorlib.ckd_public as bip32 +from trezorlib import tools class TestAddresses(common.TrezorTest): def test_btc(self): @@ -36,6 +38,29 @@ class TestAddresses(common.TrezorTest): language='english') self.assertEqual(self.client.get_address('Testnet', [111, 42]), 'moN6aN6NP1KWgnPSqzrrRPvx2x1UtZJssa') - + + def test_public_ckd(self): + self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, + pin='', + passphrase_protection=False, + label='test', + language='english') + + node = self.client.get_public_node([]) + node_sub1 = self.client.get_public_node([1]) + node_sub2 = bip32.public_ckd(node, [1]) + + print node_sub1 + print node_sub2 + + self.assertEqual(node_sub1.chain_code, node_sub2.chain_code) + self.assertEqual(node_sub1.public_key, node_sub2.public_key) + + address1 = self.client.get_address('Bitcoin', [1]) + address2 = bip32.get_address(node_sub2, 0) + + self.assertEqual(address2, '1CK7SJdcb8z9HuvVft3D91HLpLC6KSsGb') + self.assertEqual(address1, address2) + if __name__ == '__main__': unittest.main() diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 832e0a747..07a28e707 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -7,6 +7,7 @@ import trezorlib.types_pb2 as proto_types class TestSignTx(common.TrezorTest): + ''' def test_simplesigntx(self): # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 # input 0: 0.0039 BTC @@ -25,6 +26,31 @@ class TestSignTx(common.TrezorTest): tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) print binascii.hexlify(tx.serialized_tx) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + ''' + + + def test_simplesigntx_testnet(self): + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + self.client.load_device_by_xprv('xprv9s21ZrQH143K3zttRjiQmYwyugvd13pnd2VzefWrfSouRfnj5oSkJgBQXxtn18E9mqrDop7fQ8Xnb9JCLPE4vghzhpU4dT33ZJ7frjzTEW8', + '', False, 'testnet') + + inp1 = proto_types.TxInputType(address_n=[6], # mo8uUSFJULCMA4neRS9aS9jiXZ1N72FSLK + # amount=390000, + prev_hash=binascii.unhexlify('d83b27f16ce5069e0c8e4a02813f252500e257744d5b00c9b6128be7189117b1'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='mjKKH3Dk95VMbdNnDQYHZXoQ9QwuCZocwb', + amount=80085000, + script_type=proto_types.PAYTOADDRESS, + ) + + rawtx = {'d83b27f16ce5069e0c8e4a02813f252500e257744d5b00c9b6128be7189117b1': '01000000013b21cc65080c57793d0e47045a24d8e92262dc47efdc425fd5cad9a25e928f6c000000006b483045022100bde591f2c997bafa8388916663b148f4093914851a33a9903da69ad97afa6f470220138c6ff11321339974bac9c0992d7b9d72aef0c2d098f26267ec9f05d532c859012103edcc8dc5cac7dca6ed191d812621fb300863fea0dd5d14180b482b917a35acc4ffffffff020800c604000000001976a91453958011070469e2ef5e1115f34f509717d6884288acf8c99502000000001976a9141e2ba9407a6920246d0f345beecb89ed47c99a7788ac00000000'} + tx = self.client.simple_sign_tx('Testnet', [inp1, ], [out1, ]) + print binascii.hexlify(tx.serialized_tx) + # self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + ''' def test_signtx(self): diff --git a/trezorlib/ckd_public.py b/trezorlib/ckd_public.py index ec5886085..9ee747efa 100644 --- a/trezorlib/ckd_public.py +++ b/trezorlib/ckd_public.py @@ -1,25 +1,63 @@ import struct import hmac import hashlib -from ecdsa.util import string_to_number -from ecdsa.curves import SECP256k1 -import messages_pb2 as proto +import ecdsa +from ecdsa.util import string_to_number, number_to_string +from ecdsa.curves import SECP256k1 +from ecdsa.ellipticcurve import Point, INFINITY -# FIXME, this isn't finished yet +import msqrt +import tools +import types_pb2 as proto_types PRIME_DERIVATION_FLAG = 0x80000000 +def point_to_pubkey(point): + order = SECP256k1.order + x_str = number_to_string(point.x(), order) + y_str = number_to_string(point.y(), order) + vk = x_str + y_str + return chr((ord(vk[63]) & 1) + 2) + vk[0:32] # To compressed key + +def sec_to_public_pair(pubkey): + """Convert a public key in sec binary format to a public pair.""" + x = string_to_number(pubkey[1:33]) + sec0 = pubkey[:1] + if sec0 not in (b'\2', b'\3'): + raise Exception("Compressed pubkey expected") + + def public_pair_for_x(generator, x, is_even): + curve = generator.curve() + p = curve.p() + alpha = (pow(x, 3, p) + curve.a() * x + curve.b()) % p + beta = msqrt.modular_sqrt(alpha, p) + if is_even == bool(beta & 1): + return (x, p - beta) + return (x, beta) + + return public_pair_for_x(ecdsa.ecdsa.generator_secp256k1, x, is_even=(sec0 == b'\2')) + def is_prime(n): return (bool)(n & PRIME_DERIVATION_FLAG) -def hash_160(public_key): - md = hashlib.new('ripemd160') - md.update(hashlib.sha256(public_key).digest()) - return md.digest() - def fingerprint(pubkey): - return string_to_number(hash_160(pubkey)[:4]) + return string_to_number(tools.hash_160(pubkey)[:4]) + +def get_address(public_node, address_type): + return tools.public_key_to_bc_address(public_node.public_key, address_type) + +def public_ckd(public_node, n): + if not isinstance(n, list): + raise Exception('Parameter must be a list') + + node = proto_types.HDNodeType() + node.CopyFrom(public_node) + + for i in n: + node.CopyFrom(get_subnode(node, i)) + + return node def get_subnode(node, i): # Public Child key derivation (CKD) algorithm of BIP32 @@ -34,16 +72,22 @@ def get_subnode(node, i): I64 = hmac.HMAC(key=node.chain_code, msg=data, digestmod=hashlib.sha512).digest() I_left_as_exponent = string_to_number(I64[:32]) - node_out = proto.HDNodeType() + node_out = proto_types.HDNodeType() node_out.version = node.version node_out.depth = node.depth + 1 node_out.child_num = i node_out.chain_code = I64[32:] node_out.fingerprint = fingerprint(node.public_key) - # FIXME - # node_out.public_key = cls._get_pubkey(node_out.private_key) - # x, y = self.public_pair - # the_point = I_left_as_exponent * ecdsa.generator_secp256k1 + ecdsa.Point(ecdsa.generator_secp256k1.curve(), x, y, SECP256k1.generator.order()) + # BIP32 magic converts old public key to new public point + x, y = sec_to_public_pair(node.public_key) + point = I_left_as_exponent * SECP256k1.generator + \ + Point(SECP256k1.curve, x, y, SECP256k1.order) + + if point == INFINITY: + raise Exception("Point cannot be INFINITY") + + # Convert public point to compressed public key + node_out.public_key = point_to_pubkey(point) return node_out diff --git a/trezorlib/client.py b/trezorlib/client.py index c37c1a18c..b3c0ccdad 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -396,20 +396,6 @@ class TrezorClient(object): self.init_device() return isinstance(resp, proto.Success) - def bip32_ckd(self, public_node, n): - raise Exception("Unfinished code") - - if not isinstance(n, list): - raise Exception('Parameter must be a list') - - node = types.HDNodeType() - node.CopyFrom(public_node) - - for i in n: - node.CopyFrom(ckd_public.get_subnode(node, i)) - - return node - def firmware_update(self, fp): if self.features.bootloader_mode == False: raise Exception("Device must be in bootloader mode") diff --git a/trezorlib/msqrt.py b/trezorlib/msqrt.py new file mode 100644 index 000000000..f582ec260 --- /dev/null +++ b/trezorlib/msqrt.py @@ -0,0 +1,94 @@ +# from http://eli.thegreenplace.net/2009/03/07/computing-modular-square-roots-in-python/ + +def modular_sqrt(a, p): + """ Find a quadratic residue (mod p) of 'a'. p + must be an odd prime. + + Solve the congruence of the form: + x^2 = a (mod p) + And returns x. Note that p - x is also a root. + + 0 is returned is no square root exists for + these a and p. + + The Tonelli-Shanks algorithm is used (except + for some simple cases in which the solution + is known from an identity). This algorithm + runs in polynomial time (unless the + generalized Riemann hypothesis is false). + """ + # Simple cases + # + if legendre_symbol(a, p) != 1: + return 0 + elif a == 0: + return 0 + elif p == 2: + return p + elif p % 4 == 3: + return pow(a, (p + 1) / 4, p) + + # Partition p-1 to s * 2^e for an odd s (i.e. + # reduce all the powers of 2 from p-1) + # + s = p - 1 + e = 0 + while s % 2 == 0: + s /= 2 + e += 1 + + # Find some 'n' with a legendre symbol n|p = -1. + # Shouldn't take long. + # + n = 2 + while legendre_symbol(n, p) != -1: + n += 1 + + # Here be dragons! + # Read the paper "Square roots from 1; 24, 51, + # 10 to Dan Shanks" by Ezra Brown for more + # information + # + + # x is a guess of the square root that gets better + # with each iteration. + # b is the "fudge factor" - by how much we're off + # with the guess. The invariant x^2 = ab (mod p) + # is maintained throughout the loop. + # g is used for successive powers of n to update + # both a and b + # r is the exponent - decreases with each update + # + x = pow(a, (s + 1) / 2, p) + b = pow(a, s, p) + g = pow(n, s, p) + r = e + + while True: + t = b + m = 0 + for m in xrange(r): + if t == 1: + break + t = pow(t, 2, p) + + if m == 0: + return x + + gs = pow(g, 2 ** (r - m - 1), p) + g = (gs * gs) % p + x = (x * gs) % p + b = (b * g) % p + r = m + +def legendre_symbol(a, p): + """ Compute the Legendre symbol a|p using + Euler's criterion. p is a prime, a is + relatively prime to p (if p divides + a, then a|p = 0) + + Returns 1 if a has a square root modulo + p, -1 otherwise. + """ + ls = pow(a, (p - 1) / 2, p) + return -1 if ls == p - 1 else ls diff --git a/trezorlib/tools.py b/trezorlib/tools.py index 3e0837196..cb264a4a5 100644 --- a/trezorlib/tools.py +++ b/trezorlib/tools.py @@ -1,7 +1,34 @@ +import hashlib + +Hash = lambda x: hashlib.sha256(hashlib.sha256(x).digest()).digest() + +def hash_160(public_key): + md = hashlib.new('ripemd160') + md.update(hashlib.sha256(public_key).digest()) + return md.digest() + + +def hash_160_to_bc_address(h160, address_type): + vh160 = chr(address_type) + h160 + h = Hash(vh160) + addr = vh160 + h[0:4] + return b58encode(addr) + +def compress_pubkey(public_key): + if public_key[0] == '\x04': + return chr((ord(public_key[64]) & 1) + 2) + public_key[1:33] + raise Exception("Pubkey is already compressed") + +def public_key_to_bc_address(public_key, address_type, compress=True): + if public_key[0] == '\x04' and compress: + public_key = compress_pubkey(public_key) + + h160 = hash_160(public_key) + return hash_160_to_bc_address(h160, address_type) + __b58chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' __b58base = len(__b58chars) - def b58encode(v): """ encode v, which is a string of bytes, to base58.""" From a1000528f39d91677e06b9c995defeeec1963370 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 16 Jan 2014 23:04:48 +0100 Subject: [PATCH 0150/1535] Compiled pb --- trezorlib/messages_pb2.py | 156 +++++++++++++++++++++++++++++++------- trezorlib/types_pb2.py | 18 ++--- 2 files changed, 136 insertions(+), 38 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 8f42c5195..9afd10f54 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop*\xdd\n\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop*\xa1\x0b\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -164,26 +164,34 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkDecision', index=35, number=100, + name='MessageType_EstimateTxSize', index=35, number=43, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_TxSize', index=36, number=44, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_DebugLinkDecision', index=37, number=100, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkGetState', index=36, number=101, + name='MessageType_DebugLinkGetState', index=38, number=101, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkState', index=37, number=102, + name='MessageType_DebugLinkState', index=39, number=102, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkStop', index=38, number=103, + name='MessageType_DebugLinkStop', index=40, number=103, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), ], containing_type=None, options=None, - serialized_start=2278, - serialized_end=3651, + serialized_start=2396, + serialized_end=3837, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -222,6 +230,8 @@ MessageType_VerifyMessage = 39 MessageType_MessageSignature = 40 MessageType_PassphraseRequest = 41 MessageType_PassphraseAck = 42 +MessageType_EstimateTxSize = 43 +MessageType_TxSize = 44 MessageType_DebugLinkDecision = 100 MessageType_DebugLinkGetState = 101 MessageType_DebugLinkState = 102 @@ -1167,6 +1177,76 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( ) +_ESTIMATETXSIZE = _descriptor.Descriptor( + name='EstimateTxSize', + full_name='EstimateTxSize', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='outputs_count', full_name='EstimateTxSize.outputs_count', index=0, + number=1, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='inputs_count', full_name='EstimateTxSize.inputs_count', index=1, + number=2, type=13, cpp_type=3, label=2, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='coin_name', full_name='EstimateTxSize.coin_name', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=True, default_value="Bitcoin", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1536, + serialized_end=1625, +) + + +_TXSIZE = _descriptor.Descriptor( + name='TxSize', + full_name='TxSize', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='tx_size', full_name='TxSize.tx_size', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1627, + serialized_end=1652, +) + + _SIGNTX = _descriptor.Descriptor( name='SignTx', full_name='SignTx', @@ -1204,8 +1284,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1536, - serialized_end=1617, + serialized_start=1654, + serialized_end=1735, ) @@ -1253,8 +1333,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1620, - serialized_end=1764, + serialized_start=1738, + serialized_end=1882, ) @@ -1309,8 +1389,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1767, - serialized_end=1913, + serialized_start=1885, + serialized_end=2031, ) @@ -1337,8 +1417,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1915, - serialized_end=1953, + serialized_start=2033, + serialized_end=2071, ) @@ -1365,8 +1445,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1955, - serialized_end=1996, + serialized_start=2073, + serialized_end=2114, ) @@ -1386,8 +1466,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1998, - serialized_end=2013, + serialized_start=2116, + serialized_end=2131, ) @@ -1414,8 +1494,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2015, - serialized_end=2054, + serialized_start=2133, + serialized_end=2172, ) @@ -1442,8 +1522,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2056, - serialized_end=2091, + serialized_start=2174, + serialized_end=2209, ) @@ -1463,8 +1543,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2093, - serialized_end=2112, + serialized_start=2211, + serialized_end=2230, ) @@ -1526,8 +1606,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2115, - serialized_end=2258, + serialized_start=2233, + serialized_end=2376, ) @@ -1547,8 +1627,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2260, - serialized_end=2275, + serialized_start=2378, + serialized_end=2393, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -1590,6 +1670,8 @@ DESCRIPTOR.message_types_by_name['EntropyAck'] = _ENTROPYACK DESCRIPTOR.message_types_by_name['SignMessage'] = _SIGNMESSAGE DESCRIPTOR.message_types_by_name['VerifyMessage'] = _VERIFYMESSAGE DESCRIPTOR.message_types_by_name['MessageSignature'] = _MESSAGESIGNATURE +DESCRIPTOR.message_types_by_name['EstimateTxSize'] = _ESTIMATETXSIZE +DESCRIPTOR.message_types_by_name['TxSize'] = _TXSIZE DESCRIPTOR.message_types_by_name['SignTx'] = _SIGNTX DESCRIPTOR.message_types_by_name['SimpleSignTx'] = _SIMPLESIGNTX DESCRIPTOR.message_types_by_name['TxRequest'] = _TXREQUEST @@ -1770,6 +1852,18 @@ class MessageSignature(_message.Message): # @@protoc_insertion_point(class_scope:MessageSignature) +class EstimateTxSize(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _ESTIMATETXSIZE + + # @@protoc_insertion_point(class_scope:EstimateTxSize) + +class TxSize(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _TXSIZE + + # @@protoc_insertion_point(class_scope:TxSize) + class SignTx(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _SIGNTX @@ -1907,6 +2001,10 @@ _MESSAGETYPE.values_by_name["MessageType_PassphraseRequest"].has_options = True _MESSAGETYPE.values_by_name["MessageType_PassphraseRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_PassphraseAck"].has_options = True _MESSAGETYPE.values_by_name["MessageType_PassphraseAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_EstimateTxSize"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_EstimateTxSize"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_TxSize"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_TxSize"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkDecision"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkDecision"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkGetState"].has_options = True diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index fc7df6382..7b8f74241 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x9a\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x16\n\x12\x46\x61ilure_FeeTooHigh\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x95\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -56,7 +56,7 @@ _FAILURETYPE = _descriptor.EnumDescriptor( options=None, type=None), _descriptor.EnumValueDescriptor( - name='Failure_FeeTooHigh', index=8, number=9, + name='Failure_Other', index=8, number=9, options=None, type=None), _descriptor.EnumValueDescriptor( @@ -67,7 +67,7 @@ _FAILURETYPE = _descriptor.EnumDescriptor( containing_type=None, options=None, serialized_start=825, - serialized_end=1107, + serialized_end=1102, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -88,8 +88,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1109, - serialized_end=1160, + serialized_start=1104, + serialized_end=1155, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -110,8 +110,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1162, - serialized_end=1202, + serialized_start=1157, + serialized_end=1197, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -123,7 +123,7 @@ Failure_PinExpected = 5 Failure_PinCancelled = 6 Failure_PinInvalid = 7 Failure_InvalidSignature = 8 -Failure_FeeTooHigh = 9 +Failure_Other = 9 Failure_FirmwareError = 99 PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 @@ -377,7 +377,7 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='address', full_name='TxOutputType.address', index=0, - number=1, type=12, cpp_type=9, label=2, + number=1, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, From 93d7fe5341d0b69085fc2d7d1f2d64eb41047086 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 16 Jan 2014 23:08:20 +0100 Subject: [PATCH 0151/1535] Estimate tx size --- tests/test_addresses.py | 3 --- tests/test_signtx.py | 34 ++++++++++++++++++++++++---------- trezorlib/client.py | 12 ++++++++++-- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/tests/test_addresses.py b/tests/test_addresses.py index de60ffceb..6e0787c90 100644 --- a/tests/test_addresses.py +++ b/tests/test_addresses.py @@ -50,9 +50,6 @@ class TestAddresses(common.TrezorTest): node_sub1 = self.client.get_public_node([1]) node_sub2 = bip32.public_ckd(node, [1]) - print node_sub1 - print node_sub2 - self.assertEqual(node_sub1.chain_code, node_sub2.chain_code) self.assertEqual(node_sub1.public_key, node_sub2.public_key) diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 07a28e707..786a4784d 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -6,8 +6,6 @@ import trezorlib.messages_pb2 as proto import trezorlib.types_pb2 as proto_types class TestSignTx(common.TrezorTest): - - ''' def test_simplesigntx(self): # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 # input 0: 0.0039 BTC @@ -19,19 +17,37 @@ class TestSignTx(common.TrezorTest): ) out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', - amount=380000, + amount=390000 - 10000, script_type=proto_types.PAYTOADDRESS, ) tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) - print binascii.hexlify(tx.serialized_tx) + # print binascii.hexlify(tx.serialized_tx) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') - ''' + def test_estimate_size(self): + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=390000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + + est_size = self.client.estimate_tx_size('Bitcoin', [inp1, ], [out1, ]) + self.assertEqual(est_size, 194) + + tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + real_size = len(tx.serialized_tx) + + self.assertGreaterEqual(est_size, real_size) + ''' def test_simplesigntx_testnet(self): - # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 - # input 0: 0.0039 BTC self.client.load_device_by_xprv('xprv9s21ZrQH143K3zttRjiQmYwyugvd13pnd2VzefWrfSouRfnj5oSkJgBQXxtn18E9mqrDop7fQ8Xnb9JCLPE4vghzhpU4dT33ZJ7frjzTEW8', '', False, 'testnet') @@ -49,10 +65,8 @@ class TestSignTx(common.TrezorTest): rawtx = {'d83b27f16ce5069e0c8e4a02813f252500e257744d5b00c9b6128be7189117b1': '01000000013b21cc65080c57793d0e47045a24d8e92262dc47efdc425fd5cad9a25e928f6c000000006b483045022100bde591f2c997bafa8388916663b148f4093914851a33a9903da69ad97afa6f470220138c6ff11321339974bac9c0992d7b9d72aef0c2d098f26267ec9f05d532c859012103edcc8dc5cac7dca6ed191d812621fb300863fea0dd5d14180b482b917a35acc4ffffffff020800c604000000001976a91453958011070469e2ef5e1115f34f509717d6884288acf8c99502000000001976a9141e2ba9407a6920246d0f345beecb89ed47c99a7788ac00000000'} tx = self.client.simple_sign_tx('Testnet', [inp1, ], [out1, ]) print binascii.hexlify(tx.serialized_tx) - # self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') - + self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') - ''' def test_signtx(self): expected_tx = '01000000012de70f7d6ffed0db70f8882f3fca90db9bb09f0e99bce27468c23d3c994fcd56' \ '010000008b4830450221009b985e14d53cfeed3496846db6ddaa77a0206138d0df4c2ccd3b' \ diff --git a/trezorlib/client.py b/trezorlib/client.py index b3c0ccdad..aff842b23 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -203,6 +203,14 @@ class TrezorClient(object): return False + def estimate_tx_size(self, coin_name, inputs, outputs): + msg = proto.EstimateTxSize() + msg.coin_name = coin_name + msg.inputs_count = len(inputs) + msg.outputs_count = len(outputs) + res = self.call(msg) + return res.tx_size + def simple_sign_tx(self, coin_name, inputs, outputs): msg = proto.SimpleSignTx() msg.coin_name = coin_name @@ -219,7 +227,7 @@ class TrezorClient(object): known_hashes.append(inp.prev_hash) return self.call(msg) - + def sign_tx(self, coin_name, inputs, outputs): ''' inputs: list of TxInput @@ -249,7 +257,7 @@ class TrezorClient(object): # Prepare and send initial message tx = proto.SignTx() tx.inputs_count = len(inputs) - tx.outputs_count = len(outputs) + tx.outputs_count = len(outputs) res = self.call(tx) # Prepare structure for signatures From 733a4e979cafa1a3d3b4aab71fe720220570074a Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 20 Jan 2014 13:21:49 +0100 Subject: [PATCH 0152/1535] adapt config.py to new api --- .gitignore | 1 + tests/config.py | 30 +++++++++++++++++++++++------- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 0d20b6487..f3df5d2a3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.pyc +*.bin diff --git a/tests/config.py b/tests/config.py index 02aa19084..56963adfc 100644 --- a/tests/config.py +++ b/tests/config.py @@ -5,22 +5,38 @@ from trezorlib.transport_pipe import PipeTransport from trezorlib.transport_hid import HidTransport from trezorlib.transport_socket import SocketTransportClient -use_pipe = True -if use_pipe: +use_real = True +use_pipe = False + +if use_real: + + devices = HidTransport.enumerate() + TRANSPORT = HidTransport + TRANSPORT_ARGS = (devices[0], ) + TRANSPORT_KWARGS = {'debug_link': False} + + DEBUG_TRANSPORT = HidTransport + DEBUG_TRANSPORT_ARGS = (devices[0], ) + DEBUG_TRANSPORT_KWARGS = {'debug_link': True} + +elif use_pipe: TRANSPORT = PipeTransport TRANSPORT_ARGS = ('../../trezor-emu/pipe.trezor', False) + TRANSPORT_KWARGS = {} DEBUG_TRANSPORT = PipeTransport DEBUG_TRANSPORT_ARGS = ('../../trezor-emu/pipe.trezor_debug', False) + DEBUG_TRANSPORT_KWARGS = {} else: + devices = HidTransport.enumerate() TRANSPORT = HidTransport - TRANSPORT_ARGS = ('0x10c4:0xea80:000868D3', False) + TRANSPORT_ARGS = (devices[0], ) + TRANSPORT_KWARGS = {'debug_link': False} DEBUG_TRANSPORT = SocketTransportClient - DEBUG_TRANSPORT_ARGS = ('trezor.bo:2000', False) - -#DEBUG_TRANSPORT = SocketTransportClient -#DEBUG_TRANSPORT_ARGS = ('trezor.dyn:2000', False) + DEBUG_TRANSPORT_ARGS = ('trezor.bo:2000', ) +# DEBUG_TRANSPORT_ARGS = ('trezor.dyn:2000') + DEBUG_TRANSPORT_KWARGS = {} From 1089f58eb5081020aa7a47525059d6dd50a542ad Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 27 Jan 2014 16:57:22 +0100 Subject: [PATCH 0153/1535] Code cleanup --- trezorlib/client.py | 36 ++++-------------------------------- 1 file changed, 4 insertions(+), 32 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index aff842b23..6763fff61 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -229,6 +229,10 @@ class TrezorClient(object): return self.call(msg) def sign_tx(self, coin_name, inputs, outputs): + # Temporary solution, until streaming is implemented in the firmware + return self.simple_sign_tx(coin_name, inputs, outputs) + + def _sign_tx(self, coin_name, inputs, outputs): ''' inputs: list of TxInput outputs: list of TxOutput @@ -248,7 +252,6 @@ class TrezorClient(object): #script_args= ) ''' - start = time.time() try: @@ -304,37 +307,6 @@ class TrezorClient(object): (time.time() - start, counter, len(serialized_tx)) return (signatures, serialized_tx) - - #print "PBDATA", tx.SerializeToString().encode('hex') - - ################# - ################# - ################# - - ''' - signatures = [('add550d6ba9ab7e01d37e17658f98b6e901208d241f24b08197b5e20dfa7f29f095ae01acbfa5c4281704a64053dcb80e9b089ecbe09f5871d67725803e36edd', '3045022100dced96eeb43836bc95676879eac303eabf39802e513f4379a517475c259da12502201fd36c90ecd91a32b2ca8fed2e1755a7f2a89c2d520eb0da10147802bc7ca217')] - - s_inputs = [] - for i in range(len(inputs)): - addr, v, p_hash, p_pos, p_scriptPubKey, _, _ = inputs[i] - pubkey = signatures[i][0].decode('hex') - sig = signatures[i][1].decode('hex') - s_inputs.append((addr, v, p_hash, p_pos, p_scriptPubKey, pubkey, sig)) - - return s_inputs - - s_inputs = [] - for i in range(len(inputs)): - addr, v, p_hash, p_pos, p_scriptPubKey, _, _ = inputs[i] - private_key = ecdsa.SigningKey.from_string( self.get_private_key(addr, password), curve = SECP256k1 ) - public_key = private_key.get_verifying_key() - pubkey = public_key.to_string() - tx = filter( raw_tx( inputs, outputs, for_sig = i ) ) - sig = private_key.sign_digest( Hash( tx.decode('hex') ), sigencode = ecdsa.util.sigencode_der ) - assert public_key.verify_digest( sig, Hash( tx.decode('hex') ), sigdecode = ecdsa.util.sigdecode_der) - s_inputs.append( (addr, v, p_hash, p_pos, p_scriptPubKey, pubkey, sig) ) - return s_inputs - ''' def reset_device(self, display_random, strength, passphrase_protection, pin_protection, label, language): # Begin with device reset workflow From 24861a1b5834696cad38a6be6231f560292f6735 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 27 Jan 2014 11:25:27 +0100 Subject: [PATCH 0154/1535] add check for expected type of message responses --- tests/test_basic.py | 18 ++++---- trezorlib/client.py | 104 +++++++++++++++++++++++--------------------- 2 files changed, 63 insertions(+), 59 deletions(-) diff --git a/tests/test_basic.py b/tests/test_basic.py index cfb61e9d0..e8e71e8a9 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -12,27 +12,27 @@ from trezorlib import messages_pb2 as messages ''' -class TestBasic(common.TrezorTest): +class TestBasic(common.TrezorTest): def test_features(self): features = self.client.call(messages.Initialize()) - + # Result is the same as reported by BitkeyClient class self.assertEqual(features, self.client.features) - + def test_ping(self): ping = self.client.call(messages.Ping(message='ahoj!')) - + # Ping results in Success(message='Ahoj!') self.assertEqual(ping, messages.Success(message='ahoj!')) - + def test_uuid(self): uuid1 = self.client.get_device_id() self.client.init_device() uuid2 = self.client.get_device_id() - - # UUID must be longer than 10 characters - self.assertEqual(len(uuid1), 12) - + + # UUID must be at least 12 characters + self.assertTrue(len(uuid1) >= 12) + # Every resulf of UUID must be the same self.assertEqual(uuid1, uuid2) diff --git a/trezorlib/client.py b/trezorlib/client.py index 6763fff61..a32a52ccd 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -11,7 +11,7 @@ from api_blockchain import BlockchainApi def show_message(message): print "MESSAGE FROM DEVICE:", message - + def show_input(input_text, message=None): if message: print "QUESTION FROM DEVICE:", message @@ -32,21 +32,21 @@ class PinException(CallException): PRIME_DERIVATION_FLAG = 0x80000000 class TrezorClient(object): - - def __init__(self, transport, debuglink=None, + + def __init__(self, transport, debuglink=None, message_func=show_message, input_func=show_input, pin_func=pin_func, passphrase_func=passphrase_func, blockchain_api=None, debug=False): self.transport = transport self.debuglink = debuglink - + self.message_func = message_func self.input_func = input_func self.pin_func = pin_func self.passphrase_func = passphrase_func self.debug = debug - + if blockchain_api: self.blockchain = blockchain_api else: @@ -54,14 +54,14 @@ class TrezorClient(object): self.setup_debuglink() self.init_device() - + def _get_local_entropy(self): return os.urandom(32) def _convert_prime(self, n): # Convert minus signs to uint32 with flag return [ int(abs(x) | PRIME_DERIVATION_FLAG) if x < 0 else x for x in n ] - + def expand_path(self, n): # Convert string of bip32 path to list of uint32 integers with prime flags # 0/-1/1' -> [0, 0x80000001, 0x80000001] @@ -79,7 +79,7 @@ class TrezorClient(object): prime = True x = abs(int(x)) - + if prime: x |= PRIME_DERIVATION_FLAG @@ -88,7 +88,7 @@ class TrezorClient(object): return path def init_device(self): - self.features = self.call(proto.Initialize()) + self.features = self.call(proto.Initialize(), proto.Features) def close(self): self.transport.close() @@ -96,17 +96,17 @@ class TrezorClient(object): self.debuglink.transport.close() def get_public_node(self, n): - return self.call(proto.GetPublicKey(address_n=n)).node - + return self.call(proto.GetPublicKey(address_n=n), proto.PublicKey).node + def get_address(self, coin_name, n): n = self._convert_prime(n) - return self.call(proto.GetAddress(address_n=n, coin_name=coin_name)).address - + return self.call(proto.GetAddress(address_n=n, coin_name=coin_name), proto.Address).address + def get_entropy(self, size): - return self.call(proto.GetEntropy(size=size)).entropy + return self.call(proto.GetEntropy(size=size), proto.Entropy).entropy def ping(self, msg): - return self.call(proto.Ping(message=msg)).message + return self.call(proto.Ping(message=msg), proto.Success).message def get_device_id(self): return self.features.device_id @@ -118,7 +118,7 @@ class TrezorClient(object): if language: settings.language = language - out = self.call(settings).message + out = self.call(settings, proto.Success).message self.init_device() # Reload Features return out @@ -129,25 +129,25 @@ class TrezorClient(object): def setup_debuglink(self, button=None, pin_correct=False): self.debug_button = button self.debug_pin = pin_correct - - def call(self, msg): + + def call(self, msg, expected = None): if self.debug: print '----------------------' print "Sending", self._pprint(msg) - + try: self.transport.session_begin() - + self.transport.write(msg) resp = self.transport.read_blocking() - + if isinstance(resp, proto.ButtonRequest): if self.debuglink and self.debug_button: print "Pressing button", self.debug_button self.debuglink.press_button(self.debug_button) - - return self.call(proto.ButtonAck()) - + + return self.call(proto.ButtonAck()) + if isinstance(resp, proto.PinMatrixRequest): if self.debuglink: if self.debug_pin == 1: @@ -161,9 +161,9 @@ class TrezorClient(object): else: pin = self.pin_func("PIN required: ", resp.message) msg2 = proto.PinMatrixAck(pin=pin) - + return self.call(msg2) - + if isinstance(resp, proto.PassphraseRequest): passphrase = self.passphrase_func("Passphrase required: ") msg2 = proto.PassphraseAck(passphrase=passphrase) @@ -171,22 +171,25 @@ class TrezorClient(object): finally: self.transport.session_end() - + if isinstance(resp, proto.Failure): self.message_func(resp.message) if resp.code == types.Failure_ActionCancelled: raise CallException("Action cancelled by user") - + elif resp.code in (types.Failure_PinInvalid, types.Failure_PinCancelled, types.Failure_PinExpected): raise PinException("PIN is invalid") - + raise CallException(resp.code, resp.message) - + if self.debug: print "Received", self._pprint(resp) - + + if expected and not isinstance(resp, expected): + raise CallException("Expected %s message, got %s message" % (expected.DESCRIPTOR.name, resp.DESCRIPTOR.name)) + return resp def sign_message(self, n, message): @@ -236,7 +239,7 @@ class TrezorClient(object): ''' inputs: list of TxInput outputs: list of TxOutput - + proto.TxInput(index=0, address_n=0, amount=0, @@ -250,62 +253,63 @@ class TrezorClient(object): amount=100000000, script_type=proto.PAYTOADDRESS, #script_args= - ) + ) ''' + start = time.time() - - try: + + try: self.transport.session_begin() - + # Prepare and send initial message tx = proto.SignTx() tx.inputs_count = len(inputs) tx.outputs_count = len(outputs) res = self.call(tx) - + # Prepare structure for signatures signatures = [None]*len(inputs) serialized_tx = '' - + counter = 0 while True: counter += 1 - + if isinstance(res, proto.Failure): raise CallException("Signing failed") - + if not isinstance(res, proto.TxRequest): raise CallException("Unexpected message") - + # If there's some part of signed transaction, let's add it if res.serialized_tx: print "!!! RECEIVED PART OF SERIALIED TX (%d BYTES)" % len(res.serialized_tx) serialized_tx += res.serialized_tx - + if res.signed_index >= 0 and res.signature: print "!!! SIGNED INPUT", res.signed_index signatures[res.signed_index] = res.signature - + if res.request_index < 0: # Device didn't ask for more information, finish workflow break - + # Device asked for one more information, let's process it. if res.request_type == types.TXOUTPUT: res = self.call(outputs[res.request_index]) continue - + elif res.request_type == types.TXINPUT: - print "REQUESTING", res.request_index + print "REQUESTING", res.request_index res = self.call(inputs[res.request_index]) - continue + continue finally: self.transport.session_end() - + print "SIGNED IN %.03f SECONDS, CALLED %d MESSAGES, %d BYTES" % \ (time.time() - start, counter, len(serialized_tx)) - + return (signatures, serialized_tx) def reset_device(self, display_random, strength, passphrase_protection, pin_protection, label, language): @@ -327,7 +331,7 @@ class TrezorClient(object): return isinstance(resp, proto.Success) - + def load_device_by_mnemonic(self, mnemonic, pin, passphrase_protection, label, language): resp = self.call(proto.LoadDevice(mnemonic=mnemonic, pin=pin, passphrase_protection=passphrase_protection, From e34874b7c1e070d0d68a121fb898e291625f5ede Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 29 Jan 2014 19:09:24 +0100 Subject: [PATCH 0155/1535] add entropy message test --- tests/test_entropy.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 tests/test_entropy.py diff --git a/tests/test_entropy.py b/tests/test_entropy.py new file mode 100644 index 000000000..11eedcfa2 --- /dev/null +++ b/tests/test_entropy.py @@ -0,0 +1,35 @@ +import unittest +import common +import math + +from trezorlib import messages_pb2 as messages + +def entropy(data): + e = 0 + for i in range(256): + p = 0 + for c in data: + if ord(c) == i: + p += 1 + if p == 0: + continue + p = 1.0 * p / len(data) + e -= p * math.log(p, 256) + return e + +class TestEntropy(common.TrezorTest): + + def test_entropy(self): + self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, + pin='', + passphrase_protection=False, + label='test', + language='english') + + for l in [0, 1, 2, 3, 4, 5, 8, 9, 16, 17, 32, 33, 64, 65, 128, 129, 256, 257, 512, 513, 1024]: + ent = self.client.get_entropy(l) + self.assertTrue(len(ent) >= l) + print 'entropy = ', entropy(ent) + +if __name__ == '__main__': + unittest.main() From fe0e409e77419f811943c72e23fbeb88260ec70b Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 31 Jan 2014 19:48:19 +0100 Subject: [PATCH 0156/1535] Implementation of ChangePin --- cmd.py | 8 ++++++++ tests/config.py | 4 ++-- tests/test.py | 21 +++++++++++++++++++++ trezorlib/client.py | 5 +++++ trezorlib/pinmatrix.py | 12 +++++++----- 5 files changed, 43 insertions(+), 7 deletions(-) diff --git a/cmd.py b/cmd.py index 21dde28e0..b845795f3 100755 --- a/cmd.py +++ b/cmd.py @@ -107,6 +107,9 @@ class Commands(object): def set_label(self, args): return self.client.apply_settings(label=args.label) + def change_pin(self, args): + return self.client.change_pin(args.remove) + def load_device(self, args): if not args.mnemonic and not args.xprv: raise Exception("Please provide mnemonic or xprv") @@ -146,6 +149,7 @@ class Commands(object): get_features.help = 'Retrieve device features and settings' get_public_node.help = 'Get public node of given path' set_label.help = 'Set new wallet label' + change_pin.help = 'Change new PIN or remove existing' list_coins.help = 'List all supported coin types by the device' load_device.help = 'Load custom configuration to the device' reset_device.help = 'Perform factory reset of the device and generate new seed' @@ -176,6 +180,10 @@ class Commands(object): # (('-c', '--clear'), {'action': 'store_true', 'default': False}) ) + change_pin.arguments = ( + (('-r', '--remove'), {'action': 'store_true', 'default': False}), + ) + load_device.arguments = ( (('-m', '--mnemonic'), {'type': str, 'nargs': '+'}), (('-x', '--xprv'), {'type': str}), diff --git a/tests/config.py b/tests/config.py index 56963adfc..31cf06ae5 100644 --- a/tests/config.py +++ b/tests/config.py @@ -5,8 +5,8 @@ from trezorlib.transport_pipe import PipeTransport from trezorlib.transport_hid import HidTransport from trezorlib.transport_socket import SocketTransportClient -use_real = True -use_pipe = False +use_real = False +use_pipe = True if use_real: diff --git a/tests/test.py b/tests/test.py index a9a5b26fd..5ec3fa325 100755 --- a/tests/test.py +++ b/tests/test.py @@ -1,4 +1,25 @@ #!/usr/bin/python +''' +* ApplySettings workflow, zistit cez Features ci sa zmeny aplikovali +* WipeDevice workflow, zistit cez Features ci to prebehlo +* LoadDevice workflow, zistit cez Features ci to prebehlo +* ResetDevice workflow + +- zrejme v sucinnosti s inymi testami + * ButtonRequest/ButtonAck workflow (vyvolat napr. pomocou GetEntropy, myslim ze ten GetEntropy vyzaduje PIN, ale ja by som to dal na button) + * PinMatrixRequest/PinMatrixAck workflow (vyvolat napr. pomocou ChangePin) + * PassphraseRequest/PassphraseAck workflow (vyvolat napr. pomocou GetAddress) + +* rozsirit test_sign.tx o viac transakcii (zlozitejsich) + +- chceme v tomto release(?) + * SignMessage workflow + * VerifyMessage workflow + +* otestovat session handling (tento test bude zrejme failovat na RPi) +''' + + ''' import sys sys.path = ['../',] + sys.path diff --git a/trezorlib/client.py b/trezorlib/client.py index a32a52ccd..6a40d7954 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -123,6 +123,11 @@ class TrezorClient(object): return out + def change_pin(self, remove=False): + ret = self.call(proto.ChangePin(remove=remove)) + self.init_device() # Re-read features + return ret + def _pprint(self, msg): return "<%s>:\n%s" % (msg.__class__.__name__, msg) diff --git a/trezorlib/pinmatrix.py b/trezorlib/pinmatrix.py index 162bc7d34..24f6ea473 100644 --- a/trezorlib/pinmatrix.py +++ b/trezorlib/pinmatrix.py @@ -15,6 +15,7 @@ class PinButton(QPushButton): def _pressed(self): self.password.setText(self.password.text() + str(self.encoded_value)) + print self.encoded_value self.password.setFocus() class PinMatrixWidget(QWidget): @@ -40,11 +41,12 @@ class PinMatrixWidget(QWidget): grid = QGridLayout() grid.setSpacing(0) - for x in range(9): - button = PinButton(self.password, x + 1) - button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - button.setFocusPolicy(Qt.NoFocus) - grid.addWidget(button, x / 3, x % 3) + for y in range(3)[::-1]: + for x in range(3): + button = PinButton(self.password, x + y * 3 + 1) + button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + button.setFocusPolicy(Qt.NoFocus) + grid.addWidget(button, 3 - y, x) hbox = QHBoxLayout() hbox.addWidget(self.password) From 366a7aa07dad581dd7749cb52802e6e482f2848c Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 31 Jan 2014 21:21:19 +0100 Subject: [PATCH 0157/1535] monkeypatching: text formatting of protobuf messages --- tests/test_signtx.py | 2 +- trezorlib/client.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) mode change 100644 => 100755 trezorlib/client.py diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 786a4784d..00a4477f0 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -6,6 +6,7 @@ import trezorlib.messages_pb2 as proto import trezorlib.types_pb2 as proto_types class TestSignTx(common.TrezorTest): + def test_simplesigntx(self): # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 # input 0: 0.0039 BTC @@ -22,7 +23,6 @@ class TestSignTx(common.TrezorTest): ) tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) - # print binascii.hexlify(tx.serialized_tx) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') def test_estimate_size(self): diff --git a/trezorlib/client.py b/trezorlib/client.py old mode 100644 new mode 100755 index 6a40d7954..97e9e79a8 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -9,6 +9,22 @@ import messages_pb2 as proto import types_pb2 as types from api_blockchain import BlockchainApi +# === start monkeypatching: text formatting of protobuf messages +import google.protobuf.text_format +import google.protobuf.descriptor + +_oldPrintFieldValue = google.protobuf.text_format.PrintFieldValue + +def _customPrintFieldValue(field, value, out, indent=0, as_utf8=False, as_one_line=False): + if field.cpp_type == google.protobuf.descriptor.FieldDescriptor.CPPTYPE_STRING: + if str(field.GetOptions()).strip() == '[binary]:': # binary option set + _oldPrintFieldValue(field, 'hex(%s)' % binascii.hexlify(value), out, indent, as_utf8, as_one_line) + else: + _oldPrintFieldValue(field, value, out, indent, as_utf8, as_one_line) + +google.protobuf.text_format.PrintFieldValue = _customPrintFieldValue +# === end of monkeypatching + def show_message(message): print "MESSAGE FROM DEVICE:", message From 27826553200f113cf40606d8395856589030a57a Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 1 Feb 2014 11:29:44 +0100 Subject: [PATCH 0158/1535] Monkeypatching of google.protobuf.text_format --- trezorlib/client.py | 17 ++--------------- trezorlib/tools.py | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 97e9e79a8..2943e48df 100755 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -9,21 +9,8 @@ import messages_pb2 as proto import types_pb2 as types from api_blockchain import BlockchainApi -# === start monkeypatching: text formatting of protobuf messages -import google.protobuf.text_format -import google.protobuf.descriptor - -_oldPrintFieldValue = google.protobuf.text_format.PrintFieldValue - -def _customPrintFieldValue(field, value, out, indent=0, as_utf8=False, as_one_line=False): - if field.cpp_type == google.protobuf.descriptor.FieldDescriptor.CPPTYPE_STRING: - if str(field.GetOptions()).strip() == '[binary]:': # binary option set - _oldPrintFieldValue(field, 'hex(%s)' % binascii.hexlify(value), out, indent, as_utf8, as_one_line) - else: - _oldPrintFieldValue(field, value, out, indent, as_utf8, as_one_line) - -google.protobuf.text_format.PrintFieldValue = _customPrintFieldValue -# === end of monkeypatching +# monkeypatching: text formatting of protobuf messages +tools.monkeypatch_google_protobuf_text_format() def show_message(message): print "MESSAGE FROM DEVICE:", message diff --git a/trezorlib/tools.py b/trezorlib/tools.py index cb264a4a5..ac389d652 100644 --- a/trezorlib/tools.py +++ b/trezorlib/tools.py @@ -1,4 +1,5 @@ import hashlib +import binascii Hash = lambda x: hashlib.sha256(hashlib.sha256(x).digest()).digest() @@ -54,7 +55,6 @@ def b58encode(v): return (__b58chars[0] * nPad) + result - def b58decode(v, length): """ decode v into a string of len bytes.""" long_value = 0L @@ -80,3 +80,21 @@ def b58decode(v, length): return None return result + +def monkeypatch_google_protobuf_text_format(): + # monkeypatching: text formatting of protobuf messages + import google.protobuf.text_format + import google.protobuf.descriptor + + _oldPrintFieldValue = google.protobuf.text_format.PrintFieldValue + + def _customPrintFieldValue(field, value, out, indent=0, as_utf8=False, as_one_line=False): + if field.cpp_type == google.protobuf.descriptor.FieldDescriptor.CPPTYPE_STRING and \ + str(field.GetOptions()).strip() == '[binary]:': # binary option set + _oldPrintFieldValue(field, 'hex(%s) str(%s)' % (binascii.hexlify(value), value), out, indent, as_utf8, as_one_line) + + else: + _oldPrintFieldValue(field, value, out, indent, as_utf8, as_one_line) + + google.protobuf.text_format.PrintFieldValue = _customPrintFieldValue + From eb22fad56871a8a7bbce6e71dbdbf1ffe2ea14e5 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 1 Feb 2014 11:57:59 +0100 Subject: [PATCH 0159/1535] protobuf text_format now prints in both binary and hex form --- trezorlib/tools.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/trezorlib/tools.py b/trezorlib/tools.py index ac389d652..94e9ac866 100644 --- a/trezorlib/tools.py +++ b/trezorlib/tools.py @@ -90,9 +90,8 @@ def monkeypatch_google_protobuf_text_format(): def _customPrintFieldValue(field, value, out, indent=0, as_utf8=False, as_one_line=False): if field.cpp_type == google.protobuf.descriptor.FieldDescriptor.CPPTYPE_STRING and \ - str(field.GetOptions()).strip() == '[binary]:': # binary option set - _oldPrintFieldValue(field, 'hex(%s) str(%s)' % (binascii.hexlify(value), value), out, indent, as_utf8, as_one_line) - + '[binary]:' in str(field.GetOptions()).strip(): # binary option set + _oldPrintFieldValue(field, 'hex(%s) | str(%s)' % (binascii.hexlify(value), value), out, indent, as_utf8, as_one_line) else: _oldPrintFieldValue(field, value, out, indent, as_utf8, as_one_line) From e2c8ad0f90641de82ea6797d49f22b1d256576b9 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 1 Feb 2014 13:39:06 +0100 Subject: [PATCH 0160/1535] Compiled pb --- trezorlib/messages_pb2.py | 227 ++++++++++++++++++++++++-------------- 1 file changed, 145 insertions(+), 82 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 9afd10f54..3fe1b292f 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x8a\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop*\xa1\x0b\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xc5\x0b\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -187,11 +187,15 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType_DebugLinkStop', index=40, number=103, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_DebugLinkLog', index=41, number=104, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), + type=None), ], containing_type=None, options=None, - serialized_start=2396, - serialized_end=3837, + serialized_start=2478, + serialized_end=3955, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -236,6 +240,7 @@ MessageType_DebugLinkDecision = 100 MessageType_DebugLinkGetState = 101 MessageType_DebugLinkState = 102 MessageType_DebugLinkStop = 103 +MessageType_DebugLinkLog = 104 @@ -344,6 +349,13 @@ _FEATURES = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='initialized', full_name='Features.initialized', index=11, + number=12, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -354,7 +366,7 @@ _FEATURES = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=46, - serialized_end=312, + serialized_end=333, ) @@ -388,8 +400,8 @@ _APPLYSETTINGS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=314, - serialized_end=368, + serialized_start=335, + serialized_end=389, ) @@ -416,8 +428,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=370, - serialized_end=397, + serialized_start=391, + serialized_end=418, ) @@ -444,8 +456,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=399, - serialized_end=422, + serialized_start=420, + serialized_end=443, ) @@ -472,8 +484,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=424, - serialized_end=450, + serialized_start=445, + serialized_end=471, ) @@ -507,8 +519,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=452, - serialized_end=506, + serialized_start=473, + serialized_end=527, ) @@ -528,8 +540,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=508, - serialized_end=523, + serialized_start=529, + serialized_end=544, ) @@ -549,8 +561,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=525, - serialized_end=536, + serialized_start=546, + serialized_end=557, ) @@ -577,8 +589,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=538, - serialized_end=573, + serialized_start=559, + serialized_end=594, ) @@ -605,8 +617,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=575, - serialized_end=602, + serialized_start=596, + serialized_end=623, ) @@ -626,8 +638,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=604, - serialized_end=612, + serialized_start=625, + serialized_end=633, ) @@ -647,8 +659,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=614, - serialized_end=633, + serialized_start=635, + serialized_end=654, ) @@ -675,8 +687,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=635, - serialized_end=676, + serialized_start=656, + serialized_end=697, ) @@ -703,8 +715,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=678, - serialized_end=704, + serialized_start=699, + serialized_end=725, ) @@ -731,8 +743,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=706, - serialized_end=738, + serialized_start=727, + serialized_end=759, ) @@ -766,8 +778,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=740, - serialized_end=801, + serialized_start=761, + serialized_end=822, ) @@ -794,8 +806,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=803, - serialized_end=841, + serialized_start=824, + serialized_end=862, ) @@ -829,8 +841,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=843, - serialized_end=902, + serialized_start=864, + serialized_end=923, ) @@ -857,8 +869,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=904, - serialized_end=930, + serialized_start=925, + serialized_end=951, ) @@ -878,8 +890,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=932, - serialized_end=944, + serialized_start=953, + serialized_end=965, ) @@ -941,8 +953,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=947, - serialized_end=1096, + serialized_start=968, + serialized_end=1117, ) @@ -1004,8 +1016,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1099, - serialized_end=1262, + serialized_start=1120, + serialized_end=1283, ) @@ -1025,8 +1037,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1264, - serialized_end=1280, + serialized_start=1285, + serialized_end=1301, ) @@ -1053,8 +1065,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1282, - serialized_end=1317, + serialized_start=1303, + serialized_end=1338, ) @@ -1095,8 +1107,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1319, - serialized_end=1402, + serialized_start=1340, + serialized_end=1423, ) @@ -1137,8 +1149,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1404, - serialized_end=1478, + serialized_start=1425, + serialized_end=1499, ) @@ -1172,8 +1184,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1480, - serialized_end=1534, + serialized_start=1501, + serialized_end=1555, ) @@ -1214,8 +1226,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1536, - serialized_end=1625, + serialized_start=1557, + serialized_end=1646, ) @@ -1242,8 +1254,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1627, - serialized_end=1652, + serialized_start=1648, + serialized_end=1673, ) @@ -1284,8 +1296,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1654, - serialized_end=1735, + serialized_start=1675, + serialized_end=1756, ) @@ -1333,8 +1345,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1738, - serialized_end=1882, + serialized_start=1759, + serialized_end=1903, ) @@ -1389,8 +1401,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1885, - serialized_end=2031, + serialized_start=1906, + serialized_end=2052, ) @@ -1417,8 +1429,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2033, - serialized_end=2071, + serialized_start=2054, + serialized_end=2092, ) @@ -1445,8 +1457,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2073, - serialized_end=2114, + serialized_start=2094, + serialized_end=2135, ) @@ -1466,8 +1478,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2116, - serialized_end=2131, + serialized_start=2137, + serialized_end=2152, ) @@ -1494,8 +1506,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2133, - serialized_end=2172, + serialized_start=2154, + serialized_end=2193, ) @@ -1522,8 +1534,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2174, - serialized_end=2209, + serialized_start=2195, + serialized_end=2230, ) @@ -1543,8 +1555,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2211, - serialized_end=2230, + serialized_start=2232, + serialized_end=2251, ) @@ -1606,8 +1618,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2233, - serialized_end=2376, + serialized_start=2254, + serialized_end=2397, ) @@ -1627,8 +1639,50 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2378, - serialized_end=2393, + serialized_start=2399, + serialized_end=2414, +) + + +_DEBUGLINKLOG = _descriptor.Descriptor( + name='DebugLinkLog', + full_name='DebugLinkLog', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='level', full_name='DebugLinkLog.level', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bucket', full_name='DebugLinkLog.bucket', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='text', full_name='DebugLinkLog.text', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=2416, + serialized_end=2475, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -1683,6 +1737,7 @@ DESCRIPTOR.message_types_by_name['DebugLinkDecision'] = _DEBUGLINKDECISION DESCRIPTOR.message_types_by_name['DebugLinkGetState'] = _DEBUGLINKGETSTATE DESCRIPTOR.message_types_by_name['DebugLinkState'] = _DEBUGLINKSTATE DESCRIPTOR.message_types_by_name['DebugLinkStop'] = _DEBUGLINKSTOP +DESCRIPTOR.message_types_by_name['DebugLinkLog'] = _DEBUGLINKLOG class Initialize(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType @@ -1930,6 +1985,12 @@ class DebugLinkStop(_message.Message): # @@protoc_insertion_point(class_scope:DebugLinkStop) +class DebugLinkLog(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DEBUGLINKLOG + + # @@protoc_insertion_point(class_scope:DebugLinkLog) + _MESSAGETYPE.values_by_name["MessageType_Initialize"].has_options = True _MESSAGETYPE.values_by_name["MessageType_Initialize"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') @@ -2013,6 +2074,8 @@ _MESSAGETYPE.values_by_name["MessageType_DebugLinkState"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkState"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkStop"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkStop"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_DebugLinkLog"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_DebugLinkLog"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001') _FEATURES.fields_by_name['device_id'].has_options = True _FEATURES.fields_by_name['device_id']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _FEATURES.fields_by_name['label'].has_options = True From 845f874aea669decd7440aeffab81ab5ffea58a1 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 1 Feb 2014 13:39:21 +0100 Subject: [PATCH 0161/1535] Added Features.initialized Implemented wipe_device --- cmd.py | 8 +++++++- tests/common.py | 1 + tests/test_basic.py | 20 ++++++++++++++------ trezorlib/client.py | 14 ++++++++++++++ 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/cmd.py b/cmd.py index b845795f3..d8857cde3 100755 --- a/cmd.py +++ b/cmd.py @@ -110,6 +110,9 @@ class Commands(object): def change_pin(self, args): return self.client.change_pin(args.remove) + def wipe_device(self, args): + return self.client.wipe_device() + def load_device(self, args): if not args.mnemonic and not args.xprv: raise Exception("Please provide mnemonic or xprv") @@ -151,8 +154,9 @@ class Commands(object): set_label.help = 'Set new wallet label' change_pin.help = 'Change new PIN or remove existing' list_coins.help = 'List all supported coin types by the device' + wipe_device.help = 'Reset device to factory defaults and remove all private data.' load_device.help = 'Load custom configuration to the device' - reset_device.help = 'Perform factory reset of the device and generate new seed' + reset_device.help = 'Perform device setup and generate new seed' sign_message.help = 'Sign message using address of given path' verify_message.help = 'Verify message' firmware_update.help = 'Upload new firmware to device (must be in bootloader mode)' @@ -184,6 +188,8 @@ class Commands(object): (('-r', '--remove'), {'action': 'store_true', 'default': False}), ) + wipe_device.arguments = () + load_device.arguments = ( (('-m', '--mnemonic'), {'type': str, 'nargs': '+'}), (('-x', '--xprv'), {'type': str}), diff --git a/tests/common.py b/tests/common.py index c1454a44e..d2c7ddc79 100644 --- a/tests/common.py +++ b/tests/common.py @@ -17,6 +17,7 @@ class TrezorTest(unittest.TestCase): self.client.setup_debuglink(button=True, pin_correct=True) + self.client.wipe_device() self.client.load_device_by_mnemonic( mnemonic=self.mnemonic1, pin=self.pin1, diff --git a/tests/test_basic.py b/tests/test_basic.py index e8e71e8a9..16817df01 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -25,16 +25,24 @@ class TestBasic(common.TrezorTest): # Ping results in Success(message='Ahoj!') self.assertEqual(ping, messages.Success(message='ahoj!')) - def test_uuid(self): - uuid1 = self.client.get_device_id() + def test_device_id_same(self): + id1 = self.client.get_device_id() self.client.init_device() - uuid2 = self.client.get_device_id() + id2 = self.client.get_device_id() - # UUID must be at least 12 characters - self.assertTrue(len(uuid1) >= 12) + # ID must be at least 12 characters + self.assertTrue(len(id1) >= 12) # Every resulf of UUID must be the same - self.assertEqual(uuid1, uuid2) + self.assertEqual(id1, id2) + + def test_device_id_different(self): + id1 = self.client.get_device_id() + self.client.wipe_device() + id2 = self.client.get_device_id() + + # Device ID must be fresh after every reset + self.assertNotEqual(id1, id2) if __name__ == '__main__': unittest.main() diff --git a/trezorlib/client.py b/trezorlib/client.py index 2943e48df..9e8d90215 100755 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -320,7 +320,15 @@ class TrezorClient(object): return (signatures, serialized_tx) + def wipe_device(self): + ret = self.call(proto.WipeDevice()) + self.init_device() + return ret + def reset_device(self, display_random, strength, passphrase_protection, pin_protection, label, language): + if self.features.initialized: + raise Exception("Device is initialized already. Call wipe_device() and try again.") + # Begin with device reset workflow msg = proto.ResetDevice(display_random=display_random, strength=strength, @@ -341,6 +349,9 @@ class TrezorClient(object): return isinstance(resp, proto.Success) def load_device_by_mnemonic(self, mnemonic, pin, passphrase_protection, label, language): + if self.features.initialized: + raise Exception("Device is initialized already. Call wipe_device() and try again.") + resp = self.call(proto.LoadDevice(mnemonic=mnemonic, pin=pin, passphrase_protection=passphrase_protection, language=language, @@ -349,6 +360,9 @@ class TrezorClient(object): return isinstance(resp, proto.Success) def load_device_by_xprv(self, xprv, pin, passphrase_protection, label): + if self.features.initialized: + raise Exception("Device is initialized already. Call wipe_device() and try again.") + if xprv[0:4] not in ('xprv', 'tprv'): raise Exception("Unknown type of xprv") From c7729e082c069b74d7bdc27af265bfde8af9aba3 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sun, 2 Feb 2014 15:24:47 +0100 Subject: [PATCH 0162/1535] Tool for checking TREZOR-generated mnemonic --- mnemonic_check.py | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100755 mnemonic_check.py diff --git a/mnemonic_check.py b/mnemonic_check.py new file mode 100755 index 000000000..197cfcea2 --- /dev/null +++ b/mnemonic_check.py @@ -0,0 +1,61 @@ +#!/usr/bin/python +''' + Use this script to cross-check that TREZOR generated valid + mnemonic sentence for given internal (TREZOR-generated) + and external (computer-generated) entropy. +''' + +import binascii +import hashlib +import mnemonic + +def generate_entropy(strength, internal_entropy, external_entropy): + ''' + strength - length of produced seed. One of 128, 192, 256 + random - binary stream of random data from external HRNG + ''' + if strength not in (128, 192, 256): + raise Exception("Invalid strength") + + if not internal_entropy: + raise Exception("Internal entropy is not provided") + + if len(internal_entropy) < 32: + raise Exception("Internal entropy too short") + + if not external_entropy: + raise Exception("External entropy is not provided") + + if len(external_entropy) < 32: + raise Exception("External entropy too short") + + entropy = hashlib.sha256(internal_entropy + external_entropy).digest() + entropy_stripped = entropy[:strength / 8] + + if len(entropy_stripped) * 8 != strength: + raise Exception("Entropy length mismatch") + + return entropy_stripped + +def main(): + comp = binascii.unhexlify(raw_input("Please enter computer-generated entropy (in hex): ").strip()) + trzr = binascii.unhexlify(raw_input("Please enter TREZOR-generated entropy (in hex): ").strip()) + word_count = int(raw_input("How many words your mnemonic has? ")) + + strength = word_count * 32 / 3 + + entropy = generate_entropy(strength, trzr, comp) + + words = mnemonic.Mnemonic('english').to_mnemonic(entropy) + if not mnemonic.Mnemonic('english').check(words): + print "Mnemonic is invalid" + return + + if len(words.split(' ')) != word_count: + print "Mnemonic length mismatch!" + return + + print "Generated mnemonic is:", words + +if __name__ == '__main__': + main() From 0262d13944e16ce890bb59bb0abf6550140d1c37 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sun, 2 Feb 2014 15:29:07 +0100 Subject: [PATCH 0163/1535] Added warning about entering secrets to this script --- mnemonic_check.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mnemonic_check.py b/mnemonic_check.py index 197cfcea2..740bced23 100755 --- a/mnemonic_check.py +++ b/mnemonic_check.py @@ -3,6 +3,11 @@ Use this script to cross-check that TREZOR generated valid mnemonic sentence for given internal (TREZOR-generated) and external (computer-generated) entropy. + + Keep in mind that you're entering secret information to this script. + Hijacking of these information may lead to stealing your bitcoins + from your wallet! We strongly recommend to run this script only on + offline computer (ideally live linux distribution without internet connection). ''' import binascii From 7152e091a9920aab658be4a30ae6769761623290 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sun, 2 Feb 2014 15:37:50 +0100 Subject: [PATCH 0164/1535] Fixed missing parameter in reset_device --- cmd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd.py b/cmd.py index d8857cde3..ff632e414 100755 --- a/cmd.py +++ b/cmd.py @@ -127,7 +127,7 @@ class Commands(object): args.passphrase_protection, args.label, 'english') def reset_device(self, args): - return self.client.reset_device(True, args.strength, args.passphrase, args.pin, args.label) + return self.client.reset_device(True, args.strength, args.passphrase, args.pin, args.label, 'english') def sign_message(self, args): return pb2json(self.client.sign_message(args.n, args.message), {'message': args.message}) From cbd1e36bb8edd783318946f6c894da3825a3dcd1 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sun, 2 Feb 2014 18:27:36 +0100 Subject: [PATCH 0165/1535] Compiled pb --- trezorlib/messages_pb2.py | 237 +++++++++++++++++++++++++++++++------- trezorlib/types_pb2.py | 4 +- 2 files changed, 198 insertions(+), 43 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 3fe1b292f..803448a51 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xc5\x0b\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8b\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -172,30 +172,42 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkDecision', index=37, number=100, + name='MessageType_RecoveryDevice', index=37, number=45, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_WordRequest', index=38, number=46, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_WordAck', index=39, number=47, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_DebugLinkDecision', index=40, number=100, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkGetState', index=38, number=101, + name='MessageType_DebugLinkGetState', index=41, number=101, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkState', index=39, number=102, + name='MessageType_DebugLinkState', index=42, number=102, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkStop', index=40, number=103, + name='MessageType_DebugLinkStop', index=43, number=103, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkLog', index=41, number=104, + name='MessageType_DebugLinkLog', index=44, number=104, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), ], containing_type=None, options=None, - serialized_start=2478, - serialized_end=3955, + serialized_start=2666, + serialized_end=4247, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -236,6 +248,9 @@ MessageType_PassphraseRequest = 41 MessageType_PassphraseAck = 42 MessageType_EstimateTxSize = 43 MessageType_TxSize = 44 +MessageType_RecoveryDevice = 45 +MessageType_WordRequest = 46 +MessageType_WordAck = 47 MessageType_DebugLinkDecision = 100 MessageType_DebugLinkGetState = 101 MessageType_DebugLinkState = 102 @@ -1070,6 +1085,111 @@ _ENTROPYACK = _descriptor.Descriptor( ) +_RECOVERYDEVICE = _descriptor.Descriptor( + name='RecoveryDevice', + full_name='RecoveryDevice', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='word_count', full_name='RecoveryDevice.word_count', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='passphrase_protection', full_name='RecoveryDevice.passphrase_protection', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pin_protection', full_name='RecoveryDevice.pin_protection', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='language', full_name='RecoveryDevice.language', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=True, default_value="english", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='label', full_name='RecoveryDevice.label', index=4, + number=5, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1341, + serialized_end=1480, +) + + +_WORDREQUEST = _descriptor.Descriptor( + name='WordRequest', + full_name='WordRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1482, + serialized_end=1495, +) + + +_WORDACK = _descriptor.Descriptor( + name='WordAck', + full_name='WordAck', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='word', full_name='WordAck.word', index=0, + number=1, type=12, cpp_type=9, label=2, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1497, + serialized_end=1526, +) + + _SIGNMESSAGE = _descriptor.Descriptor( name='SignMessage', full_name='SignMessage', @@ -1107,8 +1227,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1340, - serialized_end=1423, + serialized_start=1528, + serialized_end=1611, ) @@ -1149,8 +1269,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1425, - serialized_end=1499, + serialized_start=1613, + serialized_end=1687, ) @@ -1184,8 +1304,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1501, - serialized_end=1555, + serialized_start=1689, + serialized_end=1743, ) @@ -1226,8 +1346,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1557, - serialized_end=1646, + serialized_start=1745, + serialized_end=1834, ) @@ -1254,8 +1374,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1648, - serialized_end=1673, + serialized_start=1836, + serialized_end=1861, ) @@ -1296,8 +1416,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1675, - serialized_end=1756, + serialized_start=1863, + serialized_end=1944, ) @@ -1345,8 +1465,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1759, - serialized_end=1903, + serialized_start=1947, + serialized_end=2091, ) @@ -1401,8 +1521,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1906, - serialized_end=2052, + serialized_start=2094, + serialized_end=2240, ) @@ -1429,8 +1549,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2054, - serialized_end=2092, + serialized_start=2242, + serialized_end=2280, ) @@ -1457,8 +1577,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2094, - serialized_end=2135, + serialized_start=2282, + serialized_end=2323, ) @@ -1478,8 +1598,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2137, - serialized_end=2152, + serialized_start=2325, + serialized_end=2340, ) @@ -1506,8 +1626,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2154, - serialized_end=2193, + serialized_start=2342, + serialized_end=2381, ) @@ -1534,8 +1654,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2195, - serialized_end=2230, + serialized_start=2383, + serialized_end=2418, ) @@ -1555,8 +1675,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2232, - serialized_end=2251, + serialized_start=2420, + serialized_end=2439, ) @@ -1618,8 +1738,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2254, - serialized_end=2397, + serialized_start=2442, + serialized_end=2585, ) @@ -1639,8 +1759,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2399, - serialized_end=2414, + serialized_start=2587, + serialized_end=2602, ) @@ -1681,8 +1801,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2416, - serialized_end=2475, + serialized_start=2604, + serialized_end=2663, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -1721,6 +1841,9 @@ DESCRIPTOR.message_types_by_name['LoadDevice'] = _LOADDEVICE DESCRIPTOR.message_types_by_name['ResetDevice'] = _RESETDEVICE DESCRIPTOR.message_types_by_name['EntropyRequest'] = _ENTROPYREQUEST DESCRIPTOR.message_types_by_name['EntropyAck'] = _ENTROPYACK +DESCRIPTOR.message_types_by_name['RecoveryDevice'] = _RECOVERYDEVICE +DESCRIPTOR.message_types_by_name['WordRequest'] = _WORDREQUEST +DESCRIPTOR.message_types_by_name['WordAck'] = _WORDACK DESCRIPTOR.message_types_by_name['SignMessage'] = _SIGNMESSAGE DESCRIPTOR.message_types_by_name['VerifyMessage'] = _VERIFYMESSAGE DESCRIPTOR.message_types_by_name['MessageSignature'] = _MESSAGESIGNATURE @@ -1889,6 +2012,24 @@ class EntropyAck(_message.Message): # @@protoc_insertion_point(class_scope:EntropyAck) +class RecoveryDevice(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _RECOVERYDEVICE + + # @@protoc_insertion_point(class_scope:RecoveryDevice) + +class WordRequest(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _WORDREQUEST + + # @@protoc_insertion_point(class_scope:WordRequest) + +class WordAck(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _WORDACK + + # @@protoc_insertion_point(class_scope:WordAck) + class SignMessage(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _SIGNMESSAGE @@ -1992,6 +2133,8 @@ class DebugLinkLog(_message.Message): # @@protoc_insertion_point(class_scope:DebugLinkLog) +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), '\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE.values_by_name["MessageType_Initialize"].has_options = True _MESSAGETYPE.values_by_name["MessageType_Initialize"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_Ping"].has_options = True @@ -2066,6 +2209,12 @@ _MESSAGETYPE.values_by_name["MessageType_EstimateTxSize"].has_options = True _MESSAGETYPE.values_by_name["MessageType_EstimateTxSize"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_TxSize"].has_options = True _MESSAGETYPE.values_by_name["MessageType_TxSize"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_RecoveryDevice"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_RecoveryDevice"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_WordRequest"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_WordRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_WordAck"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_WordAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkDecision"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkDecision"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkGetState"].has_options = True @@ -2092,6 +2241,10 @@ _RESETDEVICE.fields_by_name['label'].has_options = True _RESETDEVICE.fields_by_name['label']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _ENTROPYACK.fields_by_name['entropy'].has_options = True _ENTROPYACK.fields_by_name['entropy']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_RECOVERYDEVICE.fields_by_name['label'].has_options = True +_RECOVERYDEVICE.fields_by_name['label']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_WORDACK.fields_by_name['word'].has_options = True +_WORDACK.fields_by_name['word']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _SIGNMESSAGE.fields_by_name['message'].has_options = True _SIGNMESSAGE.fields_by_name['message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _VERIFYMESSAGE.fields_by_name['message'].has_options = True diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 7b8f74241..db0793f49 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x95\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x95\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x37\n(org.multibit.hd.hardware.trezor.protobufB\x0bTrezorTypes') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -559,6 +559,8 @@ google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_out) google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_in) google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_out) +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), '\n(org.multibit.hd.hardware.trezor.protobufB\013TrezorTypes') _HDNODETYPE.fields_by_name['chain_code'].has_options = True _HDNODETYPE.fields_by_name['chain_code']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _HDNODETYPE.fields_by_name['private_key'].has_options = True From 5a10692e86baca5992ddf99dd535f15d3f33b64f Mon Sep 17 00:00:00 2001 From: slush0 Date: Sun, 2 Feb 2014 18:27:44 +0100 Subject: [PATCH 0166/1535] Implemented RecoveryDevice --- cmd.py | 19 ++++++++++++++++--- trezorlib/client.py | 38 +++++++++++++++++++++++++++++++------- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/cmd.py b/cmd.py index ff632e414..6381dfe03 100755 --- a/cmd.py +++ b/cmd.py @@ -113,6 +113,10 @@ class Commands(object): def wipe_device(self, args): return self.client.wipe_device() + def recovery_device(self, args): + return self.client.recovery_device(args.words, args.passphrase_protection, + args.pin_protection, args.label, 'english') + def load_device(self, args): if not args.mnemonic and not args.xprv: raise Exception("Please provide mnemonic or xprv") @@ -127,7 +131,8 @@ class Commands(object): args.passphrase_protection, args.label, 'english') def reset_device(self, args): - return self.client.reset_device(True, args.strength, args.passphrase, args.pin, args.label, 'english') + return self.client.reset_device(True, args.strength, args.passphrase_protection, + args.pin_protection, args.label, 'english') def sign_message(self, args): return pb2json(self.client.sign_message(args.n, args.message), {'message': args.message}) @@ -155,6 +160,7 @@ class Commands(object): change_pin.help = 'Change new PIN or remove existing' list_coins.help = 'List all supported coin types by the device' wipe_device.help = 'Reset device to factory defaults and remove all private data.' + recovery_device.help = 'Start safe recovery workflow' load_device.help = 'Load custom configuration to the device' reset_device.help = 'Perform device setup and generate new seed' sign_message.help = 'Sign message using address of given path' @@ -190,6 +196,13 @@ class Commands(object): wipe_device.arguments = () + recovery_device.arguments = ( + (('-w', '--words'), {'type': int}), + (('-p', '--pin-protection'), {'action': 'store_true', 'default': False}), + (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), + (('-l', '--label'), {'type': str, 'default': ''}), + ) + load_device.arguments = ( (('-m', '--mnemonic'), {'type': str, 'nargs': '+'}), (('-x', '--xprv'), {'type': str}), @@ -200,8 +213,8 @@ class Commands(object): reset_device.arguments = ( (('-t', '--strength'), {'type': int, 'choices': [128, 192, 256], 'default': 128}), - (('-p', '--pin'), {'action': 'store_true', 'default': False}), - (('-r', '--passphrase'), {'action': 'store_true', 'default': False}), + (('-p', '--pin-protection'), {'action': 'store_true', 'default': False}), + (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), (('-l', '--label'), {'type': str, 'default': ''}), ) diff --git a/trezorlib/client.py b/trezorlib/client.py index 9e8d90215..97dfcebe7 100755 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -26,6 +26,9 @@ def pin_func(input_text, message=None): def passphrase_func(input_text): return show_input(input_text) +def word_func(): + return raw_input("Enter one word of mnemonic: ") + class CallException(Exception): pass @@ -39,7 +42,7 @@ class TrezorClient(object): def __init__(self, transport, debuglink=None, message_func=show_message, input_func=show_input, pin_func=pin_func, passphrase_func=passphrase_func, - blockchain_api=None, debug=False): + word_func=word_func, blockchain_api=None, debug=False): self.transport = transport self.debuglink = debuglink @@ -47,6 +50,7 @@ class TrezorClient(object): self.input_func = input_func self.pin_func = pin_func self.passphrase_func = passphrase_func + self.word_func = word_func self.debug = debug @@ -325,18 +329,38 @@ class TrezorClient(object): self.init_device() return ret + def recovery_device(self, word_count, passphrase_protection, pin_protection, label, language): + if word_count not in (12, 18, 24): + raise Exception("Invalid word count. Use 12/18/24") + + res = self.call(proto.RecoveryDevice(word_count=int(word_count), + passphrase_protection=bool(passphrase_protection), + pin_protection=bool(pin_protection), + label=label, + language=language)) + + while isinstance(res, proto.WordRequest): + word = self.word_func() + res = self.call(proto.WordAck(word=word)) + + if not isinstance(res, proto.Success): + raise Exception("Recovery device failed") + + self.init_device() + return True + def reset_device(self, display_random, strength, passphrase_protection, pin_protection, label, language): if self.features.initialized: raise Exception("Device is initialized already. Call wipe_device() and try again.") # Begin with device reset workflow msg = proto.ResetDevice(display_random=display_random, - strength=strength, - language=language, - passphrase_protection=bool(passphrase_protection), - pin_protection=bool(pin_protection), - label=label - ) + strength=strength, + language=language, + passphrase_protection=bool(passphrase_protection), + pin_protection=bool(pin_protection), + label=label) + resp = self.call(msg) if not isinstance(resp, proto.EntropyRequest): raise Exception("Invalid response, expected EntropyRequest") From 85d98f298938505a823fd8536d1b718d84ba4325 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 3 Feb 2014 11:36:56 +0100 Subject: [PATCH 0167/1535] Updated warning --- mnemonic_check.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mnemonic_check.py b/mnemonic_check.py index 740bced23..858b6067f 100755 --- a/mnemonic_check.py +++ b/mnemonic_check.py @@ -1,13 +1,14 @@ #!/usr/bin/python -''' +__doc__ = ''' Use this script to cross-check that TREZOR generated valid mnemonic sentence for given internal (TREZOR-generated) and external (computer-generated) entropy. Keep in mind that you're entering secret information to this script. - Hijacking of these information may lead to stealing your bitcoins + Leaking of these information may lead to stealing your bitcoins from your wallet! We strongly recommend to run this script only on - offline computer (ideally live linux distribution without internet connection). + highly secured computer (ideally live linux distribution + without an internet connection). ''' import binascii @@ -43,6 +44,8 @@ def generate_entropy(strength, internal_entropy, external_entropy): return entropy_stripped def main(): + print __doc__ + comp = binascii.unhexlify(raw_input("Please enter computer-generated entropy (in hex): ").strip()) trzr = binascii.unhexlify(raw_input("Please enter TREZOR-generated entropy (in hex): ").strip()) word_count = int(raw_input("How many words your mnemonic has? ")) From 7a35872ccf6fd1d6ce08431a6807242e8791fc4c Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 3 Feb 2014 15:44:52 +0100 Subject: [PATCH 0168/1535] unit test for signing/verifying messages --- tests/test_messages.py | 65 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 tests/test_messages.py diff --git a/tests/test_messages.py b/tests/test_messages.py new file mode 100644 index 000000000..e68ba9bf8 --- /dev/null +++ b/tests/test_messages.py @@ -0,0 +1,65 @@ +import unittest +import common +import binascii + +import trezorlib.messages_pb2 as proto +import trezorlib.types_pb2 as proto_types + +class TestMessages(common.TrezorTest): + + def test_message_sign(self): + sig = self.client.sign_message([0], "This is an example of a signed message.") + self.assertEqual(sig.address, '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e') + self.assertEqual(binascii.hexlify(sig.signature), XXX) + + def test_message_verify(self): + + # uncompressed pubkey - OK + res = self.client.verify_message( + '1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', + binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), + 'This is an example of a signed message.' + ) + self.assertIsInstance(res, proto.Success) + + # uncompressed pubkey - FAIL + res = self.client.verify_message( + '1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', + binascii.unhexlify('1ba77e01a9e17ba158b96200000000dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), + 'This is an example of a signed message.' + ) + self.assertIsInstance(res, proto.Failure) + self.assertEqual(res.code, proto_types.Failure_InvalidSignature) + + # compressed pubkey - OK + res = self.client.verify_message( + '1C7zdTfnkzmr13HfA2vNm5SJYRK6nEKyq8', + binascii.unhexlify('1f44e3e461f7ca9f57c472ce1a28214df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), + 'This is an example of a signed message.') + self.assertIsInstance(res, proto.Success) + + # compressed pubkey - FAIL + res = self.client.verify_message( + '1C7zdTfnkzmr13HfA2vNm5SJYRK6nEKyq8', + binascii.unhexlify('1f44e3e461f7ca9f57c472000000004df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), + 'This is an example of a signed message.' + ) + self.assertIsInstance(res, proto.Failure) + self.assertEqual(res.code, proto_types.Failure_InvalidSignature) + + # trezor pubkey - OK + res = self.client.verify_message( + '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', + binascii.unhexlify(XXX), + 'This is an example of a signed message.' + ) + self.assertIsInstance(res, proto.Success) + + # trezor pubkey - FAIL + res = self.client.verify_message( + '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', + binascii.unhexlify(XXX__), + 'This is an example of a signed message.' + ) + self.assertIsInstance(res, proto.Failure) + self.assertEqual(res.code, proto_types.Failure_InvalidSignature) From 1fcb7e7fffa65b5d3ae9acd7ec27116183e95618 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 3 Feb 2014 16:17:02 +0100 Subject: [PATCH 0169/1535] Compiled pb --- trezorlib/messages_pb2.py | 76 ++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 803448a51..04555092e 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8b\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"J\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8b\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -206,8 +206,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2666, - serialized_end=4247, + serialized_start=2678, + serialized_end=4259, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -1252,7 +1252,7 @@ _VERIFYMESSAGE = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None), + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), _descriptor.FieldDescriptor( name='message', full_name='VerifyMessage.message', index=2, number=3, type=12, cpp_type=9, label=1, @@ -1270,7 +1270,7 @@ _VERIFYMESSAGE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=1613, - serialized_end=1687, + serialized_end=1693, ) @@ -1294,7 +1294,7 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None), + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), ], extensions=[ ], @@ -1304,8 +1304,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1689, - serialized_end=1743, + serialized_start=1695, + serialized_end=1755, ) @@ -1346,8 +1346,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1745, - serialized_end=1834, + serialized_start=1757, + serialized_end=1846, ) @@ -1374,8 +1374,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1836, - serialized_end=1861, + serialized_start=1848, + serialized_end=1873, ) @@ -1416,8 +1416,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1863, - serialized_end=1944, + serialized_start=1875, + serialized_end=1956, ) @@ -1465,8 +1465,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1947, - serialized_end=2091, + serialized_start=1959, + serialized_end=2103, ) @@ -1521,8 +1521,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2094, - serialized_end=2240, + serialized_start=2106, + serialized_end=2252, ) @@ -1549,8 +1549,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2242, - serialized_end=2280, + serialized_start=2254, + serialized_end=2292, ) @@ -1577,8 +1577,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2282, - serialized_end=2323, + serialized_start=2294, + serialized_end=2335, ) @@ -1598,8 +1598,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2325, - serialized_end=2340, + serialized_start=2337, + serialized_end=2352, ) @@ -1626,8 +1626,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2342, - serialized_end=2381, + serialized_start=2354, + serialized_end=2393, ) @@ -1654,8 +1654,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2383, - serialized_end=2418, + serialized_start=2395, + serialized_end=2430, ) @@ -1675,8 +1675,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2420, - serialized_end=2439, + serialized_start=2432, + serialized_end=2451, ) @@ -1738,8 +1738,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2442, - serialized_end=2585, + serialized_start=2454, + serialized_end=2597, ) @@ -1759,8 +1759,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2587, - serialized_end=2602, + serialized_start=2599, + serialized_end=2614, ) @@ -1801,8 +1801,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2604, - serialized_end=2663, + serialized_start=2616, + serialized_end=2675, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -2247,8 +2247,12 @@ _WORDACK.fields_by_name['word'].has_options = True _WORDACK.fields_by_name['word']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _SIGNMESSAGE.fields_by_name['message'].has_options = True _SIGNMESSAGE.fields_by_name['message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_VERIFYMESSAGE.fields_by_name['signature'].has_options = True +_VERIFYMESSAGE.fields_by_name['signature']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _VERIFYMESSAGE.fields_by_name['message'].has_options = True _VERIFYMESSAGE.fields_by_name['message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_MESSAGESIGNATURE.fields_by_name['signature'].has_options = True +_MESSAGESIGNATURE.fields_by_name['signature']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _TXREQUEST.fields_by_name['signature'].has_options = True _TXREQUEST.fields_by_name['signature']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _TXREQUEST.fields_by_name['serialized_tx'].has_options = True From c9a348d4a9b20d31bede5570f8e4a24e92eec168 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 3 Feb 2014 16:17:13 +0100 Subject: [PATCH 0170/1535] Unit tests for signing messages --- tests/test_messages.py | 25 +++++++++++++------------ trezorlib/client.py | 1 - 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/test_messages.py b/tests/test_messages.py index e68ba9bf8..db5918f93 100644 --- a/tests/test_messages.py +++ b/tests/test_messages.py @@ -10,7 +10,7 @@ class TestMessages(common.TrezorTest): def test_message_sign(self): sig = self.client.sign_message([0], "This is an example of a signed message.") self.assertEqual(sig.address, '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e') - self.assertEqual(binascii.hexlify(sig.signature), XXX) + self.assertEqual(binascii.hexlify(sig.signature), '209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80') def test_message_verify(self): @@ -20,7 +20,7 @@ class TestMessages(common.TrezorTest): binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), 'This is an example of a signed message.' ) - self.assertIsInstance(res, proto.Success) + self.assertTrue(res) # uncompressed pubkey - FAIL res = self.client.verify_message( @@ -28,15 +28,14 @@ class TestMessages(common.TrezorTest): binascii.unhexlify('1ba77e01a9e17ba158b96200000000dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), 'This is an example of a signed message.' ) - self.assertIsInstance(res, proto.Failure) - self.assertEqual(res.code, proto_types.Failure_InvalidSignature) + self.assertFalse(res) # compressed pubkey - OK res = self.client.verify_message( '1C7zdTfnkzmr13HfA2vNm5SJYRK6nEKyq8', binascii.unhexlify('1f44e3e461f7ca9f57c472ce1a28214df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), 'This is an example of a signed message.') - self.assertIsInstance(res, proto.Success) + self.assertTrue(res) # compressed pubkey - FAIL res = self.client.verify_message( @@ -44,22 +43,24 @@ class TestMessages(common.TrezorTest): binascii.unhexlify('1f44e3e461f7ca9f57c472000000004df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), 'This is an example of a signed message.' ) - self.assertIsInstance(res, proto.Failure) - self.assertEqual(res.code, proto_types.Failure_InvalidSignature) + self.assertFalse(res) # trezor pubkey - OK res = self.client.verify_message( '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', - binascii.unhexlify(XXX), + binascii.unhexlify('209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), 'This is an example of a signed message.' ) - self.assertIsInstance(res, proto.Success) + self.assertTrue(res) # trezor pubkey - FAIL res = self.client.verify_message( '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', - binascii.unhexlify(XXX__), + binascii.unhexlify('209e23edf0e4e47ff1de000002cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), 'This is an example of a signed message.' ) - self.assertIsInstance(res, proto.Failure) - self.assertEqual(res.code, proto_types.Failure_InvalidSignature) + self.assertFalse(res) + +if __name__ == '__main__': + unittest.main() + diff --git a/trezorlib/client.py b/trezorlib/client.py index 97dfcebe7..f176a67c0 100755 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -3,7 +3,6 @@ import time import binascii import hashlib -import ckd_public import tools import messages_pb2 as proto import types_pb2 as types From d629a76689bbf7cbec6ab67a0b6d6b321a1d5cfd Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 3 Feb 2014 17:37:39 +0100 Subject: [PATCH 0171/1535] print message size in _pprint --- trezorlib/client.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) mode change 100755 => 100644 trezorlib/client.py diff --git a/trezorlib/client.py b/trezorlib/client.py old mode 100755 new mode 100644 index f176a67c0..3cd2c5790 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -135,7 +135,8 @@ class TrezorClient(object): return ret def _pprint(self, msg): - return "<%s>:\n%s" % (msg.__class__.__name__, msg) + ser = msg.SerializeToString() + return "<%s> (%d bytes):\n%s" % (msg.__class__.__name__, len(ser), msg) def setup_debuglink(self, button=None, pin_correct=False): self.debug_button = button From c339a416b489e21f2314f383bfde30d7ec548a11 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 3 Feb 2014 19:19:45 +0100 Subject: [PATCH 0172/1535] Changed readme --- README.md | 4 ---- README.rst | 12 ++++++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) delete mode 100644 README.md create mode 100644 README.rst diff --git a/README.md b/README.md deleted file mode 100644 index ba312076a..000000000 --- a/README.md +++ /dev/null @@ -1,4 +0,0 @@ -trezorlib-python -================ - -Client side implementation for Trezor-compatible Bitcoin hardware wallets. See http://bitcointrezor.com for more information. diff --git a/README.rst b/README.rst new file mode 100644 index 000000000..bc911343a --- /dev/null +++ b/README.rst @@ -0,0 +1,12 @@ +trezorlib-python +================ + +Client side implementation for Trezor-compatible Bitcoin hardware wallets. + +See http://bitcointrezor.com for more information. + +How to install (Debian/Ubuntu) +--------------------------------------- + +How to install (Windows) +------------------------ From b3f9390dedb9cf1f3ffd6059bd3b0e4980396534 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 3 Feb 2014 19:25:05 +0100 Subject: [PATCH 0173/1535] Added distribute_setup.py because of Windows dist --- distribute_setup.py | 515 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 515 insertions(+) create mode 100644 distribute_setup.py diff --git a/distribute_setup.py b/distribute_setup.py new file mode 100644 index 000000000..fb6e4900f --- /dev/null +++ b/distribute_setup.py @@ -0,0 +1,515 @@ +#!python +"""Bootstrap distribute installation + +If you want to use setuptools in your package's setup.py, just include this +file in the same directory with it, and add this to the top of your setup.py:: + + from distribute_setup import use_setuptools + use_setuptools() + +If you want to require a specific version of setuptools, set a download +mirror, or use an alternate download directory, you can do so by supplying +the appropriate options to ``use_setuptools()``. + +This file can also be run as a script to install or upgrade setuptools. +""" +import os +import sys +import time +import fnmatch +import tempfile +import tarfile +from distutils import log + +try: + from site import USER_SITE +except ImportError: + USER_SITE = None + +try: + import subprocess + + def _python_cmd(*args): + args = (sys.executable,) + args + return subprocess.call(args) == 0 + +except ImportError: + # will be used for python 2.3 + def _python_cmd(*args): + args = (sys.executable,) + args + # quoting arguments if windows + if sys.platform == 'win32': + def quote(arg): + if ' ' in arg: + return '"%s"' % arg + return arg + args = [quote(arg) for arg in args] + return os.spawnl(os.P_WAIT, sys.executable, *args) == 0 + +DEFAULT_VERSION = "0.6.28" +DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/" +SETUPTOOLS_FAKED_VERSION = "0.6c11" + +SETUPTOOLS_PKG_INFO = """\ +Metadata-Version: 1.0 +Name: setuptools +Version: %s +Summary: xxxx +Home-page: xxx +Author: xxx +Author-email: xxx +License: xxx +Description: xxx +""" % SETUPTOOLS_FAKED_VERSION + + +def _install(tarball, install_args=()): + # extracting the tarball + tmpdir = tempfile.mkdtemp() + log.warn('Extracting in %s', tmpdir) + old_wd = os.getcwd() + try: + os.chdir(tmpdir) + tar = tarfile.open(tarball) + _extractall(tar) + tar.close() + + # going in the directory + subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) + os.chdir(subdir) + log.warn('Now working in %s', subdir) + + # installing + log.warn('Installing Distribute') + if not _python_cmd('setup.py', 'install', *install_args): + log.warn('Something went wrong during the installation.') + log.warn('See the error message above.') + finally: + os.chdir(old_wd) + + +def _build_egg(egg, tarball, to_dir): + # extracting the tarball + tmpdir = tempfile.mkdtemp() + log.warn('Extracting in %s', tmpdir) + old_wd = os.getcwd() + try: + os.chdir(tmpdir) + tar = tarfile.open(tarball) + _extractall(tar) + tar.close() + + # going in the directory + subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) + os.chdir(subdir) + log.warn('Now working in %s', subdir) + + # building an egg + log.warn('Building a Distribute egg in %s', to_dir) + _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) + + finally: + os.chdir(old_wd) + # returning the result + log.warn(egg) + if not os.path.exists(egg): + raise IOError('Could not build the egg.') + + +def _do_download(version, download_base, to_dir, download_delay): + egg = os.path.join(to_dir, 'distribute-%s-py%d.%d.egg' + % (version, sys.version_info[0], sys.version_info[1])) + if not os.path.exists(egg): + tarball = download_setuptools(version, download_base, + to_dir, download_delay) + _build_egg(egg, tarball, to_dir) + sys.path.insert(0, egg) + import setuptools + setuptools.bootstrap_install_from = egg + + +def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, + to_dir=os.curdir, download_delay=15, no_fake=True): + # making sure we use the absolute path + to_dir = os.path.abspath(to_dir) + was_imported = 'pkg_resources' in sys.modules or \ + 'setuptools' in sys.modules + try: + try: + import pkg_resources + if not hasattr(pkg_resources, '_distribute'): + if not no_fake: + _fake_setuptools() + raise ImportError + except ImportError: + return _do_download(version, download_base, to_dir, download_delay) + try: + pkg_resources.require("distribute>=" + version) + return + except pkg_resources.VersionConflict: + e = sys.exc_info()[1] + if was_imported: + sys.stderr.write( + "The required version of distribute (>=%s) is not available,\n" + "and can't be installed while this script is running. Please\n" + "install a more recent version first, using\n" + "'easy_install -U distribute'." + "\n\n(Currently using %r)\n" % (version, e.args[0])) + sys.exit(2) + else: + del pkg_resources, sys.modules['pkg_resources'] # reload ok + return _do_download(version, download_base, to_dir, + download_delay) + except pkg_resources.DistributionNotFound: + return _do_download(version, download_base, to_dir, + download_delay) + finally: + if not no_fake: + _create_fake_setuptools_pkg_info(to_dir) + + +def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, + to_dir=os.curdir, delay=15): + """Download distribute from a specified location and return its filename + + `version` should be a valid distribute version number that is available + as an egg for download under the `download_base` URL (which should end + with a '/'). `to_dir` is the directory where the egg will be downloaded. + `delay` is the number of seconds to pause before an actual download + attempt. + """ + # making sure we use the absolute path + to_dir = os.path.abspath(to_dir) + try: + from urllib.request import urlopen + except ImportError: + from urllib2 import urlopen + tgz_name = "distribute-%s.tar.gz" % version + url = download_base + tgz_name + saveto = os.path.join(to_dir, tgz_name) + src = dst = None + if not os.path.exists(saveto): # Avoid repeated downloads + try: + log.warn("Downloading %s", url) + src = urlopen(url) + # Read/write all in one block, so we don't create a corrupt file + # if the download is interrupted. + data = src.read() + dst = open(saveto, "wb") + dst.write(data) + finally: + if src: + src.close() + if dst: + dst.close() + return os.path.realpath(saveto) + + +def _no_sandbox(function): + def __no_sandbox(*args, **kw): + try: + from setuptools.sandbox import DirectorySandbox + if not hasattr(DirectorySandbox, '_old'): + def violation(*args): + pass + DirectorySandbox._old = DirectorySandbox._violation + DirectorySandbox._violation = violation + patched = True + else: + patched = False + except ImportError: + patched = False + + try: + return function(*args, **kw) + finally: + if patched: + DirectorySandbox._violation = DirectorySandbox._old + del DirectorySandbox._old + + return __no_sandbox + + +def _patch_file(path, content): + """Will backup the file then patch it""" + existing_content = open(path).read() + if existing_content == content: + # already patched + log.warn('Already patched.') + return False + log.warn('Patching...') + _rename_path(path) + f = open(path, 'w') + try: + f.write(content) + finally: + f.close() + return True + +_patch_file = _no_sandbox(_patch_file) + + +def _same_content(path, content): + return open(path).read() == content + + +def _rename_path(path): + new_name = path + '.OLD.%s' % time.time() + log.warn('Renaming %s into %s', path, new_name) + os.rename(path, new_name) + return new_name + + +def _remove_flat_installation(placeholder): + if not os.path.isdir(placeholder): + log.warn('Unkown installation at %s', placeholder) + return False + found = False + for file in os.listdir(placeholder): + if fnmatch.fnmatch(file, 'setuptools*.egg-info'): + found = True + break + if not found: + log.warn('Could not locate setuptools*.egg-info') + return + + log.warn('Removing elements out of the way...') + pkg_info = os.path.join(placeholder, file) + if os.path.isdir(pkg_info): + patched = _patch_egg_dir(pkg_info) + else: + patched = _patch_file(pkg_info, SETUPTOOLS_PKG_INFO) + + if not patched: + log.warn('%s already patched.', pkg_info) + return False + # now let's move the files out of the way + for element in ('setuptools', 'pkg_resources.py', 'site.py'): + element = os.path.join(placeholder, element) + if os.path.exists(element): + _rename_path(element) + else: + log.warn('Could not find the %s element of the ' + 'Setuptools distribution', element) + return True + +_remove_flat_installation = _no_sandbox(_remove_flat_installation) + + +def _after_install(dist): + log.warn('After install bootstrap.') + placeholder = dist.get_command_obj('install').install_purelib + _create_fake_setuptools_pkg_info(placeholder) + + +def _create_fake_setuptools_pkg_info(placeholder): + if not placeholder or not os.path.exists(placeholder): + log.warn('Could not find the install location') + return + pyver = '%s.%s' % (sys.version_info[0], sys.version_info[1]) + setuptools_file = 'setuptools-%s-py%s.egg-info' % \ + (SETUPTOOLS_FAKED_VERSION, pyver) + pkg_info = os.path.join(placeholder, setuptools_file) + if os.path.exists(pkg_info): + log.warn('%s already exists', pkg_info) + return + + if not os.access(pkg_info, os.W_OK): + log.warn("Don't have permissions to write %s, skipping", pkg_info) + + log.warn('Creating %s', pkg_info) + f = open(pkg_info, 'w') + try: + f.write(SETUPTOOLS_PKG_INFO) + finally: + f.close() + + pth_file = os.path.join(placeholder, 'setuptools.pth') + log.warn('Creating %s', pth_file) + f = open(pth_file, 'w') + try: + f.write(os.path.join(os.curdir, setuptools_file)) + finally: + f.close() + +_create_fake_setuptools_pkg_info = _no_sandbox( + _create_fake_setuptools_pkg_info +) + + +def _patch_egg_dir(path): + # let's check if it's already patched + pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') + if os.path.exists(pkg_info): + if _same_content(pkg_info, SETUPTOOLS_PKG_INFO): + log.warn('%s already patched.', pkg_info) + return False + _rename_path(path) + os.mkdir(path) + os.mkdir(os.path.join(path, 'EGG-INFO')) + pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') + f = open(pkg_info, 'w') + try: + f.write(SETUPTOOLS_PKG_INFO) + finally: + f.close() + return True + +_patch_egg_dir = _no_sandbox(_patch_egg_dir) + + +def _before_install(): + log.warn('Before install bootstrap.') + _fake_setuptools() + + +def _under_prefix(location): + if 'install' not in sys.argv: + return True + args = sys.argv[sys.argv.index('install') + 1:] + for index, arg in enumerate(args): + for option in ('--root', '--prefix'): + if arg.startswith('%s=' % option): + top_dir = arg.split('root=')[-1] + return location.startswith(top_dir) + elif arg == option: + if len(args) > index: + top_dir = args[index + 1] + return location.startswith(top_dir) + if arg == '--user' and USER_SITE is not None: + return location.startswith(USER_SITE) + return True + + +def _fake_setuptools(): + log.warn('Scanning installed packages') + try: + import pkg_resources + except ImportError: + # we're cool + log.warn('Setuptools or Distribute does not seem to be installed.') + return + ws = pkg_resources.working_set + try: + setuptools_dist = ws.find( + pkg_resources.Requirement.parse('setuptools', replacement=False) + ) + except TypeError: + # old distribute API + setuptools_dist = ws.find( + pkg_resources.Requirement.parse('setuptools') + ) + + if setuptools_dist is None: + log.warn('No setuptools distribution found') + return + # detecting if it was already faked + setuptools_location = setuptools_dist.location + log.warn('Setuptools installation detected at %s', setuptools_location) + + # if --root or --preix was provided, and if + # setuptools is not located in them, we don't patch it + if not _under_prefix(setuptools_location): + log.warn('Not patching, --root or --prefix is installing Distribute' + ' in another location') + return + + # let's see if its an egg + if not setuptools_location.endswith('.egg'): + log.warn('Non-egg installation') + res = _remove_flat_installation(setuptools_location) + if not res: + return + else: + log.warn('Egg installation') + pkg_info = os.path.join(setuptools_location, 'EGG-INFO', 'PKG-INFO') + if (os.path.exists(pkg_info) and + _same_content(pkg_info, SETUPTOOLS_PKG_INFO)): + log.warn('Already patched.') + return + log.warn('Patching...') + # let's create a fake egg replacing setuptools one + res = _patch_egg_dir(setuptools_location) + if not res: + return + log.warn('Patched done.') + _relaunch() + + +def _relaunch(): + log.warn('Relaunching...') + # we have to relaunch the process + # pip marker to avoid a relaunch bug + _cmd = ['-c', 'install', '--single-version-externally-managed'] + if sys.argv[:3] == _cmd: + sys.argv[0] = 'setup.py' + args = [sys.executable] + sys.argv + sys.exit(subprocess.call(args)) + + +def _extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + import copy + import operator + from tarfile import ExtractError + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 448 # decimal for oct 0700 + self.extract(tarinfo, path) + + # Reverse sort directories. + if sys.version_info < (2, 4): + def sorter(dir1, dir2): + return cmp(dir1.name, dir2.name) + directories.sort(sorter) + directories.reverse() + else: + directories.sort(key=operator.attrgetter('name'), reverse=True) + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError: + e = sys.exc_info()[1] + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + +def _build_install_args(argv): + install_args = [] + user_install = '--user' in argv + if user_install and sys.version_info < (2, 6): + log.warn("--user requires Python 2.6 or later") + raise SystemExit(1) + if user_install: + install_args.append('--user') + return install_args + + +def main(argv, version=DEFAULT_VERSION): + """Install or upgrade setuptools and EasyInstall""" + tarball = download_setuptools() + _install(tarball, _build_install_args(argv)) + + +if __name__ == '__main__': + main(sys.argv[1:]) From 15d8c840b5eabf03b65adcdeb4fd28bb641d71d6 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 3 Feb 2014 19:30:40 +0100 Subject: [PATCH 0174/1535] Remove required rependency to PyQt4 --- cmd.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd.py b/cmd.py index 6381dfe03..e69766b40 100755 --- a/cmd.py +++ b/cmd.py @@ -8,7 +8,6 @@ import threading from trezorlib.client import TrezorClient, pin_func from trezorlib.debuglink import DebugLink from trezorlib.protobuf_json import pb2json -from trezorlib.pinmatrix import PinMatrixWidget def parse_args(commands): parser = argparse.ArgumentParser(description='Commandline tool for Trezor devices.') @@ -253,6 +252,8 @@ class PinMatrixThread(threading.Thread): self.pin_value = '' def run(self): + from trezorlib.pinmatrix import PinMatrixWidget + import sys from PyQt4.Qt import QApplication, QWidget, QVBoxLayout from PyQt4.QtGui import QPushButton, QLabel From a56700a03bc4ffed6d5b6256962ee8a1cfcea3ab Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 3 Feb 2014 21:49:07 +0100 Subject: [PATCH 0175/1535] Reworked HID path handling (to fix Windows issues) --- cmd.py | 24 ++++++++++++++------- trezorlib/transport_hid.py | 44 +++++++++++++++++++++++++++++--------- 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/cmd.py b/cmd.py index e69766b40..38cc8fde6 100755 --- a/cmd.py +++ b/cmd.py @@ -47,11 +47,16 @@ def get_transport(transport_string, path, **kwargs): if path == '': try: - path = list_usb()[0] + path = list_usb()[0][0] except IndexError: raise Exception("No Trezor found on USB") - return HidTransport(path, **kwargs) + for d in HidTransport.enumerate(): + # Two-tuple of (normal_interface, debug_interface) + if path in d: + return HidTransport(d, **kwargs) + + raise Exception("Device not found") if transport_string == 'serial': from trezorlib.transport_serial import SerialTransport @@ -238,8 +243,7 @@ class Commands(object): def list_usb(): from trezorlib.transport_hid import HidTransport - devices = HidTransport.enumerate() - return devices + return HidTransport.enumerate() class PinMatrixThread(threading.Thread): ''' @@ -307,19 +311,23 @@ def main(): print json.dumps(devices) else: for dev in devices: - print dev + if dev[1] != None: + print "%s - debuglink enabled" % dev[0] + else: + print dev[0] return - transport = get_transport(args.transport, args.path) if args.debug: if args.debuglink_transport == 'usb' and args.debuglink_path == '': debuglink_transport = get_transport('usb', args.path, debug_link=True) else: - debuglink_transport = get_transport(args.debuglink_transport, args.debuglink_path) + debuglink_transport = get_transport(args.debuglink_transport, + args.debuglink_path, debug_link=True) debuglink = DebugLink(debuglink_transport) else: debuglink = None - + + transport = get_transport(args.transport, args.path) client = TrezorClient(transport, pin_func=qt_pin_func, debuglink=debuglink) client.setup_debuglink(button=True, pin_correct=True) cmds = Commands(client) diff --git a/trezorlib/transport_hid.py b/trezorlib/transport_hid.py index f58b01ebd..a93d12bb7 100644 --- a/trezorlib/transport_hid.py +++ b/trezorlib/transport_hid.py @@ -2,6 +2,7 @@ import hid import time +import platform from transport import Transport, NotImplementedException DEVICE_IDS = [ @@ -21,26 +22,49 @@ class HidTransport(Transport): def __init__(self, device, *args, **kwargs): self.hid = None self.buffer = '' - if bool(kwargs.get('debug_link')): - device = device[:-2] + '01' + device = device[int(bool(kwargs.get('debug_link')))] super(HidTransport, self).__init__(device, *args, **kwargs) + @classmethod + def _detect_debuglink(cls, path): + # Takes platform-specific path of USB and + # decide if the HID interface is normal transport + # or debuglink + + if platform.system() in ('Linux', 'Darwin'): + # Sample: 0003:0017:00 + if path.endswith(':00'): + return False + return True + + elif platform.system() == 'Windows': + # Sample: \\\\?\\hid#vid_534c&pid_0001&mi_01#7&1d71791f&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030} + # Note: 'mi' parameter is optional and might be unset + if '&mi_01#' in path: # ,,,,,,~ + return True + return False + + else: + raise Exception("USB interface detection not implemented for %s" % platform.system()) + @classmethod def enumerate(cls): - devices = [] + devices = {} for d in hid.enumerate(0, 0): - vendor_id = d.get('vendor_id') - product_id = d.get('product_id') - path = d.get('path') + vendor_id = d['vendor_id'] + product_id = d['product_id'] + serial_number = d['serial_number'] + path = d['path'] - if (vendor_id, product_id) in DEVICE_IDS and path.endswith(':00'): - devices.append(path) + if (vendor_id, product_id) in DEVICE_IDS: + devices.setdefault(serial_number, [None, None]) + devices[serial_number][int(bool(cls._detect_debuglink(path)))] = path - return devices + # List of two-tuples (path_normal, path_debuglink) + return devices.values() def _open(self): self.buffer = '' - print self.device self.hid = hid.device() self.hid.open_path(self.device) self.hid.set_nonblocking(True) From 18948e2848ce85510619cb8434706a94e25de608 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 3 Feb 2014 22:24:54 +0100 Subject: [PATCH 0176/1535] Setup script --- setup.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 setup.py diff --git a/setup.py b/setup.py new file mode 100644 index 000000000..18b1fab57 --- /dev/null +++ b/setup.py @@ -0,0 +1,26 @@ +from distribute_setup import use_setuptools +use_setuptools() + +from setuptools import setup, find_packages +from os.path import dirname, join + +here = dirname(__file__) +setup( + name='python-trezor', + version='0.5.0', + author='Bitcoin TREZOR', + author_email='info@bitcointrezor.com', + description='Python library for handling TREZOR hardware bitcoin wallet', + long_description=open(join(here, 'README.rst')).read(), + packages=find_packages(), + test_suite='tests', + dependency_links=['https://github.com/trezor/python-mnemonic/archive/master.zip#egg=mnemonic-0.6'], + install_requires=['ecdsa>=0.9', 'protobuf', 'mnemonic>=0.6', 'hidapi'], + include_package_data=True, + zip_safe=False, + classifiers=[ + 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', + 'Operating System :: POSIX :: Linux', + 'Operating System :: POSIX :: Windows', + ], +) From fa8c5e884ff9e4426af71d26581285b867e9d485 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 4 Feb 2014 00:30:58 +0100 Subject: [PATCH 0177/1535] Compiled pb --- trezorlib/messages_pb2.py | 196 ++++++++++++++++++++++---------------- trezorlib/types_pb2.py | 4 +- 2 files changed, 114 insertions(+), 86 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 04555092e..e003c69c2 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"\x17\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x0f\n\rButtonRequest\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8b\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"N\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x16\n\x0epin_protection\x18\x02 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"+\n\rButtonRequest\x12\x0c\n\x04\x63ode\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8b\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -206,8 +206,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2678, - serialized_end=4259, + serialized_start=2761, + serialized_end=4342, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -462,6 +462,20 @@ _PING = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='pin_protection', full_name='Ping.pin_protection', index=1, + number=2, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='passphrase_protection', full_name='Ping.passphrase_protection', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -472,7 +486,7 @@ _PING = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=420, - serialized_end=443, + serialized_end=498, ) @@ -499,8 +513,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=445, - serialized_end=471, + serialized_start=500, + serialized_end=526, ) @@ -534,8 +548,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=473, - serialized_end=527, + serialized_start=528, + serialized_end=582, ) @@ -546,6 +560,20 @@ _BUTTONREQUEST = _descriptor.Descriptor( file=DESCRIPTOR, containing_type=None, fields=[ + _descriptor.FieldDescriptor( + name='code', full_name='ButtonRequest.code', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='data', full_name='ButtonRequest.data', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -555,8 +583,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=529, - serialized_end=544, + serialized_start=584, + serialized_end=627, ) @@ -576,8 +604,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=546, - serialized_end=557, + serialized_start=629, + serialized_end=640, ) @@ -604,8 +632,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=559, - serialized_end=594, + serialized_start=642, + serialized_end=677, ) @@ -632,8 +660,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=596, - serialized_end=623, + serialized_start=679, + serialized_end=706, ) @@ -653,8 +681,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=625, - serialized_end=633, + serialized_start=708, + serialized_end=716, ) @@ -674,8 +702,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=635, - serialized_end=654, + serialized_start=718, + serialized_end=737, ) @@ -702,8 +730,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=656, - serialized_end=697, + serialized_start=739, + serialized_end=780, ) @@ -730,8 +758,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=699, - serialized_end=725, + serialized_start=782, + serialized_end=808, ) @@ -758,8 +786,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=727, - serialized_end=759, + serialized_start=810, + serialized_end=842, ) @@ -793,8 +821,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=761, - serialized_end=822, + serialized_start=844, + serialized_end=905, ) @@ -821,8 +849,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=824, - serialized_end=862, + serialized_start=907, + serialized_end=945, ) @@ -856,8 +884,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=864, - serialized_end=923, + serialized_start=947, + serialized_end=1006, ) @@ -884,8 +912,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=925, - serialized_end=951, + serialized_start=1008, + serialized_end=1034, ) @@ -905,8 +933,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=953, - serialized_end=965, + serialized_start=1036, + serialized_end=1048, ) @@ -968,8 +996,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=968, - serialized_end=1117, + serialized_start=1051, + serialized_end=1200, ) @@ -1031,8 +1059,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1120, - serialized_end=1283, + serialized_start=1203, + serialized_end=1366, ) @@ -1052,8 +1080,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1285, - serialized_end=1301, + serialized_start=1368, + serialized_end=1384, ) @@ -1080,8 +1108,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1303, - serialized_end=1338, + serialized_start=1386, + serialized_end=1421, ) @@ -1136,8 +1164,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1341, - serialized_end=1480, + serialized_start=1424, + serialized_end=1563, ) @@ -1157,8 +1185,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1482, - serialized_end=1495, + serialized_start=1565, + serialized_end=1578, ) @@ -1185,8 +1213,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1497, - serialized_end=1526, + serialized_start=1580, + serialized_end=1609, ) @@ -1227,8 +1255,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1528, - serialized_end=1611, + serialized_start=1611, + serialized_end=1694, ) @@ -1269,8 +1297,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1613, - serialized_end=1693, + serialized_start=1696, + serialized_end=1776, ) @@ -1304,8 +1332,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1695, - serialized_end=1755, + serialized_start=1778, + serialized_end=1838, ) @@ -1346,8 +1374,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1757, - serialized_end=1846, + serialized_start=1840, + serialized_end=1929, ) @@ -1374,8 +1402,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1848, - serialized_end=1873, + serialized_start=1931, + serialized_end=1956, ) @@ -1416,8 +1444,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1875, - serialized_end=1956, + serialized_start=1958, + serialized_end=2039, ) @@ -1465,8 +1493,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1959, - serialized_end=2103, + serialized_start=2042, + serialized_end=2186, ) @@ -1521,8 +1549,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2106, - serialized_end=2252, + serialized_start=2189, + serialized_end=2335, ) @@ -1549,8 +1577,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2254, - serialized_end=2292, + serialized_start=2337, + serialized_end=2375, ) @@ -1577,8 +1605,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2294, - serialized_end=2335, + serialized_start=2377, + serialized_end=2418, ) @@ -1598,8 +1626,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2337, - serialized_end=2352, + serialized_start=2420, + serialized_end=2435, ) @@ -1626,8 +1654,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2354, - serialized_end=2393, + serialized_start=2437, + serialized_end=2476, ) @@ -1654,8 +1682,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2395, - serialized_end=2430, + serialized_start=2478, + serialized_end=2513, ) @@ -1675,8 +1703,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2432, - serialized_end=2451, + serialized_start=2515, + serialized_end=2534, ) @@ -1738,8 +1766,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2454, - serialized_end=2597, + serialized_start=2537, + serialized_end=2680, ) @@ -1759,8 +1787,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2599, - serialized_end=2614, + serialized_start=2682, + serialized_end=2697, ) @@ -1801,8 +1829,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2616, - serialized_end=2675, + serialized_start=2699, + serialized_end=2758, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index db0793f49..50ed6a047 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x95\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x37\n(org.multibit.hd.hardware.trezor.protobufB\x0bTrezorTypes') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x95\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -560,7 +560,7 @@ google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_in) google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_out) DESCRIPTOR.has_options = True -DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), '\n(org.multibit.hd.hardware.trezor.protobufB\013TrezorTypes') +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), '\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') _HDNODETYPE.fields_by_name['chain_code'].has_options = True _HDNODETYPE.fields_by_name['chain_code']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _HDNODETYPE.fields_by_name['private_key'].has_options = True From 60e6064d4eb350c0830039533d6030b3edbddeeb Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 4 Feb 2014 00:31:44 +0100 Subject: [PATCH 0178/1535] Configurable ping message --- trezorlib/client.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 3cd2c5790..f26893e2a 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -111,8 +111,12 @@ class TrezorClient(object): def get_entropy(self, size): return self.call(proto.GetEntropy(size=size), proto.Entropy).entropy - def ping(self, msg): - return self.call(proto.Ping(message=msg), proto.Success).message + def ping(self, msg, pin_protection=False, passphrase_protection=False): + msg = proto.Ping(message=msg, + pin_protection=pin_protection, + passphrase_protection=passphrase_protection) + + return self.call(msg, proto.Success).message def get_device_id(self): return self.features.device_id From a437ae1022484f7bcc20f0680289e46b7366f77a Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 4 Feb 2014 00:32:10 +0100 Subject: [PATCH 0179/1535] Fixed some tests --- tests/common.py | 1 + tests/test.py | 63 +++++--------------------------------- tests/test_basic.py | 9 ------ tests/test_protect_call.py | 12 +++++--- tests/test_signtx.py | 21 +++++++++++++ 5 files changed, 36 insertions(+), 70 deletions(-) diff --git a/tests/common.py b/tests/common.py index d2c7ddc79..c40838268 100644 --- a/tests/common.py +++ b/tests/common.py @@ -9,6 +9,7 @@ class TrezorTest(unittest.TestCase): self.debug_transport = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS) self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) self.client = TrezorClient(self.transport, DebugLink(self.debug_transport), debug=True) + # self.client = TrezorClient(self.transport, debug=False) self.mnemonic1 = 'alcohol woman abuse must during monitor noble actual mixed trade anger aisle' self.mnemonic2 = 'owner little vague addict embark decide pink prosper true fork panda embody mixture exchange choose canoe electric jewel' diff --git a/tests/test.py b/tests/test.py index 5ec3fa325..d41f6a93a 100755 --- a/tests/test.py +++ b/tests/test.py @@ -1,5 +1,8 @@ #!/usr/bin/python ''' + +TODO: + * ApplySettings workflow, zistit cez Features ci sa zmeny aplikovali * WipeDevice workflow, zistit cez Features ci to prebehlo * LoadDevice workflow, zistit cez Features ci to prebehlo @@ -17,61 +20,9 @@ * VerifyMessage workflow * otestovat session handling (tento test bude zrejme failovat na RPi) -''' - +* Features reflects all variations of LoadDevice +* Maxfee settings +* Client requires OTP +* Client requires PIN ''' -import sys -sys.path = ['../',] + sys.path - -import time - -ENABLE_DEBUG_LINK = True - -from bitkeylib.transport_pipe import PipeTransport -from bitkeylib.transport_serial import SerialTransport -from bitkeylib.transport_fake import FakeTransport -from bitkeylib import proto - -from bitkeylib.client import BitkeyClient -from bitkeylib.debuglink import DebugLink - -transport = PipeTransport('../../bitkey-python/device.socket', is_device=False) - -if ENABLE_DEBUG_LINK: - debug_transport = PipeTransport('../../bitkey-python/device.socket.debug', is_device=False) - debuglink = DebugLink(debug_transport) -else: - debuglink = None - -bitkey = BitkeyClient(transport, debuglink) - -print bitkey.call(proto.Initialize()) -#bitkey.call(proto.Ping(message='ahoj!')) -#bitkey.call(proto.GetUUID()) - -print bitkey.call(proto.GetEntropy(size=10), button=True) -bitkey.call(proto.SetMaxFeeKb(maxfee_kb=100000), button=True, pin_correct=False) -''' - -''' -d = PipeTransport('../bitkey-python/device.socket', is_device=False) -#d = SerialTransport('../../bitkey-python/COM9') - -#start = time.time() - -#for x in range(1000): - -call(proto.Initialize()) -call(proto.Ping()) -call(proto.GetUUID()) -#call(proto.GetEntropy(size=10)) -#call(proto.LoadDevice(seed='beyond neighbor scratch swirl embarrass doll cause also stick softly physical nice', -# otp=True, pin='1234', spv=True)) - -#call(proto.ResetDevice()) -call(proto.GetMasterPublicKey(algo=proto.ELECTRUM)) -#call(proto.ResetDevice()) -''' - -#print 10000 / (time.time() - start) diff --git a/tests/test_basic.py b/tests/test_basic.py index 16817df01..cf9685abd 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -3,15 +3,6 @@ import common from trezorlib import messages_pb2 as messages -''' - TODO: - * Features reflects all variations of LoadDevice - * Maxfee settings - * Client requires OTP - * Client requires PIN - -''' - class TestBasic(common.TrezorTest): def test_features(self): features = self.client.call(messages.Initialize()) diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index e149ffe57..35e7fc33f 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -3,16 +3,17 @@ import unittest import common from trezorlib.client import PinException -# from trezorlib import messages_pb2 as proto + +# FIXME TODO Add passphrase tests class TestProtectCall(common.TrezorTest): def _some_protected_call(self): # This method perform any call which have protection in the device - entropy_len = 10 - entropy = self.client.get_entropy(entropy_len) - self.assertEqual(len(entropy), entropy_len) + res = self.client.ping('random data', pin_protection=True, passphrase_protection=True) + self.assertEqual(res, 'random data') def test_no_protection(self): + self.client.wipe_device() self.client.load_device_by_mnemonic( mnemonic=self.mnemonic1, pin='', @@ -25,6 +26,7 @@ class TestProtectCall(common.TrezorTest): self._some_protected_call() def test_pin(self): + self.client.wipe_device() self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, pin=self.pin2, passphrase_protection=False, @@ -53,7 +55,7 @@ class TestProtectCall(common.TrezorTest): print msg self.assertLessEqual(expected, got, msg) - for attempt in range(1, 6): + for attempt in range(1, 4): start = time.time() self.assertRaises(PinException, self._some_protected_call) test_backoff(attempt, start) diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 00a4477f0..7b0236cad 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -25,6 +25,27 @@ class TestSignTx(common.TrezorTest): tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + ''' + def test_fee_too_high(self): + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=390000 - 50000, + script_type=proto_types.PAYTOADDRESS, + ) + + tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + # FIXME - Check if "Fee too high" appeared on display + ''' + + def test_estimate_size(self): inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e # amount=390000, From 229cfa3cd46b4bc12c26b3eca816e70701ea35ec Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 4 Feb 2014 01:02:07 +0100 Subject: [PATCH 0180/1535] Compiled pb --- trezorlib/messages_pb2.py | 179 ++++++++++++++++++++------------------ 1 file changed, 93 insertions(+), 86 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index e003c69c2..d8f710324 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"N\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x16\n\x0epin_protection\x18\x02 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"+\n\rButtonRequest\x12\x0c\n\x04\x63ode\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8b\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"+\n\rButtonRequest\x12\x0c\n\x04\x63ode\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8b\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -206,8 +206,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2761, - serialized_end=4342, + serialized_start=2788, + serialized_end=4369, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -463,19 +463,26 @@ _PING = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='pin_protection', full_name='Ping.pin_protection', index=1, + name='button_protection', full_name='Ping.button_protection', index=1, number=2, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='passphrase_protection', full_name='Ping.passphrase_protection', index=2, + name='pin_protection', full_name='Ping.pin_protection', index=2, number=3, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='passphrase_protection', full_name='Ping.passphrase_protection', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -486,7 +493,7 @@ _PING = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=420, - serialized_end=498, + serialized_end=525, ) @@ -513,8 +520,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=500, - serialized_end=526, + serialized_start=527, + serialized_end=553, ) @@ -548,8 +555,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=528, - serialized_end=582, + serialized_start=555, + serialized_end=609, ) @@ -583,8 +590,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=584, - serialized_end=627, + serialized_start=611, + serialized_end=654, ) @@ -604,8 +611,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=629, - serialized_end=640, + serialized_start=656, + serialized_end=667, ) @@ -632,8 +639,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=642, - serialized_end=677, + serialized_start=669, + serialized_end=704, ) @@ -660,8 +667,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=679, - serialized_end=706, + serialized_start=706, + serialized_end=733, ) @@ -681,8 +688,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=708, - serialized_end=716, + serialized_start=735, + serialized_end=743, ) @@ -702,8 +709,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=718, - serialized_end=737, + serialized_start=745, + serialized_end=764, ) @@ -730,8 +737,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=739, - serialized_end=780, + serialized_start=766, + serialized_end=807, ) @@ -758,8 +765,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=782, - serialized_end=808, + serialized_start=809, + serialized_end=835, ) @@ -786,8 +793,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=810, - serialized_end=842, + serialized_start=837, + serialized_end=869, ) @@ -821,8 +828,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=844, - serialized_end=905, + serialized_start=871, + serialized_end=932, ) @@ -849,8 +856,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=907, - serialized_end=945, + serialized_start=934, + serialized_end=972, ) @@ -884,8 +891,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=947, - serialized_end=1006, + serialized_start=974, + serialized_end=1033, ) @@ -912,8 +919,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1008, - serialized_end=1034, + serialized_start=1035, + serialized_end=1061, ) @@ -933,8 +940,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1036, - serialized_end=1048, + serialized_start=1063, + serialized_end=1075, ) @@ -996,8 +1003,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1051, - serialized_end=1200, + serialized_start=1078, + serialized_end=1227, ) @@ -1059,8 +1066,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1203, - serialized_end=1366, + serialized_start=1230, + serialized_end=1393, ) @@ -1080,8 +1087,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1368, - serialized_end=1384, + serialized_start=1395, + serialized_end=1411, ) @@ -1108,8 +1115,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1386, - serialized_end=1421, + serialized_start=1413, + serialized_end=1448, ) @@ -1164,8 +1171,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1424, - serialized_end=1563, + serialized_start=1451, + serialized_end=1590, ) @@ -1185,8 +1192,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1565, - serialized_end=1578, + serialized_start=1592, + serialized_end=1605, ) @@ -1213,8 +1220,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1580, - serialized_end=1609, + serialized_start=1607, + serialized_end=1636, ) @@ -1255,8 +1262,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1611, - serialized_end=1694, + serialized_start=1638, + serialized_end=1721, ) @@ -1297,8 +1304,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1696, - serialized_end=1776, + serialized_start=1723, + serialized_end=1803, ) @@ -1332,8 +1339,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1778, - serialized_end=1838, + serialized_start=1805, + serialized_end=1865, ) @@ -1374,8 +1381,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1840, - serialized_end=1929, + serialized_start=1867, + serialized_end=1956, ) @@ -1402,8 +1409,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1931, - serialized_end=1956, + serialized_start=1958, + serialized_end=1983, ) @@ -1444,8 +1451,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1958, - serialized_end=2039, + serialized_start=1985, + serialized_end=2066, ) @@ -1493,8 +1500,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2042, - serialized_end=2186, + serialized_start=2069, + serialized_end=2213, ) @@ -1549,8 +1556,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2189, - serialized_end=2335, + serialized_start=2216, + serialized_end=2362, ) @@ -1577,8 +1584,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2337, - serialized_end=2375, + serialized_start=2364, + serialized_end=2402, ) @@ -1605,8 +1612,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2377, - serialized_end=2418, + serialized_start=2404, + serialized_end=2445, ) @@ -1626,8 +1633,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2420, - serialized_end=2435, + serialized_start=2447, + serialized_end=2462, ) @@ -1654,8 +1661,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2437, - serialized_end=2476, + serialized_start=2464, + serialized_end=2503, ) @@ -1682,8 +1689,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2478, - serialized_end=2513, + serialized_start=2505, + serialized_end=2540, ) @@ -1703,8 +1710,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2515, - serialized_end=2534, + serialized_start=2542, + serialized_end=2561, ) @@ -1766,8 +1773,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2537, - serialized_end=2680, + serialized_start=2564, + serialized_end=2707, ) @@ -1787,8 +1794,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2682, - serialized_end=2697, + serialized_start=2709, + serialized_end=2724, ) @@ -1829,8 +1836,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2699, - serialized_end=2758, + serialized_start=2726, + serialized_end=2785, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From 2a59a8e0556569cd12b4783335765ad6a4ee20b0 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 4 Feb 2014 01:02:16 +0100 Subject: [PATCH 0181/1535] Added Ping.button_protection --- trezorlib/client.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index f26893e2a..6954ca3bb 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -111,10 +111,11 @@ class TrezorClient(object): def get_entropy(self, size): return self.call(proto.GetEntropy(size=size), proto.Entropy).entropy - def ping(self, msg, pin_protection=False, passphrase_protection=False): + def ping(self, msg, button_protection=True, pin_protection=True, passphrase_protection=True): msg = proto.Ping(message=msg, - pin_protection=pin_protection, - passphrase_protection=passphrase_protection) + button_protection=button_protection, + pin_protection=pin_protection, + passphrase_protection=passphrase_protection) return self.call(msg, proto.Success).message From 98868b15a6a569caa8f4535a569e942b1dc5c073 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 4 Feb 2014 16:12:52 +0100 Subject: [PATCH 0182/1535] Added bip32 speed test Fixed some unit tests --- tests/common.py | 4 ++-- tests/config.py | 10 +++++----- tests/test_addresses.py | 4 ++++ tests/test_bip32_speed.py | 40 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 tests/test_bip32_speed.py diff --git a/tests/common.py b/tests/common.py index c40838268..466ac651c 100644 --- a/tests/common.py +++ b/tests/common.py @@ -6,8 +6,8 @@ from trezorlib.debuglink import DebugLink class TrezorTest(unittest.TestCase): def setUp(self): - self.debug_transport = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS) - self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS) + self.debug_transport = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS, **config.DEBUG_TRANSPORT_KWARGS) + self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS, **config.TRANSPORT_KWARGS) self.client = TrezorClient(self.transport, DebugLink(self.debug_transport), debug=True) # self.client = TrezorClient(self.transport, debug=False) diff --git a/tests/config.py b/tests/config.py index 31cf06ae5..db48f26e4 100644 --- a/tests/config.py +++ b/tests/config.py @@ -5,18 +5,18 @@ from trezorlib.transport_pipe import PipeTransport from trezorlib.transport_hid import HidTransport from trezorlib.transport_socket import SocketTransportClient -use_real = False -use_pipe = True +use_real = True +use_pipe = False if use_real: devices = HidTransport.enumerate() TRANSPORT = HidTransport - TRANSPORT_ARGS = (devices[0], ) + TRANSPORT_ARGS = (devices[0],) TRANSPORT_KWARGS = {'debug_link': False} DEBUG_TRANSPORT = HidTransport - DEBUG_TRANSPORT_ARGS = (devices[0], ) + DEBUG_TRANSPORT_ARGS = (devices[0],) DEBUG_TRANSPORT_KWARGS = {'debug_link': True} elif use_pipe: @@ -33,7 +33,7 @@ else: devices = HidTransport.enumerate() TRANSPORT = HidTransport - TRANSPORT_ARGS = (devices[0], ) + TRANSPORT_ARGS = (devices[0][0],) TRANSPORT_KWARGS = {'debug_link': False} DEBUG_TRANSPORT = SocketTransportClient diff --git a/tests/test_addresses.py b/tests/test_addresses.py index 6e0787c90..6f56131cf 100644 --- a/tests/test_addresses.py +++ b/tests/test_addresses.py @@ -5,6 +5,7 @@ from trezorlib import tools class TestAddresses(common.TrezorTest): def test_btc(self): + self.client.wipe_device() self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, pin='', passphrase_protection=False, @@ -18,6 +19,7 @@ class TestAddresses(common.TrezorTest): self.assertEqual(self.client.get_address('Bitcoin', [0, 9999999]), '1GS8X3yc7ntzwGw9vXwj9wqmBWZkTFewBV') def test_ltc(self): + self.client.wipe_device() self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, pin='', passphrase_protection=False, @@ -31,6 +33,7 @@ class TestAddresses(common.TrezorTest): self.assertEqual(self.client.get_address('Litecoin', [0, 9999999]), 'Laf5nGHSCT94C5dK6fw2RxuXPiw2ZuRR9S') def test_tbtc(self): + self.client.wipe_device() self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, pin='', passphrase_protection=False, @@ -40,6 +43,7 @@ class TestAddresses(common.TrezorTest): self.assertEqual(self.client.get_address('Testnet', [111, 42]), 'moN6aN6NP1KWgnPSqzrrRPvx2x1UtZJssa') def test_public_ckd(self): + self.client.wipe_device() self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, pin='', passphrase_protection=False, diff --git a/tests/test_bip32_speed.py b/tests/test_bip32_speed.py new file mode 100644 index 000000000..9080a4798 --- /dev/null +++ b/tests/test_bip32_speed.py @@ -0,0 +1,40 @@ +import unittest +import common +import time +from trezorlib import tools + +class TestAddresses(common.TrezorTest): + def test_public_ckd(self): + self.client.wipe_device() + self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, + pin='', + passphrase_protection=False, + label='test', + language='english') + + for depth in range(8): + start = time.time() + self.client.get_address('Bitcoin', range(depth)) + delay = time.time() - start + expected = (depth + 1) * 0.25 + print "DEPTH", depth, "EXPECTED DELAY", expected, "REAL DELAY", delay + self.assertLessEqual(delay, expected) + + def test_private_ckd(self): + self.client.wipe_device() + self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, + pin='', + passphrase_protection=False, + label='test', + language='english') + + for depth in range(8): + start = time.time() + self.client.get_address('Bitcoin', range(-depth, 0)) + delay = time.time() - start + expected = (depth + 1) * 0.25 + print "DEPTH", depth, "EXPECTED DELAY", expected, "REAL DELAY", delay + self.assertLessEqual(delay, expected) + +if __name__ == '__main__': + unittest.main() From 1716093dbbe2bfb549171346b343e42c1dd8dea0 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 5 Feb 2014 22:15:05 +0100 Subject: [PATCH 0183/1535] compile pb once again --- tests/config.py | 2 +- trezorlib/messages_pb2.py | 169 +++++++++++++++++++------------------- trezorlib/types_pb2.py | 21 ++++- 3 files changed, 107 insertions(+), 85 deletions(-) diff --git a/tests/config.py b/tests/config.py index db48f26e4..913a628c4 100644 --- a/tests/config.py +++ b/tests/config.py @@ -33,7 +33,7 @@ else: devices = HidTransport.enumerate() TRANSPORT = HidTransport - TRANSPORT_ARGS = (devices[0][0],) + TRANSPORT_ARGS = (devices[0],) TRANSPORT_KWARGS = {'debug_link': False} DEBUG_TRANSPORT = SocketTransportClient diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index d8f710324..e2c1e2084 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"+\n\rButtonRequest\x12\x0c\n\x04\x63ode\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8b\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"E\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x12\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8b\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -206,8 +206,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2788, - serialized_end=4369, + serialized_start=2814, + serialized_end=4395, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -569,18 +569,18 @@ _BUTTONREQUEST = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='code', full_name='ButtonRequest.code', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=unicode("", "utf-8"), + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='data', full_name='ButtonRequest.data', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=unicode("", "utf-8"), + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=None), + options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), ], extensions=[ ], @@ -591,7 +591,7 @@ _BUTTONREQUEST = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=611, - serialized_end=654, + serialized_end=680, ) @@ -611,8 +611,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=656, - serialized_end=667, + serialized_start=682, + serialized_end=693, ) @@ -639,8 +639,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=669, - serialized_end=704, + serialized_start=695, + serialized_end=730, ) @@ -667,8 +667,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=706, - serialized_end=733, + serialized_start=732, + serialized_end=759, ) @@ -688,8 +688,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=735, - serialized_end=743, + serialized_start=761, + serialized_end=769, ) @@ -709,8 +709,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=745, - serialized_end=764, + serialized_start=771, + serialized_end=790, ) @@ -737,8 +737,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=766, - serialized_end=807, + serialized_start=792, + serialized_end=833, ) @@ -765,8 +765,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=809, - serialized_end=835, + serialized_start=835, + serialized_end=861, ) @@ -793,8 +793,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=837, - serialized_end=869, + serialized_start=863, + serialized_end=895, ) @@ -828,8 +828,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=871, - serialized_end=932, + serialized_start=897, + serialized_end=958, ) @@ -856,8 +856,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=934, - serialized_end=972, + serialized_start=960, + serialized_end=998, ) @@ -891,8 +891,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=974, - serialized_end=1033, + serialized_start=1000, + serialized_end=1059, ) @@ -919,8 +919,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1035, - serialized_end=1061, + serialized_start=1061, + serialized_end=1087, ) @@ -940,8 +940,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1063, - serialized_end=1075, + serialized_start=1089, + serialized_end=1101, ) @@ -1003,8 +1003,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1078, - serialized_end=1227, + serialized_start=1104, + serialized_end=1253, ) @@ -1066,8 +1066,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1230, - serialized_end=1393, + serialized_start=1256, + serialized_end=1419, ) @@ -1087,8 +1087,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1395, - serialized_end=1411, + serialized_start=1421, + serialized_end=1437, ) @@ -1115,8 +1115,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1413, - serialized_end=1448, + serialized_start=1439, + serialized_end=1474, ) @@ -1171,8 +1171,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1451, - serialized_end=1590, + serialized_start=1477, + serialized_end=1616, ) @@ -1192,8 +1192,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1592, - serialized_end=1605, + serialized_start=1618, + serialized_end=1631, ) @@ -1220,8 +1220,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1607, - serialized_end=1636, + serialized_start=1633, + serialized_end=1662, ) @@ -1262,8 +1262,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1638, - serialized_end=1721, + serialized_start=1664, + serialized_end=1747, ) @@ -1304,8 +1304,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1723, - serialized_end=1803, + serialized_start=1749, + serialized_end=1829, ) @@ -1339,8 +1339,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1805, - serialized_end=1865, + serialized_start=1831, + serialized_end=1891, ) @@ -1381,8 +1381,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1867, - serialized_end=1956, + serialized_start=1893, + serialized_end=1982, ) @@ -1409,8 +1409,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1958, - serialized_end=1983, + serialized_start=1984, + serialized_end=2009, ) @@ -1451,8 +1451,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1985, - serialized_end=2066, + serialized_start=2011, + serialized_end=2092, ) @@ -1500,8 +1500,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2069, - serialized_end=2213, + serialized_start=2095, + serialized_end=2239, ) @@ -1556,8 +1556,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2216, - serialized_end=2362, + serialized_start=2242, + serialized_end=2388, ) @@ -1584,8 +1584,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2364, - serialized_end=2402, + serialized_start=2390, + serialized_end=2428, ) @@ -1612,8 +1612,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2404, - serialized_end=2445, + serialized_start=2430, + serialized_end=2471, ) @@ -1633,8 +1633,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2447, - serialized_end=2462, + serialized_start=2473, + serialized_end=2488, ) @@ -1661,8 +1661,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2464, - serialized_end=2503, + serialized_start=2490, + serialized_end=2529, ) @@ -1689,8 +1689,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2505, - serialized_end=2540, + serialized_start=2531, + serialized_end=2566, ) @@ -1710,8 +1710,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2542, - serialized_end=2561, + serialized_start=2568, + serialized_end=2587, ) @@ -1773,8 +1773,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2564, - serialized_end=2707, + serialized_start=2590, + serialized_end=2733, ) @@ -1794,8 +1794,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2709, - serialized_end=2724, + serialized_start=2735, + serialized_end=2750, ) @@ -1836,12 +1836,13 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2726, - serialized_end=2785, + serialized_start=2752, + serialized_end=2811, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE _FAILURE.fields_by_name['code'].enum_type = types_pb2._FAILURETYPE +_BUTTONREQUEST.fields_by_name['code'].enum_type = types_pb2._BUTTONREQUESTTYPE _PUBLICKEY.fields_by_name['node'].message_type = types_pb2._HDNODETYPE _LOADDEVICE.fields_by_name['node'].message_type = types_pb2._HDNODETYPE _SIMPLESIGNTX.fields_by_name['inputs'].message_type = types_pb2._TXINPUTTYPE @@ -2266,6 +2267,8 @@ _FEATURES.fields_by_name['label'].has_options = True _FEATURES.fields_by_name['label']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _APPLYSETTINGS.fields_by_name['label'].has_options = True _APPLYSETTINGS.fields_by_name['label']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') +_BUTTONREQUEST.fields_by_name['data'].has_options = True +_BUTTONREQUEST.fields_by_name['data']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _PASSPHRASEACK.fields_by_name['passphrase'].has_options = True _PASSPHRASEACK.fields_by_name['passphrase']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') _ENTROPY.fields_by_name['entropy'].has_options = True diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 50ed6a047..495cd5c1c 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x95\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x95\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*7\n\x11\x42uttonRequestType\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -115,6 +115,24 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) +_BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( + name='ButtonRequestType', + full_name='ButtonRequestType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='ButtonRequest_FeeOverThreshold', index=0, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1199, + serialized_end=1254, +) + +ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) Failure_UnexpectedMessage = 1 Failure_ButtonExpected = 2 Failure_SyntaxError = 3 @@ -129,6 +147,7 @@ PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 TXINPUT = 0 TXOUTPUT = 1 +ButtonRequest_FeeOverThreshold = 1 BINARY_FIELD_NUMBER = 50001 binary = _descriptor.FieldDescriptor( From 07137cae9147dee5b0a2979bbc0536c481b646f1 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 6 Feb 2014 00:34:58 +0100 Subject: [PATCH 0184/1535] test_entropy does not need load_device --- tests/test_entropy.py | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/tests/test_entropy.py b/tests/test_entropy.py index 11eedcfa2..407c33d23 100644 --- a/tests/test_entropy.py +++ b/tests/test_entropy.py @@ -5,27 +5,21 @@ import math from trezorlib import messages_pb2 as messages def entropy(data): + counts = {} + for c in data: + if c in counts: + counts[c] += 1 + else: + counts[c] = 1 e = 0 - for i in range(256): - p = 0 - for c in data: - if ord(c) == i: - p += 1 - if p == 0: - continue - p = 1.0 * p / len(data) + for k,v in counts.iteritems(): + p = 1.0 * v / len(data) e -= p * math.log(p, 256) return e class TestEntropy(common.TrezorTest): def test_entropy(self): - self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, - pin='', - passphrase_protection=False, - label='test', - language='english') - for l in [0, 1, 2, 3, 4, 5, 8, 9, 16, 17, 32, 33, 64, 65, 128, 129, 256, 257, 512, 513, 1024]: ent = self.client.get_entropy(l) self.assertTrue(len(ent) >= l) From dae324f965c68cf15c976355b00f110dc4a794ba Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 6 Feb 2014 10:40:31 +0100 Subject: [PATCH 0185/1535] Basic installation howto --- README.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/README.rst b/README.rst index bc911343a..d12461ac1 100644 --- a/README.rst +++ b/README.rst @@ -10,3 +10,23 @@ How to install (Debian/Ubuntu) How to install (Windows) ------------------------ +* Install Python 2.7 (http://python.org) +* Install Cython (Windows binaries on http://cython.org/#download) +* Install Microsoft Visual Studio 2008 Express +* Add "C:\Program Files (x86)\Microsoft Visual Studio 9.0" to system PATH +* Clone repository (using TortoiseGit) to local directory +* Run c:\python27\python.exe setup.py install (or develop) + +How to install (Debian-Ubuntu) +------------------------------ +* sudo apt-get install python-dev python-setuptools cython +* git clone https://github.com/trezor/python-trezor.git +* cd python-trezor +* python setup.py install (or develop) + +Internal note: +-------------- +* Clone cython-hidapi from github.com/trezor/cython-hidapi +* Go to cython-hidapi directory +* Run "git submodule init" in Git Bash (TortoiseGit) +* Run "git submodule update" in Git Bash (TortoiseGit) From 1a71d7634bba075fce121779101d7dcfa2f6e18f Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 6 Feb 2014 10:41:19 +0100 Subject: [PATCH 0186/1535] Comments --- tests/test.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test.py b/tests/test.py index d41f6a93a..e54bf0a9a 100755 --- a/tests/test.py +++ b/tests/test.py @@ -14,6 +14,10 @@ TODO: * PassphraseRequest/PassphraseAck workflow (vyvolat napr. pomocou GetAddress) * rozsirit test_sign.tx o viac transakcii (zlozitejsich) + * fee over threshold + * not enough funds + * viac ako jeden vstup a jeden vystup + * iny cointype ako 0 - chceme v tomto release(?) * SignMessage workflow From b81c5be4c38614f795fb7e2d8477e4223a627c65 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 6 Feb 2014 10:42:17 +0100 Subject: [PATCH 0187/1535] Compiled pb --- trezorlib/types_pb2.py | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 495cd5c1c..0129e7b9c 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x95\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*7\n\x11\x42uttonRequestType\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x01:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x95\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\xec\x01\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -122,14 +122,38 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( file=DESCRIPTOR, values=[ _descriptor.EnumValueDescriptor( - name='ButtonRequest_FeeOverThreshold', index=0, number=1, + name='ButtonRequest_Other', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ButtonRequest_FeeOverThreshold', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ButtonRequest_ConfirmOutput', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ButtonRequest_ResetDevice', index=3, number=4, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ButtonRequest_ConfirmWord', index=4, number=5, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ButtonRequest_WipeDevice', index=5, number=6, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ButtonRequest_ProtectCall', index=6, number=7, options=None, type=None), ], containing_type=None, options=None, - serialized_start=1199, - serialized_end=1254, + serialized_start=1200, + serialized_end=1436, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -147,7 +171,13 @@ PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 TXINPUT = 0 TXOUTPUT = 1 -ButtonRequest_FeeOverThreshold = 1 +ButtonRequest_Other = 1 +ButtonRequest_FeeOverThreshold = 2 +ButtonRequest_ConfirmOutput = 3 +ButtonRequest_ResetDevice = 4 +ButtonRequest_ConfirmWord = 5 +ButtonRequest_WipeDevice = 6 +ButtonRequest_ProtectCall = 7 BINARY_FIELD_NUMBER = 50001 binary = _descriptor.FieldDescriptor( From 39f4ade40b2a65b36966cf2540ca6c56ae2072dc Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 6 Feb 2014 10:42:39 +0100 Subject: [PATCH 0188/1535] Implemented ButtonRequestType --- trezorlib/client.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 6954ca3bb..f1a908327 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -147,7 +147,11 @@ class TrezorClient(object): self.debug_button = button self.debug_pin = pin_correct - def call(self, msg, expected = None): + def _get_buttonrequest_value(self, code): + return [ k for k, v in types.ButtonRequestType.items() if v == code][0] + + def call(self, msg, expected=None, expected_buttonrequests=None): + # TODO split this into normal and debug mode if self.debug: print '----------------------' print "Sending", self._pprint(msg) @@ -159,6 +163,18 @@ class TrezorClient(object): resp = self.transport.read_blocking() if isinstance(resp, proto.ButtonRequest): + if expected_buttonrequests != None: + try: + exp = expected_buttonrequests.pop(0) + if resp.code != exp: + raise CallException("Expected %s, got %s" % \ + (self._get_buttonrequest_value(exp), + self._get_buttonrequest_value(resp.code))) + except IndexError: + raise CallException("Got %s, but no ButtonRequest has been expected" % \ + self._get_buttonrequest_value(resp.code)) + + print "ButtonRequest code:", self._get_buttonrequest_value(resp.code) if self.debuglink and self.debug_button: print "Pressing button", self.debug_button self.debuglink.press_button(self.debug_button) @@ -179,12 +195,12 @@ class TrezorClient(object): pin = self.pin_func("PIN required: ", resp.message) msg2 = proto.PinMatrixAck(pin=pin) - return self.call(msg2) + return self.call(msg2, expected=expected, expected_buttonrequests=expected_buttonrequests) if isinstance(resp, proto.PassphraseRequest): passphrase = self.passphrase_func("Passphrase required: ") msg2 = proto.PassphraseAck(passphrase=passphrase) - return self.call(msg2) + return self.call(msg2, expected=expected, expected_buttonrequests=expected_buttonrequests) finally: self.transport.session_end() From 7edf015914a015175969e3b84226484e76d8ad2f Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 6 Feb 2014 10:43:03 +0100 Subject: [PATCH 0189/1535] Removed debug printing --- trezorlib/api_blockchain.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/trezorlib/api_blockchain.py b/trezorlib/api_blockchain.py index 9ceaae226..98d3abdfb 100644 --- a/trezorlib/api_blockchain.py +++ b/trezorlib/api_blockchain.py @@ -10,8 +10,9 @@ import types_pb2 as proto_types class BlockchainApi(object): def _raw_tx(self, txhash): # Download tx data from blockchain.info - f = urllib2.urlopen('http://blockchain.info/rawtx/%s?scripts=true' % txhash) - print 'got', txhash + url = 'http://blockchain.info/rawtx/%s?scripts=true' % txhash + print "Downloading", url + f = urllib2.urlopen(url) return json.load(f) def submit(self, tx): From 919c216ac57655efb226272b7ceee3c5f3c9408f Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 6 Feb 2014 10:43:26 +0100 Subject: [PATCH 0190/1535] First attempt to use ButtonRequestType --- tests/test_protect_call.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index 35e7fc33f..8575fdaba 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -2,16 +2,27 @@ import time import unittest import common +from trezorlib import messages_pb2 as proto +from trezorlib import types_pb2 as types from trezorlib.client import PinException # FIXME TODO Add passphrase tests class TestProtectCall(common.TrezorTest): - def _some_protected_call(self): + def _some_protected_call(self, expected_buttonrequests): # This method perform any call which have protection in the device + res = self.client.ping('random data', pin_protection=True, passphrase_protection=True) self.assertEqual(res, 'random data') + msg = proto.Ping(message='random data', + button_protection=True, + pin_protection=True, + passphrase_protection=True) + + return self.client.call(msg, expected=proto.Success, + expected_buttonrequests=expected_buttonrequests).message + def test_no_protection(self): self.client.wipe_device() self.client.load_device_by_mnemonic( @@ -23,8 +34,9 @@ class TestProtectCall(common.TrezorTest): ) self.assertEqual(self.client.debuglink.read_pin()[0], '') - self._some_protected_call() + self._some_protected_call([]) + ''' def test_pin(self): self.client.wipe_device() self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, @@ -59,8 +71,8 @@ class TestProtectCall(common.TrezorTest): start = time.time() self.assertRaises(PinException, self._some_protected_call) test_backoff(attempt, start) - - ''' + ''' + ''' # Unplug Trezor now self.client.debuglink.stop() self.client.close() From aeb0db92de46966de5506b5f43f41d2e203bf5fc Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 6 Feb 2014 13:49:04 +0100 Subject: [PATCH 0191/1535] Compiled pb --- trezorlib/messages_pb2.py | 91 +++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index e2c1e2084..8251d847e 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"E\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x12\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x8b\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"E\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x12\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa5\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -206,8 +206,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2814, - serialized_end=4395, + serialized_start=2840, + serialized_end=4421, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -1162,6 +1162,13 @@ _RECOVERYDEVICE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( + name='enforce_wordlist', full_name='RecoveryDevice.enforce_wordlist', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -1172,7 +1179,7 @@ _RECOVERYDEVICE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=1477, - serialized_end=1616, + serialized_end=1642, ) @@ -1192,8 +1199,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1618, - serialized_end=1631, + serialized_start=1644, + serialized_end=1657, ) @@ -1220,8 +1227,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1633, - serialized_end=1662, + serialized_start=1659, + serialized_end=1688, ) @@ -1262,8 +1269,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1664, - serialized_end=1747, + serialized_start=1690, + serialized_end=1773, ) @@ -1304,8 +1311,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1749, - serialized_end=1829, + serialized_start=1775, + serialized_end=1855, ) @@ -1339,8 +1346,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1831, - serialized_end=1891, + serialized_start=1857, + serialized_end=1917, ) @@ -1381,8 +1388,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1893, - serialized_end=1982, + serialized_start=1919, + serialized_end=2008, ) @@ -1409,8 +1416,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1984, - serialized_end=2009, + serialized_start=2010, + serialized_end=2035, ) @@ -1451,8 +1458,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2011, - serialized_end=2092, + serialized_start=2037, + serialized_end=2118, ) @@ -1500,8 +1507,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2095, - serialized_end=2239, + serialized_start=2121, + serialized_end=2265, ) @@ -1556,8 +1563,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2242, - serialized_end=2388, + serialized_start=2268, + serialized_end=2414, ) @@ -1584,8 +1591,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2390, - serialized_end=2428, + serialized_start=2416, + serialized_end=2454, ) @@ -1612,8 +1619,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2430, - serialized_end=2471, + serialized_start=2456, + serialized_end=2497, ) @@ -1633,8 +1640,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2473, - serialized_end=2488, + serialized_start=2499, + serialized_end=2514, ) @@ -1661,8 +1668,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2490, - serialized_end=2529, + serialized_start=2516, + serialized_end=2555, ) @@ -1689,8 +1696,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2531, - serialized_end=2566, + serialized_start=2557, + serialized_end=2592, ) @@ -1710,8 +1717,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2568, - serialized_end=2587, + serialized_start=2594, + serialized_end=2613, ) @@ -1773,8 +1780,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2590, - serialized_end=2733, + serialized_start=2616, + serialized_end=2759, ) @@ -1794,8 +1801,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2735, - serialized_end=2750, + serialized_start=2761, + serialized_end=2776, ) @@ -1836,8 +1843,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2752, - serialized_end=2811, + serialized_start=2778, + serialized_end=2837, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From eeb6a847eaa04a93a568dfdf219ccae24bd56430 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 6 Feb 2014 15:27:19 +0100 Subject: [PATCH 0192/1535] Added dependency to hidapi>=0.7.99 (~0.8.0 RC1) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 18b1fab57..53792263a 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,7 @@ setup( packages=find_packages(), test_suite='tests', dependency_links=['https://github.com/trezor/python-mnemonic/archive/master.zip#egg=mnemonic-0.6'], - install_requires=['ecdsa>=0.9', 'protobuf', 'mnemonic>=0.6', 'hidapi'], + install_requires=['ecdsa>=0.9', 'protobuf', 'mnemonic>=0.6', 'hidapi>=0.7.99'], include_package_data=True, zip_safe=False, classifiers=[ From 49cecb563db08e1e904f81658146209f5f5005e3 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 6 Feb 2014 23:34:13 +0100 Subject: [PATCH 0193/1535] add test_debuglink test --- tests/test_debuglink.py | 25 +++++++++++ trezorlib/ckd_public.py | 3 +- trezorlib/debuglink.py | 33 +++++++++++---- trezorlib/msqrt.py | 94 ----------------------------------------- 4 files changed, 50 insertions(+), 105 deletions(-) create mode 100644 tests/test_debuglink.py delete mode 100644 trezorlib/msqrt.py diff --git a/tests/test_debuglink.py b/tests/test_debuglink.py new file mode 100644 index 000000000..81b3adc02 --- /dev/null +++ b/tests/test_debuglink.py @@ -0,0 +1,25 @@ +import time +import unittest +import common +import binascii + +from trezorlib import messages_pb2 as proto +from trezorlib import types_pb2 as types +from trezorlib.client import PinException + +class TestDebugLink(common.TrezorTest): + + def test_layout(self): + layout = self.client.debuglink.read_layout() + print binascii.hexlify(layout) + + def test_mnemonic(self): + mnemonic = self.client.debuglink.read_mnemonic() + print mnemonic + + def test_node(self): + node = self.client.debuglink.read_node() + print node + +if __name__ == '__main__': + unittest.main() diff --git a/trezorlib/ckd_public.py b/trezorlib/ckd_public.py index 9ee747efa..52070dedb 100644 --- a/trezorlib/ckd_public.py +++ b/trezorlib/ckd_public.py @@ -7,7 +7,6 @@ from ecdsa.util import string_to_number, number_to_string from ecdsa.curves import SECP256k1 from ecdsa.ellipticcurve import Point, INFINITY -import msqrt import tools import types_pb2 as proto_types @@ -31,7 +30,7 @@ def sec_to_public_pair(pubkey): curve = generator.curve() p = curve.p() alpha = (pow(x, 3, p) + curve.a() * x + curve.b()) % p - beta = msqrt.modular_sqrt(alpha, p) + beta = ecdsa.number_theory.square_root_mod_prime(alpha, p) if is_even == bool(beta & 1): return (x, p - beta) return (x, beta) diff --git a/trezorlib/debuglink.py b/trezorlib/debuglink.py index dc1949b71..7bc1d35aa 100644 --- a/trezorlib/debuglink.py +++ b/trezorlib/debuglink.py @@ -6,36 +6,51 @@ def pin_info(pin): def button_press(yes_no): print "User pressed", '"y"' if yes_no else '"n"' - + class DebugLink(object): def __init__(self, transport, pin_func=pin_info, button_func=button_press): self.transport = transport self.pin_func = pin_func self.button_func = button_func - + def read_pin(self): self.transport.write(proto.DebugLinkGetState()) obj = self.transport.read_blocking() print "Read PIN:", obj.pin print "Read matrix:", obj.matrix - + return (obj.pin, obj.matrix) - + def read_pin_encoded(self): pin, matrix = self.read_pin() - + # Now we have real PIN and PIN matrix. # We have to encode that into encoded pin, # because application must send back positions # on keypad, not a real PIN. pin_encoded = ''.join([ str(matrix.index(p) + 1) for p in pin]) - + print "Encoded PIN:", pin_encoded self.pin_func(pin_encoded) - + return pin_encoded - + + def read_layout(self): + self.transport.write(proto.DebugLinkGetState()) + obj = self.transport.read_blocking() + return obj.layout + + def read_mnemonic(self): + self.transport.write(proto.DebugLinkGetState()) + obj = self.transport.read_blocking() + return obj.mnemonic + + def read_node(self): + self.transport.write(proto.DebugLinkGetState()) + obj = self.transport.read_blocking() + return obj.node + def press_button(self, yes_no): print "Pressing", yes_no self.button_func(yes_no) @@ -43,7 +58,7 @@ class DebugLink(object): def press_yes(self): self.press_button(True) - + def press_no(self): self.press_button(False) diff --git a/trezorlib/msqrt.py b/trezorlib/msqrt.py deleted file mode 100644 index f582ec260..000000000 --- a/trezorlib/msqrt.py +++ /dev/null @@ -1,94 +0,0 @@ -# from http://eli.thegreenplace.net/2009/03/07/computing-modular-square-roots-in-python/ - -def modular_sqrt(a, p): - """ Find a quadratic residue (mod p) of 'a'. p - must be an odd prime. - - Solve the congruence of the form: - x^2 = a (mod p) - And returns x. Note that p - x is also a root. - - 0 is returned is no square root exists for - these a and p. - - The Tonelli-Shanks algorithm is used (except - for some simple cases in which the solution - is known from an identity). This algorithm - runs in polynomial time (unless the - generalized Riemann hypothesis is false). - """ - # Simple cases - # - if legendre_symbol(a, p) != 1: - return 0 - elif a == 0: - return 0 - elif p == 2: - return p - elif p % 4 == 3: - return pow(a, (p + 1) / 4, p) - - # Partition p-1 to s * 2^e for an odd s (i.e. - # reduce all the powers of 2 from p-1) - # - s = p - 1 - e = 0 - while s % 2 == 0: - s /= 2 - e += 1 - - # Find some 'n' with a legendre symbol n|p = -1. - # Shouldn't take long. - # - n = 2 - while legendre_symbol(n, p) != -1: - n += 1 - - # Here be dragons! - # Read the paper "Square roots from 1; 24, 51, - # 10 to Dan Shanks" by Ezra Brown for more - # information - # - - # x is a guess of the square root that gets better - # with each iteration. - # b is the "fudge factor" - by how much we're off - # with the guess. The invariant x^2 = ab (mod p) - # is maintained throughout the loop. - # g is used for successive powers of n to update - # both a and b - # r is the exponent - decreases with each update - # - x = pow(a, (s + 1) / 2, p) - b = pow(a, s, p) - g = pow(n, s, p) - r = e - - while True: - t = b - m = 0 - for m in xrange(r): - if t == 1: - break - t = pow(t, 2, p) - - if m == 0: - return x - - gs = pow(g, 2 ** (r - m - 1), p) - g = (gs * gs) % p - x = (x * gs) % p - b = (b * g) % p - r = m - -def legendre_symbol(a, p): - """ Compute the Legendre symbol a|p using - Euler's criterion. p is a prime, a is - relatively prime to p (if p divides - a, then a|p = 0) - - Returns 1 if a has a square root modulo - p, -1 otherwise. - """ - ls = pow(a, (p - 1) / 2, p) - return -1 if ls == p - 1 else ls From 17e28c0e10912492f518a6caa7af4b12aa199df6 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 7 Feb 2014 01:47:55 +0100 Subject: [PATCH 0194/1535] add asserts to debuglink tests --- tests/test_debuglink.py | 6 +++--- trezorlib/ckd_public.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_debuglink.py b/tests/test_debuglink.py index 81b3adc02..df090ed6c 100644 --- a/tests/test_debuglink.py +++ b/tests/test_debuglink.py @@ -11,15 +11,15 @@ class TestDebugLink(common.TrezorTest): def test_layout(self): layout = self.client.debuglink.read_layout() - print binascii.hexlify(layout) + self.assertEqual(len(layout), 1024) def test_mnemonic(self): mnemonic = self.client.debuglink.read_mnemonic() - print mnemonic + self.assertEqual(mnemonic, self.mnemonic1) def test_node(self): node = self.client.debuglink.read_node() - print node + self.assertIsNotNone(node) if __name__ == '__main__': unittest.main() diff --git a/trezorlib/ckd_public.py b/trezorlib/ckd_public.py index 52070dedb..83b7b7d34 100644 --- a/trezorlib/ckd_public.py +++ b/trezorlib/ckd_public.py @@ -30,7 +30,7 @@ def sec_to_public_pair(pubkey): curve = generator.curve() p = curve.p() alpha = (pow(x, 3, p) + curve.a() * x + curve.b()) % p - beta = ecdsa.number_theory.square_root_mod_prime(alpha, p) + beta = ecdsa.numbertheory.square_root_mod_prime(alpha, p) if is_even == bool(beta & 1): return (x, p - beta) return (x, beta) From 6ee8d7d949aec6d947fcca43a2db1ecc236e2b0a Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 7 Feb 2014 11:31:12 +0100 Subject: [PATCH 0195/1535] and test_pings for combinations of input params --- tests/test_pings.py | 37 +++++++++++++++++++++++++++++++++++++ trezorlib/client.py | 3 +-- 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 tests/test_pings.py diff --git a/tests/test_pings.py b/tests/test_pings.py new file mode 100644 index 000000000..2dc72cc3f --- /dev/null +++ b/tests/test_pings.py @@ -0,0 +1,37 @@ +import time +import unittest +import common + +from trezorlib import messages_pb2 as proto +from trezorlib import types_pb2 as types + +class TestPing(common.TrezorTest): + + def test_ping(self): + + res = self.client.ping('random data') + self.assertEqual(res, 'random data') + + res = self.client.ping('random data', button_protection=True) + self.assertEqual(res, 'random data') + + res = self.client.ping('random data', pin_protection=True) + self.assertEqual(res, 'random data') + + res = self.client.ping('random data', passphrase_protection=True) + self.assertEqual(res, 'random data') + + res = self.client.ping('random data', button_protection=True, pin_protection=True) + self.assertEqual(res, 'random data') + + res = self.client.ping('random data', button_protection=True, passphrase_protection=True) + self.assertEqual(res, 'random data') + + res = self.client.ping('random data', pin_protection=True, passphrase_protection=True) + self.assertEqual(res, 'random data') + + res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) + self.assertEqual(res, 'random data') + +if __name__ == '__main__': + unittest.main() diff --git a/trezorlib/client.py b/trezorlib/client.py index f1a908327..7f00d3fc9 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -111,12 +111,11 @@ class TrezorClient(object): def get_entropy(self, size): return self.call(proto.GetEntropy(size=size), proto.Entropy).entropy - def ping(self, msg, button_protection=True, pin_protection=True, passphrase_protection=True): + def ping(self, msg, button_protection=False, pin_protection=False, passphrase_protection=False): msg = proto.Ping(message=msg, button_protection=button_protection, pin_protection=pin_protection, passphrase_protection=passphrase_protection) - return self.call(msg, proto.Success).message def get_device_id(self): From 33d4fc9f2409526391079221965efa86ffeb09f3 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 8 Feb 2014 17:53:32 +0100 Subject: [PATCH 0196/1535] autodetect type of device in config --- tests/config.py | 50 +++++++++++++++++++++---------------------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/tests/config.py b/tests/config.py index 913a628c4..9ff6e75fb 100644 --- a/tests/config.py +++ b/tests/config.py @@ -5,38 +5,30 @@ from trezorlib.transport_pipe import PipeTransport from trezorlib.transport_hid import HidTransport from trezorlib.transport_socket import SocketTransportClient -use_real = True -use_pipe = False - -if use_real: - - devices = HidTransport.enumerate() - TRANSPORT = HidTransport - TRANSPORT_ARGS = (devices[0],) - TRANSPORT_KWARGS = {'debug_link': False} - - DEBUG_TRANSPORT = HidTransport - DEBUG_TRANSPORT_ARGS = (devices[0],) - DEBUG_TRANSPORT_KWARGS = {'debug_link': True} - -elif use_pipe: - +devices = HidTransport.enumerate() + +if len(devices) > 0: + if devices[0][1] != None: + print 'Using TREZOR' + TRANSPORT = HidTransport + TRANSPORT_ARGS = (devices[0],) + TRANSPORT_KWARGS = {'debug_link': False} + DEBUG_TRANSPORT = HidTransport + DEBUG_TRANSPORT_ARGS = (devices[0],) + DEBUG_TRANSPORT_KWARGS = {'debug_link': True} + else: + print 'Using Raspberry Pi' + TRANSPORT = HidTransport + TRANSPORT_ARGS = (devices[0],) + TRANSPORT_KWARGS = {'debug_link': False} + DEBUG_TRANSPORT = SocketTransportClient + DEBUG_TRANSPORT_ARGS = ('trezor.bo:2000',) + DEBUG_TRANSPORT_KWARGS = {} +else: + print 'Using Emulator' TRANSPORT = PipeTransport TRANSPORT_ARGS = ('../../trezor-emu/pipe.trezor', False) TRANSPORT_KWARGS = {} - DEBUG_TRANSPORT = PipeTransport DEBUG_TRANSPORT_ARGS = ('../../trezor-emu/pipe.trezor_debug', False) DEBUG_TRANSPORT_KWARGS = {} - -else: - - devices = HidTransport.enumerate() - TRANSPORT = HidTransport - TRANSPORT_ARGS = (devices[0],) - TRANSPORT_KWARGS = {'debug_link': False} - - DEBUG_TRANSPORT = SocketTransportClient - DEBUG_TRANSPORT_ARGS = ('trezor.bo:2000', ) -# DEBUG_TRANSPORT_ARGS = ('trezor.dyn:2000') - DEBUG_TRANSPORT_KWARGS = {} From e160afa56d6af4a632e047880da3dea8c9c46473 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 8 Feb 2014 23:12:48 +0100 Subject: [PATCH 0197/1535] Added signing tests --- tests/test_signtx.py | 141 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 135 insertions(+), 6 deletions(-) diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 7b0236cad..3dfc32c11 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -7,7 +7,7 @@ import trezorlib.types_pb2 as proto_types class TestSignTx(common.TrezorTest): - def test_simplesigntx(self): + def test_one_one_fee(self): # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 # input 0: 0.0039 BTC @@ -22,10 +22,137 @@ class TestSignTx(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + expected_btn = [proto_types.ButtonRequest_ConfirmOutput] + tx = self.client.call(msg, expected_buttonrequests=expected_btn) + + # Accepted by network: tx fd79435246dee76b2f159d2db08032d666c95adc544de64c8c49f474df4a7fee self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') - ''' + def test_one_two_fee(self): + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=390000 - 80000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + out2 = proto_types.TxOutputType(address_n=[1], + amount=80000, + script_type=proto_types.PAYTOADDRESS, + ) + + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2]) + expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 2 + tx = self.client.call(msg, expected_buttonrequests=expected_btn) + + self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006c493046022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef17022100e2b7e2fbde94ce623ab6001dcccebc9c1f0d54be0a65cec3851b44e62610028a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') + + def test_one_three_fee(self): + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=390000 - 80000 - 12000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + out2 = proto_types.TxOutputType(address='13uaUYn6XAooo88QvAqAVsiVvr2mAXutqP', + amount=12000, + script_type=proto_types.PAYTOADDRESS, + ) + + out3 = proto_types.TxOutputType(address_n=[1], + amount=80000, + script_type=proto_types.PAYTOADDRESS, + ) + + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2, out3]) + expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 3 + tx = self.client.call(msg, expected_buttonrequests=expected_btn) + + self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006c493046022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02210084f78657ebf75ee1dc4ee2b3869a39d35ae80723d6255f45d1a4b6d8c19d0ff70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') + + def test_two_two(self): + # tx: c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c + # input 1: 0.0010 BTC + # tx: 58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e + # input 1: 0.0011 BTC + + inp1 = proto_types.TxInputType(address_n=[1], # 1CK7SJdcb8z9HuvVft3D91HLpLC6KSsGb + # amount=100000, + prev_hash=binascii.unhexlify('c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c'), + prev_index=1, + ) + + inp2 = proto_types.TxInputType(address_n=[2], # 15AeAhtNJNKyowK8qPHwgpXkhsokzLtUpG + # amount=110000, + prev_hash=binascii.unhexlify('58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e'), + prev_index=1, + ) + + out1 = proto_types.TxOutputType(address='15Jvu3nZNP7u2ipw2533Q9VVgEu2Lu9F2B', + amount=210000 - 100000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + out2 = proto_types.TxOutputType(address_n=[3], # 1CmzyJp9w3NafXMSEFH4SLYUPAVCSUrrJ5 + amount=100000, + script_type=proto_types.PAYTOADDRESS, + ) + + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], [out1, out2]) + expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 2 + tx = self.client.call(msg, expected_buttonrequests=expected_btn) + + # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb + self.assertEqual(binascii.hexlify(tx.serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006c493046022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a022100bbc421b41bc60d89593186c99b4b9ca6ac8dce1fe62342d38a8e14e0cbf279dc01210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006c49304602210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f022100d4058d1efd9f5eb9542a62fad91ecca30db32a326f311f51dc2b1a71cbb578670121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') + + def test_255_outputs(self): + # tx: c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb + # index 1: 0.0010 BTC + # tx: 39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5 + # index 1: 0.0254 BTC + + inp1 = proto_types.TxInputType(address_n=[3], # 1CmzyJp9w3NafXMSEFH4SLYUPAVCSUrrJ5 + # amount=100000, + prev_hash=binascii.unhexlify('c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb'), + prev_index=1, + ) + + inp2 = proto_types.TxInputType(address_n=[3], # 1CmzyJp9w3NafXMSEFH4SLYUPAVCSUrrJ5 + # amount=2540000, + prev_hash=binascii.unhexlify('39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5'), + prev_index=1, + ) + + outputs = [] + for _ in range(255): + out = proto_types.TxOutputType(address_n=[4], # 1NwN6UduuVkJi6sw3gSiKZaCY5rHgVXC2h + amount=10200, + script_type=proto_types.PAYTOADDRESS, + ) + outputs.append(out) + + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], outputs) + expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 255 + tx = self.client.call(msg, expected_buttonrequests=expected_btn) + + self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006c493046022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022100d925d9688f66cdee5eafcbeca995cc62ff6b53422c48a342dddaf778d3faac4c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006b483045022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40221008fb4154fb28d13514bd1358267053584b16cf68781355e4a3c143308e985a325012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') + def test_fee_too_high(self): # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 # input 0: 0.0039 BTC @@ -41,10 +168,12 @@ class TestSignTx(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) - # FIXME - Check if "Fee too high" appeared on display - ''' + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + expected_btn = [proto_types.ButtonRequest_ConfirmOutput, + proto_types.ButtonRequest_FeeOverThreshold] + tx = self.client.call(msg, expected_buttonrequests=expected_btn) + self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac022100ac751d7a44cbfb7b44f65989ca2d6e6c19607b0e071044b0b6c7cba8e6b825400121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') def test_estimate_size(self): inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e From e919f1bd3076dcbbbab283cf6999d49df60e4cf0 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 8 Feb 2014 23:13:28 +0100 Subject: [PATCH 0198/1535] Fixed expect_buttonrequests Splitted simplesigntx --- trezorlib/client.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 7f00d3fc9..6bafaec13 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -178,7 +178,7 @@ class TrezorClient(object): print "Pressing button", self.debug_button self.debuglink.press_button(self.debug_button) - return self.call(proto.ButtonAck()) + return self.call(proto.ButtonAck(), expected_buttonrequests=expected_buttonrequests) if isinstance(resp, proto.PinMatrixRequest): if self.debuglink: @@ -222,6 +222,10 @@ class TrezorClient(object): if expected and not isinstance(resp, expected): raise CallException("Expected %s message, got %s message" % (expected.DESCRIPTOR.name, resp.DESCRIPTOR.name)) + if expected_buttonrequests != None and len(expected_buttonrequests): + raise CallException("Following ButtonRequests were not in use: %s" % \ + [ self._get_buttonrequest_value(x) for x in expected_buttonrequests]) + return resp def sign_message(self, n, message): @@ -246,7 +250,7 @@ class TrezorClient(object): res = self.call(msg) return res.tx_size - def simple_sign_tx(self, coin_name, inputs, outputs): + def _prepare_simple_sign_tx(self, coin_name, inputs, outputs): msg = proto.SimpleSignTx() msg.coin_name = coin_name msg.inputs.extend(inputs) @@ -261,6 +265,10 @@ class TrezorClient(object): tx.CopyFrom(self.blockchain.get_tx(binascii.hexlify(inp.prev_hash))) known_hashes.append(inp.prev_hash) + return msg + + def simple_sign_tx(self, coin_name, inputs, outputs): + msg = self._prepare_simple_sign_tx(coin_name, inputs, outputs) return self.call(msg) def sign_tx(self, coin_name, inputs, outputs): @@ -357,7 +365,8 @@ class TrezorClient(object): passphrase_protection=bool(passphrase_protection), pin_protection=bool(pin_protection), label=label, - language=language)) + language=language, + enforce_wordlist=True)) while isinstance(res, proto.WordRequest): word = self.word_func() @@ -462,3 +471,5 @@ class TrezorClient(object): return False raise Exception("Unexpected result " % resp) + +# class TrezorDebugClient(TrezorClient): From f5606d6824350de7d5918c25b349869b4ad96101 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 8 Feb 2014 23:15:14 +0100 Subject: [PATCH 0199/1535] Edited list of useful tests --- tests/test.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test.py b/tests/test.py index e54bf0a9a..d64a7255f 100755 --- a/tests/test.py +++ b/tests/test.py @@ -29,4 +29,6 @@ TODO: * Maxfee settings * Client requires OTP * Client requires PIN + +x Zero signature test ''' From 262d493ce2e282842b2d4f257211afa480cba1b3 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sun, 9 Feb 2014 00:12:22 +0100 Subject: [PATCH 0200/1535] CallException has always code and message --- trezorlib/client.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 6bafaec13..60eb1c08f 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -29,7 +29,9 @@ def word_func(): return raw_input("Enter one word of mnemonic: ") class CallException(Exception): - pass + def __init__(self, code, message): + super(CallException, self).__init__() + self.args = [code, message] class PinException(CallException): pass @@ -166,11 +168,12 @@ class TrezorClient(object): try: exp = expected_buttonrequests.pop(0) if resp.code != exp: - raise CallException("Expected %s, got %s" % \ + raise CallException(types.Failure_Other, "Expected %s, got %s" % \ (self._get_buttonrequest_value(exp), self._get_buttonrequest_value(resp.code))) except IndexError: - raise CallException("Got %s, but no ButtonRequest has been expected" % \ + raise CallException(types.Failure_Other, + "Got %s, but no ButtonRequest has been expected" % \ self._get_buttonrequest_value(resp.code)) print "ButtonRequest code:", self._get_buttonrequest_value(resp.code) @@ -207,12 +210,9 @@ class TrezorClient(object): if isinstance(resp, proto.Failure): self.message_func(resp.message) - if resp.code == types.Failure_ActionCancelled: - raise CallException("Action cancelled by user") - - elif resp.code in (types.Failure_PinInvalid, + if resp.code in (types.Failure_PinInvalid, types.Failure_PinCancelled, types.Failure_PinExpected): - raise PinException("PIN is invalid") + raise PinException(resp.code, resp.message) raise CallException(resp.code, resp.message) @@ -223,7 +223,8 @@ class TrezorClient(object): raise CallException("Expected %s message, got %s message" % (expected.DESCRIPTOR.name, resp.DESCRIPTOR.name)) if expected_buttonrequests != None and len(expected_buttonrequests): - raise CallException("Following ButtonRequests were not in use: %s" % \ + raise CallException(types.Failure_Other, + "Following ButtonRequests were not in use: %s" % \ [ self._get_buttonrequest_value(x) for x in expected_buttonrequests]) return resp From 22dd34baa1ca1d98ccd59b769612594e251cafc6 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sun, 9 Feb 2014 00:12:52 +0100 Subject: [PATCH 0201/1535] Compiled pb --- trezorlib/types_pb2.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 0129e7b9c..fe91a5137 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\x95\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\xec\x01\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xb1\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\xec\x01\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -60,14 +60,18 @@ _FAILURETYPE = _descriptor.EnumDescriptor( options=None, type=None), _descriptor.EnumValueDescriptor( - name='Failure_FirmwareError', index=9, number=99, + name='Failure_NotEnoughFunds', index=9, number=10, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_FirmwareError', index=10, number=99, options=None, type=None), ], containing_type=None, options=None, serialized_start=825, - serialized_end=1102, + serialized_end=1130, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -88,8 +92,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1104, - serialized_end=1155, + serialized_start=1132, + serialized_end=1183, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -110,8 +114,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1157, - serialized_end=1197, + serialized_start=1185, + serialized_end=1225, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -152,8 +156,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1200, - serialized_end=1436, + serialized_start=1228, + serialized_end=1464, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -166,6 +170,7 @@ Failure_PinCancelled = 6 Failure_PinInvalid = 7 Failure_InvalidSignature = 8 Failure_Other = 9 +Failure_NotEnoughFunds = 10 Failure_FirmwareError = 99 PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 From 0d25c8974e769feae9b3339c833c3ea96f67f8ed Mon Sep 17 00:00:00 2001 From: slush0 Date: Sun, 9 Feb 2014 00:13:32 +0100 Subject: [PATCH 0202/1535] Added basic testnet tests --- tests/test.py | 8 +-- tests/test_signtx.py | 113 +++++++++++++++++++++++++++++++++++++++++- tests/test_zerosig.py | 84 +++++++++++++++++++++++++++++++ 3 files changed, 200 insertions(+), 5 deletions(-) create mode 100644 tests/test_zerosig.py diff --git a/tests/test.py b/tests/test.py index d64a7255f..0b1a688a8 100755 --- a/tests/test.py +++ b/tests/test.py @@ -14,10 +14,10 @@ TODO: * PassphraseRequest/PassphraseAck workflow (vyvolat napr. pomocou GetAddress) * rozsirit test_sign.tx o viac transakcii (zlozitejsich) - * fee over threshold - * not enough funds - * viac ako jeden vstup a jeden vystup - * iny cointype ako 0 + x fee over threshold + x not enough funds + x viac ako jeden vstup a jeden vystup + x iny cointype ako 0 - chceme v tomto release(?) * SignMessage workflow diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 3dfc32c11..85274a418 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -1,9 +1,40 @@ +# tx 4a7b7e0403ae5607e473949cfa03f09f2cd8b0f404bf99ce10b7303d86280bf7 +# 100 UTXO for spending for unittests + import unittest import common import binascii import trezorlib.messages_pb2 as proto import trezorlib.types_pb2 as proto_types +from trezorlib.client import CallException + +class FakeTestnetBlockchain(object): + def get_tx(self, txhash): + if txhash != '6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54': + raise Exception("Unexpected hash") + + t = proto_types.TransactionType() + + i = t.inputs.add() + i.prev_hash = binascii.unhexlify('ee336e79153d51f4f3e45278f1f77ab29fd5bb135dce467282e2aff22cb9c570') + i.prev_index = 1 + i.script_sig = binascii.unhexlify('483045022066c418874dbe5628296700382d727ce1734928796068c26271472df09dccf1a20221009dec59d19f9d73db381fcd35c0fff757ad73e54ef59157b0d7c57e6739a092f00121033fef08c603943dc7d25f4ce65771762143b1cd8678343d660a1a76b9d1d3ced7') + + i = t.inputs.add() + i.prev_hash = binascii.unhexlify('2fe4d8af2b44faccc10dd5a6578c923491d2d21269a1dfe8c83f492a30fb8f9f') + i.prev_index = 1 + i.script_sig = binascii.unhexlify('47304402206fbb8e14be706b8557a2280d2a2a75c0a65c4f7936d90d510f0971c93f41f74402201b79c8c4e4ac4c944913611633c230193558296e70a36269b7fc3a80efa27d120121030cb5be79bdc36a4ff4443dbac43068cc43d638ea06ff2fa1b8dab389e39aefc7') + + o = t.outputs.add() + o.amount = 403850989 + o.script_pubkey = binascii.unhexlify('76a914f5a05c2664b40d3116b1c5086c9ba38ed15b742e88ac') + + o = t.outputs.add() + o.amount = 1000000000 + o.script_pubkey = binascii.unhexlify('76a91424a56db43cf6f2b02e838ea493f95d8d6047423188ac') + + return t class TestSignTx(common.TrezorTest): @@ -29,6 +60,60 @@ class TestSignTx(common.TrezorTest): # Accepted by network: tx fd79435246dee76b2f159d2db08032d666c95adc544de64c8c49f474df4a7fee self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + def test_testnet_one_two_fee(self): + # tx: 6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54 + # input 1: 10.00000000 BTC + inp1 = proto_types.TxInputType(address_n=[0], # mirio8q3gtv7fhdnmb3TpZ4EuafdzSs7zL + # amount=1000000000, + prev_hash=binascii.unhexlify('6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54'), + prev_index=1, + ) + + out1 = proto_types.TxOutputType(address='mfiGQVPcRcaEvQPYDErR34DcCovtxYvUUV', + amount=1000000000 - 500000000 - 10000000, + script_type=proto_types.PAYTOADDRESS, + ) + + out2 = proto_types.TxOutputType(address_n=[2], + amount=500000000, + script_type=proto_types.PAYTOADDRESS, + ) + + self.client.blockchain = FakeTestnetBlockchain() + msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) + expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 2 + tx = self.client.call(msg, expected_buttonrequests=expected_btn) + + self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b4830450221009c2d30385519fdb13dce13d5ac038be07d7b2dad0b0f7b2c1c339d7255bcf553022056a2f5bceab3cd0ffed4d388387e631f419d67ff9ce7798e3d7dfe6a6d6ec4bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0280ce341d000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') + + def test_testnet_fee_too_high(self): + # tx: 6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54 + # input 1: 10.00000000 BTC + inp1 = proto_types.TxInputType(address_n=[0], # mirio8q3gtv7fhdnmb3TpZ4EuafdzSs7zL + # amount=1000000000, + prev_hash=binascii.unhexlify('6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54'), + prev_index=1, + ) + + out1 = proto_types.TxOutputType(address='mfiGQVPcRcaEvQPYDErR34DcCovtxYvUUV', + amount=1000000000 - 500000000 - 20000000, + script_type=proto_types.PAYTOADDRESS, + ) + + out2 = proto_types.TxOutputType(address_n=[2], + amount=500000000, + script_type=proto_types.PAYTOADDRESS, + ) + + self.client.blockchain = FakeTestnetBlockchain() + msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) + expected_btn = [proto_types.ButtonRequest_ConfirmOutput, + proto_types.ButtonRequest_ConfirmOutput, + proto_types.ButtonRequest_FeeOverThreshold] + tx = self.client.call(msg, expected_buttonrequests=expected_btn) + + self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') + def test_one_two_fee(self): # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 # input 0: 0.0039 BTC @@ -122,6 +207,8 @@ class TestSignTx(common.TrezorTest): self.assertEqual(binascii.hexlify(tx.serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006c493046022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a022100bbc421b41bc60d89593186c99b4b9ca6ac8dce1fe62342d38a8e14e0cbf279dc01210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006c49304602210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f022100d4058d1efd9f5eb9542a62fad91ecca30db32a326f311f51dc2b1a71cbb578670121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') def test_255_outputs(self): + # Tests if device implements serialization of len(outputs) correctly + # tx: c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb # index 1: 0.0010 BTC # tx: 39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5 @@ -152,7 +239,7 @@ class TestSignTx(common.TrezorTest): tx = self.client.call(msg, expected_buttonrequests=expected_btn) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006c493046022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022100d925d9688f66cdee5eafcbeca995cc62ff6b53422c48a342dddaf778d3faac4c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006b483045022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40221008fb4154fb28d13514bd1358267053584b16cf68781355e4a3c143308e985a325012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') - + def test_fee_too_high(self): # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 # input 0: 0.0039 BTC @@ -175,6 +262,30 @@ class TestSignTx(common.TrezorTest): self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac022100ac751d7a44cbfb7b44f65989ca2d6e6c19607b0e071044b0b6c7cba8e6b825400121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + def test_not_enough_funds(self): + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=400000, + script_type=proto_types.PAYTOADDRESS, + ) + + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + expected_btn = [proto_types.ButtonRequest_ConfirmOutput] + try: + self.client.call(msg, expected_buttonrequests=expected_btn) + except CallException as e: + self.assertEqual(e.args[0], proto_types.Failure_NotEnoughFunds) + else: + self.assert_(False, "types.Failure_NotEnoughFunds expected") + def test_estimate_size(self): inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e # amount=390000, diff --git a/tests/test_zerosig.py b/tests/test_zerosig.py new file mode 100644 index 000000000..3d60b332f --- /dev/null +++ b/tests/test_zerosig.py @@ -0,0 +1,84 @@ +import unittest +import common +import binascii + +import trezorlib.messages_pb2 as proto +import trezorlib.types_pb2 as proto_types + +# address_n = [177] < 68 +# address_n = [16518] < 66 +class TestZeroSig(common.TrezorTest): + + ''' + def test_mine_zero_signature(self): + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], []) + + for n in range(3500, 200000): + out1 = proto_types.TxOutputType(address_n=[n], + amount=390000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + msg.ClearField('outputs') + msg.outputs.extend([out1, ]) + + tx = self.client.call(msg) + + siglen = ord(tx.serialized_tx[44]) + print siglen + if siglen < 67: + print "!!!!", n + print binascii.hexlify(tx.serialized_tx) + return + ''' + + def test_one_zero_signature(self): + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + # Following address_n has been mined by 'test_mine_zero_signature' + out1 = proto_types.TxOutputType(address_n=[177], + amount=390000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1], [out1]) + tx = self.client.call(msg) + siglen = ord(tx.serialized_tx[44]) + + # Trezor must strip leading zero from signature + self.assertEqual(siglen, 67) + + def test_two_zero_signature(self): + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + # Following address_n has been mined by 'test_mine_zero_signature' + out1 = proto_types.TxOutputType(address_n=[16518], + amount=390000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1], [out1]) + tx = self.client.call(msg) + siglen = ord(tx.serialized_tx[44]) + + # Trezor must strip leading zero from signature + self.assertEqual(siglen, 66) + +if __name__ == '__main__': + unittest.main() From 2e9104f3c253a1d3c384a9d8c16d8d81182e8df6 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sun, 9 Feb 2014 01:08:03 +0100 Subject: [PATCH 0203/1535] Reworked unit tests for using sigencode=sigencode_der_canonize in emu/trezor. --- tests/test_signtx.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 85274a418..9a27da513 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -138,7 +138,7 @@ class TestSignTx(common.TrezorTest): expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 2 tx = self.client.call(msg, expected_buttonrequests=expected_btn) - self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006c493046022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef17022100e2b7e2fbde94ce623ab6001dcccebc9c1f0d54be0a65cec3851b44e62610028a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') + self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef1702201d481d04216b319dc549ffe2333143629ba18828a4e2d1783ab719a6aa263eb70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') def test_one_three_fee(self): # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 @@ -169,7 +169,7 @@ class TestSignTx(common.TrezorTest): expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 3 tx = self.client.call(msg, expected_buttonrequests=expected_btn) - self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006c493046022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02210084f78657ebf75ee1dc4ee2b3869a39d35ae80723d6255f45d1a4b6d8c19d0ff70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') + self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02207b0879a81408a11e23b11d4c7965c62b5fc6d5c2d92340f5ee2da7b40e99314a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') def test_two_two(self): # tx: c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c @@ -204,8 +204,9 @@ class TestSignTx(common.TrezorTest): tx = self.client.call(msg, expected_buttonrequests=expected_btn) # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb - self.assertEqual(binascii.hexlify(tx.serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006c493046022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a022100bbc421b41bc60d89593186c99b4b9ca6ac8dce1fe62342d38a8e14e0cbf279dc01210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006c49304602210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f022100d4058d1efd9f5eb9542a62fad91ecca30db32a326f311f51dc2b1a71cbb578670121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') + self.assertEqual(binascii.hexlify(tx.serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') + ''' def test_255_outputs(self): # Tests if device implements serialization of len(outputs) correctly @@ -239,6 +240,7 @@ class TestSignTx(common.TrezorTest): tx = self.client.call(msg, expected_buttonrequests=expected_btn) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006c493046022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022100d925d9688f66cdee5eafcbeca995cc62ff6b53422c48a342dddaf778d3faac4c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006b483045022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40221008fb4154fb28d13514bd1358267053584b16cf68781355e4a3c143308e985a325012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') + ''' def test_fee_too_high(self): # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 @@ -260,7 +262,7 @@ class TestSignTx(common.TrezorTest): proto_types.ButtonRequest_FeeOverThreshold] tx = self.client.call(msg, expected_buttonrequests=expected_btn) - self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac022100ac751d7a44cbfb7b44f65989ca2d6e6c19607b0e071044b0b6c7cba8e6b825400121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') def test_not_enough_funds(self): # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 From dc54376b15d090962c6db51ac13f32689532ba38 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 9 Feb 2014 04:47:19 +0100 Subject: [PATCH 0204/1535] use filecache module if possible --- .gitignore | 1 + trezorlib/api_blockchain.py | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/.gitignore b/.gitignore index f3df5d2a3..500d46e85 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.pyc *.bin +*.py.cache diff --git a/trezorlib/api_blockchain.py b/trezorlib/api_blockchain.py index 98d3abdfb..56e4a0cda 100644 --- a/trezorlib/api_blockchain.py +++ b/trezorlib/api_blockchain.py @@ -4,6 +4,14 @@ import binascii import urllib2 import json +try: + from filecache import filecache, MONTH +except: + def filecache(x): + def _inner(y): + return y + return _inner + MONTH = None import types_pb2 as proto_types @@ -18,6 +26,7 @@ class BlockchainApi(object): def submit(self, tx): raise Exception("Not implemented yet") + @filecache(MONTH) def get_tx(self, txhash): # Build protobuf transaction structure from blockchain.info d = self._raw_tx(txhash) From 59f4dcbaa5dce98ea72a8299ff9f7d41a56fd50c Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 11 Feb 2014 21:03:17 +0100 Subject: [PATCH 0205/1535] compute root node via bip39 in test_bip32_speed before checking speed --- tests/test_bip32_speed.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_bip32_speed.py b/tests/test_bip32_speed.py index 9080a4798..7153f17b4 100644 --- a/tests/test_bip32_speed.py +++ b/tests/test_bip32_speed.py @@ -12,6 +12,8 @@ class TestAddresses(common.TrezorTest): label='test', language='english') + self.client.get_address('Bitcoin', [0]) # to compute root node via BIP39 + for depth in range(8): start = time.time() self.client.get_address('Bitcoin', range(depth)) @@ -28,6 +30,8 @@ class TestAddresses(common.TrezorTest): label='test', language='english') + self.client.get_address('Bitcoin', [0]) # to compute root node via BIP39 + for depth in range(8): start = time.time() self.client.get_address('Bitcoin', range(-depth, 0)) From 36b0c8095d7052a6c94ddcb229b314b0610b3c3c Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 10 Feb 2014 04:04:24 +0100 Subject: [PATCH 0206/1535] Fixed tx hash --- tests/test_signtx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 9a27da513..3ee0ee939 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -239,7 +239,7 @@ class TestSignTx(common.TrezorTest): expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 255 tx = self.client.call(msg, expected_buttonrequests=expected_btn) - self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006c493046022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022100d925d9688f66cdee5eafcbeca995cc62ff6b53422c48a342dddaf778d3faac4c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006b483045022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40221008fb4154fb28d13514bd1358267053584b16cf68781355e4a3c143308e985a325012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') + self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') ''' def test_fee_too_high(self): From 558f61e6359bba3da5c670f7f0eb7a186822de18 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 13 Feb 2014 16:46:21 +0100 Subject: [PATCH 0207/1535] Heavily refactored TrezorClient --- trezorlib/client.py | 610 +++++++++++++++++++++++++---------------- trezorlib/debuglink.py | 3 + 2 files changed, 381 insertions(+), 232 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 60eb1c08f..66c53506f 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -1,32 +1,18 @@ import os -import time import binascii import hashlib import tools import messages_pb2 as proto import types_pb2 as types -from api_blockchain import BlockchainApi +from trezorlib.debuglink import DebugLink # monkeypatching: text formatting of protobuf messages tools.monkeypatch_google_protobuf_text_format() -def show_message(message): - print "MESSAGE FROM DEVICE:", message - -def show_input(input_text, message=None): - if message: - print "QUESTION FROM DEVICE:", message - return raw_input(input_text) - -def pin_func(input_text, message=None): - return show_input(input_text, message) - -def passphrase_func(input_text): - return show_input(input_text) - -def word_func(): - return raw_input("Enter one word of mnemonic: ") +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] class CallException(Exception): def __init__(self, code, message): @@ -36,39 +22,189 @@ class CallException(Exception): class PinException(CallException): pass -PRIME_DERIVATION_FLAG = 0x80000000 +class field(object): + # Decorator extracts single value from + # protobuf object. If the field is not + # present, raises an exception. + def __init__(self, field): + self.field = field + + def __call__(self, f): + def wrapped_f(*args, **kwargs): + ret = f(*args, **kwargs) + ret.HasField(self.field) + return getattr(ret, self.field) + return wrapped_f + +class expect(object): + # Decorator checks if the method + # returned one of expected protobuf messages + # or raises an exception + def __init__(self, *expected): + self.expected = expected + + def __call__(self, f): + def wrapped_f(*args, **kwargs): + ret = f(*args, **kwargs) + if not isinstance(ret, self.expected): + raise Exception("Got %s, expected %s" % (ret.__class__, self.expected)) + return ret + return wrapped_f + +class BaseClient(object): + # Implements very basic layer of sending raw protobuf + # messages to device and getting its response back. + def __init__(self, transport, *args, **kwargs): + self.transport = transport + super(BaseClient, self).__init__(*args, **kwargs) -class TrezorClient(object): + def call(self, msg): + try: + self.transport.session_begin() - def __init__(self, transport, debuglink=None, - message_func=show_message, input_func=show_input, - pin_func=pin_func, passphrase_func=passphrase_func, - word_func=word_func, blockchain_api=None, debug=False): - self.transport = transport - self.debuglink = debuglink + self.transport.write(msg) + resp = self.transport.read_blocking() - self.message_func = message_func - self.input_func = input_func - self.pin_func = pin_func - self.passphrase_func = passphrase_func - self.word_func = word_func + handler_name = "callback_%s" % resp.__class__.__name__ + handler = getattr(self, handler_name, None) - self.debug = debug + if handler != None: + msg = handler(resp) + if msg == None: + raise Exception("Callback %s must return protobug message, not None" % handler) + + resp = self.call(msg) + + finally: + self.transport.session_end() + + return resp + + def callback_Failure(self, msg): + if msg.code in (types.Failure_PinInvalid, + types.Failure_PinCancelled, types.Failure_PinExpected): + raise PinException(msg.code, msg.message) + + raise CallException(msg.code, msg.message) + + def close(self): + self.transport.close() - if blockchain_api: - self.blockchain = blockchain_api +class TextUIMixin(object): + # This class demonstrates easy test-based UI + # integration between the device and wallet. + # You can implement similar functionality + # by implementing your own GuiMixin with + # graphical widgets for every type of these callbacks. + + def callback_ButtonRequest(self, msg): + print "Sending ButtonAck for %s " % get_buttonrequest_value(msg.code) + return proto.ButtonAck() + + def callback_PinMatrixRequest(self, msg): + pin = raw_input("PIN required: %s " % msg.message) + return proto.PinMatrixAck(pin=pin) + + def callback_PassphraseRequest(self, msg): + passphrase = raw_input("Passphrase required: %s " % msg.message) + return proto.PassphraseAck(passphrase=passphrase) + + def callback_WordRequest(self, msg): + word = raw_input("Enter one word of mnemonic: ") + return proto.WordAck(word=word) + +class DebugLinkMixin(object): + # This class implements automatic responses + # and other functionality for unit tests + # for various callbacks, created in order + # to automatically pass unit tests. + # + # This mixing should be used only for purposes + # of unit testing, because it will fail to work + # without special DebugLink interface provided + # by the device. + + def __init__(self, *args, **kwargs): + super(DebugLinkMixin, self).__init__(*args, **kwargs) + self.debug = None + + # Always press Yes and provide correct pin + self.setup_debuglink(True, True) + + # Do not expect any specific ButtonRequest + self.set_expected_buttonrequests(None) + + def close(self): + super(DebugLinkMixin, self).close() + if self.debug: + self.debug.close() + + def set_debuglink(self, debug_transport): + self.debug = DebugLink(debug_transport) + + def set_expected_buttonrequests(self, expected): + self.expected_buttonrequests = expected + + def setup_debuglink(self, button, pin_correct): + self.button = button # True -> YES button, False -> NO button + self.pin_correct = pin_correct + + def callback_ButtonRequest(self, msg): + if self.expected_buttonrequests != None: + try: + expected = self.expected_buttonrequests.pop(0) + if msg.code != expected: + raise CallException(types.Failure_Other, + "Expected %s, got %s" % \ + (get_buttonrequest_value(expected), + get_buttonrequest_value(msg.code))) + except IndexError: + raise CallException(types.Failure_Other, + "Got %s, but no ButtonRequest has been expected" % \ + get_buttonrequest_value(msg.code)) + + print "ButtonRequest code:", get_buttonrequest_value(msg.code) + + print "Pressing button", self.button + self.debug.press_button(self.button) + return proto.ButtonAck() + + def callback_PinMatrixRequest(self, msg): + if self.pin_correct: + pin = self.debug.read_pin_encoded() else: - self.blockchain = BlockchainApi() + pin = '444222' + return proto.PinMatrixAck(pin=pin) + + def callback_PassphraseRequest(self, msg): + pass - self.setup_debuglink() + def callback_WordRequest(self, msg): + pass + +class ProtocolMixin(object): + PRIME_DERIVATION_FLAG = 0x80000000 + + def __init__(self, *args, **kwargs): + super(ProtocolMixin, self).__init__() # *args, **kwargs) self.init_device() + + def get_tx_func_placeholder(txhash): + raise Exception("Please call set_tx_func() first.") + self.get_tx_func = get_tx_func_placeholder + + def set_tx_func(self, tx_func): + self.get_tx_func = tx_func + + def init_device(self): + self.features = expect(proto.Features)(self.call)(proto.Initialize()) def _get_local_entropy(self): return os.urandom(32) def _convert_prime(self, n): # Convert minus signs to uint32 with flag - return [ int(abs(x) | PRIME_DERIVATION_FLAG) if x < 0 else x for x in n ] + return [ int(abs(x) | self.PRIME_DERIVATION_FLAG) if x < 0 else x for x in n ] def expand_path(self, n): # Convert string of bip32 path to list of uint32 integers with prime flags @@ -89,40 +225,42 @@ class TrezorClient(object): x = abs(int(x)) if prime: - x |= PRIME_DERIVATION_FLAG + x |= self.PRIME_DERIVATION_FLAG path.append(x) return path - def init_device(self): - self.features = self.call(proto.Initialize(), proto.Features) - - def close(self): - self.transport.close() - if self.debuglink: - self.debuglink.transport.close() - + @field('node') + @expect(proto.PublicKey) def get_public_node(self, n): - return self.call(proto.GetPublicKey(address_n=n), proto.PublicKey).node + return self.call(proto.GetPublicKey(address_n=n)) + @field('address') + @expect(proto.Address) def get_address(self, coin_name, n): n = self._convert_prime(n) - return self.call(proto.GetAddress(address_n=n, coin_name=coin_name), proto.Address).address + return self.call(proto.GetAddress(address_n=n, coin_name=coin_name)) + @field('entropy') + @expect(proto.Entropy) def get_entropy(self, size): - return self.call(proto.GetEntropy(size=size), proto.Entropy).entropy + return self.call(proto.GetEntropy(size=size)) + @field('message') + @expect(proto.Success) def ping(self, msg, button_protection=False, pin_protection=False, passphrase_protection=False): msg = proto.Ping(message=msg, button_protection=button_protection, pin_protection=pin_protection, passphrase_protection=passphrase_protection) - return self.call(msg, proto.Success).message + return self.call(msg) def get_device_id(self): return self.features.device_id + @field('message') + @expect(proto.Success) def apply_settings(self, label=None, language=None): settings = proto.ApplySettings() if label != None: @@ -130,27 +268,203 @@ class TrezorClient(object): if language: settings.language = language - out = self.call(settings, proto.Success).message - self.init_device() # Reload Features - + out = self.call(settings) + self.init_device() # Reload Features return out + @field('message') + @expect(proto.Success) def change_pin(self, remove=False): ret = self.call(proto.ChangePin(remove=remove)) self.init_device() # Re-read features return ret + @expect(proto.MessageSignature) + def sign_message(self, n, message): + n = self._convert_prime(n) + return self.call(proto.SignMessage(address_n=n, message=message)) + + def verify_message(self, address, signature, message): + try: + resp = self.call(proto.VerifyMessage(address=address, signature=signature, message=message)) + except CallException as e: + resp = e + if isinstance(resp, proto.Success): + return True + return False + + @field('tx_size') + @expect(proto.TxSize) + def estimate_tx_size(self, coin_name, inputs, outputs): + msg = proto.EstimateTxSize() + msg.coin_name = coin_name + msg.inputs_count = len(inputs) + msg.outputs_count = len(outputs) + return self.call(msg) + + def _prepare_simple_sign_tx(self, coin_name, inputs, outputs): + msg = proto.SimpleSignTx() + msg.coin_name = coin_name + msg.inputs.extend(inputs) + msg.outputs.extend(outputs) + + known_hashes = [] + for inp in inputs: + if inp.prev_hash in known_hashes: + continue + + tx = msg.transactions.add() + tx.CopyFrom(self.get_tx_func(binascii.hexlify(inp.prev_hash))) + known_hashes.append(inp.prev_hash) + + return msg + + @field('serialized_tx') + @expect(proto.TxRequest) + def simple_sign_tx(self, coin_name, inputs, outputs): + # TODO Deserialize tx and check if inputs/outputs fits + msg = self._prepare_simple_sign_tx(coin_name, inputs, outputs) + return self.call(msg) + + def sign_tx(self, coin_name, inputs, outputs): + # Temporary solution, until streaming is implemented in the firmware + return self.simple_sign_tx(coin_name, inputs, outputs) + + @field('message') + @expect(proto.Success) + def wipe_device(self): + ret = self.call(proto.WipeDevice()) + self.init_device() + return ret + + @field('message') + @expect(proto.Success) + def recovery_device(self, word_count, passphrase_protection, pin_protection, label, language): + if self.features.initialized: + raise Exception("Device is initialized already. Call wipe_device() and try again.") + + if word_count not in (12, 18, 24): + raise Exception("Invalid word count. Use 12/18/24") + + res = self.call(proto.RecoveryDevice(word_count=int(word_count), + passphrase_protection=bool(passphrase_protection), + pin_protection=bool(pin_protection), + label=label, + language=language, + enforce_wordlist=True)) + + self.init_device() + return res + + @field('message') + @expect(proto.Success) + def reset_device(self, display_random, strength, passphrase_protection, pin_protection, label, language): + if self.features.initialized: + raise Exception("Device is initialized already. Call wipe_device() and try again.") + + # Begin with device reset workflow + msg = proto.ResetDevice(display_random=display_random, + strength=strength, + language=language, + passphrase_protection=bool(passphrase_protection), + pin_protection=bool(pin_protection), + label=label) + + resp = self.call(msg) + if not isinstance(resp, proto.EntropyRequest): + raise Exception("Invalid response, expected EntropyRequest") + + external_entropy = self._get_local_entropy() + print "Computer generated entropy:", binascii.hexlify(external_entropy) + return self.call(proto.EntropyAck(entropy=external_entropy)) + + @field('message') + @expect(proto.Success) + def load_device_by_mnemonic(self, mnemonic, pin, passphrase_protection, label, language): + if self.features.initialized: + raise Exception("Device is initialized already. Call wipe_device() and try again.") + + resp = self.call(proto.LoadDevice(mnemonic=mnemonic, pin=pin, + passphrase_protection=passphrase_protection, + language=language, + label=label)) + self.init_device() + return resp + + @field('message') + @expect(proto.Success) + def load_device_by_xprv(self, xprv, pin, passphrase_protection, label): + if self.features.initialized: + raise Exception("Device is initialized already. Call wipe_device() and try again.") + + if xprv[0:4] not in ('xprv', 'tprv'): + raise Exception("Unknown type of xprv") + + if len(xprv) < 100 and len(xprv) > 112: + raise Exception("Invalid length of xprv") + + node = types.HDNodeType() + data = tools.b58decode(xprv, None).encode('hex') + + if data[90:92] != '00': + raise Exception("Contain invalid private key") + + checksum = hashlib.sha256(hashlib.sha256(binascii.unhexlify(data[:156])).digest()).hexdigest()[:8] + if checksum != data[156:]: + raise Exception("Checksum doesn't match") + + # version 0488ade4 + # depth 00 + # fingerprint 00000000 + # child_num 00000000 + # chaincode 873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508 + # privkey 00e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35 + # checksum e77e9d71 + + node.version = int(data[0:8], 16) + node.depth = int(data[8:10], 16) + node.fingerprint = int(data[10:18], 16) + node.child_num = int(data[18:26], 16) + node.chain_code = data[26:90].decode('hex') + node.private_key = data[92:156].decode('hex') # skip 0x00 indicating privkey + + resp = self.call(proto.LoadDevice(node=node, + pin=pin, + passphrase_protection=passphrase_protection, + language='english', + label=label)) + self.init_device() + return resp + + def firmware_update(self, fp): + if self.features.bootloader_mode == False: + raise Exception("Device must be in bootloader mode") + + resp = self.call(proto.FirmwareErase()) + if isinstance(resp, proto.Failure) and resp.code == types.Failure_FirmwareError: + return False + + resp = self.call(proto.FirmwareUpload(payload=fp.read())) + if isinstance(resp, proto.Success): + return True + + elif isinstance(resp, proto.Failure) and resp.code == types.Failure_FirmwareError: + return False + + raise Exception("Unexpected result " % resp) + +class TrezorClient(BaseClient, ProtocolMixin, TextUIMixin): + pass + +class TrezorDebugClient(BaseClient, ProtocolMixin, DebugLinkMixin): + pass + +''' +class TrezorClient(object): def _pprint(self, msg): ser = msg.SerializeToString() return "<%s> (%d bytes):\n%s" % (msg.__class__.__name__, len(ser), msg) - def setup_debuglink(self, button=None, pin_correct=False): - self.debug_button = button - self.debug_pin = pin_correct - - def _get_buttonrequest_value(self, code): - return [ k for k, v in types.ButtonRequestType.items() if v == code][0] - def call(self, msg, expected=None, expected_buttonrequests=None): # TODO split this into normal and debug mode if self.debug: @@ -201,7 +515,7 @@ class TrezorClient(object): if isinstance(resp, proto.PassphraseRequest): passphrase = self.passphrase_func("Passphrase required: ") - msg2 = proto.PassphraseAck(passphrase=passphrase) + ms(object)g2 = proto.PassphraseAck(passphrase=passphrase) return self.call(msg2, expected=expected, expected_buttonrequests=expected_buttonrequests) finally: @@ -229,55 +543,8 @@ class TrezorClient(object): return resp - def sign_message(self, n, message): - n = self._convert_prime(n) - return self.call(proto.SignMessage(address_n=n, message=message)) - - def verify_message(self, address, signature, message): - try: - resp = self.call(proto.VerifyMessage(address=address, signature=signature, message=message)) - if isinstance(resp, proto.Success): - return True - except CallException: - pass - - return False - - def estimate_tx_size(self, coin_name, inputs, outputs): - msg = proto.EstimateTxSize() - msg.coin_name = coin_name - msg.inputs_count = len(inputs) - msg.outputs_count = len(outputs) - res = self.call(msg) - return res.tx_size - - def _prepare_simple_sign_tx(self, coin_name, inputs, outputs): - msg = proto.SimpleSignTx() - msg.coin_name = coin_name - msg.inputs.extend(inputs) - msg.outputs.extend(outputs) - - known_hashes = [] - for inp in inputs: - if inp.prev_hash in known_hashes: - continue - - tx = msg.transactions.add() - tx.CopyFrom(self.blockchain.get_tx(binascii.hexlify(inp.prev_hash))) - known_hashes.append(inp.prev_hash) - - return msg - - def simple_sign_tx(self, coin_name, inputs, outputs): - msg = self._prepare_simple_sign_tx(coin_name, inputs, outputs) - return self.call(msg) - - def sign_tx(self, coin_name, inputs, outputs): - # Temporary solution, until streaming is implemented in the firmware - return self.simple_sign_tx(coin_name, inputs, outputs) - def _sign_tx(self, coin_name, inputs, outputs): - ''' + '' inputs: list of TxInput outputs: list of TxOutput @@ -295,7 +562,7 @@ class TrezorClient(object): script_type=proto.PAYTOADDRESS, #script_args= ) - ''' + '' start = time.time() @@ -352,125 +619,4 @@ class TrezorClient(object): (time.time() - start, counter, len(serialized_tx)) return (signatures, serialized_tx) - - def wipe_device(self): - ret = self.call(proto.WipeDevice()) - self.init_device() - return ret - - def recovery_device(self, word_count, passphrase_protection, pin_protection, label, language): - if word_count not in (12, 18, 24): - raise Exception("Invalid word count. Use 12/18/24") - - res = self.call(proto.RecoveryDevice(word_count=int(word_count), - passphrase_protection=bool(passphrase_protection), - pin_protection=bool(pin_protection), - label=label, - language=language, - enforce_wordlist=True)) - - while isinstance(res, proto.WordRequest): - word = self.word_func() - res = self.call(proto.WordAck(word=word)) - - if not isinstance(res, proto.Success): - raise Exception("Recovery device failed") - - self.init_device() - return True - - def reset_device(self, display_random, strength, passphrase_protection, pin_protection, label, language): - if self.features.initialized: - raise Exception("Device is initialized already. Call wipe_device() and try again.") - - # Begin with device reset workflow - msg = proto.ResetDevice(display_random=display_random, - strength=strength, - language=language, - passphrase_protection=bool(passphrase_protection), - pin_protection=bool(pin_protection), - label=label) - - resp = self.call(msg) - if not isinstance(resp, proto.EntropyRequest): - raise Exception("Invalid response, expected EntropyRequest") - - external_entropy = self._get_local_entropy() - print "Computer generated entropy:", binascii.hexlify(external_entropy) - resp = self.call(proto.EntropyAck(entropy=external_entropy)) - - - return isinstance(resp, proto.Success) - - def load_device_by_mnemonic(self, mnemonic, pin, passphrase_protection, label, language): - if self.features.initialized: - raise Exception("Device is initialized already. Call wipe_device() and try again.") - - resp = self.call(proto.LoadDevice(mnemonic=mnemonic, pin=pin, - passphrase_protection=passphrase_protection, - language=language, - label=label)) - self.init_device() - return isinstance(resp, proto.Success) - - def load_device_by_xprv(self, xprv, pin, passphrase_protection, label): - if self.features.initialized: - raise Exception("Device is initialized already. Call wipe_device() and try again.") - - if xprv[0:4] not in ('xprv', 'tprv'): - raise Exception("Unknown type of xprv") - - if len(xprv) < 100 and len(xprv) > 112: - raise Exception("Invalid length of xprv") - - node = types.HDNodeType() - data = tools.b58decode(xprv, None).encode('hex') - - if data[90:92] != '00': - raise Exception("Contain invalid private key") - - checksum = hashlib.sha256(hashlib.sha256(binascii.unhexlify(data[:156])).digest()).hexdigest()[:8] - if checksum != data[156:]: - raise Exception("Checksum doesn't match") - - # version 0488ade4 - # depth 00 - # fingerprint 00000000 - # child_num 00000000 - # chaincode 873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508 - # privkey 00e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35 - # checksum e77e9d71 - - node.version = int(data[0:8], 16) - node.depth = int(data[8:10], 16) - node.fingerprint = int(data[10:18], 16) - node.child_num = int(data[18:26], 16) - node.chain_code = data[26:90].decode('hex') - node.private_key = data[92:156].decode('hex') # skip 0x00 indicating privkey - - resp = self.call(proto.LoadDevice(node=node, - pin=pin, - passphrase_protection=passphrase_protection, - language='english', - label=label)) - self.init_device() - return isinstance(resp, proto.Success) - - def firmware_update(self, fp): - if self.features.bootloader_mode == False: - raise Exception("Device must be in bootloader mode") - - resp = self.call(proto.FirmwareErase()) - if isinstance(resp, proto.Failure) and resp.code == types.Failure_FirmwareError: - return False - - resp = self.call(proto.FirmwareUpload(payload=fp.read())) - if isinstance(resp, proto.Success): - return True - - elif isinstance(resp, proto.Failure) and resp.code == types.Failure_FirmwareError: - return False - - raise Exception("Unexpected result " % resp) - -# class TrezorDebugClient(TrezorClient): +''' diff --git a/trezorlib/debuglink.py b/trezorlib/debuglink.py index 7bc1d35aa..9021cc81e 100644 --- a/trezorlib/debuglink.py +++ b/trezorlib/debuglink.py @@ -14,6 +14,9 @@ class DebugLink(object): self.pin_func = pin_func self.button_func = button_func + def close(self): + self.transport.close() + def read_pin(self): self.transport.write(proto.DebugLinkGetState()) obj = self.transport.read_blocking() From 5128fa8442db76725d872338b7aa645d1992be4d Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 13 Feb 2014 16:47:03 +0100 Subject: [PATCH 0208/1535] Changed API to refactored TrezorClient, removed unused DebugLink --- cmd.py | 42 +++++++++++++----------------------------- 1 file changed, 13 insertions(+), 29 deletions(-) diff --git a/cmd.py b/cmd.py index 38cc8fde6..b4f441e7f 100755 --- a/cmd.py +++ b/cmd.py @@ -5,27 +5,23 @@ import argparse import json import threading -from trezorlib.client import TrezorClient, pin_func -from trezorlib.debuglink import DebugLink +from trezorlib.client import TrezorClient +from trezorlib.api_blockchain import BlockchainApi from trezorlib.protobuf_json import pb2json def parse_args(commands): parser = argparse.ArgumentParser(description='Commandline tool for Trezor devices.') parser.add_argument('-t', '--transport', dest='transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Transport used for talking with the device") parser.add_argument('-p', '--path', dest='path', default='', help="Path used by the transport (usually serial port)") - parser.add_argument('-dt', '--debuglink-transport', dest='debuglink_transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Debuglink transport") - parser.add_argument('-dp', '--debuglink-path', dest='debuglink_path', default='', help="Path used by the transport (usually serial port)") +# parser.add_argument('-dt', '--debuglink-transport', dest='debuglink_transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Debuglink transport") +# parser.add_argument('-dp', '--debuglink-path', dest='debuglink_path', default='', help="Path used by the transport (usually serial port)") parser.add_argument('-j', '--json', dest='json', action='store_true', help="Prints result as json object") - parser.add_argument('-d', '--debug', dest='debug', action='store_true', help='Enable low-level debugging') +# parser.add_argument('-d', '--debug', dest='debug', action='store_true', help='Enable low-level debugging') cmdparser = parser.add_subparsers(title='Available commands') for cmd in commands._list_commands(): func = object.__getattribute__(commands, cmd) - try: - help = func.help - except AttributeError: - help = '' try: arguments = func.arguments @@ -245,10 +241,9 @@ def list_usb(): from trezorlib.transport_hid import HidTransport return HidTransport.enumerate() +''' class PinMatrixThread(threading.Thread): - ''' - Hacked PinMatrixWidget into command line tool :-). - ''' + # Hacked PinMatrixWidget into command line tool :-). def __init__(self, input_text, message): super(PinMatrixThread, self).__init__() self.input_text = input_text @@ -287,10 +282,8 @@ class PinMatrixThread(threading.Thread): a.exec_() def qt_pin_func(input_text, message=None): - ''' - This is a hack to display Qt window in non-qt application. - Qt window just asks for PIN and closes itself, which trigger join(). - ''' + # This is a hack to display Qt window in non-qt application. + # Qt window just asks for PIN and closes itself, which trigger join(). if False: # os.getenv('DISPLAY'): # Let's hope that system is configured properly and this won't crash t = PinMatrixThread(input_text, message) @@ -301,7 +294,8 @@ def qt_pin_func(input_text, message=None): # Most likely no X is running, # let's fallback to default pin_func implementation return pin_func(input_text, message) - +''' + def main(): args = parse_args(Commands) @@ -317,19 +311,9 @@ def main(): print dev[0] return - if args.debug: - if args.debuglink_transport == 'usb' and args.debuglink_path == '': - debuglink_transport = get_transport('usb', args.path, debug_link=True) - else: - debuglink_transport = get_transport(args.debuglink_transport, - args.debuglink_path, debug_link=True) - debuglink = DebugLink(debuglink_transport) - else: - debuglink = None - transport = get_transport(args.transport, args.path) - client = TrezorClient(transport, pin_func=qt_pin_func, debuglink=debuglink) - client.setup_debuglink(button=True, pin_correct=True) + client = TrezorClient(transport) + client.set_tx_func(BlockchainApi().get_tx) cmds = Commands(client) res = args.func(cmds, args) From 21b3b0ab91af332f1f084104f2002e072493fbc0 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 13 Feb 2014 16:47:28 +0100 Subject: [PATCH 0209/1535] Tests reworked to new TrezorClient API, all tests passes. --- tests/common.py | 11 +++++----- tests/test.py | 2 +- tests/test_debuglink.py | 6 +++--- tests/test_protect_call.py | 42 +++++++++++++++++--------------------- tests/test_signtx.py | 33 +++++++++++++++++++----------- 5 files changed, 49 insertions(+), 45 deletions(-) diff --git a/tests/common.py b/tests/common.py index 466ac651c..5493864e8 100644 --- a/tests/common.py +++ b/tests/common.py @@ -1,23 +1,22 @@ import unittest import config -from trezorlib.client import TrezorClient -from trezorlib.debuglink import DebugLink +from trezorlib.client import TrezorDebugClient +from trezorlib.api_blockchain import BlockchainApi class TrezorTest(unittest.TestCase): def setUp(self): self.debug_transport = config.DEBUG_TRANSPORT(*config.DEBUG_TRANSPORT_ARGS, **config.DEBUG_TRANSPORT_KWARGS) self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS, **config.TRANSPORT_KWARGS) - self.client = TrezorClient(self.transport, DebugLink(self.debug_transport), debug=True) - # self.client = TrezorClient(self.transport, debug=False) + self.client = TrezorDebugClient(self.transport) + self.client.set_debuglink(self.debug_transport) + self.client.set_tx_func(BlockchainApi().get_tx) self.mnemonic1 = 'alcohol woman abuse must during monitor noble actual mixed trade anger aisle' self.mnemonic2 = 'owner little vague addict embark decide pink prosper true fork panda embody mixture exchange choose canoe electric jewel' self.pin1 = '1234' self.pin2 = '43211' - self.client.setup_debuglink(button=True, pin_correct=True) - self.client.wipe_device() self.client.load_device_by_mnemonic( mnemonic=self.mnemonic1, diff --git a/tests/test.py b/tests/test.py index 0b1a688a8..788870500 100755 --- a/tests/test.py +++ b/tests/test.py @@ -24,7 +24,7 @@ TODO: * VerifyMessage workflow * otestovat session handling (tento test bude zrejme failovat na RPi) - +* Failure_NotInitialized * Features reflects all variations of LoadDevice * Maxfee settings * Client requires OTP diff --git a/tests/test_debuglink.py b/tests/test_debuglink.py index df090ed6c..b114885bf 100644 --- a/tests/test_debuglink.py +++ b/tests/test_debuglink.py @@ -10,15 +10,15 @@ from trezorlib.client import PinException class TestDebugLink(common.TrezorTest): def test_layout(self): - layout = self.client.debuglink.read_layout() + layout = self.client.debug.read_layout() self.assertEqual(len(layout), 1024) def test_mnemonic(self): - mnemonic = self.client.debuglink.read_mnemonic() + mnemonic = self.client.debug.read_mnemonic() self.assertEqual(mnemonic, self.mnemonic1) def test_node(self): - node = self.client.debuglink.read_node() + node = self.client.debug.read_node() self.assertIsNotNone(node) if __name__ == '__main__': diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index 8575fdaba..1a2324b61 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -9,20 +9,14 @@ from trezorlib.client import PinException # FIXME TODO Add passphrase tests class TestProtectCall(common.TrezorTest): - def _some_protected_call(self, expected_buttonrequests): + def _some_protected_call(self, button, pin, passphrase): # This method perform any call which have protection in the device - - res = self.client.ping('random data', pin_protection=True, passphrase_protection=True) + res = self.client.ping('random data', + button_protection=button, + pin_protection=pin, + passphrase_protection=passphrase) self.assertEqual(res, 'random data') - msg = proto.Ping(message='random data', - button_protection=True, - pin_protection=True, - passphrase_protection=True) - - return self.client.call(msg, expected=proto.Success, - expected_buttonrequests=expected_buttonrequests).message - def test_no_protection(self): self.client.wipe_device() self.client.load_device_by_mnemonic( @@ -33,28 +27,30 @@ class TestProtectCall(common.TrezorTest): language='english', ) - self.assertEqual(self.client.debuglink.read_pin()[0], '') - self._some_protected_call([]) + self.assertEqual(self.client.debug.read_pin()[0], '') + self.client.set_expected_buttonrequests([]) + self._some_protected_call(False, True, True) - ''' def test_pin(self): self.client.wipe_device() self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, pin=self.pin2, - passphrase_protection=False, + passphrase_protection=True, label='test', language='english') - self.assertEqual(self.client.debuglink.read_pin()[0], self.pin2) - self._some_protected_call() - + self.assertEqual(self.client.debug.read_pin()[0], self.pin2) + self.client.setup_debuglink(button=True, pin_correct=True) + self.client.set_expected_buttonrequests([types.ButtonRequest_Other]) + self._some_protected_call(True, True, False) + def test_incorrect_pin(self): self.client.setup_debuglink(button=True, pin_correct=False) - self.assertRaises(PinException, self._some_protected_call) + self.assertRaises(PinException, self._some_protected_call, False, True, False) def test_cancelled_pin(self): - self.client.setup_debuglink(button=True, pin_correct=-1) # PIN cancel - self.assertRaises(PinException, self._some_protected_call) + self.client.setup_debuglink(button=True, pin_correct=False) # PIN cancel + self.assertRaises(PinException, self._some_protected_call, False, True, False) def test_exponential_backoff_with_reboot(self): self.client.setup_debuglink(button=True, pin_correct=False) @@ -69,9 +65,9 @@ class TestProtectCall(common.TrezorTest): for attempt in range(1, 4): start = time.time() - self.assertRaises(PinException, self._some_protected_call) + self.assertRaises(PinException, self._some_protected_call, False, True, False) test_backoff(attempt, start) - ''' + ''' # Unplug Trezor now self.client.debuglink.stop() diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 3ee0ee939..fc8ec5ca8 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -55,7 +55,8 @@ class TestSignTx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) expected_btn = [proto_types.ButtonRequest_ConfirmOutput] - tx = self.client.call(msg, expected_buttonrequests=expected_btn) + self.client.set_expected_buttonrequests(expected_btn) + tx = self.client.call(msg) # Accepted by network: tx fd79435246dee76b2f159d2db08032d666c95adc544de64c8c49f474df4a7fee self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') @@ -79,10 +80,11 @@ class TestSignTx(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - self.client.blockchain = FakeTestnetBlockchain() + self.client.set_tx_func(FakeTestnetBlockchain().get_tx) msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 2 - tx = self.client.call(msg, expected_buttonrequests=expected_btn) + self.client.set_expected_buttonrequests(expected_btn) + tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b4830450221009c2d30385519fdb13dce13d5ac038be07d7b2dad0b0f7b2c1c339d7255bcf553022056a2f5bceab3cd0ffed4d388387e631f419d67ff9ce7798e3d7dfe6a6d6ec4bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0280ce341d000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') @@ -105,12 +107,13 @@ class TestSignTx(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - self.client.blockchain = FakeTestnetBlockchain() + self.client.set_tx_func(FakeTestnetBlockchain().get_tx) msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) expected_btn = [proto_types.ButtonRequest_ConfirmOutput, proto_types.ButtonRequest_ConfirmOutput, proto_types.ButtonRequest_FeeOverThreshold] - tx = self.client.call(msg, expected_buttonrequests=expected_btn) + self.client.set_expected_buttonrequests(expected_btn) + tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') @@ -136,7 +139,8 @@ class TestSignTx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2]) expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 2 - tx = self.client.call(msg, expected_buttonrequests=expected_btn) + self.client.set_expected_buttonrequests(expected_btn) + tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef1702201d481d04216b319dc549ffe2333143629ba18828a4e2d1783ab719a6aa263eb70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') @@ -167,7 +171,8 @@ class TestSignTx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2, out3]) expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 3 - tx = self.client.call(msg, expected_buttonrequests=expected_btn) + self.client.set_expected_buttonrequests(expected_btn) + tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02207b0879a81408a11e23b11d4c7965c62b5fc6d5c2d92340f5ee2da7b40e99314a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') @@ -201,7 +206,8 @@ class TestSignTx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], [out1, out2]) expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 2 - tx = self.client.call(msg, expected_buttonrequests=expected_btn) + self.client.set_expected_buttonrequests(expected_btn) + tx = self.client.call(msg) # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb self.assertEqual(binascii.hexlify(tx.serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') @@ -237,7 +243,8 @@ class TestSignTx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], outputs) expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 255 - tx = self.client.call(msg, expected_buttonrequests=expected_btn) + self.client.set_expected_buttonrequests(expected_btn) + tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') ''' @@ -260,7 +267,8 @@ class TestSignTx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) expected_btn = [proto_types.ButtonRequest_ConfirmOutput, proto_types.ButtonRequest_FeeOverThreshold] - tx = self.client.call(msg, expected_buttonrequests=expected_btn) + self.client.set_expected_buttonrequests(expected_btn) + tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') @@ -281,8 +289,9 @@ class TestSignTx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) expected_btn = [proto_types.ButtonRequest_ConfirmOutput] + self.client.set_expected_buttonrequests(expected_btn) try: - self.client.call(msg, expected_buttonrequests=expected_btn) + self.client.call(msg) except CallException as e: self.assertEqual(e.args[0], proto_types.Failure_NotEnoughFunds) else: @@ -305,7 +314,7 @@ class TestSignTx(common.TrezorTest): self.assertEqual(est_size, 194) tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) - real_size = len(tx.serialized_tx) + real_size = len(tx) self.assertGreaterEqual(est_size, real_size) From 1f893afedddc1f8184128bba6ba12ee2ff4db405 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 13 Feb 2014 16:50:16 +0100 Subject: [PATCH 0210/1535] Root path is [], not [0] --- tests/test_bip32_speed.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_bip32_speed.py b/tests/test_bip32_speed.py index 7153f17b4..ed18b997b 100644 --- a/tests/test_bip32_speed.py +++ b/tests/test_bip32_speed.py @@ -12,7 +12,7 @@ class TestAddresses(common.TrezorTest): label='test', language='english') - self.client.get_address('Bitcoin', [0]) # to compute root node via BIP39 + self.client.get_address('Bitcoin', []) # to compute root node via BIP39 for depth in range(8): start = time.time() @@ -30,7 +30,7 @@ class TestAddresses(common.TrezorTest): label='test', language='english') - self.client.get_address('Bitcoin', [0]) # to compute root node via BIP39 + self.client.get_address('Bitcoin', []) # to compute root node via BIP39 for depth in range(8): start = time.time() From 9b8462f71e06df383ec69412ae2a504cda35a562 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 13 Feb 2014 16:54:58 +0100 Subject: [PATCH 0211/1535] typo --- trezorlib/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 66c53506f..e3c460469 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -71,7 +71,7 @@ class BaseClient(object): if handler != None: msg = handler(resp) if msg == None: - raise Exception("Callback %s must return protobug message, not None" % handler) + raise Exception("Callback %s must return protobuf message, not None" % handler) resp = self.call(msg) From a117057dea1a79b0c774dda65855c5ec6c9c0b19 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 13 Feb 2014 17:20:40 +0100 Subject: [PATCH 0212/1535] Slightly refactored mixin structure, added debugging output --- tests/common.py | 3 +-- trezorlib/client.py | 31 +++++++++++++++++++++++-------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/tests/common.py b/tests/common.py index 5493864e8..e4757b37f 100644 --- a/tests/common.py +++ b/tests/common.py @@ -32,5 +32,4 @@ class TrezorTest(unittest.TestCase): print "--------------" def tearDown(self): - self.debug_transport.close() - self.transport.close() + self.client.close() diff --git a/trezorlib/client.py b/trezorlib/client.py index e3c460469..835a4dc67 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -14,6 +14,10 @@ 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): + ser = msg.SerializeToString() + return "<%s> (%d bytes):\n%s" % (msg.__class__.__name__, len(ser), msg) + class CallException(Exception): def __init__(self, code, message): super(CallException, self).__init__() @@ -54,9 +58,9 @@ class expect(object): class BaseClient(object): # Implements very basic layer of sending raw protobuf # messages to device and getting its response back. - def __init__(self, transport, *args, **kwargs): + def __init__(self, transport, **kwargs): self.transport = transport - super(BaseClient, self).__init__(*args, **kwargs) + super(BaseClient, self).__init__() # *args, **kwargs) def call(self, msg): try: @@ -97,6 +101,9 @@ class TextUIMixin(object): # by implementing your own GuiMixin with # graphical widgets for every type of these callbacks. + def __init__(self, *args, **kwargs): + super(TextUIMixin, self).__init__(*args, **kwargs) + def callback_ButtonRequest(self, msg): print "Sending ButtonAck for %s " % get_buttonrequest_value(msg.code) return proto.ButtonAck() @@ -148,6 +155,12 @@ class DebugLinkMixin(object): def setup_debuglink(self, button, pin_correct): self.button = button # True -> YES button, False -> NO button self.pin_correct = pin_correct + + def call(self, msg): + print "SENDING", pprint(msg) + ret = super(DebugLinkMixin, self).call(msg) + print "RECEIVED", pprint(ret) + return ret def callback_ButtonRequest(self, msg): if self.expected_buttonrequests != None: @@ -177,16 +190,16 @@ class DebugLinkMixin(object): return proto.PinMatrixAck(pin=pin) def callback_PassphraseRequest(self, msg): - pass + raise Exception("Not implemented yet") def callback_WordRequest(self, msg): - pass + raise Exception("Not implemented yet") class ProtocolMixin(object): PRIME_DERIVATION_FLAG = 0x80000000 def __init__(self, *args, **kwargs): - super(ProtocolMixin, self).__init__() # *args, **kwargs) + super(ProtocolMixin, self).__init__(*args, **kwargs) self.init_device() def get_tx_func_placeholder(txhash): @@ -453,10 +466,10 @@ class ProtocolMixin(object): raise Exception("Unexpected result " % resp) -class TrezorClient(BaseClient, ProtocolMixin, TextUIMixin): +class TrezorClient(ProtocolMixin, TextUIMixin, BaseClient): pass -class TrezorDebugClient(BaseClient, ProtocolMixin, DebugLinkMixin): +class TrezorDebugClient(ProtocolMixin, DebugLinkMixin, BaseClient): pass ''' @@ -478,7 +491,9 @@ class TrezorClient(object): resp = self.transport.read_blocking() if isinstance(resp, proto.ButtonRequest): - if expected_buttonrequests != None: + _pprint(self, msg): + ser = msg.SerializeToString() + if expected_buttonrequests != None: try: exp = expected_buttonrequests.pop(0) if resp.code != exp: From 9ba427e885d895d89364df2be7ddba72cec4381e Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 13 Feb 2014 18:51:11 +0100 Subject: [PATCH 0213/1535] Fixing sign_message/verify_message API in cmd --- cmd.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/cmd.py b/cmd.py index b4f441e7f..2d68db561 100755 --- a/cmd.py +++ b/cmd.py @@ -3,7 +3,7 @@ import os import binascii import argparse import json -import threading +import base64 from trezorlib.client import TrezorClient from trezorlib.api_blockchain import BlockchainApi @@ -135,10 +135,17 @@ class Commands(object): args.pin_protection, args.label, 'english') def sign_message(self, args): - return pb2json(self.client.sign_message(args.n, args.message), {'message': args.message}) + ret = self.client.sign_message(args.n, args.message) + output = { + 'message': args.message, + 'address': ret.address, + 'signature': base64.b64encode(ret.signature) + } + return output def verify_message(self, args): - return self.client.verify_message(args.address, args.signature, args.message) + signature = base64.b64decode(args.signature) + return self.client.verify_message(args.address, signature, args.message) def firmware_update(self, args): if not args.file: From a0bc12375cf1c7f8b4d62d7aa8bc0dbd662a2f7e Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 13 Feb 2014 18:51:38 +0100 Subject: [PATCH 0214/1535] Add tests for too long message and for testnet addresses --- tests/test_messages.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/tests/test_messages.py b/tests/test_messages.py index db5918f93..360a80347 100644 --- a/tests/test_messages.py +++ b/tests/test_messages.py @@ -1,9 +1,9 @@ import unittest import common import binascii +import base64 -import trezorlib.messages_pb2 as proto -import trezorlib.types_pb2 as proto_types +from trezorlib.client import CallException class TestMessages(common.TrezorTest): @@ -12,6 +12,23 @@ class TestMessages(common.TrezorTest): self.assertEqual(sig.address, '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e') self.assertEqual(binascii.hexlify(sig.signature), '209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80') + def test_too_long(self): + # Message cannot be longer than 255 bytes + self.assertRaises(CallException, self.client.sign_message, [0], '1' * 256) + + ret = self.client.verify_message('1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', + binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), + '1' * 256 + ) + self.assertFalse(ret) + + def test_message_testnet(self): + sig = base64.b64decode('IFP/nvQalDo9lWCI7kScOzRkz/fiiScdkw7tFAKPoGbl6S8AY3wEws43s2gR57AfwZP8/8y7+F+wvGK9phQghN4=') + ret = self.client.verify_message('moRDikgmxcpouFtqnKnVVzLYgkDD2gQ3sk', sig, 'Ahoj') + + self.assertTrue(ret) + + def test_message_verify(self): # uncompressed pubkey - OK From f48cf157c7dfdcbfa8a82fd473233263f85eaae8 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 13 Feb 2014 19:04:51 +0100 Subject: [PATCH 0215/1535] Fixes HID detection on Mac --- trezorlib/transport_hid.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/trezorlib/transport_hid.py b/trezorlib/transport_hid.py index a93d12bb7..bb1f9adf9 100644 --- a/trezorlib/transport_hid.py +++ b/trezorlib/transport_hid.py @@ -31,7 +31,7 @@ class HidTransport(Transport): # decide if the HID interface is normal transport # or debuglink - if platform.system() in ('Linux', 'Darwin'): + if platform.system() == 'Linux': # Sample: 0003:0017:00 if path.endswith(':00'): return False @@ -44,6 +44,10 @@ class HidTransport(Transport): return True return False + elif platform.system() == 'Darwin': + # DebugLink doesn't work on Mac + return False + else: raise Exception("USB interface detection not implemented for %s" % platform.system()) @@ -56,6 +60,11 @@ class HidTransport(Transport): serial_number = d['serial_number'] path = d['path'] + # HIDAPI on Mac cannot detect correct HID interfaces, so device with + # DebugLink doesn't work on Mac... + if devices.get(serial_number) != None and devices[serial_number][0] == path: + raise Exception("Two devices with the same path and S/N found. This is Mac, right? :-/") + if (vendor_id, product_id) in DEVICE_IDS: devices.setdefault(serial_number, [None, None]) devices[serial_number][int(bool(cls._detect_debuglink(path)))] = path From 86a2a9f8455e59b9f7e48addf866344a6bd2a492 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 15 Feb 2014 20:30:39 +0100 Subject: [PATCH 0216/1535] TrezorDebugClient: Removed expected_buttonrequests, added more generic expected_responses --- trezorlib/client.py | 66 ++++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 835a4dc67..846d8cc69 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -15,8 +15,7 @@ def get_buttonrequest_value(code): return [ k for k, v in types.ButtonRequestType.items() if v == code][0] def pprint(msg): - ser = msg.SerializeToString() - return "<%s> (%d bytes):\n%s" % (msg.__class__.__name__, len(ser), msg) + return "<%s> (%d bytes):\n%s" % (msg.__class__.__name__, msg.ByteSize(), msg) class CallException(Exception): def __init__(self, code, message): @@ -62,13 +61,23 @@ class BaseClient(object): self.transport = transport super(BaseClient, self).__init__() # *args, **kwargs) - def call(self, msg): + def call_raw(self, msg): try: self.transport.session_begin() self.transport.write(msg) resp = self.transport.read_blocking() + finally: + self.transport.session_end() + + return resp + + def call(self, msg): + try: + self.transport.session_begin() + + resp = self.call_raw(msg) handler_name = "callback_%s" % resp.__class__.__name__ handler = getattr(self, handler_name, None) @@ -138,8 +147,11 @@ class DebugLinkMixin(object): # Always press Yes and provide correct pin self.setup_debuglink(True, True) - # Do not expect any specific ButtonRequest - self.set_expected_buttonrequests(None) + # Do not expect any specific response from device + self.set_expected_responses(None) + + # Use blank passphrase + self.set_passphrase('') def close(self): super(DebugLinkMixin, self).close() @@ -149,33 +161,50 @@ class DebugLinkMixin(object): def set_debuglink(self, debug_transport): self.debug = DebugLink(debug_transport) - def set_expected_buttonrequests(self, expected): - self.expected_buttonrequests = expected + def set_expected_responses(self, expected): + self.expected_responses = expected def setup_debuglink(self, button, pin_correct): self.button = button # True -> YES button, False -> NO button self.pin_correct = pin_correct + def set_passphrase(self, passphrase): + self.passphrase = passphrase + + def call_raw(self, msg): + resp = super(DebugLinkMixin, self).call_raw(msg) + self._check_request(resp) + return resp + def call(self, msg): print "SENDING", pprint(msg) ret = super(DebugLinkMixin, self).call(msg) print "RECEIVED", pprint(ret) + + if self.expected_responses != None and len(self.expected_responses): + raise Exception("Some of expected responses didn't come from device: %s" % \ + [ pprint(x) for x in self.expected_responses ]) return ret - def callback_ButtonRequest(self, msg): - if self.expected_buttonrequests != None: + def _check_request(self, msg): + if self.expected_responses != None: try: - expected = self.expected_buttonrequests.pop(0) - if msg.code != expected: - raise CallException(types.Failure_Other, - "Expected %s, got %s" % \ - (get_buttonrequest_value(expected), - get_buttonrequest_value(msg.code))) + expected = self.expected_responses.pop(0) except IndexError: raise CallException(types.Failure_Other, - "Got %s, but no ButtonRequest has been expected" % \ - get_buttonrequest_value(msg.code)) + "Got %s, but no message has been expected" % pprint(msg)) + if msg.__class__ != expected.__class__: + raise CallException(types.Failure_Other, + "Expected %s, got %s" % (pprint(expected), pprint(msg))) + + fields = expected.ListFields() # only filled (including extensions) + for field, value in fields: + if not msg.HasField(field.name) or getattr(msg, field.name) != value: + raise CallException(types.Failure_Other, + "Expected %s, got %s" % (pprint(expected), pprint(msg))) + + def callback_ButtonRequest(self, msg): print "ButtonRequest code:", get_buttonrequest_value(msg.code) print "Pressing button", self.button @@ -190,7 +219,8 @@ class DebugLinkMixin(object): return proto.PinMatrixAck(pin=pin) def callback_PassphraseRequest(self, msg): - raise Exception("Not implemented yet") + print "Provided passphrase: '%s'" % self.passphrase + return proto.PassphraseAck(passphrase=self.passphrase) def callback_WordRequest(self, msg): raise Exception("Not implemented yet") From 5ed9fc8b1af36a7fa3927eaeda0cdc376c956e6e Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 15 Feb 2014 20:31:34 +0100 Subject: [PATCH 0217/1535] Tests use new "set_expected_responses" --- tests/test.py | 6 +++-- tests/test_entropy.py | 4 +--- tests/test_protect_call.py | 42 +++++++++++++++++++++++++++++---- tests/test_signtx.py | 48 +++++++++++++++++++++----------------- 4 files changed, 69 insertions(+), 31 deletions(-) diff --git a/tests/test.py b/tests/test.py index 788870500..5882154f3 100755 --- a/tests/test.py +++ b/tests/test.py @@ -20,8 +20,8 @@ TODO: x iny cointype ako 0 - chceme v tomto release(?) - * SignMessage workflow - * VerifyMessage workflow + x SignMessage workflow + x VerifyMessage workflow * otestovat session handling (tento test bude zrejme failovat na RPi) * Failure_NotInitialized @@ -31,4 +31,6 @@ TODO: * Client requires PIN x Zero signature test + +* test bip39, utf, passphrase ''' diff --git a/tests/test_entropy.py b/tests/test_entropy.py index 407c33d23..4183d63ea 100644 --- a/tests/test_entropy.py +++ b/tests/test_entropy.py @@ -2,8 +2,6 @@ import unittest import common import math -from trezorlib import messages_pb2 as messages - def entropy(data): counts = {} for c in data: @@ -12,7 +10,7 @@ def entropy(data): else: counts[c] = 1 e = 0 - for k,v in counts.iteritems(): + for _, v in counts.iteritems(): p = 1.0 * v / len(data) e -= p * math.log(p, 256) return e diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index 1a2324b61..fa28ada93 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -4,7 +4,7 @@ import common from trezorlib import messages_pb2 as proto from trezorlib import types_pb2 as types -from trezorlib.client import PinException +from trezorlib.client import PinException, CallException # FIXME TODO Add passphrase tests @@ -17,6 +17,37 @@ class TestProtectCall(common.TrezorTest): passphrase_protection=passphrase) self.assertEqual(res, 'random data') + def test_expected_responses(self): + # This is low-level test of set_expected_responses() + # feature of debugging client + + # Scenario 1 - Received unexpected message + self.client.set_expected_responses([]) + self.assertRaises(CallException, self._some_protected_call, True, True, True) + + # Scenario 2 - Received other than expected message + self.client.set_expected_responses([proto.Success()]) + self.assertRaises(CallException, self._some_protected_call, True, True, True) + + # Scenario 3 - Not received expected message + self.client.set_expected_responses([proto.ButtonRequest(), + proto.Success(), + proto.Success()]) # This is expected, but not received + self.assertRaises(Exception, self._some_protected_call, True, False, False) + + # Scenario 4 - Received what expected + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + # proto.PassphraseRequest(), # passhrase is already in session + proto.Success(message='random data')]) + self._some_protected_call(True, True, True) + + # Scenario 5 - Failed message by field filter + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.Success(message='wrong data')]) + self.assertRaises(CallException, self._some_protected_call, True, True, True) + def test_no_protection(self): self.client.wipe_device() self.client.load_device_by_mnemonic( @@ -28,7 +59,7 @@ class TestProtectCall(common.TrezorTest): ) self.assertEqual(self.client.debug.read_pin()[0], '') - self.client.set_expected_buttonrequests([]) + self.client.set_expected_responses([proto.Success()]) self._some_protected_call(False, True, True) def test_pin(self): @@ -41,7 +72,9 @@ class TestProtectCall(common.TrezorTest): self.assertEqual(self.client.debug.read_pin()[0], self.pin2) self.client.setup_debuglink(button=True, pin_correct=True) - self.client.set_expected_buttonrequests([types.ButtonRequest_Other]) + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.Success()]) self._some_protected_call(True, True, False) def test_incorrect_pin(self): @@ -67,8 +100,7 @@ class TestProtectCall(common.TrezorTest): start = time.time() self.assertRaises(PinException, self._some_protected_call, False, True, False) test_backoff(attempt, start) - - ''' +''' # Unplug Trezor now self.client.debuglink.stop() self.client.close() diff --git a/tests/test_signtx.py b/tests/test_signtx.py index fc8ec5ca8..660775b04 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -54,8 +54,8 @@ class TestSignTx(common.TrezorTest): ) msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) - expected_btn = [proto_types.ButtonRequest_ConfirmOutput] - self.client.set_expected_buttonrequests(expected_btn) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_index=-1)]) tx = self.client.call(msg) # Accepted by network: tx fd79435246dee76b2f159d2db08032d666c95adc544de64c8c49f474df4a7fee @@ -82,8 +82,9 @@ class TestSignTx(common.TrezorTest): self.client.set_tx_func(FakeTestnetBlockchain().get_tx) msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) - expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 2 - self.client.set_expected_buttonrequests(expected_btn) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest()]) tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b4830450221009c2d30385519fdb13dce13d5ac038be07d7b2dad0b0f7b2c1c339d7255bcf553022056a2f5bceab3cd0ffed4d388387e631f419d67ff9ce7798e3d7dfe6a6d6ec4bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0280ce341d000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') @@ -109,10 +110,10 @@ class TestSignTx(common.TrezorTest): self.client.set_tx_func(FakeTestnetBlockchain().get_tx) msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) - expected_btn = [proto_types.ButtonRequest_ConfirmOutput, - proto_types.ButtonRequest_ConfirmOutput, - proto_types.ButtonRequest_FeeOverThreshold] - self.client.set_expected_buttonrequests(expected_btn) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), + proto.TxRequest()]) tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') @@ -138,8 +139,9 @@ class TestSignTx(common.TrezorTest): ) msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2]) - expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 2 - self.client.set_expected_buttonrequests(expected_btn) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest()]) tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef1702201d481d04216b319dc549ffe2333143629ba18828a4e2d1783ab719a6aa263eb70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') @@ -170,8 +172,10 @@ class TestSignTx(common.TrezorTest): ) msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2, out3]) - expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 3 - self.client.set_expected_buttonrequests(expected_btn) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest()]) tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02207b0879a81408a11e23b11d4c7965c62b5fc6d5c2d92340f5ee2da7b40e99314a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') @@ -205,8 +209,9 @@ class TestSignTx(common.TrezorTest): ) msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], [out1, out2]) - expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 2 - self.client.set_expected_buttonrequests(expected_btn) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest()]) tx = self.client.call(msg) # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb @@ -242,8 +247,8 @@ class TestSignTx(common.TrezorTest): outputs.append(out) msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], outputs) - expected_btn = [proto_types.ButtonRequest_ConfirmOutput] * 255 - self.client.set_expected_buttonrequests(expected_btn) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), ] * 255 + \ + [proto.TxRequest(), ]) tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') @@ -265,9 +270,9 @@ class TestSignTx(common.TrezorTest): ) msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) - expected_btn = [proto_types.ButtonRequest_ConfirmOutput, - proto_types.ButtonRequest_FeeOverThreshold] - self.client.set_expected_buttonrequests(expected_btn) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), + proto.TxRequest()]) tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') @@ -288,8 +293,9 @@ class TestSignTx(common.TrezorTest): ) msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) - expected_btn = [proto_types.ButtonRequest_ConfirmOutput] - self.client.set_expected_buttonrequests(expected_btn) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.Failure(code=proto_types.Failure_NotEnoughFunds)]) + try: self.client.call(msg) except CallException as e: From 86f1c716a9d822911d90791f9ae217b459a5c1ca Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 15 Feb 2014 21:50:45 +0100 Subject: [PATCH 0218/1535] use set_expected_responses in test_entropy and test_pings --- tests/test_entropy.py | 4 ++++ tests/test_pings.py | 35 +++++++++++++++++++++++++++-------- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/tests/test_entropy.py b/tests/test_entropy.py index 4183d63ea..831a70b23 100644 --- a/tests/test_entropy.py +++ b/tests/test_entropy.py @@ -2,6 +2,9 @@ import unittest import common import math +import trezorlib.messages_pb2 as proto +import trezorlib.types_pb2 as proto_types + def entropy(data): counts = {} for c in data: @@ -19,6 +22,7 @@ class TestEntropy(common.TrezorTest): def test_entropy(self): for l in [0, 1, 2, 3, 4, 5, 8, 9, 16, 17, 32, 33, 64, 65, 128, 129, 256, 257, 512, 513, 1024]: + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other), proto.Entropy()]) ent = self.client.get_entropy(l) self.assertTrue(len(ent) >= l) print 'entropy = ', entropy(ent) diff --git a/tests/test_pings.py b/tests/test_pings.py index 2dc72cc3f..0d6bf7fda 100644 --- a/tests/test_pings.py +++ b/tests/test_pings.py @@ -3,33 +3,52 @@ import unittest import common from trezorlib import messages_pb2 as proto -from trezorlib import types_pb2 as types +from trezorlib import types_pb2 as proto_types class TestPing(common.TrezorTest): def test_ping(self): - + self.client.wipe_device() + self.client.load_device_by_mnemonic( + mnemonic=self.mnemonic1, + pin=self.pin1, + passphrase_protection=True, + label='test', + language='english', + ) + + self.client.set_expected_responses([proto.Success()]) res = self.client.ping('random data') self.assertEqual(res, 'random data') + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other),proto.Success()]) res = self.client.ping('random data', button_protection=True) self.assertEqual(res, 'random data') + self.client.set_expected_responses([proto.PinMatrixRequest(),proto.Success()]) res = self.client.ping('random data', pin_protection=True) self.assertEqual(res, 'random data') + self.client.set_expected_responses([proto.PassphraseRequest(),proto.Success()]) res = self.client.ping('random data', passphrase_protection=True) self.assertEqual(res, 'random data') - res = self.client.ping('random data', button_protection=True, pin_protection=True) - self.assertEqual(res, 'random data') + def test_ping_caching(self): + self.client.wipe_device() + self.client.load_device_by_mnemonic( + mnemonic=self.mnemonic1, + pin=self.pin1, + passphrase_protection=True, + label='test', + language='english', + ) - res = self.client.ping('random data', button_protection=True, passphrase_protection=True) - self.assertEqual(res, 'random data') - - res = self.client.ping('random data', pin_protection=True, passphrase_protection=True) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other),proto.PinMatrixRequest(),proto.PassphraseRequest(),proto.Success()]) + res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) self.assertEqual(res, 'random data') + # pin and passphrase are cached + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other)]) res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) self.assertEqual(res, 'random data') From 8e6e3bb7bea26f99c61765cdcfffbfc1fee09c64 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 17 Feb 2014 00:19:36 +0100 Subject: [PATCH 0219/1535] recompile pb --- trezorlib/types_pb2.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index fe91a5137..f5c71b7b3 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xb1\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\xec\x01\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\xec\x01\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -64,14 +64,18 @@ _FAILURETYPE = _descriptor.EnumDescriptor( options=None, type=None), _descriptor.EnumValueDescriptor( - name='Failure_FirmwareError', index=10, number=99, + name='Failure_NotInitialized', index=10, number=11, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='Failure_FirmwareError', index=11, number=99, options=None, type=None), ], containing_type=None, options=None, serialized_start=825, - serialized_end=1130, + serialized_end=1158, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -92,8 +96,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1132, - serialized_end=1183, + serialized_start=1160, + serialized_end=1211, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -114,8 +118,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1185, - serialized_end=1225, + serialized_start=1213, + serialized_end=1253, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -156,8 +160,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1228, - serialized_end=1464, + serialized_start=1256, + serialized_end=1492, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -171,6 +175,7 @@ Failure_PinInvalid = 7 Failure_InvalidSignature = 8 Failure_Other = 9 Failure_NotEnoughFunds = 10 +Failure_NotInitialized = 11 Failure_FirmwareError = 99 PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 From 74f350263737dbdc419c348745b51c67350b0cdb Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 17 Feb 2014 01:54:54 +0100 Subject: [PATCH 0220/1535] don't call load_device in tests setup --- tests/common.py | 28 ++++++++++++++-------------- tests/test_addresses.py | 34 ++++++---------------------------- tests/test_basic.py | 5 +---- tests/test_bip32_speed.py | 14 ++------------ tests/test_debuglink.py | 4 +++- tests/test_messages.py | 10 +++++----- tests/test_pings.py | 18 ++---------------- tests/test_protect_call.py | 30 ++++++++++++------------------ tests/test_signtx.py | 20 +++++++++++++++++++- tests/test_zerosig.py | 8 ++++++-- 10 files changed, 70 insertions(+), 101 deletions(-) diff --git a/tests/common.py b/tests/common.py index e4757b37f..54e1abf33 100644 --- a/tests/common.py +++ b/tests/common.py @@ -12,24 +12,24 @@ class TrezorTest(unittest.TestCase): self.client.set_debuglink(self.debug_transport) self.client.set_tx_func(BlockchainApi().get_tx) - self.mnemonic1 = 'alcohol woman abuse must during monitor noble actual mixed trade anger aisle' - self.mnemonic2 = 'owner little vague addict embark decide pink prosper true fork panda embody mixture exchange choose canoe electric jewel' - self.pin1 = '1234' - self.pin2 = '43211' + self.mnemonic12 = 'alcohol woman abuse must during monitor noble actual mixed trade anger aisle' + self.mnemonic18 = 'owner little vague addict embark decide pink prosper true fork panda embody mixture exchange choose canoe electric jewel' + self.mnemonic24 = 'dignity pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic' - self.client.wipe_device() - self.client.load_device_by_mnemonic( - mnemonic=self.mnemonic1, - pin=self.pin1, - passphrase_protection=False, - label='test', - language='english', - ) + self.pin4 = '1234' + self.pin6 = '789456' + self.pin8 = '45678978' - # self.client.apply_settings(label='unit testing', coin_shortcut='BTC', language='english') + self.client.wipe_device() print "Setup finished" print "--------------" - + + def setup_mnemonic_nopin_nopassphrase(self): + self.client.load_device_by_mnemonic(mnemonic=self.mnemonic12, pin='', passphrase_protection=False, label='test', language='english') + + def setup_mnemonic_pin_passphrase(self): + self.client.load_device_by_mnemonic(mnemonic=self.mnemonic12, pin=self.pin4, passphrase_protection=True, label='test', language='english') + def tearDown(self): self.client.close() diff --git a/tests/test_addresses.py b/tests/test_addresses.py index 6f56131cf..2f3fce7bd 100644 --- a/tests/test_addresses.py +++ b/tests/test_addresses.py @@ -4,14 +4,9 @@ import trezorlib.ckd_public as bip32 from trezorlib import tools class TestAddresses(common.TrezorTest): - def test_btc(self): - self.client.wipe_device() - self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, - pin='', - passphrase_protection=False, - label='test', - language='english') + def test_btc(self): + self.setup_mnemonic_nopin_nopassphrase() self.assertEqual(self.client.get_address('Bitcoin', []), '1EfKbQupktEMXf4gujJ9kCFo83k1iMqwqK') self.assertEqual(self.client.get_address('Bitcoin', [1]), '1CK7SJdcb8z9HuvVft3D91HLpLC6KSsGb') self.assertEqual(self.client.get_address('Bitcoin', [0, -1]), '1JVq66pzRBvqaBRFeU9SPVvg3er4ZDgoMs') @@ -19,13 +14,7 @@ class TestAddresses(common.TrezorTest): self.assertEqual(self.client.get_address('Bitcoin', [0, 9999999]), '1GS8X3yc7ntzwGw9vXwj9wqmBWZkTFewBV') def test_ltc(self): - self.client.wipe_device() - self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, - pin='', - passphrase_protection=False, - label='test', - language='english') - + self.setup_mnemonic_nopin_nopassphrase() self.assertEqual(self.client.get_address('Litecoin', []), 'LYtGrdDeqYUQnTkr5sHT2DKZLG7Hqg7HTK') self.assertEqual(self.client.get_address('Litecoin', [1]), 'LKRGNecThFP3Q6c5fosLVA53Z2hUDb1qnE') self.assertEqual(self.client.get_address('Litecoin', [0, -1]), 'LcinMK8pVrAtpz7Qpc8jfWzSFsDLgLYfG6') @@ -33,22 +22,11 @@ class TestAddresses(common.TrezorTest): self.assertEqual(self.client.get_address('Litecoin', [0, 9999999]), 'Laf5nGHSCT94C5dK6fw2RxuXPiw2ZuRR9S') def test_tbtc(self): - self.client.wipe_device() - self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, - pin='', - passphrase_protection=False, - label='test', - language='english') - + self.setup_mnemonic_nopin_nopassphrase() self.assertEqual(self.client.get_address('Testnet', [111, 42]), 'moN6aN6NP1KWgnPSqzrrRPvx2x1UtZJssa') def test_public_ckd(self): - self.client.wipe_device() - self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, - pin='', - passphrase_protection=False, - label='test', - language='english') + self.setup_mnemonic_nopin_nopassphrase() node = self.client.get_public_node([]) node_sub1 = self.client.get_public_node([1]) @@ -64,4 +42,4 @@ class TestAddresses(common.TrezorTest): self.assertEqual(address1, address2) if __name__ == '__main__': - unittest.main() + unittest.main() diff --git a/tests/test_basic.py b/tests/test_basic.py index cf9685abd..4d258191c 100644 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -4,16 +4,13 @@ import common from trezorlib import messages_pb2 as messages class TestBasic(common.TrezorTest): + def test_features(self): features = self.client.call(messages.Initialize()) - - # Result is the same as reported by BitkeyClient class self.assertEqual(features, self.client.features) def test_ping(self): ping = self.client.call(messages.Ping(message='ahoj!')) - - # Ping results in Success(message='Ahoj!') self.assertEqual(ping, messages.Success(message='ahoj!')) def test_device_id_same(self): diff --git a/tests/test_bip32_speed.py b/tests/test_bip32_speed.py index ed18b997b..34bf0acb4 100644 --- a/tests/test_bip32_speed.py +++ b/tests/test_bip32_speed.py @@ -5,12 +5,7 @@ from trezorlib import tools class TestAddresses(common.TrezorTest): def test_public_ckd(self): - self.client.wipe_device() - self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, - pin='', - passphrase_protection=False, - label='test', - language='english') + self.setup_mnemonic_nopin_nopassphrase() self.client.get_address('Bitcoin', []) # to compute root node via BIP39 @@ -23,12 +18,7 @@ class TestAddresses(common.TrezorTest): self.assertLessEqual(delay, expected) def test_private_ckd(self): - self.client.wipe_device() - self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, - pin='', - passphrase_protection=False, - label='test', - language='english') + self.setup_mnemonic_nopin_nopassphrase() self.client.get_address('Bitcoin', []) # to compute root node via BIP39 diff --git a/tests/test_debuglink.py b/tests/test_debuglink.py index b114885bf..36e0484d2 100644 --- a/tests/test_debuglink.py +++ b/tests/test_debuglink.py @@ -14,10 +14,12 @@ class TestDebugLink(common.TrezorTest): self.assertEqual(len(layout), 1024) def test_mnemonic(self): + self.setup_mnemonic_nopin_nopassphrase() mnemonic = self.client.debug.read_mnemonic() - self.assertEqual(mnemonic, self.mnemonic1) + self.assertEqual(mnemonic, self.mnemonic12) def test_node(self): + self.setup_mnemonic_nopin_nopassphrase() node = self.client.debug.read_node() self.assertIsNotNone(node) diff --git a/tests/test_messages.py b/tests/test_messages.py index 360a80347..0104f0af5 100644 --- a/tests/test_messages.py +++ b/tests/test_messages.py @@ -8,14 +8,17 @@ from trezorlib.client import CallException class TestMessages(common.TrezorTest): def test_message_sign(self): + self.setup_mnemonic_nopin_nopassphrase() sig = self.client.sign_message([0], "This is an example of a signed message.") self.assertEqual(sig.address, '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e') self.assertEqual(binascii.hexlify(sig.signature), '209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80') def test_too_long(self): + self.setup_mnemonic_nopin_nopassphrase() + # Message cannot be longer than 255 bytes self.assertRaises(CallException, self.client.sign_message, [0], '1' * 256) - + ret = self.client.verify_message('1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), '1' * 256 @@ -27,10 +30,8 @@ class TestMessages(common.TrezorTest): ret = self.client.verify_message('moRDikgmxcpouFtqnKnVVzLYgkDD2gQ3sk', sig, 'Ahoj') self.assertTrue(ret) - - - def test_message_verify(self): + def test_message_verify(self): # uncompressed pubkey - OK res = self.client.verify_message( '1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', @@ -80,4 +81,3 @@ class TestMessages(common.TrezorTest): if __name__ == '__main__': unittest.main() - diff --git a/tests/test_pings.py b/tests/test_pings.py index 0d6bf7fda..3534f5df8 100644 --- a/tests/test_pings.py +++ b/tests/test_pings.py @@ -8,14 +8,7 @@ from trezorlib import types_pb2 as proto_types class TestPing(common.TrezorTest): def test_ping(self): - self.client.wipe_device() - self.client.load_device_by_mnemonic( - mnemonic=self.mnemonic1, - pin=self.pin1, - passphrase_protection=True, - label='test', - language='english', - ) + self.setup_mnemonic_pin_passphrase() self.client.set_expected_responses([proto.Success()]) res = self.client.ping('random data') @@ -34,14 +27,7 @@ class TestPing(common.TrezorTest): self.assertEqual(res, 'random data') def test_ping_caching(self): - self.client.wipe_device() - self.client.load_device_by_mnemonic( - mnemonic=self.mnemonic1, - pin=self.pin1, - passphrase_protection=True, - label='test', - language='english', - ) + self.setup_mnemonic_pin_passphrase() self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other),proto.PinMatrixRequest(),proto.PassphraseRequest(),proto.Success()]) res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index fa28ada93..672ff3e9b 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -18,6 +18,8 @@ class TestProtectCall(common.TrezorTest): self.assertEqual(res, 'random data') def test_expected_responses(self): + self.setup_mnemonic_pin_passphrase() + # This is low-level test of set_expected_responses() # feature of debugging client @@ -49,28 +51,16 @@ class TestProtectCall(common.TrezorTest): self.assertRaises(CallException, self._some_protected_call, True, True, True) def test_no_protection(self): - self.client.wipe_device() - self.client.load_device_by_mnemonic( - mnemonic=self.mnemonic1, - pin='', - passphrase_protection=False, - label='test', - language='english', - ) - + self.setup_mnemonic_nopin_nopassphrase() + self.assertEqual(self.client.debug.read_pin()[0], '') self.client.set_expected_responses([proto.Success()]) self._some_protected_call(False, True, True) def test_pin(self): - self.client.wipe_device() - self.client.load_device_by_mnemonic(mnemonic=self.mnemonic1, - pin=self.pin2, - passphrase_protection=True, - label='test', - language='english') - - self.assertEqual(self.client.debug.read_pin()[0], self.pin2) + self.setup_mnemonic_pin_passphrase() + + self.assertEqual(self.client.debug.read_pin()[0], self.pin4) self.client.setup_debuglink(button=True, pin_correct=True) self.client.set_expected_responses([proto.ButtonRequest(), proto.PinMatrixRequest(), @@ -78,16 +68,20 @@ class TestProtectCall(common.TrezorTest): self._some_protected_call(True, True, False) def test_incorrect_pin(self): + self.setup_mnemonic_pin_passphrase() self.client.setup_debuglink(button=True, pin_correct=False) self.assertRaises(PinException, self._some_protected_call, False, True, False) def test_cancelled_pin(self): + self.setup_mnemonic_pin_passphrase() self.client.setup_debuglink(button=True, pin_correct=False) # PIN cancel self.assertRaises(PinException, self._some_protected_call, False, True, False) def test_exponential_backoff_with_reboot(self): + self.setup_mnemonic_pin_passphrase() + self.client.setup_debuglink(button=True, pin_correct=False) - + def test_backoff(attempts, start): expected = 1.8 ** attempts got = time.time() - start diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 660775b04..4346f0c19 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -39,6 +39,8 @@ class FakeTestnetBlockchain(object): class TestSignTx(common.TrezorTest): def test_one_one_fee(self): + self.setup_mnemonic_nopin_nopassphrase() + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 # input 0: 0.0039 BTC @@ -62,6 +64,8 @@ class TestSignTx(common.TrezorTest): self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') def test_testnet_one_two_fee(self): + self.setup_mnemonic_nopin_nopassphrase() + # tx: 6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54 # input 1: 10.00000000 BTC inp1 = proto_types.TxInputType(address_n=[0], # mirio8q3gtv7fhdnmb3TpZ4EuafdzSs7zL @@ -90,6 +94,8 @@ class TestSignTx(common.TrezorTest): self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b4830450221009c2d30385519fdb13dce13d5ac038be07d7b2dad0b0f7b2c1c339d7255bcf553022056a2f5bceab3cd0ffed4d388387e631f419d67ff9ce7798e3d7dfe6a6d6ec4bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0280ce341d000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') def test_testnet_fee_too_high(self): + self.setup_mnemonic_nopin_nopassphrase() + # tx: 6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54 # input 1: 10.00000000 BTC inp1 = proto_types.TxInputType(address_n=[0], # mirio8q3gtv7fhdnmb3TpZ4EuafdzSs7zL @@ -119,6 +125,8 @@ class TestSignTx(common.TrezorTest): self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') def test_one_two_fee(self): + self.setup_mnemonic_nopin_nopassphrase() + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 # input 0: 0.0039 BTC @@ -147,6 +155,8 @@ class TestSignTx(common.TrezorTest): self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef1702201d481d04216b319dc549ffe2333143629ba18828a4e2d1783ab719a6aa263eb70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') def test_one_three_fee(self): + self.setup_mnemonic_nopin_nopassphrase() + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 # input 0: 0.0039 BTC @@ -181,11 +191,13 @@ class TestSignTx(common.TrezorTest): self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02207b0879a81408a11e23b11d4c7965c62b5fc6d5c2d92340f5ee2da7b40e99314a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') def test_two_two(self): + self.setup_mnemonic_nopin_nopassphrase() + # tx: c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c # input 1: 0.0010 BTC # tx: 58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e # input 1: 0.0011 BTC - + inp1 = proto_types.TxInputType(address_n=[1], # 1CK7SJdcb8z9HuvVft3D91HLpLC6KSsGb # amount=100000, prev_hash=binascii.unhexlify('c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c'), @@ -219,6 +231,8 @@ class TestSignTx(common.TrezorTest): ''' def test_255_outputs(self): + self.setup_mnemonic_nopin_nopassphrase() + # Tests if device implements serialization of len(outputs) correctly # tx: c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb @@ -255,6 +269,8 @@ class TestSignTx(common.TrezorTest): ''' def test_fee_too_high(self): + self.setup_mnemonic_nopin_nopassphrase() + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 # input 0: 0.0039 BTC @@ -278,6 +294,8 @@ class TestSignTx(common.TrezorTest): self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') def test_not_enough_funds(self): + self.setup_mnemonic_nopin_nopassphrase() + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 # input 0: 0.0039 BTC diff --git a/tests/test_zerosig.py b/tests/test_zerosig.py index 3d60b332f..15fa04778 100644 --- a/tests/test_zerosig.py +++ b/tests/test_zerosig.py @@ -31,7 +31,7 @@ class TestZeroSig(common.TrezorTest): msg.outputs.extend([out1, ]) tx = self.client.call(msg) - + siglen = ord(tx.serialized_tx[44]) print siglen if siglen < 67: @@ -41,6 +41,8 @@ class TestZeroSig(common.TrezorTest): ''' def test_one_zero_signature(self): + self.setup_mnemonic_nopin_nopassphrase() + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e # amount=390000, prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), @@ -61,6 +63,8 @@ class TestZeroSig(common.TrezorTest): self.assertEqual(siglen, 67) def test_two_zero_signature(self): + self.setup_mnemonic_nopin_nopassphrase() + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e # amount=390000, prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), @@ -79,6 +83,6 @@ class TestZeroSig(common.TrezorTest): # Trezor must strip leading zero from signature self.assertEqual(siglen, 66) - + if __name__ == '__main__': unittest.main() From b63418c8b85aed1705aab04a75076552b24f961d Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 17 Feb 2014 02:16:43 +0100 Subject: [PATCH 0221/1535] add read_passphrase_protection to debuglink --- tests/test_device_load.py | 34 ++++++++++++++++++++++++++++++++++ tests/test_device_recover.py | 12 ++++++++++++ tests/test_device_reset.py | 12 ++++++++++++ tests/test_signtx.py | 2 ++ trezorlib/debuglink.py | 5 +++++ 5 files changed, 65 insertions(+) create mode 100644 tests/test_device_load.py create mode 100644 tests/test_device_recover.py create mode 100644 tests/test_device_reset.py diff --git a/tests/test_device_load.py b/tests/test_device_load.py new file mode 100644 index 000000000..39e59a537 --- /dev/null +++ b/tests/test_device_load.py @@ -0,0 +1,34 @@ +import unittest +import common + +from trezorlib import messages_pb2 as messages + +class TestDeviceLoad(common.TrezorTest): + + def test_load_device_1(self): + self.setup_mnemonic_nopin_nopassphrase() + + mnemonic = self.client.debug.read_mnemonic() + self.assertEqual(mnemonic, self.mnemonic12) + + pin = self.client.debug.read_pin()[0] + self.assertEqual(pin, '') + + passphrase_protection = self.client.debug.read_passphrase_protection() + self.assertEqual(passphrase_protection, False) + + def test_load_device_2(self): + self.setup_mnemonic_pin_passphrase() + + mnemonic = self.client.debug.read_mnemonic() + self.assertEqual(mnemonic, self.mnemonic12) + + pin = self.client.debug.read_pin()[0] + self.assertEqual(pin, self.pin4) + + passphrase_protection = self.client.debug.read_passphrase_protection() + self.assertEqual(passphrase_protection, True) + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_device_recover.py b/tests/test_device_recover.py new file mode 100644 index 000000000..1f634c7a5 --- /dev/null +++ b/tests/test_device_recover.py @@ -0,0 +1,12 @@ +import unittest +import common + +from trezorlib import messages_pb2 as messages + +class TestDeviceRecover(common.TrezorTest): + + def test_recover_device(self): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_device_reset.py b/tests/test_device_reset.py new file mode 100644 index 000000000..d0bfe29e2 --- /dev/null +++ b/tests/test_device_reset.py @@ -0,0 +1,12 @@ +import unittest +import common + +from trezorlib import messages_pb2 as messages + +class TestDeviceReset(common.TrezorTest): + + def test_reset_device(self): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_signtx.py b/tests/test_signtx.py index 4346f0c19..4dbd2c47d 100644 --- a/tests/test_signtx.py +++ b/tests/test_signtx.py @@ -322,6 +322,8 @@ class TestSignTx(common.TrezorTest): self.assert_(False, "types.Failure_NotEnoughFunds expected") def test_estimate_size(self): + self.setup_mnemonic_nopin_nopassphrase() + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e # amount=390000, prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), diff --git a/trezorlib/debuglink.py b/trezorlib/debuglink.py index 9021cc81e..c6d989781 100644 --- a/trezorlib/debuglink.py +++ b/trezorlib/debuglink.py @@ -54,6 +54,11 @@ class DebugLink(object): obj = self.transport.read_blocking() return obj.node + def read_passphrase_protection(self): + self.transport.write(proto.DebugLinkGetState()) + obj = self.transport.read_blocking() + return obj.passphrase_protection + def press_button(self, yes_no): print "Pressing", yes_no self.button_func(yes_no) From 8f7c8799a4d42fbf919c3b2c2d00e70f691e270c Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 17 Feb 2014 11:17:44 +0100 Subject: [PATCH 0222/1535] forgot Success --- tests/test_pings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_pings.py b/tests/test_pings.py index 3534f5df8..1fbe3123d 100644 --- a/tests/test_pings.py +++ b/tests/test_pings.py @@ -34,7 +34,7 @@ class TestPing(common.TrezorTest): self.assertEqual(res, 'random data') # pin and passphrase are cached - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other)]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other),proto.Success()]) res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) self.assertEqual(res, 'random data') From b6a280c3801787d57bcadbc843031ae5668f15c7 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 20 Feb 2014 15:58:28 +0100 Subject: [PATCH 0223/1535] Fixed passphrase request --- trezorlib/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 846d8cc69..7531035ec 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -122,7 +122,7 @@ class TextUIMixin(object): return proto.PinMatrixAck(pin=pin) def callback_PassphraseRequest(self, msg): - passphrase = raw_input("Passphrase required: %s " % msg.message) + passphrase = raw_input("Passphrase required: ") return proto.PassphraseAck(passphrase=passphrase) def callback_WordRequest(self, msg): From 6e90d5763eada46d09a473b01fe199368b987b70 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 20 Feb 2014 16:01:17 +0100 Subject: [PATCH 0224/1535] Added debug printing --- trezorlib/client.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/trezorlib/client.py b/trezorlib/client.py index 7531035ec..67b6fb573 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -63,10 +63,12 @@ class BaseClient(object): def call_raw(self, msg): try: + print "SENDING", pprint(msg) self.transport.session_begin() self.transport.write(msg) resp = self.transport.read_blocking() + print "RECEIVED", pprint(resp) finally: self.transport.session_end() From 2a3e5ace6b11fe7ed818c9f91dc3ce73db7bbf76 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 20 Feb 2014 16:09:58 +0100 Subject: [PATCH 0225/1535] Added TrezorClientDebug which prints wire messages to stdout --- cmd.py | 4 ++-- trezorlib/client.py | 18 +++++++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/cmd.py b/cmd.py index 2d68db561..a1a14f0e0 100755 --- a/cmd.py +++ b/cmd.py @@ -5,7 +5,7 @@ import argparse import json import base64 -from trezorlib.client import TrezorClient +from trezorlib.client import TrezorClientDebug from trezorlib.api_blockchain import BlockchainApi from trezorlib.protobuf_json import pb2json @@ -319,7 +319,7 @@ def main(): return transport = get_transport(args.transport, args.path) - client = TrezorClient(transport) + client = TrezorClientDebug(transport) client.set_tx_func(BlockchainApi().get_tx) cmds = Commands(client) diff --git a/trezorlib/client.py b/trezorlib/client.py index 67b6fb573..73816e0b5 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -63,13 +63,9 @@ class BaseClient(object): def call_raw(self, msg): try: - print "SENDING", pprint(msg) self.transport.session_begin() - self.transport.write(msg) resp = self.transport.read_blocking() - print "RECEIVED", pprint(resp) - finally: self.transport.session_end() @@ -105,6 +101,13 @@ class BaseClient(object): def close(self): self.transport.close() +class DebugWireMixin(object): + def call_raw(self, msg): + print "SENDING", pprint(msg) + resp = super(DebugWireMixin, self).call_raw(msg) + print "RECEIVED", pprint(resp) + return resp + class TextUIMixin(object): # This class demonstrates easy test-based UI # integration between the device and wallet. @@ -179,9 +182,7 @@ class DebugLinkMixin(object): return resp def call(self, msg): - print "SENDING", pprint(msg) ret = super(DebugLinkMixin, self).call(msg) - print "RECEIVED", pprint(ret) if self.expected_responses != None and len(self.expected_responses): raise Exception("Some of expected responses didn't come from device: %s" % \ @@ -501,7 +502,10 @@ class ProtocolMixin(object): class TrezorClient(ProtocolMixin, TextUIMixin, BaseClient): pass -class TrezorDebugClient(ProtocolMixin, DebugLinkMixin, BaseClient): +class TrezorClientDebug(ProtocolMixin, TextUIMixin, DebugWireMixin, BaseClient): + pass + +class TrezorDebugClient(ProtocolMixin, DebugLinkMixin, DebugWireMixin, BaseClient): pass ''' From 8e4611f56c2863b805261fd2273cda93a8ed961c Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 20 Feb 2014 19:14:31 +0100 Subject: [PATCH 0226/1535] Compiled pb --- trezorlib/messages_pb2.py | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 8251d847e..3e4a1d9b4 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"E\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x12\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa5\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\x8f\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"E\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x12\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa5\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xc0\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x0c\n\x04word\x18\x07 \x01(\x0c\x12\x10\n\x08word_pos\x18\x08 \x01(\x05\x12\x0f\n\x07\x65ntropy\x18\t \x01(\x0c\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -206,8 +206,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2840, - serialized_end=4421, + serialized_start=2889, + serialized_end=4470, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -1771,6 +1771,27 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='word', full_name='DebugLinkState.word', index=6, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='word_pos', full_name='DebugLinkState.word_pos', index=7, + number=8, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='entropy', full_name='DebugLinkState.entropy', index=8, + number=9, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -1781,7 +1802,7 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=2616, - serialized_end=2759, + serialized_end=2808, ) @@ -1801,8 +1822,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2761, - serialized_end=2776, + serialized_start=2810, + serialized_end=2825, ) @@ -1843,8 +1864,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2778, - serialized_end=2837, + serialized_start=2827, + serialized_end=2886, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From dfeb6de331d547dfb311cba3c49c323937db1e14 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 20 Feb 2014 19:15:43 +0100 Subject: [PATCH 0227/1535] Test for Reset Device --- tests/test.py | 3 +- tests/test_debuglink.py | 15 ++++ tests/test_device_reset.py | 167 ++++++++++++++++++++++++++++++++++++- tests/test_protect_call.py | 2 +- trezorlib/debuglink.py | 22 ++++- 5 files changed, 201 insertions(+), 8 deletions(-) diff --git a/tests/test.py b/tests/test.py index 5882154f3..71184e1aa 100755 --- a/tests/test.py +++ b/tests/test.py @@ -6,7 +6,7 @@ TODO: * ApplySettings workflow, zistit cez Features ci sa zmeny aplikovali * WipeDevice workflow, zistit cez Features ci to prebehlo * LoadDevice workflow, zistit cez Features ci to prebehlo -* ResetDevice workflow +x ResetDevice workflow - zrejme v sucinnosti s inymi testami * ButtonRequest/ButtonAck workflow (vyvolat napr. pomocou GetEntropy, myslim ze ten GetEntropy vyzaduje PIN, ale ja by som to dal na button) @@ -33,4 +33,5 @@ TODO: x Zero signature test * test bip39, utf, passphrase +x Clear session on ChangePin ''' diff --git a/tests/test_debuglink.py b/tests/test_debuglink.py index 36e0484d2..3ad80448a 100644 --- a/tests/test_debuglink.py +++ b/tests/test_debuglink.py @@ -23,5 +23,20 @@ class TestDebugLink(common.TrezorTest): node = self.client.debug.read_node() self.assertIsNotNone(node) + def test_pin(self): + self.setup_mnemonic_pin_passphrase() + + # Manually trigger PinMatrixRequest + resp = self.client.call_raw(proto.Ping(message='test', pin_protection=True)) + self.assertIsInstance(resp, proto.PinMatrixRequest) + + pin = self.client.debug.read_pin() + self.assertEqual(pin[0], '1234') + self.assertNotEqual(pin[1], '') + + pin_encoded = self.client.debug.read_pin_encoded() + resp = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + self.assertIsInstance(resp, proto.Success) + if __name__ == '__main__': unittest.main() diff --git a/tests/test_device_reset.py b/tests/test_device_reset.py index d0bfe29e2..9ddc8665d 100644 --- a/tests/test_device_reset.py +++ b/tests/test_device_reset.py @@ -1,12 +1,175 @@ import unittest import common +import hashlib -from trezorlib import messages_pb2 as messages +from trezorlib import messages_pb2 as proto +from mnemonic import Mnemonic + +def generate_entropy(strength, internal_entropy, external_entropy): + ''' + strength - length of produced seed. One of 128, 192, 256 + random - binary stream of random data from external HRNG + ''' + if strength not in (128, 192, 256): + raise Exception("Invalid strength") + + if not internal_entropy: + raise Exception("Internal entropy is not provided") + + if len(internal_entropy) < 32: + raise Exception("Internal entropy too short") + + if not external_entropy: + raise Exception("External entropy is not provided") + + if len(external_entropy) < 32: + raise Exception("External entropy too short") + + entropy = hashlib.sha256(internal_entropy + external_entropy).digest() + entropy_stripped = entropy[:strength / 8] + + if len(entropy_stripped) * 8 != strength: + raise Exception("Entropy length mismatch") + + return entropy_stripped class TestDeviceReset(common.TrezorTest): def test_reset_device(self): - pass + # No PIN, no passphrase + external_entropy = 'zlutoucky kun upel divoke ody' * 2 + strength = 128 + + ret = self.client.call_raw(proto.ResetDevice(display_random=False, + strength=strength, + passphrase_protection=False, + pin_protection=False, + language='english', + label='test')) + + self.assertIsInstance(ret, proto.ButtonRequest) + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + self.assertIsInstance(ret, proto.EntropyRequest) + ret = self.client.call_raw(proto.EntropyAck(entropy=external_entropy)) + + # Read internal entropy and generate mnemonic locally + internal_entropy = self.client.debug.read_entropy() + entropy = generate_entropy(strength, internal_entropy, external_entropy) + expected_mnemonic = Mnemonic('english').to_mnemonic(entropy) + + mnemonic = [] + for _ in range(12): + self.assertIsInstance(ret, proto.ButtonRequest) + mnemonic.append(self.client.debug.read_word()[0]) + self.client.debug.press_yes() + self.client.call_raw(proto.ButtonAck()) + + mnemonic = ' '.join(mnemonic) + + # Compare that device generated proper mnemonic for given entropies + self.assertEqual(mnemonic, expected_mnemonic) + + mnemonic = [] + for _ in range(12): + self.assertIsInstance(ret, proto.ButtonRequest) + mnemonic.append(self.client.debug.read_word()[0]) + self.client.debug.press_yes() + resp = self.client.call_raw(proto.ButtonAck()) + + self.assertIsInstance(resp, proto.Success) + + mnemonic = ' '.join(mnemonic) + + # Compare that second pass printed out the same mnemonic once again + self.assertEqual(mnemonic, expected_mnemonic) + + # Check if device is properly initialized + resp = self.client.call_raw(proto.Initialize()) + self.assertFalse(resp.pin_protection) + self.assertFalse(resp.passphrase_protection) + + # Do passphrase-protected action, PassphraseRequest should NOT be raised + resp = self.client.call_raw(proto.Ping(passphrase_protection=True)) + self.assertIsInstance(resp, proto.Success) + + # Do PIN-protected action, PinRequest should NOT be raised + resp = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(resp, proto.Success) + + def test_reset_device_pin(self): + external_entropy = 'zlutoucky kun upel divoke ody' * 2 + strength = 128 + + ret = self.client.call_raw(proto.ResetDevice(display_random=True, + strength=strength, + passphrase_protection=True, + pin_protection=True, + language='english', + label='test')) + + self.assertIsInstance(ret, proto.ButtonRequest) + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + self.assertIsInstance(ret, proto.EntropyRequest) + ret = self.client.call_raw(proto.EntropyAck(entropy=external_entropy)) + + self.assertIsInstance(ret, proto.PinMatrixRequest) + + # Enter PIN for first time + pin_encoded = self.client.debug.encode_pin('654') + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + self.assertIsInstance(ret, proto.PinMatrixRequest) + + # Enter PIN for second time + pin_encoded = self.client.debug.encode_pin('654') + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Read internal entropy and generate mnemonic locally + internal_entropy = self.client.debug.read_entropy() + entropy = generate_entropy(strength, internal_entropy, external_entropy) + expected_mnemonic = Mnemonic('english').to_mnemonic(entropy) + + mnemonic = [] + for _ in range(12): + self.assertIsInstance(ret, proto.ButtonRequest) + mnemonic.append(self.client.debug.read_word()[0]) + self.client.debug.press_yes() + self.client.call_raw(proto.ButtonAck()) + + mnemonic = ' '.join(mnemonic) + + # Compare that device generated proper mnemonic for given entropies + self.assertEqual(mnemonic, expected_mnemonic) + + mnemonic = [] + for _ in range(12): + self.assertIsInstance(ret, proto.ButtonRequest) + mnemonic.append(self.client.debug.read_word()[0]) + self.client.debug.press_yes() + resp = self.client.call_raw(proto.ButtonAck()) + + self.assertIsInstance(resp, proto.Success) + + mnemonic = ' '.join(mnemonic) + + # Compare that second pass printed out the same mnemonic once again + self.assertEqual(mnemonic, expected_mnemonic) + + # Check if device is properly initialized + resp = self.client.call_raw(proto.Initialize()) + self.assertTrue(resp.pin_protection) + self.assertTrue(resp.passphrase_protection) + + # Do passphrase-protected action, PassphraseRequest should be raised + resp = self.client.call_raw(proto.Ping(passphrase_protection=True)) + self.assertIsInstance(resp, proto.PassphraseRequest) + # Do PIN-protected action, PinRequest should be raised + resp = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(resp, proto.PinMatrixRequest) + if __name__ == '__main__': unittest.main() diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index 672ff3e9b..0a946f722 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -40,7 +40,7 @@ class TestProtectCall(common.TrezorTest): # Scenario 4 - Received what expected self.client.set_expected_responses([proto.ButtonRequest(), proto.PinMatrixRequest(), - # proto.PassphraseRequest(), # passhrase is already in session + proto.PassphraseRequest(), proto.Success(message='random data')]) self._some_protected_call(True, True, True) diff --git a/trezorlib/debuglink.py b/trezorlib/debuglink.py index c6d989781..a7e16b404 100644 --- a/trezorlib/debuglink.py +++ b/trezorlib/debuglink.py @@ -26,7 +26,13 @@ class DebugLink(object): return (obj.pin, obj.matrix) def read_pin_encoded(self): - pin, matrix = self.read_pin() + pin, _ = self.read_pin() + pin_encoded = self.encode_pin(pin) + self.pin_func(pin_encoded) + return pin_encoded + + def encode_pin(self, pin): + _, matrix = self.read_pin() # Now we have real PIN and PIN matrix. # We have to encode that into encoded pin, @@ -35,10 +41,8 @@ class DebugLink(object): pin_encoded = ''.join([ str(matrix.index(p) + 1) for p in pin]) print "Encoded PIN:", pin_encoded - self.pin_func(pin_encoded) - return pin_encoded - + def read_layout(self): self.transport.write(proto.DebugLinkGetState()) obj = self.transport.read_blocking() @@ -54,6 +58,16 @@ class DebugLink(object): obj = self.transport.read_blocking() return obj.node + def read_word(self): + self.transport.write(proto.DebugLinkGetState()) + obj = self.transport.read_blocking() + return (obj.word, obj.word_pos) + + def read_entropy(self): + self.transport.write(proto.DebugLinkGetState()) + obj = self.transport.read_blocking() + return obj.entropy + def read_passphrase_protection(self): self.transport.write(proto.DebugLinkGetState()) obj = self.transport.read_blocking() From fabb9523274b82bf65c5c106423484a6f375a396 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 01:46:24 +0100 Subject: [PATCH 0228/1535] Compiled pb --- trezorlib/messages_pb2.py | 107 ++++++++++++++++++++------------------ 1 file changed, 57 insertions(+), 50 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 3e4a1d9b4..8c07461c9 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"E\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x12\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\x95\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa5\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xc0\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x0c\n\x04word\x18\x07 \x01(\x0c\x12\x10\n\x08word_pos\x18\x08 \x01(\x05\x12\x0f\n\x07\x65ntropy\x18\t \x01(\x0c\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"E\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x12\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\xac\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa5\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xc0\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x0c\n\x04word\x18\x07 \x01(\x0c\x12\x10\n\x08word_pos\x18\x08 \x01(\x05\x12\x0f\n\x07\x65ntropy\x18\t \x01(\x0c\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -206,8 +206,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2889, - serialized_end=4470, + serialized_start=2912, + serialized_end=4493, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -994,6 +994,13 @@ _LOADDEVICE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + _descriptor.FieldDescriptor( + name='skip_checksum', full_name='LoadDevice.skip_checksum', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -1004,7 +1011,7 @@ _LOADDEVICE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=1104, - serialized_end=1253, + serialized_end=1276, ) @@ -1066,8 +1073,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1256, - serialized_end=1419, + serialized_start=1279, + serialized_end=1442, ) @@ -1087,8 +1094,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1421, - serialized_end=1437, + serialized_start=1444, + serialized_end=1460, ) @@ -1115,8 +1122,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1439, - serialized_end=1474, + serialized_start=1462, + serialized_end=1497, ) @@ -1178,8 +1185,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1477, - serialized_end=1642, + serialized_start=1500, + serialized_end=1665, ) @@ -1199,8 +1206,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1644, - serialized_end=1657, + serialized_start=1667, + serialized_end=1680, ) @@ -1227,8 +1234,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1659, - serialized_end=1688, + serialized_start=1682, + serialized_end=1711, ) @@ -1269,8 +1276,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1690, - serialized_end=1773, + serialized_start=1713, + serialized_end=1796, ) @@ -1311,8 +1318,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1775, - serialized_end=1855, + serialized_start=1798, + serialized_end=1878, ) @@ -1346,8 +1353,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1857, - serialized_end=1917, + serialized_start=1880, + serialized_end=1940, ) @@ -1388,8 +1395,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1919, - serialized_end=2008, + serialized_start=1942, + serialized_end=2031, ) @@ -1416,8 +1423,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2010, - serialized_end=2035, + serialized_start=2033, + serialized_end=2058, ) @@ -1458,8 +1465,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2037, - serialized_end=2118, + serialized_start=2060, + serialized_end=2141, ) @@ -1507,8 +1514,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2121, - serialized_end=2265, + serialized_start=2144, + serialized_end=2288, ) @@ -1563,8 +1570,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2268, - serialized_end=2414, + serialized_start=2291, + serialized_end=2437, ) @@ -1591,8 +1598,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2416, - serialized_end=2454, + serialized_start=2439, + serialized_end=2477, ) @@ -1619,8 +1626,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2456, - serialized_end=2497, + serialized_start=2479, + serialized_end=2520, ) @@ -1640,8 +1647,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2499, - serialized_end=2514, + serialized_start=2522, + serialized_end=2537, ) @@ -1668,8 +1675,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2516, - serialized_end=2555, + serialized_start=2539, + serialized_end=2578, ) @@ -1696,8 +1703,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2557, - serialized_end=2592, + serialized_start=2580, + serialized_end=2615, ) @@ -1717,8 +1724,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2594, - serialized_end=2613, + serialized_start=2617, + serialized_end=2636, ) @@ -1801,8 +1808,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2616, - serialized_end=2808, + serialized_start=2639, + serialized_end=2831, ) @@ -1822,8 +1829,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2810, - serialized_end=2825, + serialized_start=2833, + serialized_end=2848, ) @@ -1864,8 +1871,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2827, - serialized_end=2886, + serialized_start=2850, + serialized_end=2909, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From 58dee1a9867d690d1f94032995be3e8234037c8f Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 01:48:11 +0100 Subject: [PATCH 0229/1535] Improved utf8 handling --- trezorlib/client.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 73816e0b5..1b039d041 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -6,6 +6,7 @@ import tools import messages_pb2 as proto import types_pb2 as types from trezorlib.debuglink import DebugLink +from mnemonic import Mnemonic # monkeypatching: text formatting of protobuf messages tools.monkeypatch_google_protobuf_text_format() @@ -128,6 +129,8 @@ class TextUIMixin(object): def callback_PassphraseRequest(self, msg): passphrase = raw_input("Passphrase required: ") + passphrase = str(bytearray(passphrase, 'utf-8')) + return proto.PassphraseAck(passphrase=passphrase) def callback_WordRequest(self, msg): @@ -174,7 +177,7 @@ class DebugLinkMixin(object): self.pin_correct = pin_correct def set_passphrase(self, passphrase): - self.passphrase = passphrase + self.passphrase = str(bytearray(passphrase, 'utf-8')) def call_raw(self, msg): resp = super(DebugLinkMixin, self).call_raw(msg) @@ -426,14 +429,25 @@ class ProtocolMixin(object): @field('message') @expect(proto.Success) - def load_device_by_mnemonic(self, mnemonic, pin, passphrase_protection, label, language): + def load_device_by_mnemonic(self, mnemonic, pin, passphrase_protection, label, language, skip_checksum=False): + m = Mnemonic('english') + if not skip_checksum and not m.check(mnemonic): + raise Exception("Invalid mnemonic checksum") + + # Convert mnemonic to UTF8 NKFD + mnemonic = Mnemonic.normalize_string(mnemonic) + + # Convert mnemonic to ASCII stream + mnemonic = str(bytearray(mnemonic, 'utf-8')) + if self.features.initialized: raise Exception("Device is initialized already. Call wipe_device() and try again.") resp = self.call(proto.LoadDevice(mnemonic=mnemonic, pin=pin, passphrase_protection=passphrase_protection, language=language, - label=label)) + label=label, + skip_checksum=skip_checksum)) self.init_device() return resp From 56a9a4b38427a63c0991199948c5e3e4fb516a55 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 01:48:32 +0100 Subject: [PATCH 0230/1535] DeviceLoad using UTF8 mnemonic --- tests/test_device_load.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tests/test_device_load.py b/tests/test_device_load.py index 39e59a537..c7f27ff2c 100644 --- a/tests/test_device_load.py +++ b/tests/test_device_load.py @@ -29,6 +29,40 @@ class TestDeviceLoad(common.TrezorTest): passphrase_protection = self.client.debug.read_passphrase_protection() self.assertEqual(passphrase_protection, True) + def test_load_device_utf(self): + words_nfkd = u'Pr\u030ci\u0301s\u030cerne\u030c z\u030clut\u030couc\u030cky\u0301 ku\u030an\u030c u\u0301pe\u030cl d\u030ca\u0301belske\u0301 o\u0301dy za\u0301ker\u030cny\u0301 uc\u030cen\u030c be\u030cz\u030ci\u0301 pode\u0301l zo\u0301ny u\u0301lu\u030a' + words_nfc = u'P\u0159\xed\u0161ern\u011b \u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy z\xe1ke\u0159n\xfd u\u010de\u0148 b\u011b\u017e\xed pod\xe9l z\xf3ny \xfal\u016f' + words_nfkc = u'P\u0159\xed\u0161ern\u011b \u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy z\xe1ke\u0159n\xfd u\u010de\u0148 b\u011b\u017e\xed pod\xe9l z\xf3ny \xfal\u016f' + words_nfd = u'Pr\u030ci\u0301s\u030cerne\u030c z\u030clut\u030couc\u030cky\u0301 ku\u030an\u030c u\u0301pe\u030cl d\u030ca\u0301belske\u0301 o\u0301dy za\u0301ker\u030cny\u0301 uc\u030cen\u030c be\u030cz\u030ci\u0301 pode\u0301l zo\u0301ny u\u0301lu\u030a' + + passphrase_nfkd = u'Neuve\u030cr\u030citelne\u030c bezpec\u030cne\u0301 hesli\u0301c\u030cko' + passphrase_nfc = u'Neuv\u011b\u0159iteln\u011b bezpe\u010dn\xe9 hesl\xed\u010dko' + passphrase_nfkc = u'Neuv\u011b\u0159iteln\u011b bezpe\u010dn\xe9 hesl\xed\u010dko' + passphrase_nfd = u'Neuve\u030cr\u030citelne\u030c bezpec\u030cne\u0301 hesli\u0301c\u030cko' + + self.client.wipe_device() + self.client.load_device_by_mnemonic(mnemonic=words_nfkd, pin='', passphrase_protection=True, label='test', language='english', skip_checksum=True) + self.client.set_passphrase(passphrase_nfkd) + address_nfkd = self.client.get_address('Bitcoin', []) + + self.client.wipe_device() + self.client.load_device_by_mnemonic(mnemonic=words_nfc, pin='', passphrase_protection=True, label='test', language='english', skip_checksum=True) + self.client.set_passphrase(passphrase_nfc) + address_nfc = self.client.get_address('Bitcoin', []) + + self.client.wipe_device() + self.client.load_device_by_mnemonic(mnemonic=words_nfkc, pin='', passphrase_protection=True, label='test', language='english', skip_checksum=True) + self.client.set_passphrase(passphrase_nfkc) + address_nfkc = self.client.get_address('Bitcoin', []) + + self.client.wipe_device() + self.client.load_device_by_mnemonic(mnemonic=words_nfd, pin='', passphrase_protection=True, label='test', language='english', skip_checksum=True) + self.client.set_passphrase(passphrase_nfd) + address_nfd = self.client.get_address('Bitcoin', []) + + self.assertEqual(address_nfkd, address_nfc) + self.assertEqual(address_nfkd, address_nfkc) + self.assertEqual(address_nfkd, address_nfd) if __name__ == '__main__': unittest.main() From e2aca677c087f5945538e62efeb6512621542a22 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 01:48:50 +0100 Subject: [PATCH 0231/1535] WipeDevice test --- tests/test_device_wipe.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 tests/test_device_wipe.py diff --git a/tests/test_device_wipe.py b/tests/test_device_wipe.py new file mode 100644 index 000000000..0f9c70ade --- /dev/null +++ b/tests/test_device_wipe.py @@ -0,0 +1,25 @@ +import unittest +import common + +from trezorlib import messages_pb2 as proto + +class TestDeviceWipe(common.TrezorTest): + def test_wipe_device(self): + self.setup_mnemonic_pin_passphrase() + features = self.client.call_raw(proto.Initialize()) + + self.assertEqual(features.initialized, True) + self.assertEqual(features.pin_protection, True) + self.assertEqual(features.passphrase_protection, True) + device_id = features.device_id + + self.client.wipe_device() + features = self.client.call_raw(proto.Initialize()) + + self.assertEqual(features.initialized, False) + self.assertEqual(features.pin_protection, False) + self.assertEqual(features.passphrase_protection, False) + self.assertNotEqual(features.device_id, device_id) + +if __name__ == '__main__': + unittest.main() From 747e58ebf7f82d41734fd52abcadc67c97520675 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 01:49:20 +0100 Subject: [PATCH 0232/1535] Uses mnemonic>=0.8 (improved UTF8 handling) --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 53792263a..27f8459eb 100644 --- a/setup.py +++ b/setup.py @@ -14,8 +14,8 @@ setup( long_description=open(join(here, 'README.rst')).read(), packages=find_packages(), test_suite='tests', - dependency_links=['https://github.com/trezor/python-mnemonic/archive/master.zip#egg=mnemonic-0.6'], - install_requires=['ecdsa>=0.9', 'protobuf', 'mnemonic>=0.6', 'hidapi>=0.7.99'], + dependency_links=['https://github.com/trezor/python-mnemonic/archive/master.zip#egg=mnemonic-0.8'], + install_requires=['ecdsa>=0.9', 'protobuf', 'mnemonic>=0.8', 'hidapi>=0.7.99'], include_package_data=True, zip_safe=False, classifiers=[ From 443ffab619789a17876e21094832544e2288b217 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 02:30:10 +0100 Subject: [PATCH 0233/1535] Added utf8 handling to sign_message/verify_message --- trezorlib/client.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 1b039d041..b08eea2fa 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -1,6 +1,7 @@ import os import binascii import hashlib +import unicodedata import tools import messages_pb2 as proto @@ -55,6 +56,17 @@ class expect(object): return ret return wrapped_f +def normalize_nfc(txt): + # Normalize string to UTF8 NFC for sign_message + if isinstance(txt, str): + utxt = txt.decode('utf8') + elif isinstance(txt, unicode): + utxt = txt + else: + raise Exception("String value expected") + + return unicodedata.normalize('NFC', utxt) + class BaseClient(object): # Implements very basic layer of sending raw protobuf # messages to device and getting its response back. @@ -329,11 +341,24 @@ class ProtocolMixin(object): return ret @expect(proto.MessageSignature) - def sign_message(self, n, message): + def sign_message(self, coin_name, n, message): n = self._convert_prime(n) - return self.call(proto.SignMessage(address_n=n, message=message)) + + # Convert message to UTF8 NFC (seems to be a bitcoin-qt standard) + message = normalize_nfc(message) + + # Convert message to ASCII stream + message = str(bytearray(message, 'utf-8')) + + return self.call(proto.SignMessage(coin_name=coin_name, address_n=n, message=message)) def verify_message(self, address, signature, message): + # Convert message to UTF8 NFC (seems to be a bitcoin-qt standard) + message = normalize_nfc(message) + + # Convert message to ASCII stream + message = str(bytearray(message, 'utf-8')) + try: resp = self.call(proto.VerifyMessage(address=address, signature=signature, message=message)) except CallException as e: From c870b65f22c9454a480c3d7d520b6fd077279054 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 02:31:34 +0100 Subject: [PATCH 0234/1535] Renamed unittests for better consistency --- tests/test_device_load.py | 68 -------------- tests/test_device_recover.py | 12 --- tests/test_device_reset.py | 175 ----------------------------------- tests/test_device_wipe.py | 25 ----- tests/test_entropy.py | 31 ------- 5 files changed, 311 deletions(-) delete mode 100644 tests/test_device_load.py delete mode 100644 tests/test_device_recover.py delete mode 100644 tests/test_device_reset.py delete mode 100644 tests/test_device_wipe.py delete mode 100644 tests/test_entropy.py diff --git a/tests/test_device_load.py b/tests/test_device_load.py deleted file mode 100644 index c7f27ff2c..000000000 --- a/tests/test_device_load.py +++ /dev/null @@ -1,68 +0,0 @@ -import unittest -import common - -from trezorlib import messages_pb2 as messages - -class TestDeviceLoad(common.TrezorTest): - - def test_load_device_1(self): - self.setup_mnemonic_nopin_nopassphrase() - - mnemonic = self.client.debug.read_mnemonic() - self.assertEqual(mnemonic, self.mnemonic12) - - pin = self.client.debug.read_pin()[0] - self.assertEqual(pin, '') - - passphrase_protection = self.client.debug.read_passphrase_protection() - self.assertEqual(passphrase_protection, False) - - def test_load_device_2(self): - self.setup_mnemonic_pin_passphrase() - - mnemonic = self.client.debug.read_mnemonic() - self.assertEqual(mnemonic, self.mnemonic12) - - pin = self.client.debug.read_pin()[0] - self.assertEqual(pin, self.pin4) - - passphrase_protection = self.client.debug.read_passphrase_protection() - self.assertEqual(passphrase_protection, True) - - def test_load_device_utf(self): - words_nfkd = u'Pr\u030ci\u0301s\u030cerne\u030c z\u030clut\u030couc\u030cky\u0301 ku\u030an\u030c u\u0301pe\u030cl d\u030ca\u0301belske\u0301 o\u0301dy za\u0301ker\u030cny\u0301 uc\u030cen\u030c be\u030cz\u030ci\u0301 pode\u0301l zo\u0301ny u\u0301lu\u030a' - words_nfc = u'P\u0159\xed\u0161ern\u011b \u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy z\xe1ke\u0159n\xfd u\u010de\u0148 b\u011b\u017e\xed pod\xe9l z\xf3ny \xfal\u016f' - words_nfkc = u'P\u0159\xed\u0161ern\u011b \u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy z\xe1ke\u0159n\xfd u\u010de\u0148 b\u011b\u017e\xed pod\xe9l z\xf3ny \xfal\u016f' - words_nfd = u'Pr\u030ci\u0301s\u030cerne\u030c z\u030clut\u030couc\u030cky\u0301 ku\u030an\u030c u\u0301pe\u030cl d\u030ca\u0301belske\u0301 o\u0301dy za\u0301ker\u030cny\u0301 uc\u030cen\u030c be\u030cz\u030ci\u0301 pode\u0301l zo\u0301ny u\u0301lu\u030a' - - passphrase_nfkd = u'Neuve\u030cr\u030citelne\u030c bezpec\u030cne\u0301 hesli\u0301c\u030cko' - passphrase_nfc = u'Neuv\u011b\u0159iteln\u011b bezpe\u010dn\xe9 hesl\xed\u010dko' - passphrase_nfkc = u'Neuv\u011b\u0159iteln\u011b bezpe\u010dn\xe9 hesl\xed\u010dko' - passphrase_nfd = u'Neuve\u030cr\u030citelne\u030c bezpec\u030cne\u0301 hesli\u0301c\u030cko' - - self.client.wipe_device() - self.client.load_device_by_mnemonic(mnemonic=words_nfkd, pin='', passphrase_protection=True, label='test', language='english', skip_checksum=True) - self.client.set_passphrase(passphrase_nfkd) - address_nfkd = self.client.get_address('Bitcoin', []) - - self.client.wipe_device() - self.client.load_device_by_mnemonic(mnemonic=words_nfc, pin='', passphrase_protection=True, label='test', language='english', skip_checksum=True) - self.client.set_passphrase(passphrase_nfc) - address_nfc = self.client.get_address('Bitcoin', []) - - self.client.wipe_device() - self.client.load_device_by_mnemonic(mnemonic=words_nfkc, pin='', passphrase_protection=True, label='test', language='english', skip_checksum=True) - self.client.set_passphrase(passphrase_nfkc) - address_nfkc = self.client.get_address('Bitcoin', []) - - self.client.wipe_device() - self.client.load_device_by_mnemonic(mnemonic=words_nfd, pin='', passphrase_protection=True, label='test', language='english', skip_checksum=True) - self.client.set_passphrase(passphrase_nfd) - address_nfd = self.client.get_address('Bitcoin', []) - - self.assertEqual(address_nfkd, address_nfc) - self.assertEqual(address_nfkd, address_nfkc) - self.assertEqual(address_nfkd, address_nfd) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_device_recover.py b/tests/test_device_recover.py deleted file mode 100644 index 1f634c7a5..000000000 --- a/tests/test_device_recover.py +++ /dev/null @@ -1,12 +0,0 @@ -import unittest -import common - -from trezorlib import messages_pb2 as messages - -class TestDeviceRecover(common.TrezorTest): - - def test_recover_device(self): - pass - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_device_reset.py b/tests/test_device_reset.py deleted file mode 100644 index 9ddc8665d..000000000 --- a/tests/test_device_reset.py +++ /dev/null @@ -1,175 +0,0 @@ -import unittest -import common -import hashlib - -from trezorlib import messages_pb2 as proto -from mnemonic import Mnemonic - -def generate_entropy(strength, internal_entropy, external_entropy): - ''' - strength - length of produced seed. One of 128, 192, 256 - random - binary stream of random data from external HRNG - ''' - if strength not in (128, 192, 256): - raise Exception("Invalid strength") - - if not internal_entropy: - raise Exception("Internal entropy is not provided") - - if len(internal_entropy) < 32: - raise Exception("Internal entropy too short") - - if not external_entropy: - raise Exception("External entropy is not provided") - - if len(external_entropy) < 32: - raise Exception("External entropy too short") - - entropy = hashlib.sha256(internal_entropy + external_entropy).digest() - entropy_stripped = entropy[:strength / 8] - - if len(entropy_stripped) * 8 != strength: - raise Exception("Entropy length mismatch") - - return entropy_stripped - -class TestDeviceReset(common.TrezorTest): - - def test_reset_device(self): - # No PIN, no passphrase - external_entropy = 'zlutoucky kun upel divoke ody' * 2 - strength = 128 - - ret = self.client.call_raw(proto.ResetDevice(display_random=False, - strength=strength, - passphrase_protection=False, - pin_protection=False, - language='english', - label='test')) - - self.assertIsInstance(ret, proto.ButtonRequest) - self.client.debug.press_yes() - ret = self.client.call_raw(proto.ButtonAck()) - - self.assertIsInstance(ret, proto.EntropyRequest) - ret = self.client.call_raw(proto.EntropyAck(entropy=external_entropy)) - - # Read internal entropy and generate mnemonic locally - internal_entropy = self.client.debug.read_entropy() - entropy = generate_entropy(strength, internal_entropy, external_entropy) - expected_mnemonic = Mnemonic('english').to_mnemonic(entropy) - - mnemonic = [] - for _ in range(12): - self.assertIsInstance(ret, proto.ButtonRequest) - mnemonic.append(self.client.debug.read_word()[0]) - self.client.debug.press_yes() - self.client.call_raw(proto.ButtonAck()) - - mnemonic = ' '.join(mnemonic) - - # Compare that device generated proper mnemonic for given entropies - self.assertEqual(mnemonic, expected_mnemonic) - - mnemonic = [] - for _ in range(12): - self.assertIsInstance(ret, proto.ButtonRequest) - mnemonic.append(self.client.debug.read_word()[0]) - self.client.debug.press_yes() - resp = self.client.call_raw(proto.ButtonAck()) - - self.assertIsInstance(resp, proto.Success) - - mnemonic = ' '.join(mnemonic) - - # Compare that second pass printed out the same mnemonic once again - self.assertEqual(mnemonic, expected_mnemonic) - - # Check if device is properly initialized - resp = self.client.call_raw(proto.Initialize()) - self.assertFalse(resp.pin_protection) - self.assertFalse(resp.passphrase_protection) - - # Do passphrase-protected action, PassphraseRequest should NOT be raised - resp = self.client.call_raw(proto.Ping(passphrase_protection=True)) - self.assertIsInstance(resp, proto.Success) - - # Do PIN-protected action, PinRequest should NOT be raised - resp = self.client.call_raw(proto.Ping(pin_protection=True)) - self.assertIsInstance(resp, proto.Success) - - def test_reset_device_pin(self): - external_entropy = 'zlutoucky kun upel divoke ody' * 2 - strength = 128 - - ret = self.client.call_raw(proto.ResetDevice(display_random=True, - strength=strength, - passphrase_protection=True, - pin_protection=True, - language='english', - label='test')) - - self.assertIsInstance(ret, proto.ButtonRequest) - self.client.debug.press_yes() - ret = self.client.call_raw(proto.ButtonAck()) - - self.assertIsInstance(ret, proto.EntropyRequest) - ret = self.client.call_raw(proto.EntropyAck(entropy=external_entropy)) - - self.assertIsInstance(ret, proto.PinMatrixRequest) - - # Enter PIN for first time - pin_encoded = self.client.debug.encode_pin('654') - ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) - self.assertIsInstance(ret, proto.PinMatrixRequest) - - # Enter PIN for second time - pin_encoded = self.client.debug.encode_pin('654') - ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) - - # Read internal entropy and generate mnemonic locally - internal_entropy = self.client.debug.read_entropy() - entropy = generate_entropy(strength, internal_entropy, external_entropy) - expected_mnemonic = Mnemonic('english').to_mnemonic(entropy) - - mnemonic = [] - for _ in range(12): - self.assertIsInstance(ret, proto.ButtonRequest) - mnemonic.append(self.client.debug.read_word()[0]) - self.client.debug.press_yes() - self.client.call_raw(proto.ButtonAck()) - - mnemonic = ' '.join(mnemonic) - - # Compare that device generated proper mnemonic for given entropies - self.assertEqual(mnemonic, expected_mnemonic) - - mnemonic = [] - for _ in range(12): - self.assertIsInstance(ret, proto.ButtonRequest) - mnemonic.append(self.client.debug.read_word()[0]) - self.client.debug.press_yes() - resp = self.client.call_raw(proto.ButtonAck()) - - self.assertIsInstance(resp, proto.Success) - - mnemonic = ' '.join(mnemonic) - - # Compare that second pass printed out the same mnemonic once again - self.assertEqual(mnemonic, expected_mnemonic) - - # Check if device is properly initialized - resp = self.client.call_raw(proto.Initialize()) - self.assertTrue(resp.pin_protection) - self.assertTrue(resp.passphrase_protection) - - # Do passphrase-protected action, PassphraseRequest should be raised - resp = self.client.call_raw(proto.Ping(passphrase_protection=True)) - self.assertIsInstance(resp, proto.PassphraseRequest) - - # Do PIN-protected action, PinRequest should be raised - resp = self.client.call_raw(proto.Ping(pin_protection=True)) - self.assertIsInstance(resp, proto.PinMatrixRequest) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_device_wipe.py b/tests/test_device_wipe.py deleted file mode 100644 index 0f9c70ade..000000000 --- a/tests/test_device_wipe.py +++ /dev/null @@ -1,25 +0,0 @@ -import unittest -import common - -from trezorlib import messages_pb2 as proto - -class TestDeviceWipe(common.TrezorTest): - def test_wipe_device(self): - self.setup_mnemonic_pin_passphrase() - features = self.client.call_raw(proto.Initialize()) - - self.assertEqual(features.initialized, True) - self.assertEqual(features.pin_protection, True) - self.assertEqual(features.passphrase_protection, True) - device_id = features.device_id - - self.client.wipe_device() - features = self.client.call_raw(proto.Initialize()) - - self.assertEqual(features.initialized, False) - self.assertEqual(features.pin_protection, False) - self.assertEqual(features.passphrase_protection, False) - self.assertNotEqual(features.device_id, device_id) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_entropy.py b/tests/test_entropy.py deleted file mode 100644 index 831a70b23..000000000 --- a/tests/test_entropy.py +++ /dev/null @@ -1,31 +0,0 @@ -import unittest -import common -import math - -import trezorlib.messages_pb2 as proto -import trezorlib.types_pb2 as proto_types - -def entropy(data): - counts = {} - for c in data: - if c in counts: - counts[c] += 1 - else: - counts[c] = 1 - e = 0 - for _, v in counts.iteritems(): - p = 1.0 * v / len(data) - e -= p * math.log(p, 256) - return e - -class TestEntropy(common.TrezorTest): - - def test_entropy(self): - for l in [0, 1, 2, 3, 4, 5, 8, 9, 16, 17, 32, 33, 64, 65, 128, 129, 256, 257, 512, 513, 1024]: - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other), proto.Entropy()]) - ent = self.client.get_entropy(l) - self.assertTrue(len(ent) >= l) - print 'entropy = ', entropy(ent) - -if __name__ == '__main__': - unittest.main() From f6845089d5392a36cce9e580b103433ba7452a33 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 02:32:09 +0100 Subject: [PATCH 0235/1535] Added utf8 tests to sign/verify messages --- tests/test_msg_signmessage.py | 43 +++++++++++++++ tests/test_msg_verifymessage.py | 94 +++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 tests/test_msg_signmessage.py create mode 100644 tests/test_msg_verifymessage.py diff --git a/tests/test_msg_signmessage.py b/tests/test_msg_signmessage.py new file mode 100644 index 000000000..78cdb6d9b --- /dev/null +++ b/tests/test_msg_signmessage.py @@ -0,0 +1,43 @@ +import unittest +import common +import binascii + +from trezorlib.client import CallException + +class TestMsgSignmessage(common.TrezorTest): + + def test_sign(self): + self.setup_mnemonic_nopin_nopassphrase() + sig = self.client.sign_message('Bitcoin', [0], "This is an example of a signed message.") + self.assertEqual(sig.address, '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e') + self.assertEqual(binascii.hexlify(sig.signature), '209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80') + + def test_sign_testnet(self): + self.setup_mnemonic_nopin_nopassphrase() + sig = self.client.sign_message('Testnet', [0], "This is an example of a signed message.") + + self.assertEqual(sig.address, 'mirio8q3gtv7fhdnmb3TpZ4EuafdzSs7zL') + self.assertEqual(binascii.hexlify(sig.signature), '209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80') + + def test_sign_utf(self): + self.setup_mnemonic_nopin_nopassphrase() + + words_nfkd = u'Pr\u030ci\u0301s\u030cerne\u030c z\u030clut\u030couc\u030cky\u0301 ku\u030an\u030c u\u0301pe\u030cl d\u030ca\u0301belske\u0301 o\u0301dy za\u0301ker\u030cny\u0301 uc\u030cen\u030c be\u030cz\u030ci\u0301 pode\u0301l zo\u0301ny u\u0301lu\u030a' + words_nfc = u'P\u0159\xed\u0161ern\u011b \u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy z\xe1ke\u0159n\xfd u\u010de\u0148 b\u011b\u017e\xed pod\xe9l z\xf3ny \xfal\u016f' + + sig_nfkd = self.client.sign_message('Bitcoin', [0], words_nfkd) + self.assertEqual(sig_nfkd.address, '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e') + self.assertEqual(binascii.hexlify(sig_nfkd.signature), '1fd0ec02ed8da8df23e7fe9e680e7867cc290312fe1c970749d8306ddad1a1eda4e39588e4ec2b6a22dda4ec4f562f06e91129eea9a844a7193812de82d47c496b') + + sig_nfc = self.client.sign_message('Bitcoin', [0], words_nfc) + self.assertEqual(sig_nfc.address, '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e') + self.assertEqual(binascii.hexlify(sig_nfc.signature), '1fd0ec02ed8da8df23e7fe9e680e7867cc290312fe1c970749d8306ddad1a1eda4e39588e4ec2b6a22dda4ec4f562f06e91129eea9a844a7193812de82d47c496b') + + def test_too_long(self): + self.setup_mnemonic_nopin_nopassphrase() + + # Message cannot be longer than 255 bytes + self.assertRaises(CallException, self.client.sign_message, 'Bitcoin', [0], '1' * 256) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_msg_verifymessage.py b/tests/test_msg_verifymessage.py new file mode 100644 index 000000000..abc7525c5 --- /dev/null +++ b/tests/test_msg_verifymessage.py @@ -0,0 +1,94 @@ +import unittest +import common +import binascii +import base64 + +from trezorlib.client import CallException + +class TestMsgVerifymessage(common.TrezorTest): + def test_too_long(self): + self.setup_mnemonic_nopin_nopassphrase() + + ret = self.client.verify_message('1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', + binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), + '1' * 256 + ) + self.assertFalse(ret) + + def test_message_testnet(self): + sig = base64.b64decode('IFP/nvQalDo9lWCI7kScOzRkz/fiiScdkw7tFAKPoGbl6S8AY3wEws43s2gR57AfwZP8/8y7+F+wvGK9phQghN4=') + ret = self.client.verify_message('moRDikgmxcpouFtqnKnVVzLYgkDD2gQ3sk', sig, 'Ahoj') + + self.assertTrue(ret) + + def test_message_verify(self): + # uncompressed pubkey - OK + res = self.client.verify_message( + '1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', + binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), + 'This is an example of a signed message.' + ) + self.assertTrue(res) + + # uncompressed pubkey - FAIL + res = self.client.verify_message( + '1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', + binascii.unhexlify('1ba77e01a9e17ba158b96200000000dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), + 'This is an example of a signed message.' + ) + self.assertFalse(res) + + # compressed pubkey - OK + res = self.client.verify_message( + '1C7zdTfnkzmr13HfA2vNm5SJYRK6nEKyq8', + binascii.unhexlify('1f44e3e461f7ca9f57c472ce1a28214df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), + 'This is an example of a signed message.') + self.assertTrue(res) + + # compressed pubkey - FAIL + res = self.client.verify_message( + '1C7zdTfnkzmr13HfA2vNm5SJYRK6nEKyq8', + binascii.unhexlify('1f44e3e461f7ca9f57c472000000004df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), + 'This is an example of a signed message.' + ) + self.assertFalse(res) + + # trezor pubkey - OK + res = self.client.verify_message( + '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', + binascii.unhexlify('209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), + 'This is an example of a signed message.' + ) + self.assertTrue(res) + + # trezor pubkey - FAIL + res = self.client.verify_message( + '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', + binascii.unhexlify('209e23edf0e4e47ff1de000002cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), + 'This is an example of a signed message.' + ) + self.assertFalse(res) + + def test_verify_utf(self): + self.setup_mnemonic_nopin_nopassphrase() + + words_nfkd = u'Pr\u030ci\u0301s\u030cerne\u030c z\u030clut\u030couc\u030cky\u0301 ku\u030an\u030c u\u0301pe\u030cl d\u030ca\u0301belske\u0301 o\u0301dy za\u0301ker\u030cny\u0301 uc\u030cen\u030c be\u030cz\u030ci\u0301 pode\u0301l zo\u0301ny u\u0301lu\u030a' + words_nfc = u'P\u0159\xed\u0161ern\u011b \u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy z\xe1ke\u0159n\xfd u\u010de\u0148 b\u011b\u017e\xed pod\xe9l z\xf3ny \xfal\u016f' + + res_nfkd = self.client.verify_message( + '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', + binascii.unhexlify('1fd0ec02ed8da8df23e7fe9e680e7867cc290312fe1c970749d8306ddad1a1eda4e39588e4ec2b6a22dda4ec4f562f06e91129eea9a844a7193812de82d47c496b'), + words_nfkd + ) + + res_nfc = self.client.verify_message( + '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', + binascii.unhexlify('1fd0ec02ed8da8df23e7fe9e680e7867cc290312fe1c970749d8306ddad1a1eda4e39588e4ec2b6a22dda4ec4f562f06e91129eea9a844a7193812de82d47c496b'), + words_nfc + ) + + self.assertTrue(res_nfkd) + self.assertTrue(res_nfc) + +if __name__ == '__main__': + unittest.main() From 80aabfaa0fb492833584e986a26678feaa1f155b Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 02:32:37 +0100 Subject: [PATCH 0236/1535] Added coin_type to sign_message --- cmd.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd.py b/cmd.py index a1a14f0e0..62fdb2c00 100755 --- a/cmd.py +++ b/cmd.py @@ -135,7 +135,7 @@ class Commands(object): args.pin_protection, args.label, 'english') def sign_message(self, args): - ret = self.client.sign_message(args.n, args.message) + ret = self.client.sign_message(args.coin, args.n, args.message) output = { 'message': args.message, 'address': ret.address, @@ -226,6 +226,7 @@ class Commands(object): ) sign_message.arguments = ( + (('-c', '--coin'), {'type': str, 'default': 'Bitcoin'}), (('n',), {'metavar': 'N', 'type': int, 'nargs': '+'}), (('message',), {'type': str}), ) From 1a15cbafb4d396affd99f710de208e4e5d79c946 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 02:33:08 +0100 Subject: [PATCH 0237/1535] Changed unittest's TODO --- tests/test.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test.py b/tests/test.py index 71184e1aa..af4aebd87 100755 --- a/tests/test.py +++ b/tests/test.py @@ -4,14 +4,14 @@ TODO: * ApplySettings workflow, zistit cez Features ci sa zmeny aplikovali -* WipeDevice workflow, zistit cez Features ci to prebehlo -* LoadDevice workflow, zistit cez Features ci to prebehlo +x WipeDevice workflow, zistit cez Features ci to prebehlo +x LoadDevice workflow, zistit cez Features ci to prebehlo x ResetDevice workflow - zrejme v sucinnosti s inymi testami - * ButtonRequest/ButtonAck workflow (vyvolat napr. pomocou GetEntropy, myslim ze ten GetEntropy vyzaduje PIN, ale ja by som to dal na button) - * PinMatrixRequest/PinMatrixAck workflow (vyvolat napr. pomocou ChangePin) - * PassphraseRequest/PassphraseAck workflow (vyvolat napr. pomocou GetAddress) + x ButtonRequest/ButtonAck workflow + x PinMatrixRequest/PinMatrixAck workflow + x PassphraseRequest/PassphraseAck workflow * rozsirit test_sign.tx o viac transakcii (zlozitejsich) x fee over threshold @@ -32,6 +32,6 @@ x ResetDevice workflow x Zero signature test -* test bip39, utf, passphrase +x test bip39, utf, passphrase x Clear session on ChangePin ''' From ca14d1a995315fc30efa387a1923ad229e485f93 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 02:33:23 +0100 Subject: [PATCH 0238/1535] Renamed unit tests for better consistency --- tests/test_messages.py | 83 --------------- tests/test_msg_getentropy.py | 31 ++++++ tests/test_msg_loaddevice.py | 68 ++++++++++++ tests/test_msg_recoverydevice.py | 12 +++ tests/test_msg_resetdevice.py | 175 +++++++++++++++++++++++++++++++ tests/test_msg_wipedevice.py | 25 +++++ 6 files changed, 311 insertions(+), 83 deletions(-) delete mode 100644 tests/test_messages.py create mode 100644 tests/test_msg_getentropy.py create mode 100644 tests/test_msg_loaddevice.py create mode 100644 tests/test_msg_recoverydevice.py create mode 100644 tests/test_msg_resetdevice.py create mode 100644 tests/test_msg_wipedevice.py diff --git a/tests/test_messages.py b/tests/test_messages.py deleted file mode 100644 index 0104f0af5..000000000 --- a/tests/test_messages.py +++ /dev/null @@ -1,83 +0,0 @@ -import unittest -import common -import binascii -import base64 - -from trezorlib.client import CallException - -class TestMessages(common.TrezorTest): - - def test_message_sign(self): - self.setup_mnemonic_nopin_nopassphrase() - sig = self.client.sign_message([0], "This is an example of a signed message.") - self.assertEqual(sig.address, '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e') - self.assertEqual(binascii.hexlify(sig.signature), '209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80') - - def test_too_long(self): - self.setup_mnemonic_nopin_nopassphrase() - - # Message cannot be longer than 255 bytes - self.assertRaises(CallException, self.client.sign_message, [0], '1' * 256) - - ret = self.client.verify_message('1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', - binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), - '1' * 256 - ) - self.assertFalse(ret) - - def test_message_testnet(self): - sig = base64.b64decode('IFP/nvQalDo9lWCI7kScOzRkz/fiiScdkw7tFAKPoGbl6S8AY3wEws43s2gR57AfwZP8/8y7+F+wvGK9phQghN4=') - ret = self.client.verify_message('moRDikgmxcpouFtqnKnVVzLYgkDD2gQ3sk', sig, 'Ahoj') - - self.assertTrue(ret) - - def test_message_verify(self): - # uncompressed pubkey - OK - res = self.client.verify_message( - '1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', - binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), - 'This is an example of a signed message.' - ) - self.assertTrue(res) - - # uncompressed pubkey - FAIL - res = self.client.verify_message( - '1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', - binascii.unhexlify('1ba77e01a9e17ba158b96200000000dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), - 'This is an example of a signed message.' - ) - self.assertFalse(res) - - # compressed pubkey - OK - res = self.client.verify_message( - '1C7zdTfnkzmr13HfA2vNm5SJYRK6nEKyq8', - binascii.unhexlify('1f44e3e461f7ca9f57c472ce1a28214df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), - 'This is an example of a signed message.') - self.assertTrue(res) - - # compressed pubkey - FAIL - res = self.client.verify_message( - '1C7zdTfnkzmr13HfA2vNm5SJYRK6nEKyq8', - binascii.unhexlify('1f44e3e461f7ca9f57c472000000004df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), - 'This is an example of a signed message.' - ) - self.assertFalse(res) - - # trezor pubkey - OK - res = self.client.verify_message( - '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', - binascii.unhexlify('209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), - 'This is an example of a signed message.' - ) - self.assertTrue(res) - - # trezor pubkey - FAIL - res = self.client.verify_message( - '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', - binascii.unhexlify('209e23edf0e4e47ff1de000002cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), - 'This is an example of a signed message.' - ) - self.assertFalse(res) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_msg_getentropy.py b/tests/test_msg_getentropy.py new file mode 100644 index 000000000..831a70b23 --- /dev/null +++ b/tests/test_msg_getentropy.py @@ -0,0 +1,31 @@ +import unittest +import common +import math + +import trezorlib.messages_pb2 as proto +import trezorlib.types_pb2 as proto_types + +def entropy(data): + counts = {} + for c in data: + if c in counts: + counts[c] += 1 + else: + counts[c] = 1 + e = 0 + for _, v in counts.iteritems(): + p = 1.0 * v / len(data) + e -= p * math.log(p, 256) + return e + +class TestEntropy(common.TrezorTest): + + def test_entropy(self): + for l in [0, 1, 2, 3, 4, 5, 8, 9, 16, 17, 32, 33, 64, 65, 128, 129, 256, 257, 512, 513, 1024]: + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other), proto.Entropy()]) + ent = self.client.get_entropy(l) + self.assertTrue(len(ent) >= l) + print 'entropy = ', entropy(ent) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_msg_loaddevice.py b/tests/test_msg_loaddevice.py new file mode 100644 index 000000000..c7f27ff2c --- /dev/null +++ b/tests/test_msg_loaddevice.py @@ -0,0 +1,68 @@ +import unittest +import common + +from trezorlib import messages_pb2 as messages + +class TestDeviceLoad(common.TrezorTest): + + def test_load_device_1(self): + self.setup_mnemonic_nopin_nopassphrase() + + mnemonic = self.client.debug.read_mnemonic() + self.assertEqual(mnemonic, self.mnemonic12) + + pin = self.client.debug.read_pin()[0] + self.assertEqual(pin, '') + + passphrase_protection = self.client.debug.read_passphrase_protection() + self.assertEqual(passphrase_protection, False) + + def test_load_device_2(self): + self.setup_mnemonic_pin_passphrase() + + mnemonic = self.client.debug.read_mnemonic() + self.assertEqual(mnemonic, self.mnemonic12) + + pin = self.client.debug.read_pin()[0] + self.assertEqual(pin, self.pin4) + + passphrase_protection = self.client.debug.read_passphrase_protection() + self.assertEqual(passphrase_protection, True) + + def test_load_device_utf(self): + words_nfkd = u'Pr\u030ci\u0301s\u030cerne\u030c z\u030clut\u030couc\u030cky\u0301 ku\u030an\u030c u\u0301pe\u030cl d\u030ca\u0301belske\u0301 o\u0301dy za\u0301ker\u030cny\u0301 uc\u030cen\u030c be\u030cz\u030ci\u0301 pode\u0301l zo\u0301ny u\u0301lu\u030a' + words_nfc = u'P\u0159\xed\u0161ern\u011b \u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy z\xe1ke\u0159n\xfd u\u010de\u0148 b\u011b\u017e\xed pod\xe9l z\xf3ny \xfal\u016f' + words_nfkc = u'P\u0159\xed\u0161ern\u011b \u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy z\xe1ke\u0159n\xfd u\u010de\u0148 b\u011b\u017e\xed pod\xe9l z\xf3ny \xfal\u016f' + words_nfd = u'Pr\u030ci\u0301s\u030cerne\u030c z\u030clut\u030couc\u030cky\u0301 ku\u030an\u030c u\u0301pe\u030cl d\u030ca\u0301belske\u0301 o\u0301dy za\u0301ker\u030cny\u0301 uc\u030cen\u030c be\u030cz\u030ci\u0301 pode\u0301l zo\u0301ny u\u0301lu\u030a' + + passphrase_nfkd = u'Neuve\u030cr\u030citelne\u030c bezpec\u030cne\u0301 hesli\u0301c\u030cko' + passphrase_nfc = u'Neuv\u011b\u0159iteln\u011b bezpe\u010dn\xe9 hesl\xed\u010dko' + passphrase_nfkc = u'Neuv\u011b\u0159iteln\u011b bezpe\u010dn\xe9 hesl\xed\u010dko' + passphrase_nfd = u'Neuve\u030cr\u030citelne\u030c bezpec\u030cne\u0301 hesli\u0301c\u030cko' + + self.client.wipe_device() + self.client.load_device_by_mnemonic(mnemonic=words_nfkd, pin='', passphrase_protection=True, label='test', language='english', skip_checksum=True) + self.client.set_passphrase(passphrase_nfkd) + address_nfkd = self.client.get_address('Bitcoin', []) + + self.client.wipe_device() + self.client.load_device_by_mnemonic(mnemonic=words_nfc, pin='', passphrase_protection=True, label='test', language='english', skip_checksum=True) + self.client.set_passphrase(passphrase_nfc) + address_nfc = self.client.get_address('Bitcoin', []) + + self.client.wipe_device() + self.client.load_device_by_mnemonic(mnemonic=words_nfkc, pin='', passphrase_protection=True, label='test', language='english', skip_checksum=True) + self.client.set_passphrase(passphrase_nfkc) + address_nfkc = self.client.get_address('Bitcoin', []) + + self.client.wipe_device() + self.client.load_device_by_mnemonic(mnemonic=words_nfd, pin='', passphrase_protection=True, label='test', language='english', skip_checksum=True) + self.client.set_passphrase(passphrase_nfd) + address_nfd = self.client.get_address('Bitcoin', []) + + self.assertEqual(address_nfkd, address_nfc) + self.assertEqual(address_nfkd, address_nfkc) + self.assertEqual(address_nfkd, address_nfd) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_msg_recoverydevice.py b/tests/test_msg_recoverydevice.py new file mode 100644 index 000000000..1f634c7a5 --- /dev/null +++ b/tests/test_msg_recoverydevice.py @@ -0,0 +1,12 @@ +import unittest +import common + +from trezorlib import messages_pb2 as messages + +class TestDeviceRecover(common.TrezorTest): + + def test_recover_device(self): + pass + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_msg_resetdevice.py b/tests/test_msg_resetdevice.py new file mode 100644 index 000000000..9ddc8665d --- /dev/null +++ b/tests/test_msg_resetdevice.py @@ -0,0 +1,175 @@ +import unittest +import common +import hashlib + +from trezorlib import messages_pb2 as proto +from mnemonic import Mnemonic + +def generate_entropy(strength, internal_entropy, external_entropy): + ''' + strength - length of produced seed. One of 128, 192, 256 + random - binary stream of random data from external HRNG + ''' + if strength not in (128, 192, 256): + raise Exception("Invalid strength") + + if not internal_entropy: + raise Exception("Internal entropy is not provided") + + if len(internal_entropy) < 32: + raise Exception("Internal entropy too short") + + if not external_entropy: + raise Exception("External entropy is not provided") + + if len(external_entropy) < 32: + raise Exception("External entropy too short") + + entropy = hashlib.sha256(internal_entropy + external_entropy).digest() + entropy_stripped = entropy[:strength / 8] + + if len(entropy_stripped) * 8 != strength: + raise Exception("Entropy length mismatch") + + return entropy_stripped + +class TestDeviceReset(common.TrezorTest): + + def test_reset_device(self): + # No PIN, no passphrase + external_entropy = 'zlutoucky kun upel divoke ody' * 2 + strength = 128 + + ret = self.client.call_raw(proto.ResetDevice(display_random=False, + strength=strength, + passphrase_protection=False, + pin_protection=False, + language='english', + label='test')) + + self.assertIsInstance(ret, proto.ButtonRequest) + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + self.assertIsInstance(ret, proto.EntropyRequest) + ret = self.client.call_raw(proto.EntropyAck(entropy=external_entropy)) + + # Read internal entropy and generate mnemonic locally + internal_entropy = self.client.debug.read_entropy() + entropy = generate_entropy(strength, internal_entropy, external_entropy) + expected_mnemonic = Mnemonic('english').to_mnemonic(entropy) + + mnemonic = [] + for _ in range(12): + self.assertIsInstance(ret, proto.ButtonRequest) + mnemonic.append(self.client.debug.read_word()[0]) + self.client.debug.press_yes() + self.client.call_raw(proto.ButtonAck()) + + mnemonic = ' '.join(mnemonic) + + # Compare that device generated proper mnemonic for given entropies + self.assertEqual(mnemonic, expected_mnemonic) + + mnemonic = [] + for _ in range(12): + self.assertIsInstance(ret, proto.ButtonRequest) + mnemonic.append(self.client.debug.read_word()[0]) + self.client.debug.press_yes() + resp = self.client.call_raw(proto.ButtonAck()) + + self.assertIsInstance(resp, proto.Success) + + mnemonic = ' '.join(mnemonic) + + # Compare that second pass printed out the same mnemonic once again + self.assertEqual(mnemonic, expected_mnemonic) + + # Check if device is properly initialized + resp = self.client.call_raw(proto.Initialize()) + self.assertFalse(resp.pin_protection) + self.assertFalse(resp.passphrase_protection) + + # Do passphrase-protected action, PassphraseRequest should NOT be raised + resp = self.client.call_raw(proto.Ping(passphrase_protection=True)) + self.assertIsInstance(resp, proto.Success) + + # Do PIN-protected action, PinRequest should NOT be raised + resp = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(resp, proto.Success) + + def test_reset_device_pin(self): + external_entropy = 'zlutoucky kun upel divoke ody' * 2 + strength = 128 + + ret = self.client.call_raw(proto.ResetDevice(display_random=True, + strength=strength, + passphrase_protection=True, + pin_protection=True, + language='english', + label='test')) + + self.assertIsInstance(ret, proto.ButtonRequest) + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + self.assertIsInstance(ret, proto.EntropyRequest) + ret = self.client.call_raw(proto.EntropyAck(entropy=external_entropy)) + + self.assertIsInstance(ret, proto.PinMatrixRequest) + + # Enter PIN for first time + pin_encoded = self.client.debug.encode_pin('654') + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + self.assertIsInstance(ret, proto.PinMatrixRequest) + + # Enter PIN for second time + pin_encoded = self.client.debug.encode_pin('654') + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Read internal entropy and generate mnemonic locally + internal_entropy = self.client.debug.read_entropy() + entropy = generate_entropy(strength, internal_entropy, external_entropy) + expected_mnemonic = Mnemonic('english').to_mnemonic(entropy) + + mnemonic = [] + for _ in range(12): + self.assertIsInstance(ret, proto.ButtonRequest) + mnemonic.append(self.client.debug.read_word()[0]) + self.client.debug.press_yes() + self.client.call_raw(proto.ButtonAck()) + + mnemonic = ' '.join(mnemonic) + + # Compare that device generated proper mnemonic for given entropies + self.assertEqual(mnemonic, expected_mnemonic) + + mnemonic = [] + for _ in range(12): + self.assertIsInstance(ret, proto.ButtonRequest) + mnemonic.append(self.client.debug.read_word()[0]) + self.client.debug.press_yes() + resp = self.client.call_raw(proto.ButtonAck()) + + self.assertIsInstance(resp, proto.Success) + + mnemonic = ' '.join(mnemonic) + + # Compare that second pass printed out the same mnemonic once again + self.assertEqual(mnemonic, expected_mnemonic) + + # Check if device is properly initialized + resp = self.client.call_raw(proto.Initialize()) + self.assertTrue(resp.pin_protection) + self.assertTrue(resp.passphrase_protection) + + # Do passphrase-protected action, PassphraseRequest should be raised + resp = self.client.call_raw(proto.Ping(passphrase_protection=True)) + self.assertIsInstance(resp, proto.PassphraseRequest) + + # Do PIN-protected action, PinRequest should be raised + resp = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(resp, proto.PinMatrixRequest) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_msg_wipedevice.py b/tests/test_msg_wipedevice.py new file mode 100644 index 000000000..0f9c70ade --- /dev/null +++ b/tests/test_msg_wipedevice.py @@ -0,0 +1,25 @@ +import unittest +import common + +from trezorlib import messages_pb2 as proto + +class TestDeviceWipe(common.TrezorTest): + def test_wipe_device(self): + self.setup_mnemonic_pin_passphrase() + features = self.client.call_raw(proto.Initialize()) + + self.assertEqual(features.initialized, True) + self.assertEqual(features.pin_protection, True) + self.assertEqual(features.passphrase_protection, True) + device_id = features.device_id + + self.client.wipe_device() + features = self.client.call_raw(proto.Initialize()) + + self.assertEqual(features.initialized, False) + self.assertEqual(features.pin_protection, False) + self.assertEqual(features.passphrase_protection, False) + self.assertNotEqual(features.device_id, device_id) + +if __name__ == '__main__': + unittest.main() From c743765a1bf2566ad37b7c13eccb11cd08344c38 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 02:35:41 +0100 Subject: [PATCH 0239/1535] Renamed unit tests --- tests/{test_addresses.py => test_msg_getaddress.py} | 0 tests/{test_pings.py => test_msg_ping.py} | 0 tests/{test_signtx.py => test_msg_simplesigntx.py} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename tests/{test_addresses.py => test_msg_getaddress.py} (100%) rename tests/{test_pings.py => test_msg_ping.py} (100%) rename tests/{test_signtx.py => test_msg_simplesigntx.py} (100%) diff --git a/tests/test_addresses.py b/tests/test_msg_getaddress.py similarity index 100% rename from tests/test_addresses.py rename to tests/test_msg_getaddress.py diff --git a/tests/test_pings.py b/tests/test_msg_ping.py similarity index 100% rename from tests/test_pings.py rename to tests/test_msg_ping.py diff --git a/tests/test_signtx.py b/tests/test_msg_simplesigntx.py similarity index 100% rename from tests/test_signtx.py rename to tests/test_msg_simplesigntx.py From 2e326bae91b81d454f82141a2e5df7d8d6682bdb Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 04:46:12 +0100 Subject: [PATCH 0240/1535] Reworked&updated unittest todo --- tests/test.py | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/tests/test.py b/tests/test.py index af4aebd87..2ce87f98f 100755 --- a/tests/test.py +++ b/tests/test.py @@ -3,32 +3,45 @@ TODO: -* ApplySettings workflow, zistit cez Features ci sa zmeny aplikovali -x WipeDevice workflow, zistit cez Features ci to prebehlo -x LoadDevice workflow, zistit cez Features ci to prebehlo -x ResetDevice workflow +ApplySettings +x ChangePin +x Ping +x GetEntropy +GetPublicKey +x GetAddress +x WipeDevice +x LoadDevice +x ResetDevice +RecoveryDevice +x SignMessage +x VerifyMessage +EstimateTxSize +- SignTx +x SimpleSignTx +FirmwareErase +FirmwareUpload - zrejme v sucinnosti s inymi testami x ButtonRequest/ButtonAck workflow x PinMatrixRequest/PinMatrixAck workflow x PassphraseRequest/PassphraseAck workflow -* rozsirit test_sign.tx o viac transakcii (zlozitejsich) - x fee over threshold - x not enough funds - x viac ako jeden vstup a jeden vystup - x iny cointype ako 0 +- rozsirit test_sign.tx o viac transakcii (zlozitejsich) + x fee over threshold + x not enough funds + x viac ako jeden vstup a jeden vystup + x iny cointype ako 0 - chceme v tomto release(?) x SignMessage workflow x VerifyMessage workflow -* otestovat session handling (tento test bude zrejme failovat na RPi) -* Failure_NotInitialized -* Features reflects all variations of LoadDevice -* Maxfee settings -* Client requires OTP -* Client requires PIN +otestovat session handling (tento test bude zrejme failovat na RPi) +Failure_NotInitialized +Features reflects all variations of LoadDevice +Maxfee settings +Client requires OTP +Client requires PIN x Zero signature test From 9310465946c5373bd3987c7824c6c8563f88d358 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 04:46:33 +0100 Subject: [PATCH 0241/1535] ChangePin unittest --- tests/test_msg_changepin.py | 131 ++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 tests/test_msg_changepin.py diff --git a/tests/test_msg_changepin.py b/tests/test_msg_changepin.py new file mode 100644 index 000000000..1594d9549 --- /dev/null +++ b/tests/test_msg_changepin.py @@ -0,0 +1,131 @@ +import time +import unittest +import common + +from trezorlib import messages_pb2 as proto +from trezorlib import types_pb2 as proto_types + +class TestMsgChangepin(common.TrezorTest): + def test_set_pin(self): + self.setup_mnemonic_nopin_nopassphrase() + features = self.client.call_raw(proto.Initialize()) + self.assertFalse(features.pin_protection) + + # Check that there's no PIN protection + ret = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(ret, proto.Success) + + # Let's set new PIN + ret = self.client.call_raw(proto.ChangePin()) + self.assertIsInstance(ret, proto.ButtonRequest) + + # Press button + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + # Send the PIN for first time + self.assertIsInstance(ret, proto.PinMatrixRequest) + pin_encoded = self.client.debug.encode_pin(self.pin6) + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Send the PIN for second time + self.assertIsInstance(ret, proto.PinMatrixRequest) + pin_encoded = self.client.debug.encode_pin(self.pin6) + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Now we're done + self.assertIsInstance(ret, proto.Success) + + # Check that there's PIN protection now + features = self.client.call_raw(proto.Initialize()) + self.assertTrue(features.pin_protection) + ret = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(ret, proto.PinMatrixRequest) + + # Check that the PIN is correct + self.assertEqual(self.client.debug.read_pin()[0], self.pin6) + + def test_change_pin(self): + self.setup_mnemonic_pin_passphrase() + features = self.client.call_raw(proto.Initialize()) + self.assertTrue(features.pin_protection) + + # Check that there's PIN protection + ret = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(ret, proto.PinMatrixRequest) + self.client.call_raw(proto.Cancel()) + + # Check current PIN value + self.assertEqual(self.client.debug.read_pin()[0], self.pin4) + + # Let's change PIN + ret = self.client.call_raw(proto.ChangePin()) + self.assertIsInstance(ret, proto.ButtonRequest) + + # Press button + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + # Send current PIN + self.assertIsInstance(ret, proto.PinMatrixRequest) + pin_encoded = self.client.debug.read_pin_encoded() + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Send new PIN for first time + self.assertIsInstance(ret, proto.PinMatrixRequest) + pin_encoded = self.client.debug.encode_pin(self.pin6) + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Send the PIN for second time + self.assertIsInstance(ret, proto.PinMatrixRequest) + pin_encoded = self.client.debug.encode_pin(self.pin6) + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Now we're done + self.assertIsInstance(ret, proto.Success) + + # Check that there's still PIN protection now + features = self.client.call_raw(proto.Initialize()) + self.assertTrue(features.pin_protection) + ret = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(ret, proto.PinMatrixRequest) + self.client.call_raw(proto.Cancel()) + + # Check that the PIN is correct + self.assertEqual(self.client.debug.read_pin()[0], self.pin6) + + + def test_remove_pin(self): + self.setup_mnemonic_pin_passphrase() + features = self.client.call_raw(proto.Initialize()) + self.assertTrue(features.pin_protection) + + # Check that there's PIN protection + ret = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(ret, proto.PinMatrixRequest) + self.client.call_raw(proto.Cancel()) + + # Let's remove PIN + ret = self.client.call_raw(proto.ChangePin(remove=True)) + self.assertIsInstance(ret, proto.ButtonRequest) + + # Press button + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + # Send current PIN + self.assertIsInstance(ret, proto.PinMatrixRequest) + pin_encoded = self.client.debug.read_pin_encoded() + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Now we're done + self.assertIsInstance(ret, proto.Success) + + # Check that there's no PIN protection now + features = self.client.call_raw(proto.Initialize()) + self.assertFalse(features.pin_protection) + ret = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(ret, proto.Success) + +if __name__ == '__main__': + unittest.main() From eae7d98b8aff38f7e4c86a9fc83c5506cb7e1790 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 07:28:10 +0100 Subject: [PATCH 0242/1535] set_expected_responses enforces using 'with' statement --- trezorlib/client.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index b08eea2fa..a5dfff445 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -148,7 +148,7 @@ class TextUIMixin(object): def callback_WordRequest(self, msg): word = raw_input("Enter one word of mnemonic: ") return proto.WordAck(word=word) - + class DebugLinkMixin(object): # This class implements automatic responses # and other functionality for unit tests @@ -163,12 +163,13 @@ class DebugLinkMixin(object): def __init__(self, *args, **kwargs): super(DebugLinkMixin, self).__init__(*args, **kwargs) self.debug = None + self.in_with_statement = 0 # Always press Yes and provide correct pin self.setup_debuglink(True, True) # Do not expect any specific response from device - self.set_expected_responses(None) + self.expected_responses = None # Use blank passphrase self.set_passphrase('') @@ -181,7 +182,26 @@ class DebugLinkMixin(object): def set_debuglink(self, debug_transport): self.debug = DebugLink(debug_transport) + def __enter__(self): + # For usage in with/expected_responses + self.in_with_statement += 1 + return self + + def __exit__(self, *args): + self.in_with_statement -= 1 + + # Evaluate missed responses in 'with' statement + if self.expected_responses != None and len(self.expected_responses): + raise Exception("Some of expected responses didn't come from device: %s" % \ + [ pprint(x) for x in self.expected_responses ]) + + # Cleanup + self.expected_responses = None + return False + def set_expected_responses(self, expected): + if not self.in_with_statement: + raise Exception("Must be called inside 'with' statement") self.expected_responses = expected def setup_debuglink(self, button, pin_correct): @@ -195,14 +215,6 @@ class DebugLinkMixin(object): resp = super(DebugLinkMixin, self).call_raw(msg) self._check_request(resp) return resp - - def call(self, msg): - ret = super(DebugLinkMixin, self).call(msg) - - if self.expected_responses != None and len(self.expected_responses): - raise Exception("Some of expected responses didn't come from device: %s" % \ - [ pprint(x) for x in self.expected_responses ]) - return ret def _check_request(self, msg): if self.expected_responses != None: From 640d290129df51414d458af0da575eefe26489d1 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 07:28:56 +0100 Subject: [PATCH 0243/1535] Implements 'with' + set_expected_responses --- tests/test.py | 2 + tests/test_bip32_speed.py | 6 +- tests/test_msg_getaddress.py | 2 +- tests/test_msg_getentropy.py | 11 ++-- tests/test_msg_ping.py | 50 ++++++++------- tests/test_msg_simplesigntx.py | 113 ++++++++++++++++++--------------- tests/test_protect_call.py | 81 +++++++++++++---------- 7 files changed, 147 insertions(+), 118 deletions(-) diff --git a/tests/test.py b/tests/test.py index 2ce87f98f..86fe03cc2 100755 --- a/tests/test.py +++ b/tests/test.py @@ -21,6 +21,8 @@ x SimpleSignTx FirmwareErase FirmwareUpload +protection levels + - zrejme v sucinnosti s inymi testami x ButtonRequest/ButtonAck workflow x PinMatrixRequest/PinMatrixAck workflow diff --git a/tests/test_bip32_speed.py b/tests/test_bip32_speed.py index 34bf0acb4..9d38b6107 100644 --- a/tests/test_bip32_speed.py +++ b/tests/test_bip32_speed.py @@ -3,7 +3,7 @@ import common import time from trezorlib import tools -class TestAddresses(common.TrezorTest): +class TestBip32Speed(common.TrezorTest): def test_public_ckd(self): self.setup_mnemonic_nopin_nopassphrase() @@ -13,7 +13,7 @@ class TestAddresses(common.TrezorTest): start = time.time() self.client.get_address('Bitcoin', range(depth)) delay = time.time() - start - expected = (depth + 1) * 0.25 + expected = (depth + 1) * 0.26 print "DEPTH", depth, "EXPECTED DELAY", expected, "REAL DELAY", delay self.assertLessEqual(delay, expected) @@ -26,7 +26,7 @@ class TestAddresses(common.TrezorTest): start = time.time() self.client.get_address('Bitcoin', range(-depth, 0)) delay = time.time() - start - expected = (depth + 1) * 0.25 + expected = (depth + 1) * 0.26 print "DEPTH", depth, "EXPECTED DELAY", expected, "REAL DELAY", delay self.assertLessEqual(delay, expected) diff --git a/tests/test_msg_getaddress.py b/tests/test_msg_getaddress.py index 2f3fce7bd..b6419e02d 100644 --- a/tests/test_msg_getaddress.py +++ b/tests/test_msg_getaddress.py @@ -3,7 +3,7 @@ import common import trezorlib.ckd_public as bip32 from trezorlib import tools -class TestAddresses(common.TrezorTest): +class TestMsgGetaddress(common.TrezorTest): def test_btc(self): self.setup_mnemonic_nopin_nopassphrase() diff --git a/tests/test_msg_getentropy.py b/tests/test_msg_getentropy.py index 831a70b23..5eae42d45 100644 --- a/tests/test_msg_getentropy.py +++ b/tests/test_msg_getentropy.py @@ -18,14 +18,15 @@ def entropy(data): e -= p * math.log(p, 256) return e -class TestEntropy(common.TrezorTest): +class TestMsgGetentropy(common.TrezorTest): def test_entropy(self): for l in [0, 1, 2, 3, 4, 5, 8, 9, 16, 17, 32, 33, 64, 65, 128, 129, 256, 257, 512, 513, 1024]: - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other), proto.Entropy()]) - ent = self.client.get_entropy(l) - self.assertTrue(len(ent) >= l) - print 'entropy = ', entropy(ent) + with self.client: + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other), proto.Entropy()]) + ent = self.client.get_entropy(l) + self.assertTrue(len(ent) >= l) + print 'entropy = ', entropy(ent) if __name__ == '__main__': unittest.main() diff --git a/tests/test_msg_ping.py b/tests/test_msg_ping.py index 1fbe3123d..8fc5326ad 100644 --- a/tests/test_msg_ping.py +++ b/tests/test_msg_ping.py @@ -10,33 +10,39 @@ class TestPing(common.TrezorTest): def test_ping(self): self.setup_mnemonic_pin_passphrase() - self.client.set_expected_responses([proto.Success()]) - res = self.client.ping('random data') - self.assertEqual(res, 'random data') - - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other),proto.Success()]) - res = self.client.ping('random data', button_protection=True) - self.assertEqual(res, 'random data') - - self.client.set_expected_responses([proto.PinMatrixRequest(),proto.Success()]) - res = self.client.ping('random data', pin_protection=True) - self.assertEqual(res, 'random data') - - self.client.set_expected_responses([proto.PassphraseRequest(),proto.Success()]) - res = self.client.ping('random data', passphrase_protection=True) - self.assertEqual(res, 'random data') + with self.client: + self.client.set_expected_responses([proto.Success()]) + res = self.client.ping('random data') + self.assertEqual(res, 'random data') + + with self.client: + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other), proto.Success()]) + res = self.client.ping('random data', button_protection=True) + self.assertEqual(res, 'random data') + + with self.client: + self.client.set_expected_responses([proto.PinMatrixRequest(), proto.Success()]) + res = self.client.ping('random data', pin_protection=True) + self.assertEqual(res, 'random data') + + with self.client: + self.client.set_expected_responses([proto.PassphraseRequest(), proto.Success()]) + res = self.client.ping('random data', passphrase_protection=True) + self.assertEqual(res, 'random data') def test_ping_caching(self): self.setup_mnemonic_pin_passphrase() - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other),proto.PinMatrixRequest(),proto.PassphraseRequest(),proto.Success()]) - res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) - self.assertEqual(res, 'random data') + with self.client: + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other), proto.PinMatrixRequest(), proto.PassphraseRequest(), proto.Success()]) + res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) + self.assertEqual(res, 'random data') - # pin and passphrase are cached - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other),proto.Success()]) - res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) - self.assertEqual(res, 'random data') + with self.client: + # pin and passphrase are cached + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other), proto.Success()]) + res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) + self.assertEqual(res, 'random data') if __name__ == '__main__': unittest.main() diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index 4dbd2c47d..f2e2f37fd 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -55,10 +55,11 @@ class TestSignTx(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_index=-1)]) - tx = self.client.call(msg) + with self.client: + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_index=-1)]) + tx = self.client.call(msg) # Accepted by network: tx fd79435246dee76b2f159d2db08032d666c95adc544de64c8c49f474df4a7fee self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') @@ -84,12 +85,13 @@ class TestSignTx(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - self.client.set_tx_func(FakeTestnetBlockchain().get_tx) - msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest()]) - tx = self.client.call(msg) + with self.client: + self.client.set_tx_func(FakeTestnetBlockchain().get_tx) + msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest()]) + tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b4830450221009c2d30385519fdb13dce13d5ac038be07d7b2dad0b0f7b2c1c339d7255bcf553022056a2f5bceab3cd0ffed4d388387e631f419d67ff9ce7798e3d7dfe6a6d6ec4bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0280ce341d000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') @@ -114,13 +116,14 @@ class TestSignTx(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - self.client.set_tx_func(FakeTestnetBlockchain().get_tx) - msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), - proto.TxRequest()]) - tx = self.client.call(msg) + with self.client: + self.client.set_tx_func(FakeTestnetBlockchain().get_tx) + msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), + proto.TxRequest()]) + tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') @@ -146,11 +149,12 @@ class TestSignTx(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2]) - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest()]) - tx = self.client.call(msg) + with self.client: + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest()]) + tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef1702201d481d04216b319dc549ffe2333143629ba18828a4e2d1783ab719a6aa263eb70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') @@ -181,12 +185,13 @@ class TestSignTx(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2, out3]) - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest()]) - tx = self.client.call(msg) + with self.client: + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2, out3]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest()]) + tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02207b0879a81408a11e23b11d4c7965c62b5fc6d5c2d92340f5ee2da7b40e99314a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') @@ -220,11 +225,12 @@ class TestSignTx(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], [out1, out2]) - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest()]) - tx = self.client.call(msg) + with self.client: + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], [out1, out2]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest()]) + tx = self.client.call(msg) # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb self.assertEqual(binascii.hexlify(tx.serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') @@ -260,10 +266,11 @@ class TestSignTx(common.TrezorTest): ) outputs.append(out) - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], outputs) - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), ] * 255 + \ - [proto.TxRequest(), ]) - tx = self.client.call(msg) + with self.client: + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], outputs) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), ] * 255 + \ + [proto.TxRequest(), ]) + tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') ''' @@ -285,11 +292,12 @@ class TestSignTx(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), - proto.TxRequest()]) - tx = self.client.call(msg) + with self.client: + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), + proto.TxRequest()]) + tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') @@ -310,16 +318,17 @@ class TestSignTx(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.Failure(code=proto_types.Failure_NotEnoughFunds)]) - - try: - self.client.call(msg) - except CallException as e: - self.assertEqual(e.args[0], proto_types.Failure_NotEnoughFunds) - else: - self.assert_(False, "types.Failure_NotEnoughFunds expected") + with self.client: + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.Failure(code=proto_types.Failure_NotEnoughFunds)]) + + try: + self.client.call(msg) + except CallException as e: + self.assertEqual(e.args[0], proto_types.Failure_NotEnoughFunds) + else: + self.assert_(False, "types.Failure_NotEnoughFunds expected") def test_estimate_size(self): self.setup_mnemonic_nopin_nopassphrase() diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index 0a946f722..3ce98c68b 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -23,49 +23,59 @@ class TestProtectCall(common.TrezorTest): # This is low-level test of set_expected_responses() # feature of debugging client - # Scenario 1 - Received unexpected message - self.client.set_expected_responses([]) - self.assertRaises(CallException, self._some_protected_call, True, True, True) - - # Scenario 2 - Received other than expected message - self.client.set_expected_responses([proto.Success()]) - self.assertRaises(CallException, self._some_protected_call, True, True, True) - - # Scenario 3 - Not received expected message - self.client.set_expected_responses([proto.ButtonRequest(), - proto.Success(), - proto.Success()]) # This is expected, but not received - self.assertRaises(Exception, self._some_protected_call, True, False, False) - - # Scenario 4 - Received what expected - self.client.set_expected_responses([proto.ButtonRequest(), - proto.PinMatrixRequest(), - proto.PassphraseRequest(), - proto.Success(message='random data')]) - self._some_protected_call(True, True, True) - - # Scenario 5 - Failed message by field filter - self.client.set_expected_responses([proto.ButtonRequest(), - proto.PinMatrixRequest(), - proto.Success(message='wrong data')]) - self.assertRaises(CallException, self._some_protected_call, True, True, True) + with self.client: + # Scenario 1 - Received unexpected message + self.client.set_expected_responses([]) + self.assertRaises(CallException, self._some_protected_call, True, True, True) + + with self.client: + # Scenario 2 - Received other than expected message + self.client.set_expected_responses([proto.Success()]) + self.assertRaises(CallException, self._some_protected_call, True, True, True) + + def scenario3(): + with self.client: + # Scenario 3 - Not received expected message + self.client.set_expected_responses([proto.ButtonRequest(), + proto.Success(), + proto.Success()]) # This is expected, but not received + self._some_protected_call(True, False, False) + self.assertRaises(Exception, scenario3) + + with self.client: + # Scenario 4 - Received what expected + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.PassphraseRequest(), + proto.Success(message='random data')]) + self._some_protected_call(True, True, True) + + def scenario5(): + with self.client: + # Scenario 5 - Failed message by field filter + self.client.set_expected_responses([proto.ButtonRequest(), + proto.Success(message='wrong data')]) + self._some_protected_call(True, True, True) + self.assertRaises(CallException, scenario5) def test_no_protection(self): self.setup_mnemonic_nopin_nopassphrase() - self.assertEqual(self.client.debug.read_pin()[0], '') - self.client.set_expected_responses([proto.Success()]) - self._some_protected_call(False, True, True) + with self.client: + self.assertEqual(self.client.debug.read_pin()[0], '') + self.client.set_expected_responses([proto.Success()]) + self._some_protected_call(False, True, True) def test_pin(self): self.setup_mnemonic_pin_passphrase() - self.assertEqual(self.client.debug.read_pin()[0], self.pin4) - self.client.setup_debuglink(button=True, pin_correct=True) - self.client.set_expected_responses([proto.ButtonRequest(), - proto.PinMatrixRequest(), - proto.Success()]) - self._some_protected_call(True, True, False) + with self.client: + self.assertEqual(self.client.debug.read_pin()[0], self.pin4) + self.client.setup_debuglink(button=True, pin_correct=True) + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.Success()]) + self._some_protected_call(True, True, False) def test_incorrect_pin(self): self.setup_mnemonic_pin_passphrase() @@ -94,6 +104,7 @@ class TestProtectCall(common.TrezorTest): start = time.time() self.assertRaises(PinException, self._some_protected_call, False, True, False) test_backoff(attempt, start) + ''' # Unplug Trezor now self.client.debuglink.stop() From 729fac20773d027dbf63e012fc094beefeb1025f Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 21 Feb 2014 18:56:51 +0100 Subject: [PATCH 0244/1535] add coin param to get_public_node call; new test for getpublickey message --- cmd.py | 3 ++- tests/test_msg_getaddress.py | 1 - tests/test_msg_getpublickey.py | 28 ++++++++++++++++++++++++++++ trezorlib/ckd_public.py | 14 ++++++++++++++ trezorlib/client.py | 5 +++-- 5 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 tests/test_msg_getpublickey.py diff --git a/cmd.py b/cmd.py index 62fdb2c00..6c3161e97 100755 --- a/cmd.py +++ b/cmd.py @@ -102,7 +102,7 @@ class Commands(object): def get_public_node(self, args): address_n = self.client.expand_path(args.n) - return self.client.get_public_node(address_n) + return self.client.get_public_node(args.coin, address_n) def set_label(self, args): return self.client.apply_settings(label=args.label) @@ -238,6 +238,7 @@ class Commands(object): ) get_public_node.arguments = ( + (('-c', '--coin'), {'type': str, 'default': 'Bitcoin'}), (('-n', '-address'), {'type': str}), ) diff --git a/tests/test_msg_getaddress.py b/tests/test_msg_getaddress.py index b6419e02d..b13a4b422 100644 --- a/tests/test_msg_getaddress.py +++ b/tests/test_msg_getaddress.py @@ -1,7 +1,6 @@ import unittest import common import trezorlib.ckd_public as bip32 -from trezorlib import tools class TestMsgGetaddress(common.TrezorTest): diff --git a/tests/test_msg_getpublickey.py b/tests/test_msg_getpublickey.py new file mode 100644 index 000000000..40547c20d --- /dev/null +++ b/tests/test_msg_getpublickey.py @@ -0,0 +1,28 @@ +import unittest +import common +import trezorlib.ckd_public as bip32 + +class TestMsgGetpublic_key(common.TrezorTest): + + def test_btc(self): + self.setup_mnemonic_nopin_nopassphrase() + self.assertEqual(bip32.serialize( self.client.get_public_node('Bitcoin', []) ), 'xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') + self.assertEqual(bip32.serialize( self.client.get_public_node('Bitcoin', [1]) ), 'xpub68zNxjsTrV8y9AadThLW7dTAqEpZ7xBLFSyJ3X9pjTv6Njg6kxgjXJkzxq8u3ttnjBw1jupQHMP3gpGZzZqd1eh5S4GjkaMhPR18vMyUi8N') + self.assertEqual(bip32.serialize( self.client.get_public_node('Bitcoin', [0, -1]) ), 'xpub6A3FoZqYXj1AbW4thRwBh26YwZWbmoyjTaZwwxJjY1oKUpefLepL3RFS9DHKQrjAfxDrzDepYMDZPqXN6upQm3bHQ9xaXD5a3mqni3goF4v') + self.assertEqual(bip32.serialize( self.client.get_public_node('Bitcoin', [-9, 0]) ), 'xpub6A2h5mzLDfYginoD7q7wCWbq18wTbN9gducRr2w5NRTwdLeoT3cJSwefFqW7uXTpVFGtpUyDMBNYs3DNvvXx6NPjF9YEbUQrtxFSWnPtVrv') + self.assertEqual(bip32.serialize( self.client.get_public_node('Bitcoin', [0, 9999999]) ), 'xpub6A3FoZqQEK6iwLZ4HFkqSo5fb35BH4bpjC4SPZ63prfLdGYPwYxEuC6o91bUvFFdMzKWe5rs3axHRUjxJaSvBnKKFtnfLwDACRxPxabsv2r') + + def test_ltc(self): + self.setup_mnemonic_nopin_nopassphrase() + self.assertEqual(bip32.serialize( self.client.get_public_node('Litecoin', []) ), 'Ltub2SSUS19CirucVPGDKDBatBDBEM2s9UbH66pBURfaKrMocCPLhQ7Z7hecy5VYLHA5fRdXwB2e61j2VJCNzVsqKTCVEU1vECjqi5EyczFX9xp') + self.assertEqual(bip32.serialize( self.client.get_public_node('Litecoin', [1]) ), 'Ltub2VRVRP5VjvSyPXra4BLVyVZPv397sjhUNjBGsbtw6xko77JuQyBULxFSKheviJJ3KQLbL3Cx8P2RnudguTw4raUVjCACRG7jsumUptYx55C') + self.assertEqual(bip32.serialize( self.client.get_public_node('Litecoin', [0, -1]) ), 'Ltub2WUNGD3aRAKAqsLqHuwBYtCn2MqAXbVsarmvn33quWe2DCHTzfK4s4jsW5oM5G8RGAdSaM3NPNrwVvtV1ourbyNhhHr3BtqcYGc8caf5GoT') + self.assertEqual(bip32.serialize( self.client.get_public_node('Litecoin', [-9, 0]) ), 'Ltub2WToYRCN76rgyA59iK7w4Ni45wG2M9fpmBpQg7gBjvJeMiHc7473Gb96ci29Zvs55TgUQcMmCD1vy8aVqpdPwJB9YHRhGAAuPT1nRLLXmFu') + self.assertEqual(bip32.serialize( self.client.get_public_node('Litecoin', [0, 9999999]) ), 'Ltub2WUNGD3S7kQjBhpzsjkqJfBtfqPk2r7xrUGRDdqACMW3MeBCbZSyiqbEVt7WaeesxCj6EDFQtcbfXa75DUYN2i6jZ2g81cyCgvijs9J2u2n') + + def test_tbtc(self): + self.setup_mnemonic_nopin_nopassphrase() + self.assertEqual(bip32.serialize( self.client.get_public_node('Testnet', [111, 42]) ), 'tpubDAgixSyai5PWbc8N1mBkHDR5nLgAnHFtY7r4y5EzxqAxrt9YUDpZL3kaRoHVvCfrcwNo31c2isBP2uTHcZxEosuKbyJhCAbrvGoPuLUZ7Mz') + +if __name__ == '__main__': + unittest.main() diff --git a/trezorlib/ckd_public.py b/trezorlib/ckd_public.py index 83b7b7d34..bec0bad1a 100644 --- a/trezorlib/ckd_public.py +++ b/trezorlib/ckd_public.py @@ -90,3 +90,17 @@ def get_subnode(node, i): node_out.public_key = point_to_pubkey(point) return node_out + +def serialize(node): + s = '' + s += struct.pack('>I', node.version) + s += struct.pack('>B', node.depth) + s += struct.pack('>I', node.fingerprint) + s += struct.pack('>I', node.child_num) + s += node.chain_code + if node.private_key: + s += '\x00' + node.private_key + else : + s += node.public_key + s += tools.Hash(s)[:4] + return tools.b58encode(s) diff --git a/trezorlib/client.py b/trezorlib/client.py index a5dfff445..aa20348ed 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -306,8 +306,9 @@ class ProtocolMixin(object): @field('node') @expect(proto.PublicKey) - def get_public_node(self, n): - return self.call(proto.GetPublicKey(address_n=n)) + def get_public_node(self, coin_name, n): + n = self._convert_prime(n) + return self.call(proto.GetPublicKey(address_n=n, coin_name=coin_name)) @field('address') @expect(proto.Address) From f2cb352ac39524e886373959cb6c19d028c1c185 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 21 Feb 2014 19:13:14 +0100 Subject: [PATCH 0245/1535] don't pprint FirmwareUpload message --- trezorlib/client.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index aa20348ed..ccade33e9 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -17,7 +17,10 @@ def get_buttonrequest_value(code): return [ k for k, v in types.ButtonRequestType.items() if v == code][0] def pprint(msg): - return "<%s> (%d bytes):\n%s" % (msg.__class__.__name__, msg.ByteSize(), msg) + if isinstance(msg, proto.FirmwareUpload): + return "<%s> (%d bytes):\n" % (msg.__class__.__name__, msg.ByteSize()) + else: + return "<%s> (%d bytes):\n%s" % (msg.__class__.__name__, msg.ByteSize(), msg) class CallException(Exception): def __init__(self, code, message): From 4ca5b9e5e256a82c7bb0b4822b3d6116d652f333 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 21 Feb 2014 21:31:13 +0100 Subject: [PATCH 0246/1535] fix get_public_node call in test_msg_getaddress --- tests/test_msg_getaddress.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_msg_getaddress.py b/tests/test_msg_getaddress.py index b13a4b422..9b9c361da 100644 --- a/tests/test_msg_getaddress.py +++ b/tests/test_msg_getaddress.py @@ -27,8 +27,8 @@ class TestMsgGetaddress(common.TrezorTest): def test_public_ckd(self): self.setup_mnemonic_nopin_nopassphrase() - node = self.client.get_public_node([]) - node_sub1 = self.client.get_public_node([1]) + node = self.client.get_public_node('Bitcoin', []) + node_sub1 = self.client.get_public_node('Bitcoin', [1]) node_sub2 = bip32.public_ckd(node, [1]) self.assertEqual(node_sub1.chain_code, node_sub2.chain_code) From 4b699962445e095d810358f4044ce051e28f97f8 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 21:00:56 +0100 Subject: [PATCH 0247/1535] Implemented DebugLink->word request --- trezorlib/client.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index ccade33e9..89fb98dc8 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -190,9 +190,14 @@ class DebugLinkMixin(object): self.in_with_statement += 1 return self - def __exit__(self, *args): + def __exit__(self, _type, value, traceback): self.in_with_statement -= 1 + if _type != None: + # Another exception raised + return False + + # return isinstance(value, TypeError) # Evaluate missed responses in 'with' statement if self.expected_responses != None and len(self.expected_responses): raise Exception("Some of expected responses didn't come from device: %s" % \ @@ -212,7 +217,10 @@ class DebugLinkMixin(object): self.pin_correct = pin_correct def set_passphrase(self, passphrase): - self.passphrase = str(bytearray(passphrase, 'utf-8')) + self.passphrase = str(bytearray(Mnemonic.normalize_string(passphrase), 'utf-8')) + + def set_mnemonic(self, mnemonic): + self.mnemonic = str(bytearray(Mnemonic.normalize_string(mnemonic), 'utf-8')).split(' ') def call_raw(self, msg): resp = super(DebugLinkMixin, self).call_raw(msg) @@ -256,7 +264,13 @@ class DebugLinkMixin(object): return proto.PassphraseAck(passphrase=self.passphrase) def callback_WordRequest(self, msg): - raise Exception("Not implemented yet") + (word, pos) = self.debug.read_word() + if word != '': + return proto.WordAck(word=word) + if pos != 0: + return proto.WordAck(word=self.mnemonic[pos - 1]) + + raise Exception("Unexpected call") class ProtocolMixin(object): PRIME_DERIVATION_FLAG = 0x80000000 @@ -466,7 +480,9 @@ class ProtocolMixin(object): external_entropy = self._get_local_entropy() print "Computer generated entropy:", binascii.hexlify(external_entropy) - return self.call(proto.EntropyAck(entropy=external_entropy)) + ret = self.call(proto.EntropyAck(entropy=external_entropy)) + self.init_device() + return ret @field('message') @expect(proto.Success) From 60e23c38d3a4e924002b299f25e9dcfb7538ce6a Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 22:15:27 +0100 Subject: [PATCH 0248/1535] Compiled pb --- trezorlib/messages_pb2.py | 127 ++++++++++++++++++-------------------- trezorlib/types_pb2.py | 83 ++++++++++--------------- 2 files changed, 91 insertions(+), 119 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 8c07461c9..438c5569f 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"E\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x12\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"=\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\xac\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa5\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xc0\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x0c\n\x04word\x18\x07 \x01(\x0c\x12\x10\n\x08word_pos\x18\x08 \x01(\x05\x12\x0f\n\x07\x65ntropy\x18\t \x01(\x0c\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"E\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x12\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\xac\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa5\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xc0\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x0c\n\x04word\x18\x07 \x01(\x0c\x12\x10\n\x08word_pos\x18\x08 \x01(\x05\x12\x0f\n\x07\x65ntropy\x18\t \x01(\x0c\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -206,8 +206,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2912, - serialized_end=4493, + serialized_start=2884, + serialized_end=4465, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -812,13 +812,6 @@ _GETPUBLICKEY = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - _descriptor.FieldDescriptor( - name='coin_name', full_name='GetPublicKey.coin_name', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=True, default_value="Bitcoin", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -829,7 +822,7 @@ _GETPUBLICKEY = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=897, - serialized_end=958, + serialized_end=930, ) @@ -856,8 +849,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=960, - serialized_end=998, + serialized_start=932, + serialized_end=970, ) @@ -891,8 +884,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1000, - serialized_end=1059, + serialized_start=972, + serialized_end=1031, ) @@ -919,8 +912,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1061, - serialized_end=1087, + serialized_start=1033, + serialized_end=1059, ) @@ -940,8 +933,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1089, - serialized_end=1101, + serialized_start=1061, + serialized_end=1073, ) @@ -1010,8 +1003,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1104, - serialized_end=1276, + serialized_start=1076, + serialized_end=1248, ) @@ -1073,8 +1066,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1279, - serialized_end=1442, + serialized_start=1251, + serialized_end=1414, ) @@ -1094,8 +1087,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1444, - serialized_end=1460, + serialized_start=1416, + serialized_end=1432, ) @@ -1122,8 +1115,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1462, - serialized_end=1497, + serialized_start=1434, + serialized_end=1469, ) @@ -1185,8 +1178,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1500, - serialized_end=1665, + serialized_start=1472, + serialized_end=1637, ) @@ -1206,8 +1199,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1667, - serialized_end=1680, + serialized_start=1639, + serialized_end=1652, ) @@ -1234,8 +1227,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1682, - serialized_end=1711, + serialized_start=1654, + serialized_end=1683, ) @@ -1276,8 +1269,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1713, - serialized_end=1796, + serialized_start=1685, + serialized_end=1768, ) @@ -1318,8 +1311,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1798, - serialized_end=1878, + serialized_start=1770, + serialized_end=1850, ) @@ -1353,8 +1346,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1880, - serialized_end=1940, + serialized_start=1852, + serialized_end=1912, ) @@ -1395,8 +1388,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1942, - serialized_end=2031, + serialized_start=1914, + serialized_end=2003, ) @@ -1423,8 +1416,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2033, - serialized_end=2058, + serialized_start=2005, + serialized_end=2030, ) @@ -1465,8 +1458,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2060, - serialized_end=2141, + serialized_start=2032, + serialized_end=2113, ) @@ -1514,8 +1507,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2144, - serialized_end=2288, + serialized_start=2116, + serialized_end=2260, ) @@ -1570,8 +1563,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2291, - serialized_end=2437, + serialized_start=2263, + serialized_end=2409, ) @@ -1598,8 +1591,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2439, - serialized_end=2477, + serialized_start=2411, + serialized_end=2449, ) @@ -1626,8 +1619,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2479, - serialized_end=2520, + serialized_start=2451, + serialized_end=2492, ) @@ -1647,8 +1640,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2522, - serialized_end=2537, + serialized_start=2494, + serialized_end=2509, ) @@ -1675,8 +1668,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2539, - serialized_end=2578, + serialized_start=2511, + serialized_end=2550, ) @@ -1703,8 +1696,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2580, - serialized_end=2615, + serialized_start=2552, + serialized_end=2587, ) @@ -1724,8 +1717,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2617, - serialized_end=2636, + serialized_start=2589, + serialized_end=2608, ) @@ -1808,8 +1801,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2639, - serialized_end=2831, + serialized_start=2611, + serialized_end=2803, ) @@ -1829,8 +1822,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2833, - serialized_end=2848, + serialized_start=2805, + serialized_end=2820, ) @@ -1871,8 +1864,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2850, - serialized_end=2909, + serialized_start=2822, + serialized_end=2881, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index f5c71b7b3..126e77900 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xb4\x01\n\nHDNodeType\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\r\n\x05\x64\x65pth\x18\x02 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x03 \x02(\r\x12\x11\n\tchild_num\x18\x04 \x02(\r\x12\x18\n\nchain_code\x18\x05 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x07 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x08 \x01(\x0c\"\x86\x01\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x13\n\x0bser_private\x18\x05 \x01(\r\x12\x12\n\nser_public\x18\x06 \x01(\r\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\xec\x01\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xa3\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x18\n\nchain_code\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x07 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\xec\x01\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,8 +74,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=825, - serialized_end=1158, + serialized_start=766, + serialized_end=1099, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -96,8 +96,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1160, - serialized_end=1211, + serialized_start=1101, + serialized_end=1152, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -118,8 +118,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1213, - serialized_end=1253, + serialized_start=1154, + serialized_end=1194, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -160,8 +160,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1256, - serialized_end=1492, + serialized_start=1197, + serialized_end=1433, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -239,57 +239,50 @@ _HDNODETYPE = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='version', full_name='HDNodeType.version', index=0, + name='depth', full_name='HDNodeType.depth', index=0, number=1, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='depth', full_name='HDNodeType.depth', index=1, + name='fingerprint', full_name='HDNodeType.fingerprint', index=1, number=2, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='fingerprint', full_name='HDNodeType.fingerprint', index=2, + name='child_num', full_name='HDNodeType.child_num', index=2, number=3, type=13, cpp_type=3, label=2, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='child_num', full_name='HDNodeType.child_num', index=3, - number=4, type=13, cpp_type=3, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='chain_code', full_name='HDNodeType.chain_code', index=4, - number=5, type=12, cpp_type=9, label=2, + name='chain_code', full_name='HDNodeType.chain_code', index=3, + number=4, type=12, cpp_type=9, label=2, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), _descriptor.FieldDescriptor( - name='private_key', full_name='HDNodeType.private_key', index=5, - number=6, type=12, cpp_type=9, label=1, + name='private_key', full_name='HDNodeType.private_key', index=4, + number=5, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), _descriptor.FieldDescriptor( - name='public_key', full_name='HDNodeType.public_key', index=6, - number=7, type=12, cpp_type=9, label=1, + name='public_key', full_name='HDNodeType.public_key', index=5, + number=6, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), _descriptor.FieldDescriptor( - name='address', full_name='HDNodeType.address', index=7, - number=8, type=12, cpp_type=9, label=1, + name='address', full_name='HDNodeType.address', index=6, + number=7, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -304,7 +297,7 @@ _HDNODETYPE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=50, - serialized_end=230, + serialized_end=213, ) @@ -343,20 +336,6 @@ _COINTYPE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - _descriptor.FieldDescriptor( - name='ser_private', full_name='CoinType.ser_private', index=4, - number=5, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='ser_public', full_name='CoinType.ser_public', index=5, - number=6, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -366,8 +345,8 @@ _COINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=233, - serialized_end=367, + serialized_start=215, + serialized_end=308, ) @@ -422,8 +401,8 @@ _TXINPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=370, - serialized_end=503, + serialized_start=311, + serialized_end=444, ) @@ -478,8 +457,8 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=505, - serialized_end=632, + serialized_start=446, + serialized_end=573, ) @@ -513,8 +492,8 @@ _TXOUTPUTBINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=634, - serialized_end=696, + serialized_start=575, + serialized_end=637, ) @@ -562,8 +541,8 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=698, - serialized_end=822, + serialized_start=639, + serialized_end=763, ) _TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _SCRIPTTYPE From e19c8881c0de822ec394399a26db841cb8763d06 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 22:15:48 +0100 Subject: [PATCH 0249/1535] Removed 'version' from HDNodeType & fixed unit tests --- tests/test_msg_getpublickey.py | 22 +++++++++++----------- trezorlib/ckd_public.py | 4 ++-- trezorlib/client.py | 5 ++--- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/tests/test_msg_getpublickey.py b/tests/test_msg_getpublickey.py index 40547c20d..3dc74cd04 100644 --- a/tests/test_msg_getpublickey.py +++ b/tests/test_msg_getpublickey.py @@ -6,23 +6,23 @@ class TestMsgGetpublic_key(common.TrezorTest): def test_btc(self): self.setup_mnemonic_nopin_nopassphrase() - self.assertEqual(bip32.serialize( self.client.get_public_node('Bitcoin', []) ), 'xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') - self.assertEqual(bip32.serialize( self.client.get_public_node('Bitcoin', [1]) ), 'xpub68zNxjsTrV8y9AadThLW7dTAqEpZ7xBLFSyJ3X9pjTv6Njg6kxgjXJkzxq8u3ttnjBw1jupQHMP3gpGZzZqd1eh5S4GjkaMhPR18vMyUi8N') - self.assertEqual(bip32.serialize( self.client.get_public_node('Bitcoin', [0, -1]) ), 'xpub6A3FoZqYXj1AbW4thRwBh26YwZWbmoyjTaZwwxJjY1oKUpefLepL3RFS9DHKQrjAfxDrzDepYMDZPqXN6upQm3bHQ9xaXD5a3mqni3goF4v') - self.assertEqual(bip32.serialize( self.client.get_public_node('Bitcoin', [-9, 0]) ), 'xpub6A2h5mzLDfYginoD7q7wCWbq18wTbN9gducRr2w5NRTwdLeoT3cJSwefFqW7uXTpVFGtpUyDMBNYs3DNvvXx6NPjF9YEbUQrtxFSWnPtVrv') - self.assertEqual(bip32.serialize( self.client.get_public_node('Bitcoin', [0, 9999999]) ), 'xpub6A3FoZqQEK6iwLZ4HFkqSo5fb35BH4bpjC4SPZ63prfLdGYPwYxEuC6o91bUvFFdMzKWe5rs3axHRUjxJaSvBnKKFtnfLwDACRxPxabsv2r') + self.assertEqual(bip32.serialize(self.client.get_public_node([]), 0x0488B21E), 'xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') + self.assertEqual(bip32.serialize(self.client.get_public_node([1]), 0x0488B21E), 'xpub68zNxjsTrV8y9AadThLW7dTAqEpZ7xBLFSyJ3X9pjTv6Njg6kxgjXJkzxq8u3ttnjBw1jupQHMP3gpGZzZqd1eh5S4GjkaMhPR18vMyUi8N') + self.assertEqual(bip32.serialize(self.client.get_public_node([0, -1]), 0x0488B21E), 'xpub6A3FoZqYXj1AbW4thRwBh26YwZWbmoyjTaZwwxJjY1oKUpefLepL3RFS9DHKQrjAfxDrzDepYMDZPqXN6upQm3bHQ9xaXD5a3mqni3goF4v') + self.assertEqual(bip32.serialize(self.client.get_public_node([-9, 0]), 0x0488B21E), 'xpub6A2h5mzLDfYginoD7q7wCWbq18wTbN9gducRr2w5NRTwdLeoT3cJSwefFqW7uXTpVFGtpUyDMBNYs3DNvvXx6NPjF9YEbUQrtxFSWnPtVrv') + self.assertEqual(bip32.serialize(self.client.get_public_node([0, 9999999]), 0x0488B21E), 'xpub6A3FoZqQEK6iwLZ4HFkqSo5fb35BH4bpjC4SPZ63prfLdGYPwYxEuC6o91bUvFFdMzKWe5rs3axHRUjxJaSvBnKKFtnfLwDACRxPxabsv2r') def test_ltc(self): self.setup_mnemonic_nopin_nopassphrase() - self.assertEqual(bip32.serialize( self.client.get_public_node('Litecoin', []) ), 'Ltub2SSUS19CirucVPGDKDBatBDBEM2s9UbH66pBURfaKrMocCPLhQ7Z7hecy5VYLHA5fRdXwB2e61j2VJCNzVsqKTCVEU1vECjqi5EyczFX9xp') - self.assertEqual(bip32.serialize( self.client.get_public_node('Litecoin', [1]) ), 'Ltub2VRVRP5VjvSyPXra4BLVyVZPv397sjhUNjBGsbtw6xko77JuQyBULxFSKheviJJ3KQLbL3Cx8P2RnudguTw4raUVjCACRG7jsumUptYx55C') - self.assertEqual(bip32.serialize( self.client.get_public_node('Litecoin', [0, -1]) ), 'Ltub2WUNGD3aRAKAqsLqHuwBYtCn2MqAXbVsarmvn33quWe2DCHTzfK4s4jsW5oM5G8RGAdSaM3NPNrwVvtV1ourbyNhhHr3BtqcYGc8caf5GoT') - self.assertEqual(bip32.serialize( self.client.get_public_node('Litecoin', [-9, 0]) ), 'Ltub2WToYRCN76rgyA59iK7w4Ni45wG2M9fpmBpQg7gBjvJeMiHc7473Gb96ci29Zvs55TgUQcMmCD1vy8aVqpdPwJB9YHRhGAAuPT1nRLLXmFu') - self.assertEqual(bip32.serialize( self.client.get_public_node('Litecoin', [0, 9999999]) ), 'Ltub2WUNGD3S7kQjBhpzsjkqJfBtfqPk2r7xrUGRDdqACMW3MeBCbZSyiqbEVt7WaeesxCj6EDFQtcbfXa75DUYN2i6jZ2g81cyCgvijs9J2u2n') + self.assertEqual(bip32.serialize(self.client.get_public_node([]), 0x019dA462), 'Ltub2SSUS19CirucVPGDKDBatBDBEM2s9UbH66pBURfaKrMocCPLhQ7Z7hecy5VYLHA5fRdXwB2e61j2VJCNzVsqKTCVEU1vECjqi5EyczFX9xp') + self.assertEqual(bip32.serialize(self.client.get_public_node([1]), 0x019dA462), 'Ltub2VRVRP5VjvSyPXra4BLVyVZPv397sjhUNjBGsbtw6xko77JuQyBULxFSKheviJJ3KQLbL3Cx8P2RnudguTw4raUVjCACRG7jsumUptYx55C') + self.assertEqual(bip32.serialize(self.client.get_public_node([0, -1]), 0x019dA462), 'Ltub2WUNGD3aRAKAqsLqHuwBYtCn2MqAXbVsarmvn33quWe2DCHTzfK4s4jsW5oM5G8RGAdSaM3NPNrwVvtV1ourbyNhhHr3BtqcYGc8caf5GoT') + self.assertEqual(bip32.serialize(self.client.get_public_node([-9, 0]), 0x019dA462), 'Ltub2WToYRCN76rgyA59iK7w4Ni45wG2M9fpmBpQg7gBjvJeMiHc7473Gb96ci29Zvs55TgUQcMmCD1vy8aVqpdPwJB9YHRhGAAuPT1nRLLXmFu') + self.assertEqual(bip32.serialize(self.client.get_public_node([0, 9999999]), 0x019dA462), 'Ltub2WUNGD3S7kQjBhpzsjkqJfBtfqPk2r7xrUGRDdqACMW3MeBCbZSyiqbEVt7WaeesxCj6EDFQtcbfXa75DUYN2i6jZ2g81cyCgvijs9J2u2n') def test_tbtc(self): self.setup_mnemonic_nopin_nopassphrase() - self.assertEqual(bip32.serialize( self.client.get_public_node('Testnet', [111, 42]) ), 'tpubDAgixSyai5PWbc8N1mBkHDR5nLgAnHFtY7r4y5EzxqAxrt9YUDpZL3kaRoHVvCfrcwNo31c2isBP2uTHcZxEosuKbyJhCAbrvGoPuLUZ7Mz') + self.assertEqual(bip32.serialize(self.client.get_public_node([111, 42]), 0x043587CF), 'tpubDAgixSyai5PWbc8N1mBkHDR5nLgAnHFtY7r4y5EzxqAxrt9YUDpZL3kaRoHVvCfrcwNo31c2isBP2uTHcZxEosuKbyJhCAbrvGoPuLUZ7Mz') if __name__ == '__main__': unittest.main() diff --git a/trezorlib/ckd_public.py b/trezorlib/ckd_public.py index bec0bad1a..cfd829139 100644 --- a/trezorlib/ckd_public.py +++ b/trezorlib/ckd_public.py @@ -91,9 +91,9 @@ def get_subnode(node, i): return node_out -def serialize(node): +def serialize(node, version=0x0488B21E): s = '' - s += struct.pack('>I', node.version) + s += struct.pack('>I', version) s += struct.pack('>B', node.depth) s += struct.pack('>I', node.fingerprint) s += struct.pack('>I', node.child_num) diff --git a/trezorlib/client.py b/trezorlib/client.py index 89fb98dc8..18fb281b1 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -323,9 +323,9 @@ class ProtocolMixin(object): @field('node') @expect(proto.PublicKey) - def get_public_node(self, coin_name, n): + def get_public_node(self, n): n = self._convert_prime(n) - return self.call(proto.GetPublicKey(address_n=n, coin_name=coin_name)) + return self.call(proto.GetPublicKey(address_n=n)) @field('address') @expect(proto.Address) @@ -538,7 +538,6 @@ class ProtocolMixin(object): # privkey 00e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35 # checksum e77e9d71 - node.version = int(data[0:8], 16) node.depth = int(data[8:10], 16) node.fingerprint = int(data[10:18], 16) node.child_num = int(data[18:26], 16) From 39348895f924ce1f4f3ad2edc726e3609b1915c5 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 22:19:55 +0100 Subject: [PATCH 0250/1535] Fixed unittest for get_subnode CKD --- tests/test.py | 1 + tests/test_msg_getaddress.py | 4 ++-- trezorlib/ckd_public.py | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test.py b/tests/test.py index 86fe03cc2..37753fe01 100755 --- a/tests/test.py +++ b/tests/test.py @@ -22,6 +22,7 @@ FirmwareErase FirmwareUpload protection levels +neuspesna zmena pinu - zrejme v sucinnosti s inymi testami x ButtonRequest/ButtonAck workflow diff --git a/tests/test_msg_getaddress.py b/tests/test_msg_getaddress.py index 9b9c361da..b13a4b422 100644 --- a/tests/test_msg_getaddress.py +++ b/tests/test_msg_getaddress.py @@ -27,8 +27,8 @@ class TestMsgGetaddress(common.TrezorTest): def test_public_ckd(self): self.setup_mnemonic_nopin_nopassphrase() - node = self.client.get_public_node('Bitcoin', []) - node_sub1 = self.client.get_public_node('Bitcoin', [1]) + node = self.client.get_public_node([]) + node_sub1 = self.client.get_public_node([1]) node_sub2 = bip32.public_ckd(node, [1]) self.assertEqual(node_sub1.chain_code, node_sub2.chain_code) diff --git a/trezorlib/ckd_public.py b/trezorlib/ckd_public.py index cfd829139..d85f97f48 100644 --- a/trezorlib/ckd_public.py +++ b/trezorlib/ckd_public.py @@ -72,7 +72,6 @@ def get_subnode(node, i): I_left_as_exponent = string_to_number(I64[:32]) node_out = proto_types.HDNodeType() - node_out.version = node.version node_out.depth = node.depth + 1 node_out.child_num = i node_out.chain_code = I64[32:] From 2708ccd8ba932f1bb3c9f0d56ea89d00a27d08ba Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 22:22:19 +0100 Subject: [PATCH 0251/1535] Test of change pin failure --- tests/test_msg_changepin.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/test_msg_changepin.py b/tests/test_msg_changepin.py index 1594d9549..102515385 100644 --- a/tests/test_msg_changepin.py +++ b/tests/test_msg_changepin.py @@ -127,5 +127,41 @@ class TestMsgChangepin(common.TrezorTest): ret = self.client.call_raw(proto.Ping(pin_protection=True)) self.assertIsInstance(ret, proto.Success) + def test_set_failed(self): + self.setup_mnemonic_nopin_nopassphrase() + features = self.client.call_raw(proto.Initialize()) + self.assertFalse(features.pin_protection) + + # Check that there's no PIN protection + ret = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(ret, proto.Success) + + # Let's set new PIN + ret = self.client.call_raw(proto.ChangePin()) + self.assertIsInstance(ret, proto.ButtonRequest) + + # Press button + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + # Send the PIN for first time + self.assertIsInstance(ret, proto.PinMatrixRequest) + pin_encoded = self.client.debug.encode_pin(self.pin6) + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Send the PIN for second time, but with typo + self.assertIsInstance(ret, proto.PinMatrixRequest) + pin_encoded = self.client.debug.encode_pin(self.pin4) + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Now it should fail, because pins are different + self.assertIsInstance(ret, proto.Failure) + + # Check that there's still no PIN protection now + features = self.client.call_raw(proto.Initialize()) + self.assertFalse(features.pin_protection) + ret = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(ret, proto.Success) + if __name__ == '__main__': unittest.main() From ff31a7bebc30d914c32810c4a922a7387f707a7c Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 21 Feb 2014 22:42:14 +0100 Subject: [PATCH 0252/1535] Compiled pb --- trezorlib/types_pb2.py | 47 ++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 126e77900..c4c62497b 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\xa3\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x18\n\nchain_code\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0f\n\x07\x61\x64\x64ress\x18\x07 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\xec\x01\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x92\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x18\n\nchain_code\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\xec\x01\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,8 +74,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=766, - serialized_end=1099, + serialized_start=749, + serialized_end=1082, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -96,8 +96,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1101, - serialized_end=1152, + serialized_start=1084, + serialized_end=1135, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -118,8 +118,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1154, - serialized_end=1194, + serialized_start=1137, + serialized_end=1177, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -160,8 +160,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1197, - serialized_end=1433, + serialized_start=1180, + serialized_end=1416, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -280,13 +280,6 @@ _HDNODETYPE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), - _descriptor.FieldDescriptor( - name='address', full_name='HDNodeType.address', index=6, - number=7, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -297,7 +290,7 @@ _HDNODETYPE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=50, - serialized_end=213, + serialized_end=196, ) @@ -345,8 +338,8 @@ _COINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=215, - serialized_end=308, + serialized_start=198, + serialized_end=291, ) @@ -401,8 +394,8 @@ _TXINPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=311, - serialized_end=444, + serialized_start=294, + serialized_end=427, ) @@ -457,8 +450,8 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=446, - serialized_end=573, + serialized_start=429, + serialized_end=556, ) @@ -492,8 +485,8 @@ _TXOUTPUTBINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=575, - serialized_end=637, + serialized_start=558, + serialized_end=620, ) @@ -541,8 +534,8 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=639, - serialized_end=763, + serialized_start=622, + serialized_end=746, ) _TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _SCRIPTTYPE From 89d17297ce4d1229d400984f4569df7341e69e34 Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 22 Feb 2014 00:36:06 +0100 Subject: [PATCH 0253/1535] Compiled pb --- trezorlib/types_pb2.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index c4c62497b..4d85adc6a 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x92\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x18\n\nchain_code\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\xec\x01\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x92\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x18\n\nchain_code\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -157,11 +157,15 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( name='ButtonRequest_ProtectCall', index=6, number=7, options=None, type=None), + _descriptor.EnumValueDescriptor( + name='ButtonRequest_SignTx', index=7, number=8, + options=None, + type=None), ], containing_type=None, options=None, serialized_start=1180, - serialized_end=1416, + serialized_end=1442, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -188,6 +192,7 @@ ButtonRequest_ResetDevice = 4 ButtonRequest_ConfirmWord = 5 ButtonRequest_WipeDevice = 6 ButtonRequest_ProtectCall = 7 +ButtonRequest_SignTx = 8 BINARY_FIELD_NUMBER = 50001 binary = _descriptor.FieldDescriptor( From 8e97281f29dd54d40ad944092f6cca7e2f814f1c Mon Sep 17 00:00:00 2001 From: slush0 Date: Sat, 22 Feb 2014 02:15:21 +0100 Subject: [PATCH 0254/1535] Unit tests of recovery device, apply settings --- tests/test.py | 19 ++-- tests/test_msg_applysettings.py | 35 +++++++ tests/test_msg_estimatetxsize.py | 34 +++++++ tests/test_msg_recoverydevice.py | 146 ++++++++++++++++++++++++++- tests/test_msg_resetdevice.py | 36 ++++++- tests/test_msg_simplesigntx.py | 35 ++----- tests/test_protection_levels.py | 166 +++++++++++++++++++++++++++++++ 7 files changed, 430 insertions(+), 41 deletions(-) create mode 100644 tests/test_msg_applysettings.py create mode 100644 tests/test_msg_estimatetxsize.py create mode 100644 tests/test_protection_levels.py diff --git a/tests/test.py b/tests/test.py index 37753fe01..d69208fa5 100755 --- a/tests/test.py +++ b/tests/test.py @@ -3,26 +3,26 @@ TODO: -ApplySettings +x ApplySettings x ChangePin x Ping x GetEntropy -GetPublicKey +x GetPublicKey x GetAddress x WipeDevice x LoadDevice x ResetDevice -RecoveryDevice +x RecoveryDevice x SignMessage x VerifyMessage -EstimateTxSize +x EstimateTxSize - SignTx x SimpleSignTx -FirmwareErase -FirmwareUpload +- FirmwareErase +- FirmwareUpload -protection levels -neuspesna zmena pinu +x protection levels +x neuspesna zmena pinu - zrejme v sucinnosti s inymi testami x ButtonRequest/ButtonAck workflow @@ -42,9 +42,6 @@ neuspesna zmena pinu otestovat session handling (tento test bude zrejme failovat na RPi) Failure_NotInitialized Features reflects all variations of LoadDevice -Maxfee settings -Client requires OTP -Client requires PIN x Zero signature test diff --git a/tests/test_msg_applysettings.py b/tests/test_msg_applysettings.py new file mode 100644 index 000000000..6c0855b18 --- /dev/null +++ b/tests/test_msg_applysettings.py @@ -0,0 +1,35 @@ +import time +import unittest +import common + +from trezorlib import messages_pb2 as proto + +class TestMsgApplysettings(common.TrezorTest): + def test_apply_settings(self): + self.setup_mnemonic_pin_passphrase() + self.assertEqual(self.client.features.label, 'test') + + with self.client: + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.Success(), + proto.Features()]) + self.client.apply_settings('new label', 'english') + + self.assertEqual(self.client.features.label, 'new label') + + def test_invalid_language(self): + self.setup_mnemonic_pin_passphrase() + self.assertEqual(self.client.features.language, 'english') + + with self.client: + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.Success(), + proto.Features()]) + self.client.apply_settings('new label', 'nonexistent') + + self.assertEqual(self.client.features.language, 'english') + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_msg_estimatetxsize.py b/tests/test_msg_estimatetxsize.py new file mode 100644 index 000000000..85283e84a --- /dev/null +++ b/tests/test_msg_estimatetxsize.py @@ -0,0 +1,34 @@ +import unittest +import common +import binascii + +import trezorlib.messages_pb2 as proto +import trezorlib.types_pb2 as proto_types +from trezorlib.client import CallException + +class TestMsgEstimatetxsize(common.TrezorTest): + def test_estimate_size(self): + self.setup_mnemonic_nopin_nopassphrase() + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=390000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + + est_size = self.client.estimate_tx_size('Bitcoin', [inp1, ], [out1, ]) + self.assertEqual(est_size, 194) + + tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + real_size = len(tx) + + self.assertGreaterEqual(est_size, real_size) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_msg_recoverydevice.py b/tests/test_msg_recoverydevice.py index 1f634c7a5..b2b2ac050 100644 --- a/tests/test_msg_recoverydevice.py +++ b/tests/test_msg_recoverydevice.py @@ -1,12 +1,150 @@ import unittest import common -from trezorlib import messages_pb2 as messages +from trezorlib import messages_pb2 as proto -class TestDeviceRecover(common.TrezorTest): +class TestDeviceRecovery(common.TrezorTest): + def test_pin_passphrase(self): + mnemonic = self.mnemonic12.split(' ') + ret = self.client.call_raw(proto.RecoveryDevice(word_count=12, + passphrase_protection=True, + pin_protection=True, + label='label', + language='english', + enforce_wordlist=True)) - def test_recover_device(self): - pass + + self.assertIsInstance(ret, proto.ButtonRequest) + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + self.assertIsInstance(ret, proto.PinMatrixRequest) + + # Enter PIN for first time + pin_encoded = self.client.debug.encode_pin(self.pin6) + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + self.assertIsInstance(ret, proto.PinMatrixRequest) + + # Enter PIN for second time + pin_encoded = self.client.debug.encode_pin(self.pin6) + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + fakes = 0 + for _ in range(int(12 * 1.5)): + self.assertIsInstance(ret, proto.WordRequest) + word = self.client.debug.read_word() + + if word[1] != 0: + ret = self.client.call_raw(proto.WordAck(word=mnemonic[word[1] - 1])) + mnemonic[word[1] - 1] = None + else: + ret = self.client.call_raw(proto.WordAck(word=word[0])) + fakes += 1 + + print mnemonic + + # Workflow succesfully ended + self.assertIsInstance(ret, proto.Success) + + # 6 expected fake words and all words of mnemonic are used + self.assertEqual(fakes, 6) + self.assertEqual(mnemonic, [None] * 12) + + # Mnemonic is the same + self.client.init_device() + self.assertEqual(self.client.debug.read_mnemonic(), self.mnemonic12) + + self.assertTrue(self.client.features.pin_protection) + self.assertTrue(self.client.features.passphrase_protection) + + # Do passphrase-protected action, PassphraseRequest should be raised + resp = self.client.call_raw(proto.Ping(passphrase_protection=True)) + self.assertIsInstance(resp, proto.PassphraseRequest) + + # Do PIN-protected action, PinRequest should be raised + resp = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(resp, proto.PinMatrixRequest) + + def test_nopin_nopassphrase(self): + mnemonic = self.mnemonic12.split(' ') + ret = self.client.call_raw(proto.RecoveryDevice(word_count=12, + passphrase_protection=False, + pin_protection=False, + label='label', + language='english', + enforce_wordlist=True)) + + + self.assertIsInstance(ret, proto.ButtonRequest) + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + fakes = 0 + for _ in range(int(12 * 1.5)): + self.assertIsInstance(ret, proto.WordRequest) + word = self.client.debug.read_word() + + if word[1] != 0: + ret = self.client.call_raw(proto.WordAck(word=mnemonic[word[1] - 1])) + mnemonic[word[1] - 1] = None + else: + ret = self.client.call_raw(proto.WordAck(word=word[0])) + fakes += 1 + + print mnemonic + + # Workflow succesfully ended + self.assertIsInstance(ret, proto.Success) + + # 6 expected fake words and all words of mnemonic are used + self.assertEqual(fakes, 6) + self.assertEqual(mnemonic, [None] * 12) + + # Mnemonic is the same + self.client.init_device() + self.assertEqual(self.client.debug.read_mnemonic(), self.mnemonic12) + + self.assertFalse(self.client.features.pin_protection) + self.assertFalse(self.client.features.passphrase_protection) + + # Do passphrase-protected action, PassphraseRequest should NOT be raised + resp = self.client.call_raw(proto.Ping(passphrase_protection=True)) + self.assertIsInstance(resp, proto.Success) + + # Do PIN-protected action, PinRequest should NOT be raised + resp = self.client.call_raw(proto.Ping(pin_protection=True)) + self.assertIsInstance(resp, proto.Success) + + def test_pin_fail(self): + ret = self.client.call_raw(proto.RecoveryDevice(word_count=12, + passphrase_protection=True, + pin_protection=True, + label='label', + language='english', + enforce_wordlist=True)) + + + self.assertIsInstance(ret, proto.ButtonRequest) + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + self.assertIsInstance(ret, proto.PinMatrixRequest) + + # Enter PIN for first time + pin_encoded = self.client.debug.encode_pin(self.pin4) + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + self.assertIsInstance(ret, proto.PinMatrixRequest) + + # Enter PIN for second time, but different one + pin_encoded = self.client.debug.encode_pin(self.pin6) + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Failure should be raised + self.assertIsInstance(ret, proto.Failure) + + def test_already_initialized(self): + self.setup_mnemonic_nopin_nopassphrase() + self.assertRaises(Exception, self.client.recovery_device, 12, False, False, 'label', 'english') if __name__ == '__main__': unittest.main() diff --git a/tests/test_msg_resetdevice.py b/tests/test_msg_resetdevice.py index 9ddc8665d..1aa1aedab 100644 --- a/tests/test_msg_resetdevice.py +++ b/tests/test_msg_resetdevice.py @@ -34,7 +34,6 @@ def generate_entropy(strength, internal_entropy, external_entropy): return entropy_stripped class TestDeviceReset(common.TrezorTest): - def test_reset_device(self): # No PIN, no passphrase external_entropy = 'zlutoucky kun upel divoke ody' * 2 @@ -170,6 +169,41 @@ class TestDeviceReset(common.TrezorTest): # Do PIN-protected action, PinRequest should be raised resp = self.client.call_raw(proto.Ping(pin_protection=True)) self.assertIsInstance(resp, proto.PinMatrixRequest) + + def test_failed_pin(self): + external_entropy = 'zlutoucky kun upel divoke ody' * 2 + strength = 128 + + ret = self.client.call_raw(proto.ResetDevice(display_random=True, + strength=strength, + passphrase_protection=True, + pin_protection=True, + language='english', + label='test')) + + self.assertIsInstance(ret, proto.ButtonRequest) + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + self.assertIsInstance(ret, proto.EntropyRequest) + ret = self.client.call_raw(proto.EntropyAck(entropy=external_entropy)) + + self.assertIsInstance(ret, proto.PinMatrixRequest) + + # Enter PIN for first time + pin_encoded = self.client.debug.encode_pin(self.pin4) + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + self.assertIsInstance(ret, proto.PinMatrixRequest) + + # Enter PIN for second time + pin_encoded = self.client.debug.encode_pin(self.pin6) + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + self.assertIsInstance(ret, proto.Failure) + def test_already_initialized(self): + self.setup_mnemonic_nopin_nopassphrase() + self.assertRaises(Exception, self.client.reset_device, False, 128, True, True, 'label', 'english') + if __name__ == '__main__': unittest.main() diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index f2e2f37fd..19c217fc7 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -36,7 +36,7 @@ class FakeTestnetBlockchain(object): return t -class TestSignTx(common.TrezorTest): +class TestMsgSimplesigntx(common.TrezorTest): def test_one_one_fee(self): self.setup_mnemonic_nopin_nopassphrase() @@ -58,6 +58,7 @@ class TestSignTx(common.TrezorTest): with self.client: msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_index=-1)]) tx = self.client.call(msg) @@ -90,6 +91,7 @@ class TestSignTx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest()]) tx = self.client.call(msg) @@ -122,6 +124,7 @@ class TestSignTx(common.TrezorTest): self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest()]) tx = self.client.call(msg) @@ -153,6 +156,7 @@ class TestSignTx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest()]) tx = self.client.call(msg) @@ -190,6 +194,7 @@ class TestSignTx(common.TrezorTest): self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest()]) tx = self.client.call(msg) @@ -229,6 +234,7 @@ class TestSignTx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest()]) tx = self.client.call(msg) @@ -269,7 +275,8 @@ class TestSignTx(common.TrezorTest): with self.client: msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], outputs) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), ] * 255 + \ - [proto.TxRequest(), ]) + [proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(), ]) tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') @@ -296,6 +303,7 @@ class TestSignTx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest()]) tx = self.client.call(msg) @@ -330,29 +338,6 @@ class TestSignTx(common.TrezorTest): else: self.assert_(False, "types.Failure_NotEnoughFunds expected") - def test_estimate_size(self): - self.setup_mnemonic_nopin_nopassphrase() - - inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e - # amount=390000, - prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), - prev_index=0, - ) - - out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', - amount=390000 - 10000, - script_type=proto_types.PAYTOADDRESS, - ) - - - est_size = self.client.estimate_tx_size('Bitcoin', [inp1, ], [out1, ]) - self.assertEqual(est_size, 194) - - tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) - real_size = len(tx) - - self.assertGreaterEqual(est_size, real_size) - ''' def test_simplesigntx_testnet(self): self.client.load_device_by_xprv('xprv9s21ZrQH143K3zttRjiQmYwyugvd13pnd2VzefWrfSouRfnj5oSkJgBQXxtn18E9mqrDop7fQ8Xnb9JCLPE4vghzhpU4dT33ZJ7frjzTEW8', diff --git a/tests/test_protection_levels.py b/tests/test_protection_levels.py new file mode 100644 index 000000000..bcf9b3266 --- /dev/null +++ b/tests/test_protection_levels.py @@ -0,0 +1,166 @@ +import unittest +import common +import binascii + +from trezorlib import messages_pb2 as proto +from trezorlib import types_pb2 as proto_types + +class TestProtectionLevels(common.TrezorTest): + # Tests protection levels of all messages as defined here: + # https://github.com/trezor/documentation/wiki/Protection-Levels + + def test_initialize(self): + with self.client: + self.setup_mnemonic_pin_passphrase() + self.client.set_expected_responses([proto.Features()]) + self.client.init_device() + + def test_apply_settings(self): + with self.client: + self.setup_mnemonic_pin_passphrase() + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.Success(), + proto.Features()]) # TrezorClient reinitializes device + self.client.apply_settings('nazdar', 'english') + + def test_change_pin(self): + with self.client: + self.setup_mnemonic_pin_passphrase() + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.PinMatrixRequest(), + proto.PinMatrixRequest(), + proto.Success(), + proto.Features()]) + self.client.change_pin() + + def test_ping(self): + with self.client: + self.setup_mnemonic_pin_passphrase() + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.PassphraseRequest(), + proto.Success()]) + self.client.ping('msg', True, True, True) + + def test_get_entropy(self): + with self.client: + self.setup_mnemonic_pin_passphrase() + self.client.set_expected_responses([proto.ButtonRequest(), + proto.Entropy()]) + self.client.get_entropy(10) + + def test_get_public_key(self): + with self.client: + self.setup_mnemonic_pin_passphrase() + self.client.set_expected_responses([proto.PassphraseRequest(), + proto.PublicKey()]) + self.client.get_public_node([]) + + def test_get_address(self): + with self.client: + self.setup_mnemonic_pin_passphrase() + self.client.set_expected_responses([proto.PassphraseRequest(), + proto.Address()]) + self.client.get_address('Bitcoin', []) + + def test_wipe_device(self): + with self.client: + self.setup_mnemonic_pin_passphrase() + self.client.set_expected_responses([proto.ButtonRequest(), + proto.Success(), + proto.Features()]) + self.client.wipe_device() + + def test_load_device(self): + with self.client: + self.client.set_expected_responses([proto.ButtonRequest(), + proto.Success(), + proto.Features()]) + self.client.load_device_by_mnemonic('this is mnemonic', '1234', True, 'label', 'english', skip_checksum=True) + + # This must fail, because device is already initialized + self.assertRaises(Exception, self.client.load_device_by_mnemonic, + 'this is mnemonic', '1234', True, 'label', 'english', skip_checksum=True) + + def test_reset_device(self): + with self.client: + self.client.set_expected_responses([proto.ButtonRequest(), + proto.EntropyRequest()] +\ + [proto.ButtonRequest()] * 24 + \ + [proto.Success(), + proto.Features()]) + self.client.reset_device(False, 128, True, False, 'label', 'english') + + # This must fail, because device is already initialized + self.assertRaises(Exception, self.client.reset_device, False, 128, True, False, 'label', 'english') + + def test_recovery_device(self): + with self.client: + self.client.set_mnemonic(self.mnemonic12) + self.client.set_expected_responses([proto.ButtonRequest(), ] + \ + [proto.WordRequest()] * int(12 * 1.5) + \ + [proto.Success(), + proto.Features()]) + self.client.recovery_device(12, False, False, 'label', 'english') + + # This must fail, because device is already initialized + self.assertRaises(Exception, self.client.recovery_device, 12, False, False, 'label', 'english') + + def test_sign_message(self): + with self.client: + self.setup_mnemonic_pin_passphrase() + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.PassphraseRequest(), + proto.MessageSignature()]) + self.client.sign_message('Bitcoin', [], 'testing message') + + def test_verify_message(self): + with self.client: + self.setup_mnemonic_pin_passphrase() + self.client.set_expected_responses([proto.Success()]) + self.client.verify_message( + '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', + binascii.unhexlify('209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), + 'This is an example of a signed message.') + + def test_estimate_txsize(self): + with self.client: + self.setup_mnemonic_pin_passphrase() + self.client.set_expected_responses([proto.TxSize()]) + self.client.estimate_tx_size('Bitcoin', [], []) + + #def test_signtx(self): + # pass + + def test_simplesigntx(self): + self.setup_mnemonic_pin_passphrase() + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=390000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + with self.client: + self.client.set_expected_responses([proto.PinMatrixRequest(), + proto.PassphraseRequest(), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_index=-1)]) + self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + + # def test_firmware_erase(self): + # pass + + # def test_firmware_upload(self): + # pass + +if __name__ == '__main__': + unittest.main() From 31454ffda66de64fdef52e3423260d8ef8360567 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 22 Feb 2014 17:39:23 +0100 Subject: [PATCH 0255/1535] add button/pin/passphrase protection to ping call in cmd.py --- cmd.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmd.py b/cmd.py index 6c3161e97..f35af8e70 100755 --- a/cmd.py +++ b/cmd.py @@ -98,7 +98,7 @@ class Commands(object): return [ coin.coin_name for coin in self.client.features.coins ] def ping(self, args): - return self.client.ping(args.msg) + return self.client.ping(args.msg, button_protection=args.button_protection, pin_protection=args.pin_protection, passphrase_protection=args.passphrase_protection) def get_public_node(self, args): address_n = self.client.expand_path(args.n) @@ -190,6 +190,9 @@ class Commands(object): ping.arguments = ( (('msg',), {'type': str}), + (('-b', '--button-protection'), {'action': 'store_true', 'default': False}), + (('-p', '--pin-protection'), {'action': 'store_true', 'default': False}), + (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), ) set_label.arguments = ( From 4b9cc6cb780d8ac948cf269ec84a571a10c305d5 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 25 Feb 2014 19:31:31 +0100 Subject: [PATCH 0256/1535] Added debug printing to debuglink communication --- trezorlib/debuglink.py | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/trezorlib/debuglink.py b/trezorlib/debuglink.py index a7e16b404..cf29447d1 100644 --- a/trezorlib/debuglink.py +++ b/trezorlib/debuglink.py @@ -7,6 +7,9 @@ def pin_info(pin): def button_press(yes_no): print "User pressed", '"y"' if yes_no else '"n"' +def pprint(msg): + return "<%s> (%d bytes):\n%s" % (msg.__class__.__name__, msg.ByteSize(), msg) + class DebugLink(object): def __init__(self, transport, pin_func=pin_info, button_func=button_press): self.transport = transport @@ -17,9 +20,17 @@ class DebugLink(object): def close(self): self.transport.close() + def _call(self, msg, nowait=False): + print "DEBUGLINK SEND", pprint(msg) + self.transport.write(msg) + if nowait: + return + ret = self.transport.read_blocking() + print "DEBUGLINK RECV", pprint(ret) + return ret + def read_pin(self): - self.transport.write(proto.DebugLinkGetState()) - obj = self.transport.read_blocking() + obj = self._call(proto.DebugLinkGetState()) print "Read PIN:", obj.pin print "Read matrix:", obj.matrix @@ -44,39 +55,33 @@ class DebugLink(object): return pin_encoded def read_layout(self): - self.transport.write(proto.DebugLinkGetState()) - obj = self.transport.read_blocking() + obj = self._call(proto.DebugLinkGetState()) return obj.layout def read_mnemonic(self): - self.transport.write(proto.DebugLinkGetState()) - obj = self.transport.read_blocking() + obj = self._call(proto.DebugLinkGetState()) return obj.mnemonic def read_node(self): - self.transport.write(proto.DebugLinkGetState()) - obj = self.transport.read_blocking() + obj = self._call(proto.DebugLinkGetState()) return obj.node def read_word(self): - self.transport.write(proto.DebugLinkGetState()) - obj = self.transport.read_blocking() + obj = self._call(proto.DebugLinkGetState()) return (obj.word, obj.word_pos) def read_entropy(self): - self.transport.write(proto.DebugLinkGetState()) - obj = self.transport.read_blocking() + obj = self._call(proto.DebugLinkGetState()) return obj.entropy def read_passphrase_protection(self): - self.transport.write(proto.DebugLinkGetState()) - obj = self.transport.read_blocking() + obj = self._call(proto.DebugLinkGetState()) return obj.passphrase_protection def press_button(self, yes_no): print "Pressing", yes_no self.button_func(yes_no) - self.transport.write(proto.DebugLinkDecision(yes_no=yes_no)) + self._call(proto.DebugLinkDecision(yes_no=yes_no), nowait=True) def press_yes(self): self.press_button(True) @@ -85,4 +90,4 @@ class DebugLink(object): self.press_button(False) def stop(self): - self.transport.write(proto.DebugLinkStop()) + self._call(proto.DebugLinkStop(), nowait=True) From 50d1537f43e81c70f74e700a56affcb4838e09d4 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 26 Feb 2014 14:03:11 +0100 Subject: [PATCH 0257/1535] disable layout retrieval in debuglink for now --- tests/test_debuglink.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_debuglink.py b/tests/test_debuglink.py index 3ad80448a..b1a777dd1 100644 --- a/tests/test_debuglink.py +++ b/tests/test_debuglink.py @@ -9,9 +9,12 @@ from trezorlib.client import PinException class TestDebugLink(common.TrezorTest): + # disable for now + """ def test_layout(self): layout = self.client.debug.read_layout() self.assertEqual(len(layout), 1024) + """ def test_mnemonic(self): self.setup_mnemonic_nopin_nopassphrase() From ffa289967cbd3da17abf98a9aaf9b7f4462f69b1 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 1 Mar 2014 12:08:43 +0100 Subject: [PATCH 0258/1535] adapt to new pb, small fixes --- trezorlib/client.py | 8 +- trezorlib/messages_pb2.py | 400 +++++++++++++++++--------------------- trezorlib/tools.py | 5 +- trezorlib/types_pb2.py | 97 ++++----- 4 files changed, 224 insertions(+), 286 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 18fb281b1..713f7c198 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -144,7 +144,7 @@ class TextUIMixin(object): def callback_PassphraseRequest(self, msg): passphrase = raw_input("Passphrase required: ") - passphrase = str(bytearray(passphrase, 'utf-8')) + passphrase = unicode(str(bytearray(passphrase, 'utf-8')), 'utf-8') return proto.PassphraseAck(passphrase=passphrase) @@ -217,10 +217,10 @@ class DebugLinkMixin(object): self.pin_correct = pin_correct def set_passphrase(self, passphrase): - self.passphrase = str(bytearray(Mnemonic.normalize_string(passphrase), 'utf-8')) + self.passphrase = unicode(str(bytearray(Mnemonic.normalize_string(passphrase), 'utf-8')), 'utf-8') def set_mnemonic(self, mnemonic): - self.mnemonic = str(bytearray(Mnemonic.normalize_string(mnemonic), 'utf-8')).split(' ') + self.mnemonic = unicode(str(bytearray(Mnemonic.normalize_string(mnemonic), 'utf-8')), 'utf-8').split(' ') def call_raw(self, msg): resp = super(DebugLinkMixin, self).call_raw(msg) @@ -495,7 +495,7 @@ class ProtocolMixin(object): mnemonic = Mnemonic.normalize_string(mnemonic) # Convert mnemonic to ASCII stream - mnemonic = str(bytearray(mnemonic, 'utf-8')) + mnemonic = unicode(str(bytearray(mnemonic, 'utf-8')), 'utf-8') if self.features.initialized: raise Exception("Device is initialized already. Call wipe_device() and try again.") diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 438c5569f..e7d252d23 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x9f\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\x0c\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x17\n\tdevice_id\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\x0c\x12\x13\n\x05label\x18\n \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"6\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\x0c\x12\x13\n\x05label\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"E\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x12\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\x0c\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\x0c\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\")\n\rPassphraseAck\x12\x18\n\npassphrase\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\" \n\x07\x45ntropy\x12\x15\n\x07\x65ntropy\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\x0c:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\x0c\"\x0c\n\nWipeDevice\"\xac\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\x0c\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\x0c\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\xa3\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\x10\n\x0e\x45ntropyRequest\"#\n\nEntropyAck\x12\x15\n\x07\x65ntropy\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"\xa5\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\x0c:\x07\x65nglish\x12\x13\n\x05label\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x1d\n\x07WordAck\x12\x12\n\x04word\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"S\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x15\n\x07message\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"P\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x15\n\x07message\x18\x03 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"<\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x17\n\tsignature\x18\x02 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\x0c:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\x0c:\x07\x42itcoin\"\x92\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x17\n\tsignature\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1b\n\rserialized_tx\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"\'\n\x0e\x46irmwareUpload\x12\x15\n\x07payload\x18\x01 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xc0\x01\n\x0e\x44\x65\x62ugLinkState\x12\x14\n\x06layout\x18\x01 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x0b\n\x03pin\x18\x02 \x01(\x0c\x12\x0e\n\x06matrix\x18\x03 \x01(\x0c\x12\x10\n\x08mnemonic\x18\x04 \x01(\x0c\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x0c\n\x04word\x18\x07 \x01(\x0c\x12\x10\n\x08word_pos\x18\x08 \x01(\x05\x12\x0f\n\x07\x65ntropy\x18\t \x01(\x0c\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\x0c\x12\x0c\n\x04text\x18\x03 \x01(\x0c*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x93\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xba\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x0c\n\x04word\x18\x07 \x01(\t\x12\x10\n\x08word_pos\x18\x08 \x01(\x05\x12\x0f\n\x07\x65ntropy\x18\t \x01(\x0c\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -206,8 +206,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2884, - serialized_end=4465, + serialized_start=2770, + serialized_end=4351, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -289,8 +289,8 @@ _FEATURES = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='vendor', full_name='Features.vendor', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -324,11 +324,11 @@ _FEATURES = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='device_id', full_name='Features.device_id', index=5, - number=6, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), _descriptor.FieldDescriptor( name='pin_protection', full_name='Features.pin_protection', index=6, number=7, type=8, cpp_type=7, label=1, @@ -345,18 +345,18 @@ _FEATURES = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='language', full_name='Features.language', index=8, - number=9, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=9, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='label', full_name='Features.label', index=9, - number=10, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=10, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), _descriptor.FieldDescriptor( name='coins', full_name='Features.coins', index=10, number=11, type=11, cpp_type=10, label=3, @@ -381,7 +381,7 @@ _FEATURES = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=46, - serialized_end=333, + serialized_end=321, ) @@ -394,18 +394,18 @@ _APPLYSETTINGS = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='language', full_name='ApplySettings.language', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='label', full_name='ApplySettings.label', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -415,8 +415,8 @@ _APPLYSETTINGS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=335, - serialized_end=389, + serialized_start=323, + serialized_end=371, ) @@ -443,8 +443,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=391, - serialized_end=418, + serialized_start=373, + serialized_end=400, ) @@ -457,8 +457,8 @@ _PING = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='message', full_name='Ping.message', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -492,8 +492,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=420, - serialized_end=525, + serialized_start=402, + serialized_end=507, ) @@ -506,8 +506,8 @@ _SUCCESS = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='message', full_name='Success.message', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -520,8 +520,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=527, - serialized_end=553, + serialized_start=509, + serialized_end=535, ) @@ -541,8 +541,8 @@ _FAILURE = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='message', full_name='Failure.message', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -555,8 +555,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=555, - serialized_end=609, + serialized_start=537, + serialized_end=591, ) @@ -576,11 +576,11 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='data', full_name='ButtonRequest.data', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -590,8 +590,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=611, - serialized_end=680, + serialized_start=593, + serialized_end=656, ) @@ -611,8 +611,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=682, - serialized_end=693, + serialized_start=658, + serialized_end=669, ) @@ -625,8 +625,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='message', full_name='PinMatrixRequest.message', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -639,8 +639,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=695, - serialized_end=730, + serialized_start=671, + serialized_end=706, ) @@ -653,8 +653,8 @@ _PINMATRIXACK = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='pin', full_name='PinMatrixAck.pin', index=0, - number=1, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -667,8 +667,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=732, - serialized_end=759, + serialized_start=708, + serialized_end=735, ) @@ -688,8 +688,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=761, - serialized_end=769, + serialized_start=737, + serialized_end=745, ) @@ -709,8 +709,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=771, - serialized_end=790, + serialized_start=747, + serialized_end=766, ) @@ -723,11 +723,11 @@ _PASSPHRASEACK = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='passphrase', full_name='PassphraseAck.passphrase', index=0, - number=1, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -737,8 +737,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=792, - serialized_end=833, + serialized_start=768, + serialized_end=803, ) @@ -765,8 +765,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=835, - serialized_end=861, + serialized_start=805, + serialized_end=831, ) @@ -783,7 +783,7 @@ _ENTROPY = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -793,8 +793,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=863, - serialized_end=895, + serialized_start=833, + serialized_end=859, ) @@ -821,8 +821,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=897, - serialized_end=930, + serialized_start=861, + serialized_end=894, ) @@ -849,8 +849,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=932, - serialized_end=970, + serialized_start=896, + serialized_end=934, ) @@ -870,8 +870,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='coin_name', full_name='GetAddress.coin_name', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=True, default_value="Bitcoin", + number=2, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("Bitcoin", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -884,8 +884,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=972, - serialized_end=1031, + serialized_start=936, + serialized_end=995, ) @@ -898,8 +898,8 @@ _ADDRESS = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='address', full_name='Address.address', index=0, - number=1, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -912,8 +912,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1033, - serialized_end=1059, + serialized_start=997, + serialized_end=1023, ) @@ -933,8 +933,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1061, - serialized_end=1073, + serialized_start=1025, + serialized_end=1037, ) @@ -947,8 +947,8 @@ _LOADDEVICE = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='mnemonic', full_name='LoadDevice.mnemonic', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -961,8 +961,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='pin', full_name='LoadDevice.pin', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -975,18 +975,18 @@ _LOADDEVICE = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='language', full_name='LoadDevice.language', index=4, - number=5, type=12, cpp_type=9, label=1, - has_default_value=True, default_value="english", + number=5, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("english", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='label', full_name='LoadDevice.label', index=5, - number=6, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), _descriptor.FieldDescriptor( name='skip_checksum', full_name='LoadDevice.skip_checksum', index=6, number=7, type=8, cpp_type=7, label=1, @@ -1003,8 +1003,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1076, - serialized_end=1248, + serialized_start=1040, + serialized_end=1206, ) @@ -1045,18 +1045,18 @@ _RESETDEVICE = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='language', full_name='ResetDevice.language', index=4, - number=5, type=12, cpp_type=9, label=1, - has_default_value=True, default_value="english", + number=5, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("english", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='label', full_name='ResetDevice.label', index=5, - number=6, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -1066,8 +1066,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1251, - serialized_end=1414, + serialized_start=1209, + serialized_end=1366, ) @@ -1087,8 +1087,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1416, - serialized_end=1432, + serialized_start=1368, + serialized_end=1384, ) @@ -1105,7 +1105,7 @@ _ENTROPYACK = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -1115,8 +1115,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1434, - serialized_end=1469, + serialized_start=1386, + serialized_end=1415, ) @@ -1150,18 +1150,18 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='language', full_name='RecoveryDevice.language', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=True, default_value="english", + number=4, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("english", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='label', full_name='RecoveryDevice.label', index=4, - number=5, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), _descriptor.FieldDescriptor( name='enforce_wordlist', full_name='RecoveryDevice.enforce_wordlist', index=5, number=6, type=8, cpp_type=7, label=1, @@ -1178,8 +1178,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1472, - serialized_end=1637, + serialized_start=1418, + serialized_end=1577, ) @@ -1199,8 +1199,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1639, - serialized_end=1652, + serialized_start=1579, + serialized_end=1592, ) @@ -1213,11 +1213,11 @@ _WORDACK = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='word', full_name='WordAck.word', index=0, - number=1, type=12, cpp_type=9, label=2, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=2, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -1227,8 +1227,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1654, - serialized_end=1683, + serialized_start=1594, + serialized_end=1617, ) @@ -1252,11 +1252,11 @@ _SIGNMESSAGE = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), _descriptor.FieldDescriptor( name='coin_name', full_name='SignMessage.coin_name', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=True, default_value="Bitcoin", + number=3, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("Bitcoin", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1269,8 +1269,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1685, - serialized_end=1768, + serialized_start=1619, + serialized_end=1696, ) @@ -1283,8 +1283,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='address', full_name='VerifyMessage.address', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1294,14 +1294,14 @@ _VERIFYMESSAGE = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), _descriptor.FieldDescriptor( name='message', full_name='VerifyMessage.message', index=2, number=3, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -1311,8 +1311,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1770, - serialized_end=1850, + serialized_start=1698, + serialized_end=1766, ) @@ -1325,8 +1325,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='address', full_name='MessageSignature.address', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1336,7 +1336,7 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -1346,8 +1346,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1852, - serialized_end=1912, + serialized_start=1768, + serialized_end=1822, ) @@ -1374,8 +1374,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='coin_name', full_name='EstimateTxSize.coin_name', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=True, default_value="Bitcoin", + number=3, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("Bitcoin", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1388,8 +1388,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1914, - serialized_end=2003, + serialized_start=1824, + serialized_end=1913, ) @@ -1416,8 +1416,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2005, - serialized_end=2030, + serialized_start=1915, + serialized_end=1940, ) @@ -1444,8 +1444,8 @@ _SIGNTX = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='coin_name', full_name='SignTx.coin_name', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=True, default_value="Bitcoin", + number=3, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("Bitcoin", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1458,8 +1458,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2032, - serialized_end=2113, + serialized_start=1942, + serialized_end=2023, ) @@ -1493,8 +1493,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='coin_name', full_name='SimpleSignTx.coin_name', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=True, default_value="Bitcoin", + number=4, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("Bitcoin", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1507,8 +1507,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2116, - serialized_end=2260, + serialized_start=2026, + serialized_end=2170, ) @@ -1546,14 +1546,14 @@ _TXREQUEST = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), _descriptor.FieldDescriptor( name='serialized_tx', full_name='TxRequest.serialized_tx', index=4, number=5, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -1563,8 +1563,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2263, - serialized_end=2409, + serialized_start=2173, + serialized_end=2307, ) @@ -1591,8 +1591,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2411, - serialized_end=2449, + serialized_start=2309, + serialized_end=2347, ) @@ -1619,8 +1619,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2451, - serialized_end=2492, + serialized_start=2349, + serialized_end=2390, ) @@ -1640,8 +1640,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2494, - serialized_end=2509, + serialized_start=2392, + serialized_end=2407, ) @@ -1658,7 +1658,7 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -1668,8 +1668,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2511, - serialized_end=2550, + serialized_start=2409, + serialized_end=2442, ) @@ -1696,8 +1696,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2552, - serialized_end=2587, + serialized_start=2444, + serialized_end=2479, ) @@ -1717,8 +1717,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2589, - serialized_end=2608, + serialized_start=2481, + serialized_end=2500, ) @@ -1735,25 +1735,25 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), _descriptor.FieldDescriptor( name='pin', full_name='DebugLinkState.pin', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='matrix', full_name='DebugLinkState.matrix', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='mnemonic', full_name='DebugLinkState.mnemonic', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1773,8 +1773,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='word', full_name='DebugLinkState.word', index=6, - number=7, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1801,8 +1801,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2611, - serialized_end=2803, + serialized_start=2503, + serialized_end=2689, ) @@ -1822,8 +1822,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2805, - serialized_end=2820, + serialized_start=2691, + serialized_end=2706, ) @@ -1843,15 +1843,15 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='bucket', full_name='DebugLinkLog.bucket', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='text', full_name='DebugLinkLog.text', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1864,8 +1864,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2822, - serialized_end=2881, + serialized_start=2708, + serialized_end=2767, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -2289,42 +2289,4 @@ _MESSAGETYPE.values_by_name["MessageType_DebugLinkStop"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkStop"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkLog"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkLog"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001') -_FEATURES.fields_by_name['device_id'].has_options = True -_FEATURES.fields_by_name['device_id']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_FEATURES.fields_by_name['label'].has_options = True -_FEATURES.fields_by_name['label']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_APPLYSETTINGS.fields_by_name['label'].has_options = True -_APPLYSETTINGS.fields_by_name['label']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_BUTTONREQUEST.fields_by_name['data'].has_options = True -_BUTTONREQUEST.fields_by_name['data']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_PASSPHRASEACK.fields_by_name['passphrase'].has_options = True -_PASSPHRASEACK.fields_by_name['passphrase']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_ENTROPY.fields_by_name['entropy'].has_options = True -_ENTROPY.fields_by_name['entropy']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_LOADDEVICE.fields_by_name['label'].has_options = True -_LOADDEVICE.fields_by_name['label']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_RESETDEVICE.fields_by_name['label'].has_options = True -_RESETDEVICE.fields_by_name['label']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_ENTROPYACK.fields_by_name['entropy'].has_options = True -_ENTROPYACK.fields_by_name['entropy']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_RECOVERYDEVICE.fields_by_name['label'].has_options = True -_RECOVERYDEVICE.fields_by_name['label']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_WORDACK.fields_by_name['word'].has_options = True -_WORDACK.fields_by_name['word']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_SIGNMESSAGE.fields_by_name['message'].has_options = True -_SIGNMESSAGE.fields_by_name['message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_VERIFYMESSAGE.fields_by_name['signature'].has_options = True -_VERIFYMESSAGE.fields_by_name['signature']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_VERIFYMESSAGE.fields_by_name['message'].has_options = True -_VERIFYMESSAGE.fields_by_name['message']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_MESSAGESIGNATURE.fields_by_name['signature'].has_options = True -_MESSAGESIGNATURE.fields_by_name['signature']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_TXREQUEST.fields_by_name['signature'].has_options = True -_TXREQUEST.fields_by_name['signature']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_TXREQUEST.fields_by_name['serialized_tx'].has_options = True -_TXREQUEST.fields_by_name['serialized_tx']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_FIRMWAREUPLOAD.fields_by_name['payload'].has_options = True -_FIRMWAREUPLOAD.fields_by_name['payload']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_DEBUGLINKSTATE.fields_by_name['layout'].has_options = True -_DEBUGLINKSTATE.fields_by_name['layout']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') # @@protoc_insertion_point(module_scope) diff --git a/trezorlib/tools.py b/trezorlib/tools.py index 94e9ac866..176fefaea 100644 --- a/trezorlib/tools.py +++ b/trezorlib/tools.py @@ -89,9 +89,8 @@ def monkeypatch_google_protobuf_text_format(): _oldPrintFieldValue = google.protobuf.text_format.PrintFieldValue def _customPrintFieldValue(field, value, out, indent=0, as_utf8=False, as_one_line=False): - if field.cpp_type == google.protobuf.descriptor.FieldDescriptor.CPPTYPE_STRING and \ - '[binary]:' in str(field.GetOptions()).strip(): # binary option set - _oldPrintFieldValue(field, 'hex(%s) | str(%s)' % (binascii.hexlify(value), value), out, indent, as_utf8, as_one_line) + if field.type == google.protobuf.descriptor.FieldDescriptor.TYPE_BYTES: + _oldPrintFieldValue(field, 'hex(%s)' % binascii.hexlify(value), out, indent, as_utf8, as_one_line) else: _oldPrintFieldValue(field, value, out, indent, as_utf8, as_one_line) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 4d85adc6a..ea721736b 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x92\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x18\n\nchain_code\x18\x04 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x19\n\x0bprivate_key\x18\x05 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x18\n\npublic_key\x18\x06 \x01(\x0c\x42\x04\x88\xb5\x18\x01\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\x0c\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\x0c\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"\x85\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x17\n\tprev_hash\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x18\n\nscript_sig\x18\x04 \x01(\x0c\x42\x04\x88\xb5\x18\x01\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"\x7f\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\x0c\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x19\n\x0bscript_args\x18\x05 \x03(\x0c\x42\x04\x88\xb5\x18\x01\">\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x1b\n\rscript_pubkey\x18\x02 \x02(\x0c\x42\x04\x88\xb5\x18\x01\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08:/\n\x06\x62inary\x12\x1d.google.protobuf.FieldOptions\x18\xd1\x86\x03 \x01(\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,8 +74,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=749, - serialized_end=1082, + serialized_start=706, + serialized_end=1039, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -96,8 +96,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1084, - serialized_end=1135, + serialized_start=1041, + serialized_end=1092, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -118,8 +118,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1137, - serialized_end=1177, + serialized_start=1094, + serialized_end=1134, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -164,8 +164,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1180, - serialized_end=1442, + serialized_start=1137, + serialized_end=1399, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -194,17 +194,9 @@ ButtonRequest_WipeDevice = 6 ButtonRequest_ProtectCall = 7 ButtonRequest_SignTx = 8 -BINARY_FIELD_NUMBER = 50001 -binary = _descriptor.FieldDescriptor( - name='binary', full_name='binary', index=0, - number=50001, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - options=None) WIRE_IN_FIELD_NUMBER = 50002 wire_in = _descriptor.FieldDescriptor( - name='wire_in', full_name='wire_in', index=1, + name='wire_in', full_name='wire_in', index=0, number=50002, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, @@ -212,7 +204,7 @@ wire_in = _descriptor.FieldDescriptor( options=None) WIRE_OUT_FIELD_NUMBER = 50003 wire_out = _descriptor.FieldDescriptor( - name='wire_out', full_name='wire_out', index=2, + name='wire_out', full_name='wire_out', index=1, number=50003, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, @@ -220,7 +212,7 @@ wire_out = _descriptor.FieldDescriptor( options=None) WIRE_DEBUG_IN_FIELD_NUMBER = 50004 wire_debug_in = _descriptor.FieldDescriptor( - name='wire_debug_in', full_name='wire_debug_in', index=3, + name='wire_debug_in', full_name='wire_debug_in', index=2, number=50004, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, @@ -228,7 +220,7 @@ wire_debug_in = _descriptor.FieldDescriptor( options=None) WIRE_DEBUG_OUT_FIELD_NUMBER = 50005 wire_debug_out = _descriptor.FieldDescriptor( - name='wire_debug_out', full_name='wire_debug_out', index=4, + name='wire_debug_out', full_name='wire_debug_out', index=3, number=50005, type=8, cpp_type=7, label=1, has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, @@ -270,21 +262,21 @@ _HDNODETYPE = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), _descriptor.FieldDescriptor( name='private_key', full_name='HDNodeType.private_key', index=4, number=5, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), _descriptor.FieldDescriptor( name='public_key', full_name='HDNodeType.public_key', index=5, number=6, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -295,7 +287,7 @@ _HDNODETYPE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=50, - serialized_end=196, + serialized_end=178, ) @@ -308,15 +300,15 @@ _COINTYPE = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='coin_name', full_name='CoinType.coin_name', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='coin_shortcut', full_name='CoinType.coin_shortcut', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -343,8 +335,8 @@ _COINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=198, - serialized_end=291, + serialized_start=180, + serialized_end=273, ) @@ -368,7 +360,7 @@ _TXINPUTTYPE = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), _descriptor.FieldDescriptor( name='prev_index', full_name='TxInputType.prev_index', index=2, number=3, type=13, cpp_type=3, label=2, @@ -382,7 +374,7 @@ _TXINPUTTYPE = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), _descriptor.FieldDescriptor( name='sequence', full_name='TxInputType.sequence', index=4, number=5, type=13, cpp_type=3, label=1, @@ -399,8 +391,8 @@ _TXINPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=294, - serialized_end=427, + serialized_start=275, + serialized_end=396, ) @@ -413,8 +405,8 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='address', full_name='TxOutputType.address', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -445,7 +437,7 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -455,8 +447,8 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=429, - serialized_end=556, + serialized_start=398, + serialized_end=519, ) @@ -480,7 +472,7 @@ _TXOUTPUTBINTYPE = _descriptor.Descriptor( has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, - options=_descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001')), + options=None), ], extensions=[ ], @@ -490,8 +482,8 @@ _TXOUTPUTBINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=558, - serialized_end=620, + serialized_start=521, + serialized_end=577, ) @@ -539,8 +531,8 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=622, - serialized_end=746, + serialized_start=579, + serialized_end=703, ) _TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _SCRIPTTYPE @@ -589,7 +581,6 @@ class TransactionType(_message.Message): # @@protoc_insertion_point(class_scope:TransactionType) -google.protobuf.descriptor_pb2.FieldOptions.RegisterExtension(binary) google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_in) google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_out) google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_in) @@ -597,18 +588,4 @@ google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_out DESCRIPTOR.has_options = True DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), '\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') -_HDNODETYPE.fields_by_name['chain_code'].has_options = True -_HDNODETYPE.fields_by_name['chain_code']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_HDNODETYPE.fields_by_name['private_key'].has_options = True -_HDNODETYPE.fields_by_name['private_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_HDNODETYPE.fields_by_name['public_key'].has_options = True -_HDNODETYPE.fields_by_name['public_key']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_TXINPUTTYPE.fields_by_name['prev_hash'].has_options = True -_TXINPUTTYPE.fields_by_name['prev_hash']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_TXINPUTTYPE.fields_by_name['script_sig'].has_options = True -_TXINPUTTYPE.fields_by_name['script_sig']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_TXOUTPUTTYPE.fields_by_name['script_args'].has_options = True -_TXOUTPUTTYPE.fields_by_name['script_args']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') -_TXOUTPUTBINTYPE.fields_by_name['script_pubkey'].has_options = True -_TXOUTPUTBINTYPE.fields_by_name['script_pubkey']._options = _descriptor._ParseOptions(descriptor_pb2.FieldOptions(), '\210\265\030\001') # @@protoc_insertion_point(module_scope) From 006812a0b30ab3123f8b721b29eec3fea971a915 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 3 Mar 2014 00:29:17 +0100 Subject: [PATCH 0259/1535] add one more test to test_msg_changepin --- tests/test_msg_changepin.py | 41 +++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/tests/test_msg_changepin.py b/tests/test_msg_changepin.py index 102515385..3a0756a6c 100644 --- a/tests/test_msg_changepin.py +++ b/tests/test_msg_changepin.py @@ -6,6 +6,7 @@ from trezorlib import messages_pb2 as proto from trezorlib import types_pb2 as proto_types class TestMsgChangepin(common.TrezorTest): + def test_set_pin(self): self.setup_mnemonic_nopin_nopassphrase() features = self.client.call_raw(proto.Initialize()) @@ -41,6 +42,7 @@ class TestMsgChangepin(common.TrezorTest): self.assertTrue(features.pin_protection) ret = self.client.call_raw(proto.Ping(pin_protection=True)) self.assertIsInstance(ret, proto.PinMatrixRequest) + self.client.call_raw(proto.Cancel()) # Check that the PIN is correct self.assertEqual(self.client.debug.read_pin()[0], self.pin6) @@ -94,7 +96,6 @@ class TestMsgChangepin(common.TrezorTest): # Check that the PIN is correct self.assertEqual(self.client.debug.read_pin()[0], self.pin6) - def test_remove_pin(self): self.setup_mnemonic_pin_passphrase() features = self.client.call_raw(proto.Initialize()) @@ -126,7 +127,7 @@ class TestMsgChangepin(common.TrezorTest): self.assertFalse(features.pin_protection) ret = self.client.call_raw(proto.Ping(pin_protection=True)) self.assertIsInstance(ret, proto.Success) - + def test_set_failed(self): self.setup_mnemonic_nopin_nopassphrase() features = self.client.call_raw(proto.Initialize()) @@ -163,5 +164,41 @@ class TestMsgChangepin(common.TrezorTest): ret = self.client.call_raw(proto.Ping(pin_protection=True)) self.assertIsInstance(ret, proto.Success) + def test_set_failed_2(self): + self.setup_mnemonic_pin_passphrase() + features = self.client.call_raw(proto.Initialize()) + self.assertTrue(features.pin_protection) + + # Let's set new PIN + ret = self.client.call_raw(proto.ChangePin()) + self.assertIsInstance(ret, proto.ButtonRequest) + + # Press button + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + # Send current PIN + self.assertIsInstance(ret, proto.PinMatrixRequest) + pin_encoded = self.client.debug.read_pin_encoded() + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Send the PIN for first time + self.assertIsInstance(ret, proto.PinMatrixRequest) + pin_encoded = self.client.debug.encode_pin(self.pin6) + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Send the PIN for second time, but with typo + self.assertIsInstance(ret, proto.PinMatrixRequest) + pin_encoded = self.client.debug.encode_pin(self.pin6 + '3') + ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) + + # Now it should fail, because pins are different + self.assertIsInstance(ret, proto.Failure) + + # Check that there's still old PIN protection + features = self.client.call_raw(proto.Initialize()) + self.assertTrue(features.pin_protection) + self.assertEqual(self.client.debug.read_pin()[0], self.pin4) + if __name__ == '__main__': unittest.main() From 3cd07c4dea64917f8254e069ccb7d6968c23131b Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 3 Mar 2014 15:56:32 +0100 Subject: [PATCH 0260/1535] get public_node doesn't use coin param anymore --- cmd.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cmd.py b/cmd.py index f35af8e70..5c71ca802 100755 --- a/cmd.py +++ b/cmd.py @@ -102,7 +102,7 @@ class Commands(object): def get_public_node(self, args): address_n = self.client.expand_path(args.n) - return self.client.get_public_node(args.coin, address_n) + return self.client.get_public_node(address_n) def set_label(self, args): return self.client.apply_settings(label=args.label) @@ -241,7 +241,6 @@ class Commands(object): ) get_public_node.arguments = ( - (('-c', '--coin'), {'type': str, 'default': 'Bitcoin'}), (('-n', '-address'), {'type': str}), ) From 1e148a7b7b0813fe34b1ad82e691ffa498587845 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 3 Mar 2014 19:30:43 +0100 Subject: [PATCH 0261/1535] really query for internal entropy before sending external one use strength to compute number of words --- tests/test_msg_resetdevice.py | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/tests/test_msg_resetdevice.py b/tests/test_msg_resetdevice.py index 1aa1aedab..de66ca6bf 100644 --- a/tests/test_msg_resetdevice.py +++ b/tests/test_msg_resetdevice.py @@ -50,16 +50,17 @@ class TestDeviceReset(common.TrezorTest): self.client.debug.press_yes() ret = self.client.call_raw(proto.ButtonAck()) + # Provide entropy self.assertIsInstance(ret, proto.EntropyRequest) + internal_entropy = self.client.debug.read_entropy() ret = self.client.call_raw(proto.EntropyAck(entropy=external_entropy)) - # Read internal entropy and generate mnemonic locally - internal_entropy = self.client.debug.read_entropy() + # Generate mnemonic locally entropy = generate_entropy(strength, internal_entropy, external_entropy) expected_mnemonic = Mnemonic('english').to_mnemonic(entropy) mnemonic = [] - for _ in range(12): + for _ in range(strength/32*3): self.assertIsInstance(ret, proto.ButtonRequest) mnemonic.append(self.client.debug.read_word()[0]) self.client.debug.press_yes() @@ -71,7 +72,7 @@ class TestDeviceReset(common.TrezorTest): self.assertEqual(mnemonic, expected_mnemonic) mnemonic = [] - for _ in range(12): + for _ in range(strength/32*3): self.assertIsInstance(ret, proto.ButtonRequest) mnemonic.append(self.client.debug.read_word()[0]) self.client.debug.press_yes() @@ -83,7 +84,7 @@ class TestDeviceReset(common.TrezorTest): # Compare that second pass printed out the same mnemonic once again self.assertEqual(mnemonic, expected_mnemonic) - + # Check if device is properly initialized resp = self.client.call_raw(proto.Initialize()) self.assertFalse(resp.pin_protection) @@ -112,9 +113,6 @@ class TestDeviceReset(common.TrezorTest): self.client.debug.press_yes() ret = self.client.call_raw(proto.ButtonAck()) - self.assertIsInstance(ret, proto.EntropyRequest) - ret = self.client.call_raw(proto.EntropyAck(entropy=external_entropy)) - self.assertIsInstance(ret, proto.PinMatrixRequest) # Enter PIN for first time @@ -126,13 +124,17 @@ class TestDeviceReset(common.TrezorTest): pin_encoded = self.client.debug.encode_pin('654') ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) - # Read internal entropy and generate mnemonic locally + # Provide entropy + self.assertIsInstance(ret, proto.EntropyRequest) internal_entropy = self.client.debug.read_entropy() + ret = self.client.call_raw(proto.EntropyAck(entropy=external_entropy)) + + # Generate mnemonic locally entropy = generate_entropy(strength, internal_entropy, external_entropy) expected_mnemonic = Mnemonic('english').to_mnemonic(entropy) mnemonic = [] - for _ in range(12): + for _ in range(strength/32*3): self.assertIsInstance(ret, proto.ButtonRequest) mnemonic.append(self.client.debug.read_word()[0]) self.client.debug.press_yes() @@ -144,7 +146,7 @@ class TestDeviceReset(common.TrezorTest): self.assertEqual(mnemonic, expected_mnemonic) mnemonic = [] - for _ in range(12): + for _ in range(strength/32*3): self.assertIsInstance(ret, proto.ButtonRequest) mnemonic.append(self.client.debug.read_word()[0]) self.client.debug.press_yes() @@ -165,10 +167,12 @@ class TestDeviceReset(common.TrezorTest): # Do passphrase-protected action, PassphraseRequest should be raised resp = self.client.call_raw(proto.Ping(passphrase_protection=True)) self.assertIsInstance(resp, proto.PassphraseRequest) + self.client.call_raw(proto.Cancel()) # Do PIN-protected action, PinRequest should be raised resp = self.client.call_raw(proto.Ping(pin_protection=True)) self.assertIsInstance(resp, proto.PinMatrixRequest) + self.client.call_raw(proto.Cancel()) def test_failed_pin(self): external_entropy = 'zlutoucky kun upel divoke ody' * 2 @@ -185,9 +189,6 @@ class TestDeviceReset(common.TrezorTest): self.client.debug.press_yes() ret = self.client.call_raw(proto.ButtonAck()) - self.assertIsInstance(ret, proto.EntropyRequest) - ret = self.client.call_raw(proto.EntropyAck(entropy=external_entropy)) - self.assertIsInstance(ret, proto.PinMatrixRequest) # Enter PIN for first time @@ -200,7 +201,7 @@ class TestDeviceReset(common.TrezorTest): ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) self.assertIsInstance(ret, proto.Failure) - + def test_already_initialized(self): self.setup_mnemonic_nopin_nopassphrase() self.assertRaises(Exception, self.client.reset_device, False, 128, True, True, 'label', 'english') From 2f498f63e2b05872a5bba2c150385be291ab916f Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 6 Mar 2014 20:54:50 +0100 Subject: [PATCH 0262/1535] don't request confirmation of change addresses --- tests/test_msg_simplesigntx.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index 19c217fc7..822cadc38 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -90,7 +90,7 @@ class TestMsgSimplesigntx(common.TrezorTest): self.client.set_tx_func(FakeTestnetBlockchain().get_tx) msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest()]) tx = self.client.call(msg) @@ -122,7 +122,7 @@ class TestMsgSimplesigntx(common.TrezorTest): self.client.set_tx_func(FakeTestnetBlockchain().get_tx) msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest()]) @@ -155,7 +155,7 @@ class TestMsgSimplesigntx(common.TrezorTest): with self.client: msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest()]) tx = self.client.call(msg) @@ -193,7 +193,7 @@ class TestMsgSimplesigntx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2, out3]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest()]) tx = self.client.call(msg) @@ -233,7 +233,7 @@ class TestMsgSimplesigntx(common.TrezorTest): with self.client: msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest()]) tx = self.client.call(msg) @@ -266,7 +266,7 @@ class TestMsgSimplesigntx(common.TrezorTest): outputs = [] for _ in range(255): - out = proto_types.TxOutputType(address_n=[4], # 1NwN6UduuVkJi6sw3gSiKZaCY5rHgVXC2h + out = proto_types.TxOutputType(address='1NwN6UduuVkJi6sw3gSiKZaCY5rHgVXC2h', amount=10200, script_type=proto_types.PAYTOADDRESS, ) From 14007cc61349bbbbb7a87847df0eb8f8b89edf29 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 6 Mar 2014 22:02:07 +0100 Subject: [PATCH 0263/1535] add test_verify_bitcoind to test_msg_verifymessage --- tests/test_msg_verifymessage.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/test_msg_verifymessage.py b/tests/test_msg_verifymessage.py index abc7525c5..d5be691a6 100644 --- a/tests/test_msg_verifymessage.py +++ b/tests/test_msg_verifymessage.py @@ -89,6 +89,17 @@ class TestMsgVerifymessage(common.TrezorTest): self.assertTrue(res_nfkd) self.assertTrue(res_nfc) - + + def test_verify_bitcoind(self): + self.setup_mnemonic_nopin_nopassphrase() + + res = self.client.verify_message( + '1KzXE97kV7DrpxCViCN3HbGbiKhzzPM7TQ', + binascii.unhexlify('1cc694f0f23901dfe3603789142f36a3fc582d0d5c0ec7215cf2ccd641e4e37228504f3d4dc3eea28bbdbf5da27c49d4635c097004d9f228750ccd836a8e1460c0'), + u'\u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy' + ) + + self.assertTrue(res) + if __name__ == '__main__': unittest.main() From 4fc8868589cbcc4af41879a215fcd4984804bc7c Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 7 Mar 2014 17:25:55 +0100 Subject: [PATCH 0264/1535] rename word variables in DebugLinkState message --- tests/test_msg_recoverydevice.py | 20 ++++++++--------- tests/test_msg_resetdevice.py | 12 +++++------ trezorlib/client.py | 2 +- trezorlib/debuglink.py | 12 +++++++---- trezorlib/messages_pb2.py | 37 +++++++++++++++++++------------- 5 files changed, 47 insertions(+), 36 deletions(-) diff --git a/tests/test_msg_recoverydevice.py b/tests/test_msg_recoverydevice.py index b2b2ac050..85f3cb5a7 100644 --- a/tests/test_msg_recoverydevice.py +++ b/tests/test_msg_recoverydevice.py @@ -32,13 +32,13 @@ class TestDeviceRecovery(common.TrezorTest): fakes = 0 for _ in range(int(12 * 1.5)): self.assertIsInstance(ret, proto.WordRequest) - word = self.client.debug.read_word() + (word, pos) = self.client.debug.read_word() - if word[1] != 0: - ret = self.client.call_raw(proto.WordAck(word=mnemonic[word[1] - 1])) - mnemonic[word[1] - 1] = None + if pos != 0: + ret = self.client.call_raw(proto.WordAck(word=mnemonic[pos - 1])) + mnemonic[pos - 1] = None else: - ret = self.client.call_raw(proto.WordAck(word=word[0])) + ret = self.client.call_raw(proto.WordAck(word=word)) fakes += 1 print mnemonic @@ -82,13 +82,13 @@ class TestDeviceRecovery(common.TrezorTest): fakes = 0 for _ in range(int(12 * 1.5)): self.assertIsInstance(ret, proto.WordRequest) - word = self.client.debug.read_word() + (word, pos) = self.client.debug.read_recvery_word() - if word[1] != 0: - ret = self.client.call_raw(proto.WordAck(word=mnemonic[word[1] - 1])) - mnemonic[word[1] - 1] = None + if pos != 0: + ret = self.client.call_raw(proto.WordAck(word=mnemonic[pos - 1])) + mnemonic[pos - 1] = None else: - ret = self.client.call_raw(proto.WordAck(word=word[0])) + ret = self.client.call_raw(proto.WordAck(word=word)) fakes += 1 print mnemonic diff --git a/tests/test_msg_resetdevice.py b/tests/test_msg_resetdevice.py index de66ca6bf..5f2dbea4f 100644 --- a/tests/test_msg_resetdevice.py +++ b/tests/test_msg_resetdevice.py @@ -52,7 +52,7 @@ class TestDeviceReset(common.TrezorTest): # Provide entropy self.assertIsInstance(ret, proto.EntropyRequest) - internal_entropy = self.client.debug.read_entropy() + internal_entropy = self.client.debug.read_reset_entropy() ret = self.client.call_raw(proto.EntropyAck(entropy=external_entropy)) # Generate mnemonic locally @@ -62,7 +62,7 @@ class TestDeviceReset(common.TrezorTest): mnemonic = [] for _ in range(strength/32*3): self.assertIsInstance(ret, proto.ButtonRequest) - mnemonic.append(self.client.debug.read_word()[0]) + mnemonic.append(self.client.debug.read_reset_word()) self.client.debug.press_yes() self.client.call_raw(proto.ButtonAck()) @@ -74,7 +74,7 @@ class TestDeviceReset(common.TrezorTest): mnemonic = [] for _ in range(strength/32*3): self.assertIsInstance(ret, proto.ButtonRequest) - mnemonic.append(self.client.debug.read_word()[0]) + mnemonic.append(self.client.debug.read_reset_word()) self.client.debug.press_yes() resp = self.client.call_raw(proto.ButtonAck()) @@ -126,7 +126,7 @@ class TestDeviceReset(common.TrezorTest): # Provide entropy self.assertIsInstance(ret, proto.EntropyRequest) - internal_entropy = self.client.debug.read_entropy() + internal_entropy = self.client.debug.read_reset_entropy() ret = self.client.call_raw(proto.EntropyAck(entropy=external_entropy)) # Generate mnemonic locally @@ -136,7 +136,7 @@ class TestDeviceReset(common.TrezorTest): mnemonic = [] for _ in range(strength/32*3): self.assertIsInstance(ret, proto.ButtonRequest) - mnemonic.append(self.client.debug.read_word()[0]) + mnemonic.append(self.client.debug.read_reset_word()) self.client.debug.press_yes() self.client.call_raw(proto.ButtonAck()) @@ -148,7 +148,7 @@ class TestDeviceReset(common.TrezorTest): mnemonic = [] for _ in range(strength/32*3): self.assertIsInstance(ret, proto.ButtonRequest) - mnemonic.append(self.client.debug.read_word()[0]) + mnemonic.append(self.client.debug.read_reset_word()) self.client.debug.press_yes() resp = self.client.call_raw(proto.ButtonAck()) diff --git a/trezorlib/client.py b/trezorlib/client.py index 713f7c198..fc3f45dcc 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -264,7 +264,7 @@ class DebugLinkMixin(object): return proto.PassphraseAck(passphrase=self.passphrase) def callback_WordRequest(self, msg): - (word, pos) = self.debug.read_word() + (word, pos) = self.debug.read_recovery_word() if word != '': return proto.WordAck(word=word) if pos != 0: diff --git a/trezorlib/debuglink.py b/trezorlib/debuglink.py index cf29447d1..9bc1c17fa 100644 --- a/trezorlib/debuglink.py +++ b/trezorlib/debuglink.py @@ -66,13 +66,17 @@ class DebugLink(object): obj = self._call(proto.DebugLinkGetState()) return obj.node - def read_word(self): + def read_recovery_word(self): obj = self._call(proto.DebugLinkGetState()) - return (obj.word, obj.word_pos) + return (obj.recovery_fake_word, obj.recovery_word_pos) - def read_entropy(self): + def read_reset_word(self): obj = self._call(proto.DebugLinkGetState()) - return obj.entropy + return obj.reset_word + + def read_reset_entropy(self): + obj = self._call(proto.DebugLinkGetState()) + return obj.reset_entropy def read_passphrase_protection(self): obj = self._call(proto.DebugLinkGetState()) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index e7d252d23..b8764a0da 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x93\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xba\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x0c\n\x04word\x18\x07 \x01(\t\x12\x10\n\x08word_pos\x18\x08 \x01(\x05\x12\x0f\n\x07\x65ntropy\x18\t \x01(\x0c\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x93\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -206,8 +206,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2770, - serialized_end=4351, + serialized_start=2819, + serialized_end=4400, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -1772,23 +1772,30 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='word', full_name='DebugLinkState.word', index=6, + name='reset_word', full_name='DebugLinkState.reset_word', index=6, number=7, type=9, cpp_type=9, label=1, has_default_value=False, default_value=unicode("", "utf-8"), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='word_pos', full_name='DebugLinkState.word_pos', index=7, - number=8, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, + name='reset_entropy', full_name='DebugLinkState.reset_entropy', index=7, + number=8, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='entropy', full_name='DebugLinkState.entropy', index=8, - number=9, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + name='recovery_fake_word', full_name='DebugLinkState.recovery_fake_word', index=8, + number=9, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='recovery_word_pos', full_name='DebugLinkState.recovery_word_pos', index=9, + number=10, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1802,7 +1809,7 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=2503, - serialized_end=2689, + serialized_end=2738, ) @@ -1822,8 +1829,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2691, - serialized_end=2706, + serialized_start=2740, + serialized_end=2755, ) @@ -1864,8 +1871,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2708, - serialized_end=2767, + serialized_start=2757, + serialized_end=2816, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From da6ce3acb81c70d582c9bd5adde198e3d259199a Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 7 Mar 2014 21:51:01 +0100 Subject: [PATCH 0265/1535] add test for failed word in recovery device --- tests/test_msg_recoverydevice.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/test_msg_recoverydevice.py b/tests/test_msg_recoverydevice.py index 85f3cb5a7..6919a69e2 100644 --- a/tests/test_msg_recoverydevice.py +++ b/tests/test_msg_recoverydevice.py @@ -115,6 +115,28 @@ class TestDeviceRecovery(common.TrezorTest): resp = self.client.call_raw(proto.Ping(pin_protection=True)) self.assertIsInstance(resp, proto.Success) + def test_word_fail(self): + ret = self.client.call_raw(proto.RecoveryDevice(word_count=12, + passphrase_protection=False, + pin_protection=False, + label='label', + language='english', + enforce_wordlist=True)) + + self.assertIsInstance(ret, proto.ButtonRequest) + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + + for _ in range(int(12 * 1.5)): + self.assertIsInstance(ret, proto.WordRequest) + (word, pos) = self.client.debug.read_recovery_word() + + if pos != 0: + ret = self.client.call_raw(proto.WordAck('kwyjibo')) + self.assertIsInstance(ret, proto.Failure) + else: + ret = self.client.call_raw(proto.WordAck(word=word)) + def test_pin_fail(self): ret = self.client.call_raw(proto.RecoveryDevice(word_count=12, passphrase_protection=True, From 099cdd25780ac266286dc21ace825f7c2c8d62fd Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 7 Mar 2014 21:44:06 +0100 Subject: [PATCH 0266/1535] Fixed load_device_by_xprv --- trezorlib/client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index fc3f45dcc..f7ecbda44 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -510,7 +510,7 @@ class ProtocolMixin(object): @field('message') @expect(proto.Success) - def load_device_by_xprv(self, xprv, pin, passphrase_protection, label): + def load_device_by_xprv(self, xprv, pin, passphrase_protection, label, language): if self.features.initialized: raise Exception("Device is initialized already. Call wipe_device() and try again.") @@ -547,7 +547,7 @@ class ProtocolMixin(object): resp = self.call(proto.LoadDevice(node=node, pin=pin, passphrase_protection=passphrase_protection, - language='english', + language=language, label=label)) self.init_device() return resp From bf7fb7928b366c5aab2774a6077fa83449b27096 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 7 Mar 2014 21:44:27 +0100 Subject: [PATCH 0267/1535] Numbered mnemonic --- tests/common.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/common.py b/tests/common.py index 54e1abf33..8e5112586 100644 --- a/tests/common.py +++ b/tests/common.py @@ -12,6 +12,7 @@ class TrezorTest(unittest.TestCase): self.client.set_debuglink(self.debug_transport) self.client.set_tx_func(BlockchainApi().get_tx) + # 1 2 3 4 5 6 7 8 9 10 11 12 self.mnemonic12 = 'alcohol woman abuse must during monitor noble actual mixed trade anger aisle' self.mnemonic18 = 'owner little vague addict embark decide pink prosper true fork panda embody mixture exchange choose canoe electric jewel' self.mnemonic24 = 'dignity pass list indicate nasty swamp pool script soccer toe leaf photo multiply desk host tomato cradle drill spread actor shine dismiss champion exotic' From 40f8c56eb44f8669a82d12dfa14801332401c2a5 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 7 Mar 2014 21:44:41 +0100 Subject: [PATCH 0268/1535] Updated tests to do --- tests/test.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test.py b/tests/test.py index d69208fa5..08055d891 100755 --- a/tests/test.py +++ b/tests/test.py @@ -24,6 +24,8 @@ x SimpleSignTx x protection levels x neuspesna zmena pinu +pin backoff predelat pred zadanim pinu + - zrejme v sucinnosti s inymi testami x ButtonRequest/ButtonAck workflow x PinMatrixRequest/PinMatrixAck workflow @@ -47,4 +49,6 @@ x Zero signature test x test bip39, utf, passphrase x Clear session on ChangePin + +Test s invalid adresou pro vystup ''' From e0efe950c0f3649401f941b4a136a70e8d648c22 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 7 Mar 2014 21:51:48 +0100 Subject: [PATCH 0269/1535] Fixed typos --- tests/test_msg_recoverydevice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_msg_recoverydevice.py b/tests/test_msg_recoverydevice.py index 6919a69e2..da9eaa725 100644 --- a/tests/test_msg_recoverydevice.py +++ b/tests/test_msg_recoverydevice.py @@ -32,7 +32,7 @@ class TestDeviceRecovery(common.TrezorTest): fakes = 0 for _ in range(int(12 * 1.5)): self.assertIsInstance(ret, proto.WordRequest) - (word, pos) = self.client.debug.read_word() + (word, pos) = self.client.debug.read_recovery_word() if pos != 0: ret = self.client.call_raw(proto.WordAck(word=mnemonic[pos - 1])) @@ -82,7 +82,7 @@ class TestDeviceRecovery(common.TrezorTest): fakes = 0 for _ in range(int(12 * 1.5)): self.assertIsInstance(ret, proto.WordRequest) - (word, pos) = self.client.debug.read_recvery_word() + (word, pos) = self.client.debug.read_recovery_word() if pos != 0: ret = self.client.call_raw(proto.WordAck(word=mnemonic[pos - 1])) From 25631221c54baf3764af6b5fc363f62b073eb0f5 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 7 Mar 2014 22:38:16 +0100 Subject: [PATCH 0270/1535] fix test_word_fail in test_msg_recoverydevice --- tests/test_msg_recoverydevice.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/test_msg_recoverydevice.py b/tests/test_msg_recoverydevice.py index da9eaa725..2125e9dea 100644 --- a/tests/test_msg_recoverydevice.py +++ b/tests/test_msg_recoverydevice.py @@ -60,10 +60,12 @@ class TestDeviceRecovery(common.TrezorTest): # Do passphrase-protected action, PassphraseRequest should be raised resp = self.client.call_raw(proto.Ping(passphrase_protection=True)) self.assertIsInstance(resp, proto.PassphraseRequest) + self.client.call_raw(proto.Cancel()) # Do PIN-protected action, PinRequest should be raised resp = self.client.call_raw(proto.Ping(pin_protection=True)) self.assertIsInstance(resp, proto.PinMatrixRequest) + self.client.call_raw(proto.Cancel()) def test_nopin_nopassphrase(self): mnemonic = self.mnemonic12.split(' ') @@ -127,15 +129,15 @@ class TestDeviceRecovery(common.TrezorTest): self.client.debug.press_yes() ret = self.client.call_raw(proto.ButtonAck()) + self.assertIsInstance(ret, proto.WordRequest) for _ in range(int(12 * 1.5)): - self.assertIsInstance(ret, proto.WordRequest) (word, pos) = self.client.debug.read_recovery_word() - if pos != 0: - ret = self.client.call_raw(proto.WordAck('kwyjibo')) + ret = self.client.call_raw(proto.WordAck(word='kwyjibo')) self.assertIsInstance(ret, proto.Failure) + break else: - ret = self.client.call_raw(proto.WordAck(word=word)) + self.client.call_raw(proto.WordAck(word=word)) def test_pin_fail(self): ret = self.client.call_raw(proto.RecoveryDevice(word_count=12, From d2a787821bf3e2b0cbe0dfbbce4dfabc64c3bc72 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 7 Mar 2014 22:39:19 +0100 Subject: [PATCH 0271/1535] Fixed reset device --- tests/test_msg_resetdevice.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tests/test_msg_resetdevice.py b/tests/test_msg_resetdevice.py index 5f2dbea4f..bfca2bed3 100644 --- a/tests/test_msg_resetdevice.py +++ b/tests/test_msg_resetdevice.py @@ -46,10 +46,6 @@ class TestDeviceReset(common.TrezorTest): language='english', label='test')) - self.assertIsInstance(ret, proto.ButtonRequest) - self.client.debug.press_yes() - ret = self.client.call_raw(proto.ButtonAck()) - # Provide entropy self.assertIsInstance(ret, proto.EntropyRequest) internal_entropy = self.client.debug.read_reset_entropy() From 21f3481c612d13b7dbf4dd4ba4dff5b24658dce6 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 7 Mar 2014 22:50:35 +0100 Subject: [PATCH 0272/1535] Removed button presses for LoadDevice/ResetDevice/RecoveryDevice --- tests/test_msg_recoverydevice.py | 19 ------------------- tests/test_protection_levels.py | 9 +++------ 2 files changed, 3 insertions(+), 25 deletions(-) diff --git a/tests/test_msg_recoverydevice.py b/tests/test_msg_recoverydevice.py index 2125e9dea..47dbf23aa 100644 --- a/tests/test_msg_recoverydevice.py +++ b/tests/test_msg_recoverydevice.py @@ -13,11 +13,6 @@ class TestDeviceRecovery(common.TrezorTest): language='english', enforce_wordlist=True)) - - self.assertIsInstance(ret, proto.ButtonRequest) - self.client.debug.press_yes() - ret = self.client.call_raw(proto.ButtonAck()) - self.assertIsInstance(ret, proto.PinMatrixRequest) # Enter PIN for first time @@ -76,11 +71,6 @@ class TestDeviceRecovery(common.TrezorTest): language='english', enforce_wordlist=True)) - - self.assertIsInstance(ret, proto.ButtonRequest) - self.client.debug.press_yes() - ret = self.client.call_raw(proto.ButtonAck()) - fakes = 0 for _ in range(int(12 * 1.5)): self.assertIsInstance(ret, proto.WordRequest) @@ -125,10 +115,6 @@ class TestDeviceRecovery(common.TrezorTest): language='english', enforce_wordlist=True)) - self.assertIsInstance(ret, proto.ButtonRequest) - self.client.debug.press_yes() - ret = self.client.call_raw(proto.ButtonAck()) - self.assertIsInstance(ret, proto.WordRequest) for _ in range(int(12 * 1.5)): (word, pos) = self.client.debug.read_recovery_word() @@ -147,11 +133,6 @@ class TestDeviceRecovery(common.TrezorTest): language='english', enforce_wordlist=True)) - - self.assertIsInstance(ret, proto.ButtonRequest) - self.client.debug.press_yes() - ret = self.client.call_raw(proto.ButtonAck()) - self.assertIsInstance(ret, proto.PinMatrixRequest) # Enter PIN for first time diff --git a/tests/test_protection_levels.py b/tests/test_protection_levels.py index bcf9b3266..a8fa9a56e 100644 --- a/tests/test_protection_levels.py +++ b/tests/test_protection_levels.py @@ -75,8 +75,7 @@ class TestProtectionLevels(common.TrezorTest): def test_load_device(self): with self.client: - self.client.set_expected_responses([proto.ButtonRequest(), - proto.Success(), + self.client.set_expected_responses([proto.Success(), proto.Features()]) self.client.load_device_by_mnemonic('this is mnemonic', '1234', True, 'label', 'english', skip_checksum=True) @@ -86,8 +85,7 @@ class TestProtectionLevels(common.TrezorTest): def test_reset_device(self): with self.client: - self.client.set_expected_responses([proto.ButtonRequest(), - proto.EntropyRequest()] +\ + self.client.set_expected_responses([proto.EntropyRequest()] + \ [proto.ButtonRequest()] * 24 + \ [proto.Success(), proto.Features()]) @@ -99,8 +97,7 @@ class TestProtectionLevels(common.TrezorTest): def test_recovery_device(self): with self.client: self.client.set_mnemonic(self.mnemonic12) - self.client.set_expected_responses([proto.ButtonRequest(), ] + \ - [proto.WordRequest()] * int(12 * 1.5) + \ + self.client.set_expected_responses([proto.WordRequest()] * int(12 * 1.5) + \ [proto.Success(), proto.Features()]) self.client.recovery_device(12, False, False, 'label', 'english') From 27070e84a970e9cf615066e31452b86a10021fcb Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 11 Mar 2014 18:06:38 +0100 Subject: [PATCH 0273/1535] support binary messages in sign/verify message --- trezorlib/client.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index f7ecbda44..e05e5b339 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -374,20 +374,24 @@ class ProtocolMixin(object): def sign_message(self, coin_name, n, message): n = self._convert_prime(n) - # Convert message to UTF8 NFC (seems to be a bitcoin-qt standard) - message = normalize_nfc(message) - - # Convert message to ASCII stream - message = str(bytearray(message, 'utf-8')) + try: + # Convert message to UTF8 NFC (seems to be a bitcoin-qt standard) + message = normalize_nfc(message) + # Convert message to ASCII stream + message = str(bytearray(message, 'utf-8')) + except: + pass # it was not UTF8 string return self.call(proto.SignMessage(coin_name=coin_name, address_n=n, message=message)) def verify_message(self, address, signature, message): - # Convert message to UTF8 NFC (seems to be a bitcoin-qt standard) - message = normalize_nfc(message) - + try: + # Convert message to UTF8 NFC (seems to be a bitcoin-qt standard) + message = normalize_nfc(message) # Convert message to ASCII stream - message = str(bytearray(message, 'utf-8')) + message = str(bytearray(message, 'utf-8')) + except: + pass # it was not UTF8 string try: resp = self.call(proto.VerifyMessage(address=address, signature=signature, message=message)) From 560e2a7038f4f3b9318adee395f17f237b1d092f Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 13 Mar 2014 15:01:50 +0100 Subject: [PATCH 0274/1535] rebuild pb --- trezorlib/messages_pb2.py | 194 ++++++++++++++++++++------------------ trezorlib/types_pb2.py | 31 +++++- 2 files changed, 131 insertions(+), 94 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index b8764a0da..0f5ccbe91 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\x93\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"#\n\x10PinMatrixRequest\x12\x0f\n\x07message\x18\x01 \x01(\t\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xa5\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\t\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -206,8 +206,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2819, - serialized_end=4400, + serialized_start=2857, + serialized_end=4438, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -371,6 +371,13 @@ _FEATURES = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='revision', full_name='Features.revision', index=12, + number=13, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -381,7 +388,7 @@ _FEATURES = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=46, - serialized_end=321, + serialized_end=339, ) @@ -415,8 +422,8 @@ _APPLYSETTINGS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=323, - serialized_end=371, + serialized_start=341, + serialized_end=389, ) @@ -443,8 +450,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=373, - serialized_end=400, + serialized_start=391, + serialized_end=418, ) @@ -492,8 +499,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=402, - serialized_end=507, + serialized_start=420, + serialized_end=525, ) @@ -520,8 +527,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=509, - serialized_end=535, + serialized_start=527, + serialized_end=553, ) @@ -555,8 +562,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=537, - serialized_end=591, + serialized_start=555, + serialized_end=609, ) @@ -590,8 +597,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=593, - serialized_end=656, + serialized_start=611, + serialized_end=674, ) @@ -611,8 +618,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=658, - serialized_end=669, + serialized_start=676, + serialized_end=687, ) @@ -624,9 +631,9 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='message', full_name='PinMatrixRequest.message', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=unicode("", "utf-8"), + name='type', full_name='PinMatrixRequest.type', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=1, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -639,8 +646,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=671, - serialized_end=706, + serialized_start=689, + serialized_end=744, ) @@ -667,8 +674,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=708, - serialized_end=735, + serialized_start=746, + serialized_end=773, ) @@ -688,8 +695,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=737, - serialized_end=745, + serialized_start=775, + serialized_end=783, ) @@ -709,8 +716,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=747, - serialized_end=766, + serialized_start=785, + serialized_end=804, ) @@ -737,8 +744,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=768, - serialized_end=803, + serialized_start=806, + serialized_end=841, ) @@ -765,8 +772,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=805, - serialized_end=831, + serialized_start=843, + serialized_end=869, ) @@ -793,8 +800,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=833, - serialized_end=859, + serialized_start=871, + serialized_end=897, ) @@ -821,8 +828,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=861, - serialized_end=894, + serialized_start=899, + serialized_end=932, ) @@ -849,8 +856,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=896, - serialized_end=934, + serialized_start=934, + serialized_end=972, ) @@ -884,8 +891,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=936, - serialized_end=995, + serialized_start=974, + serialized_end=1033, ) @@ -912,8 +919,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=997, - serialized_end=1023, + serialized_start=1035, + serialized_end=1061, ) @@ -933,8 +940,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1025, - serialized_end=1037, + serialized_start=1063, + serialized_end=1075, ) @@ -1003,8 +1010,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1040, - serialized_end=1206, + serialized_start=1078, + serialized_end=1244, ) @@ -1066,8 +1073,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1209, - serialized_end=1366, + serialized_start=1247, + serialized_end=1404, ) @@ -1087,8 +1094,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1368, - serialized_end=1384, + serialized_start=1406, + serialized_end=1422, ) @@ -1115,8 +1122,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1386, - serialized_end=1415, + serialized_start=1424, + serialized_end=1453, ) @@ -1178,8 +1185,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1418, - serialized_end=1577, + serialized_start=1456, + serialized_end=1615, ) @@ -1199,8 +1206,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1579, - serialized_end=1592, + serialized_start=1617, + serialized_end=1630, ) @@ -1227,8 +1234,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1594, - serialized_end=1617, + serialized_start=1632, + serialized_end=1655, ) @@ -1269,8 +1276,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1619, - serialized_end=1696, + serialized_start=1657, + serialized_end=1734, ) @@ -1311,8 +1318,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1698, - serialized_end=1766, + serialized_start=1736, + serialized_end=1804, ) @@ -1346,8 +1353,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1768, - serialized_end=1822, + serialized_start=1806, + serialized_end=1860, ) @@ -1388,8 +1395,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1824, - serialized_end=1913, + serialized_start=1862, + serialized_end=1951, ) @@ -1416,8 +1423,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1915, - serialized_end=1940, + serialized_start=1953, + serialized_end=1978, ) @@ -1458,8 +1465,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1942, - serialized_end=2023, + serialized_start=1980, + serialized_end=2061, ) @@ -1507,8 +1514,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2026, - serialized_end=2170, + serialized_start=2064, + serialized_end=2208, ) @@ -1563,8 +1570,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2173, - serialized_end=2307, + serialized_start=2211, + serialized_end=2345, ) @@ -1591,8 +1598,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2309, - serialized_end=2347, + serialized_start=2347, + serialized_end=2385, ) @@ -1619,8 +1626,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2349, - serialized_end=2390, + serialized_start=2387, + serialized_end=2428, ) @@ -1640,8 +1647,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2392, - serialized_end=2407, + serialized_start=2430, + serialized_end=2445, ) @@ -1668,8 +1675,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2409, - serialized_end=2442, + serialized_start=2447, + serialized_end=2480, ) @@ -1696,8 +1703,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2444, - serialized_end=2479, + serialized_start=2482, + serialized_end=2517, ) @@ -1717,8 +1724,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2481, - serialized_end=2500, + serialized_start=2519, + serialized_end=2538, ) @@ -1808,8 +1815,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2503, - serialized_end=2738, + serialized_start=2541, + serialized_end=2776, ) @@ -1829,8 +1836,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2740, - serialized_end=2755, + serialized_start=2778, + serialized_end=2793, ) @@ -1871,13 +1878,14 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2757, - serialized_end=2816, + serialized_start=2795, + serialized_end=2854, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE _FAILURE.fields_by_name['code'].enum_type = types_pb2._FAILURETYPE _BUTTONREQUEST.fields_by_name['code'].enum_type = types_pb2._BUTTONREQUESTTYPE +_PINMATRIXREQUEST.fields_by_name['type'].enum_type = types_pb2._PINMATRIXREQUESTTYPE _PUBLICKEY.fields_by_name['node'].message_type = types_pb2._HDNODETYPE _LOADDEVICE.fields_by_name['node'].message_type = types_pb2._HDNODETYPE _SIMPLESIGNTX.fields_by_name['inputs'].message_type = types_pb2._TXINPUTTYPE diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index ea721736b..109b9ce4e 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -169,6 +169,32 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) +_PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( + name='PinMatrixRequestType', + full_name='PinMatrixRequestType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='PinMatrixRequestType_Current', index=0, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PinMatrixRequestType_NewFirst', index=1, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PinMatrixRequestType_NewSecond', index=2, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1401, + serialized_end=1528, +) + +PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) Failure_UnexpectedMessage = 1 Failure_ButtonExpected = 2 Failure_SyntaxError = 3 @@ -193,6 +219,9 @@ ButtonRequest_ConfirmWord = 5 ButtonRequest_WipeDevice = 6 ButtonRequest_ProtectCall = 7 ButtonRequest_SignTx = 8 +PinMatrixRequestType_Current = 1 +PinMatrixRequestType_NewFirst = 2 +PinMatrixRequestType_NewSecond = 3 WIRE_IN_FIELD_NUMBER = 50002 wire_in = _descriptor.FieldDescriptor( From 0a2e1b66c9bd930351a5e9f34e8d2c0d60966cc9 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 14 Mar 2014 21:10:02 +0100 Subject: [PATCH 0275/1535] update pb --- trezorlib/messages_pb2.py | 191 ++++++++++++++++++++------------------ 1 file changed, 99 insertions(+), 92 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 0f5ccbe91..31f373548 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xa5\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\t\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xbe\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -206,8 +206,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2857, - serialized_end=4438, + serialized_start=2882, + serialized_end=4463, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -373,8 +373,15 @@ _FEATURES = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='revision', full_name='Features.revision', index=12, - number=13, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=unicode("", "utf-8"), + number=13, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bootloader_hash', full_name='Features.bootloader_hash', index=13, + number=14, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -388,7 +395,7 @@ _FEATURES = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=46, - serialized_end=339, + serialized_end=364, ) @@ -422,8 +429,8 @@ _APPLYSETTINGS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=341, - serialized_end=389, + serialized_start=366, + serialized_end=414, ) @@ -450,8 +457,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=391, - serialized_end=418, + serialized_start=416, + serialized_end=443, ) @@ -499,8 +506,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=420, - serialized_end=525, + serialized_start=445, + serialized_end=550, ) @@ -527,8 +534,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=527, - serialized_end=553, + serialized_start=552, + serialized_end=578, ) @@ -562,8 +569,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=555, - serialized_end=609, + serialized_start=580, + serialized_end=634, ) @@ -597,8 +604,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=611, - serialized_end=674, + serialized_start=636, + serialized_end=699, ) @@ -618,8 +625,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=676, - serialized_end=687, + serialized_start=701, + serialized_end=712, ) @@ -646,8 +653,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=689, - serialized_end=744, + serialized_start=714, + serialized_end=769, ) @@ -674,8 +681,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=746, - serialized_end=773, + serialized_start=771, + serialized_end=798, ) @@ -695,8 +702,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=775, - serialized_end=783, + serialized_start=800, + serialized_end=808, ) @@ -716,8 +723,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=785, - serialized_end=804, + serialized_start=810, + serialized_end=829, ) @@ -744,8 +751,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=806, - serialized_end=841, + serialized_start=831, + serialized_end=866, ) @@ -772,8 +779,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=843, - serialized_end=869, + serialized_start=868, + serialized_end=894, ) @@ -800,8 +807,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=871, - serialized_end=897, + serialized_start=896, + serialized_end=922, ) @@ -828,8 +835,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=899, - serialized_end=932, + serialized_start=924, + serialized_end=957, ) @@ -856,8 +863,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=934, - serialized_end=972, + serialized_start=959, + serialized_end=997, ) @@ -891,8 +898,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=974, - serialized_end=1033, + serialized_start=999, + serialized_end=1058, ) @@ -919,8 +926,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1035, - serialized_end=1061, + serialized_start=1060, + serialized_end=1086, ) @@ -940,8 +947,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1063, - serialized_end=1075, + serialized_start=1088, + serialized_end=1100, ) @@ -1010,8 +1017,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1078, - serialized_end=1244, + serialized_start=1103, + serialized_end=1269, ) @@ -1073,8 +1080,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1247, - serialized_end=1404, + serialized_start=1272, + serialized_end=1429, ) @@ -1094,8 +1101,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1406, - serialized_end=1422, + serialized_start=1431, + serialized_end=1447, ) @@ -1122,8 +1129,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1424, - serialized_end=1453, + serialized_start=1449, + serialized_end=1478, ) @@ -1185,8 +1192,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1456, - serialized_end=1615, + serialized_start=1481, + serialized_end=1640, ) @@ -1206,8 +1213,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1617, - serialized_end=1630, + serialized_start=1642, + serialized_end=1655, ) @@ -1234,8 +1241,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1632, - serialized_end=1655, + serialized_start=1657, + serialized_end=1680, ) @@ -1276,8 +1283,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1657, - serialized_end=1734, + serialized_start=1682, + serialized_end=1759, ) @@ -1318,8 +1325,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1736, - serialized_end=1804, + serialized_start=1761, + serialized_end=1829, ) @@ -1353,8 +1360,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1806, - serialized_end=1860, + serialized_start=1831, + serialized_end=1885, ) @@ -1395,8 +1402,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1862, - serialized_end=1951, + serialized_start=1887, + serialized_end=1976, ) @@ -1423,8 +1430,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1953, - serialized_end=1978, + serialized_start=1978, + serialized_end=2003, ) @@ -1465,8 +1472,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1980, - serialized_end=2061, + serialized_start=2005, + serialized_end=2086, ) @@ -1514,8 +1521,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2064, - serialized_end=2208, + serialized_start=2089, + serialized_end=2233, ) @@ -1570,8 +1577,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2211, - serialized_end=2345, + serialized_start=2236, + serialized_end=2370, ) @@ -1598,8 +1605,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2347, - serialized_end=2385, + serialized_start=2372, + serialized_end=2410, ) @@ -1626,8 +1633,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2387, - serialized_end=2428, + serialized_start=2412, + serialized_end=2453, ) @@ -1647,8 +1654,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2430, - serialized_end=2445, + serialized_start=2455, + serialized_end=2470, ) @@ -1675,8 +1682,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2447, - serialized_end=2480, + serialized_start=2472, + serialized_end=2505, ) @@ -1703,8 +1710,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2482, - serialized_end=2517, + serialized_start=2507, + serialized_end=2542, ) @@ -1724,8 +1731,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2519, - serialized_end=2538, + serialized_start=2544, + serialized_end=2563, ) @@ -1815,8 +1822,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2541, - serialized_end=2776, + serialized_start=2566, + serialized_end=2801, ) @@ -1836,8 +1843,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2778, - serialized_end=2793, + serialized_start=2803, + serialized_end=2818, ) @@ -1878,8 +1885,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2795, - serialized_end=2854, + serialized_start=2820, + serialized_end=2879, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From 8f870c54edd823dd0ddeb8a273577673a2e75dd8 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 23 Mar 2014 20:01:19 +0100 Subject: [PATCH 0276/1535] recompile pb --- trezorlib/messages_pb2.py | 182 +++++++++++++++++++------------------- 1 file changed, 91 insertions(+), 91 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 31f373548..2f33e84c1 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xbe\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x16\n\x0e\x62ugfix_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xbd\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -206,8 +206,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2882, - serialized_end=4463, + serialized_start=2881, + serialized_end=4462, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -309,7 +309,7 @@ _FEATURES = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='bugfix_version', full_name='Features.bugfix_version', index=3, + name='patch_version', full_name='Features.patch_version', index=3, number=4, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, @@ -395,7 +395,7 @@ _FEATURES = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=46, - serialized_end=364, + serialized_end=363, ) @@ -429,8 +429,8 @@ _APPLYSETTINGS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=366, - serialized_end=414, + serialized_start=365, + serialized_end=413, ) @@ -457,8 +457,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=416, - serialized_end=443, + serialized_start=415, + serialized_end=442, ) @@ -506,8 +506,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=445, - serialized_end=550, + serialized_start=444, + serialized_end=549, ) @@ -534,8 +534,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=552, - serialized_end=578, + serialized_start=551, + serialized_end=577, ) @@ -569,8 +569,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=580, - serialized_end=634, + serialized_start=579, + serialized_end=633, ) @@ -604,8 +604,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=636, - serialized_end=699, + serialized_start=635, + serialized_end=698, ) @@ -625,8 +625,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=701, - serialized_end=712, + serialized_start=700, + serialized_end=711, ) @@ -653,8 +653,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=714, - serialized_end=769, + serialized_start=713, + serialized_end=768, ) @@ -681,8 +681,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=771, - serialized_end=798, + serialized_start=770, + serialized_end=797, ) @@ -702,8 +702,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=800, - serialized_end=808, + serialized_start=799, + serialized_end=807, ) @@ -723,8 +723,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=810, - serialized_end=829, + serialized_start=809, + serialized_end=828, ) @@ -751,8 +751,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=831, - serialized_end=866, + serialized_start=830, + serialized_end=865, ) @@ -779,8 +779,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=868, - serialized_end=894, + serialized_start=867, + serialized_end=893, ) @@ -807,8 +807,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=896, - serialized_end=922, + serialized_start=895, + serialized_end=921, ) @@ -835,8 +835,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=924, - serialized_end=957, + serialized_start=923, + serialized_end=956, ) @@ -863,8 +863,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=959, - serialized_end=997, + serialized_start=958, + serialized_end=996, ) @@ -898,8 +898,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=999, - serialized_end=1058, + serialized_start=998, + serialized_end=1057, ) @@ -926,8 +926,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1060, - serialized_end=1086, + serialized_start=1059, + serialized_end=1085, ) @@ -947,8 +947,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1088, - serialized_end=1100, + serialized_start=1087, + serialized_end=1099, ) @@ -1017,8 +1017,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1103, - serialized_end=1269, + serialized_start=1102, + serialized_end=1268, ) @@ -1080,8 +1080,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1272, - serialized_end=1429, + serialized_start=1271, + serialized_end=1428, ) @@ -1101,8 +1101,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1431, - serialized_end=1447, + serialized_start=1430, + serialized_end=1446, ) @@ -1129,8 +1129,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1449, - serialized_end=1478, + serialized_start=1448, + serialized_end=1477, ) @@ -1192,8 +1192,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1481, - serialized_end=1640, + serialized_start=1480, + serialized_end=1639, ) @@ -1213,8 +1213,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1642, - serialized_end=1655, + serialized_start=1641, + serialized_end=1654, ) @@ -1241,8 +1241,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1657, - serialized_end=1680, + serialized_start=1656, + serialized_end=1679, ) @@ -1283,8 +1283,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1682, - serialized_end=1759, + serialized_start=1681, + serialized_end=1758, ) @@ -1325,8 +1325,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1761, - serialized_end=1829, + serialized_start=1760, + serialized_end=1828, ) @@ -1360,8 +1360,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1831, - serialized_end=1885, + serialized_start=1830, + serialized_end=1884, ) @@ -1402,8 +1402,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1887, - serialized_end=1976, + serialized_start=1886, + serialized_end=1975, ) @@ -1430,8 +1430,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1978, - serialized_end=2003, + serialized_start=1977, + serialized_end=2002, ) @@ -1472,8 +1472,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2005, - serialized_end=2086, + serialized_start=2004, + serialized_end=2085, ) @@ -1521,8 +1521,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2089, - serialized_end=2233, + serialized_start=2088, + serialized_end=2232, ) @@ -1577,8 +1577,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2236, - serialized_end=2370, + serialized_start=2235, + serialized_end=2369, ) @@ -1605,8 +1605,8 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2372, - serialized_end=2410, + serialized_start=2371, + serialized_end=2409, ) @@ -1633,8 +1633,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2412, - serialized_end=2453, + serialized_start=2411, + serialized_end=2452, ) @@ -1654,8 +1654,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2455, - serialized_end=2470, + serialized_start=2454, + serialized_end=2469, ) @@ -1682,8 +1682,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2472, - serialized_end=2505, + serialized_start=2471, + serialized_end=2504, ) @@ -1710,8 +1710,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2507, - serialized_end=2542, + serialized_start=2506, + serialized_end=2541, ) @@ -1731,8 +1731,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2544, - serialized_end=2563, + serialized_start=2543, + serialized_end=2562, ) @@ -1822,8 +1822,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2566, - serialized_end=2801, + serialized_start=2565, + serialized_end=2800, ) @@ -1843,8 +1843,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2803, - serialized_end=2818, + serialized_start=2802, + serialized_end=2817, ) @@ -1885,8 +1885,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2820, - serialized_end=2879, + serialized_start=2819, + serialized_end=2878, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From 51b9d4e177a37be5c9830ef4f755a9ae21d54b44 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 25 Mar 2014 19:36:46 +0100 Subject: [PATCH 0277/1535] recompile pb, adjust TransactionType constructors --- tests/test_msg_signtx.py | 161 +++++++++++++++++++++++++ tests/test_msg_simplesigntx.py | 200 ++------------------------------ tests/test_protection_levels.py | 2 +- trezorlib/api_blockchain.py | 2 +- trezorlib/messages_pb2.py | 169 +++++++++++---------------- trezorlib/types_pb2.py | 47 +++++--- 6 files changed, 272 insertions(+), 309 deletions(-) create mode 100644 tests/test_msg_signtx.py diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py new file mode 100644 index 000000000..56c941086 --- /dev/null +++ b/tests/test_msg_signtx.py @@ -0,0 +1,161 @@ +''' + def test_signtx(self): + expected_tx = '01000000012de70f7d6ffed0db70f8882f3fca90db9bb09f0e99bce27468c23d3c994fcd56' \ + '010000008b4830450221009b985e14d53cfeed3496846db6ddaa77a0206138d0df4c2ccd3b' \ + '759e91bae3e1022004c76e10f99ccac8ced761719181a96bae25a74829eab3ecb8f29eb07f' \ + 'e18f7e01410436ae8595f03a7324d1d1482ede8560a4508c767fbc662559482d5759b32209' \ + 'a62964699995f6e018cfbeb7a71a66d4c64fa38875d79ead0a9ac66f59c1c8b3a3ffffffff' \ + '0250c30000000000001976a91444ce5c6789b0bb0e8a9ab9a4769fe181cb274c4688aca086' \ + '0100000000001976a9149e03078026388661b197129a43f0f64f88379ce688ac00000000' + + inp1 = proto.TxInput(index=0, + address_n=[1, 0], + amount=200000, # 0.002 BTC + prev_hash=binascii.unhexlify('56cd4f993c3dc26874e2bc990e9fb09bdb90ca3f2f88f870dbd0fe6f7d0fe72d'), + prev_index=1, + #script_sig= + ) + + out1 = proto.TxOutput(index=0, + address='1GnnT11aZeH6QZCtT7EjCvRF3EXHoY3owE', + address_n=[0, 1], + amount=50000, # 0.0005 BTC + script_type=proto.PAYTOADDRESS, + #script_args= + ) + + out2 = proto.TxOutput(index=1, + address='1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv', + #address_n=[], + amount=100000, # 0.001 BTC + script_type=proto.PAYTOADDRESS, + #script_args= + ) + + print binascii.hexlify(self.client.sign_tx([inp1], [out1, out2])[1]) + ''' + ''' + def test_workflow(self): + inp1 = proto.TxInput(index=0, + address_n=[1,0], + amount=100000000, + prev_hash='prevhash1234354346543456543654', + prev_index=11, + ) + + inp2 = proto.TxInput(index=1, + address_n=[2,0], + amount=100000000, + prev_hash='prevhash2222254346543456543654', + prev_index=11, + ) + + out1 = proto.TxOutput(index=0, + address='1BitkeyP2nDd5oa647AjvBbbwST54W5Zmx', + amount=100000000, + script_type=proto.PAYTOADDRESS, + ) + + out2 = proto.TxOutput(index=1, + address='1BitkeyP2nDd5oa647AjvBbbwST54W5Zmx', + #address_n=[], + amount=100000000, + script_type=proto.PAYTOADDRESS, + #script_args= + ) + + serialized = '' + + # Prepare and send initial message + tx = proto.SignTx() + tx.algo = proto.ELECTRUM + tx.random = self.client._get_local_entropy() + tx.inputs_count = 2 + tx.outputs_count = 2 + + res = self.client.call(tx) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXINPUT) + self.assertEqual(res.request_index, 0) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + # FIRST SIGNATURE + res = self.client.call(inp1) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXINPUT) + self.assertEqual(res.request_index, 1) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + res = self.client.call(inp2) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, 0) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + res = self.client.call(out1) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, 1) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + res = self.client.call(out2) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXINPUT) + self.assertEqual(res.request_index, 0) + self.assertNotEqual(res.signature, '') + self.assertNotEqual(res.serialized_tx, '') + serialized += res.serialized_tx + + # SECOND SIGNATURE + res = self.client.call(inp1) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXINPUT) + self.assertEqual(res.request_index, 1) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + res = self.client.call(inp2) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, 0) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + res = self.client.call(out1) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, 1) + self.assertEqual(res.signature, '') + self.assertEqual(res.serialized_tx, '') + + res = self.client.call(out2) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, 0) + self.assertNotEqual(res.signature, '') + self.assertNotEqual(res.serialized_tx, '') + serialized += res.serialized_tx + + # FINALIZING OUTPUTS + res = self.client.call(out1) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, 1) + self.assertEqual(res.signature, '') + self.assertNotEqual(res.serialized_tx, '') + serialized += res.serialized_tx + + res = self.client.call(out2) + self.assertIsInstance(res, proto.TxRequest) + self.assertEqual(res.request_type, proto.TXOUTPUT) + self.assertEqual(res.request_index, -1) + self.assertEqual(res.signature, '') + self.assertNotEqual(res.serialized_tx, '') + serialized += res.serialized_tx + + print binascii.hexlify(serialized) +''' diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index 822cadc38..d8b906cfb 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -14,7 +14,7 @@ class FakeTestnetBlockchain(object): if txhash != '6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54': raise Exception("Unexpected hash") - t = proto_types.TransactionType() + t = proto_types.TransactionType(version = 1, lock_time = 0) i = t.inputs.add() i.prev_hash = binascii.unhexlify('ee336e79153d51f4f3e45278f1f77ab29fd5bb135dce467282e2aff22cb9c570') @@ -59,7 +59,7 @@ class TestMsgSimplesigntx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(request_index=-1)]) + proto.TxRequest(finished=True)]) tx = self.client.call(msg) # Accepted by network: tx fd79435246dee76b2f159d2db08032d666c95adc544de64c8c49f474df4a7fee @@ -92,7 +92,7 @@ class TestMsgSimplesigntx(common.TrezorTest): self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest()]) + proto.TxRequest(finished=True)]) tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b4830450221009c2d30385519fdb13dce13d5ac038be07d7b2dad0b0f7b2c1c339d7255bcf553022056a2f5bceab3cd0ffed4d388387e631f419d67ff9ce7798e3d7dfe6a6d6ec4bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0280ce341d000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') @@ -125,7 +125,7 @@ class TestMsgSimplesigntx(common.TrezorTest): # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest()]) + proto.TxRequest(finished=True)]) tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') @@ -157,7 +157,7 @@ class TestMsgSimplesigntx(common.TrezorTest): self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest()]) + proto.TxRequest(finished=True)]) tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef1702201d481d04216b319dc549ffe2333143629ba18828a4e2d1783ab719a6aa263eb70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') @@ -195,7 +195,7 @@ class TestMsgSimplesigntx(common.TrezorTest): proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest()]) + proto.TxRequest(finished=True)]) tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02207b0879a81408a11e23b11d4c7965c62b5fc6d5c2d92340f5ee2da7b40e99314a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') @@ -235,7 +235,7 @@ class TestMsgSimplesigntx(common.TrezorTest): self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest()]) + proto.TxRequest(finished=True)]) tx = self.client.call(msg) # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb @@ -276,7 +276,7 @@ class TestMsgSimplesigntx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], outputs) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), ] * 255 + \ [proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(), ]) + proto.TxRequest(finished=True)]) tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') @@ -304,7 +304,7 @@ class TestMsgSimplesigntx(common.TrezorTest): self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest()]) + proto.TxRequest(finished=True)]) tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') @@ -338,187 +338,5 @@ class TestMsgSimplesigntx(common.TrezorTest): else: self.assert_(False, "types.Failure_NotEnoughFunds expected") - ''' - def test_simplesigntx_testnet(self): - self.client.load_device_by_xprv('xprv9s21ZrQH143K3zttRjiQmYwyugvd13pnd2VzefWrfSouRfnj5oSkJgBQXxtn18E9mqrDop7fQ8Xnb9JCLPE4vghzhpU4dT33ZJ7frjzTEW8', - '', False, 'testnet') - - inp1 = proto_types.TxInputType(address_n=[6], # mo8uUSFJULCMA4neRS9aS9jiXZ1N72FSLK - # amount=390000, - prev_hash=binascii.unhexlify('d83b27f16ce5069e0c8e4a02813f252500e257744d5b00c9b6128be7189117b1'), - prev_index=0, - ) - - out1 = proto_types.TxOutputType(address='mjKKH3Dk95VMbdNnDQYHZXoQ9QwuCZocwb', - amount=80085000, - script_type=proto_types.PAYTOADDRESS, - ) - - rawtx = {'d83b27f16ce5069e0c8e4a02813f252500e257744d5b00c9b6128be7189117b1': '01000000013b21cc65080c57793d0e47045a24d8e92262dc47efdc425fd5cad9a25e928f6c000000006b483045022100bde591f2c997bafa8388916663b148f4093914851a33a9903da69ad97afa6f470220138c6ff11321339974bac9c0992d7b9d72aef0c2d098f26267ec9f05d532c859012103edcc8dc5cac7dca6ed191d812621fb300863fea0dd5d14180b482b917a35acc4ffffffff020800c604000000001976a91453958011070469e2ef5e1115f34f509717d6884288acf8c99502000000001976a9141e2ba9407a6920246d0f345beecb89ed47c99a7788ac00000000'} - tx = self.client.simple_sign_tx('Testnet', [inp1, ], [out1, ]) - print binascii.hexlify(tx.serialized_tx) - self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') - - def test_signtx(self): - expected_tx = '01000000012de70f7d6ffed0db70f8882f3fca90db9bb09f0e99bce27468c23d3c994fcd56' \ - '010000008b4830450221009b985e14d53cfeed3496846db6ddaa77a0206138d0df4c2ccd3b' \ - '759e91bae3e1022004c76e10f99ccac8ced761719181a96bae25a74829eab3ecb8f29eb07f' \ - 'e18f7e01410436ae8595f03a7324d1d1482ede8560a4508c767fbc662559482d5759b32209' \ - 'a62964699995f6e018cfbeb7a71a66d4c64fa38875d79ead0a9ac66f59c1c8b3a3ffffffff' \ - '0250c30000000000001976a91444ce5c6789b0bb0e8a9ab9a4769fe181cb274c4688aca086' \ - '0100000000001976a9149e03078026388661b197129a43f0f64f88379ce688ac00000000' - - inp1 = proto.TxInput(index=0, - address_n=[1, 0], - amount=200000, # 0.002 BTC - prev_hash=binascii.unhexlify('56cd4f993c3dc26874e2bc990e9fb09bdb90ca3f2f88f870dbd0fe6f7d0fe72d'), - prev_index=1, - #script_sig= - ) - - out1 = proto.TxOutput(index=0, - address='1GnnT11aZeH6QZCtT7EjCvRF3EXHoY3owE', - address_n=[0, 1], - amount=50000, # 0.0005 BTC - script_type=proto.PAYTOADDRESS, - #script_args= - ) - - out2 = proto.TxOutput(index=1, - address='1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv', - #address_n=[], - amount=100000, # 0.001 BTC - script_type=proto.PAYTOADDRESS, - #script_args= - ) - - print binascii.hexlify(self.client.sign_tx([inp1], [out1, out2])[1]) - ''' - ''' - def test_workflow(self): - inp1 = proto.TxInput(index=0, - address_n=[1,0], - amount=100000000, - prev_hash='prevhash1234354346543456543654', - prev_index=11, - ) - - inp2 = proto.TxInput(index=1, - address_n=[2,0], - amount=100000000, - prev_hash='prevhash2222254346543456543654', - prev_index=11, - ) - - out1 = proto.TxOutput(index=0, - address='1BitkeyP2nDd5oa647AjvBbbwST54W5Zmx', - amount=100000000, - script_type=proto.PAYTOADDRESS, - ) - - out2 = proto.TxOutput(index=1, - address='1BitkeyP2nDd5oa647AjvBbbwST54W5Zmx', - #address_n=[], - amount=100000000, - script_type=proto.PAYTOADDRESS, - #script_args= - ) - - serialized = '' - - # Prepare and send initial message - tx = proto.SignTx() - tx.algo = proto.ELECTRUM - tx.random = self.client._get_local_entropy() - tx.inputs_count = 2 - tx.outputs_count = 2 - - res = self.client.call(tx) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXINPUT) - self.assertEqual(res.request_index, 0) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - # FIRST SIGNATURE - res = self.client.call(inp1) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXINPUT) - self.assertEqual(res.request_index, 1) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - res = self.client.call(inp2) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, 0) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - res = self.client.call(out1) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, 1) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - res = self.client.call(out2) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXINPUT) - self.assertEqual(res.request_index, 0) - self.assertNotEqual(res.signature, '') - self.assertNotEqual(res.serialized_tx, '') - serialized += res.serialized_tx - - # SECOND SIGNATURE - res = self.client.call(inp1) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXINPUT) - self.assertEqual(res.request_index, 1) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - res = self.client.call(inp2) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, 0) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - res = self.client.call(out1) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, 1) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - res = self.client.call(out2) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, 0) - self.assertNotEqual(res.signature, '') - self.assertNotEqual(res.serialized_tx, '') - serialized += res.serialized_tx - - # FINALIZING OUTPUTS - res = self.client.call(out1) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, 1) - self.assertEqual(res.signature, '') - self.assertNotEqual(res.serialized_tx, '') - serialized += res.serialized_tx - - res = self.client.call(out2) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, -1) - self.assertEqual(res.signature, '') - self.assertNotEqual(res.serialized_tx, '') - serialized += res.serialized_tx - - print binascii.hexlify(serialized) - ''' - if __name__ == '__main__': unittest.main() diff --git a/tests/test_protection_levels.py b/tests/test_protection_levels.py index a8fa9a56e..bb550acd6 100644 --- a/tests/test_protection_levels.py +++ b/tests/test_protection_levels.py @@ -150,7 +150,7 @@ class TestProtectionLevels(common.TrezorTest): proto.PassphraseRequest(), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(request_index=-1)]) + proto.TxRequest(finished=True)]) self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) # def test_firmware_erase(self): diff --git a/trezorlib/api_blockchain.py b/trezorlib/api_blockchain.py index 56e4a0cda..cc4e0b9b7 100644 --- a/trezorlib/api_blockchain.py +++ b/trezorlib/api_blockchain.py @@ -30,7 +30,7 @@ class BlockchainApi(object): def get_tx(self, txhash): # Build protobuf transaction structure from blockchain.info d = self._raw_tx(txhash) - t = proto_types.TransactionType() + t = proto_types.TransactionType(version = 1, lock_time = 0) for inp in d['inputs']: di = self._raw_tx(inp['prev_out']['tx_index']) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 2f33e84c1..bfad63dc7 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xbd\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x86\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\x05\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x14\n\x0csigned_index\x18\x03 \x01(\x05\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\"&\n\x07TxInput\x12\x1b\n\x05input\x18\x01 \x02(\x0b\x32\x0c.TxInputType\")\n\x08TxOutput\x12\x1d\n\x06output\x18\x01 \x02(\x0b\x32\r.TxOutputType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xad\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_TxInput\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_TxOutput\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xbd\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\xac\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x17\n\x0fsignature_index\x18\x03 \x01(\r\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\x12\x0f\n\x07tx_hash\x18\x06 \x01(\x0c\x12\x10\n\x08\x66inished\x18\x07 \x01(\x08\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x8b\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -108,106 +108,102 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxInput', index=21, number=23, + name='MessageType_TxAck', index=21, number=22, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxOutput', index=22, number=24, + name='MessageType_ApplySettings', index=22, number=25, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ApplySettings', index=23, number=25, - options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), - type=None), - _descriptor.EnumValueDescriptor( - name='MessageType_ButtonRequest', index=24, number=26, + name='MessageType_ButtonRequest', index=23, number=26, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonAck', index=25, number=27, + name='MessageType_ButtonAck', index=24, number=27, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_GetAddress', index=26, number=29, + name='MessageType_GetAddress', index=25, number=29, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_Address', index=27, number=30, + name='MessageType_Address', index=26, number=30, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyRequest', index=28, number=35, + name='MessageType_EntropyRequest', index=27, number=35, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyAck', index=29, number=36, + name='MessageType_EntropyAck', index=28, number=36, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_SignMessage', index=30, number=38, + name='MessageType_SignMessage', index=29, number=38, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_VerifyMessage', index=31, number=39, + name='MessageType_VerifyMessage', index=30, number=39, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_MessageSignature', index=32, number=40, + name='MessageType_MessageSignature', index=31, number=40, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PassphraseRequest', index=33, number=41, + name='MessageType_PassphraseRequest', index=32, number=41, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PassphraseAck', index=34, number=42, + name='MessageType_PassphraseAck', index=33, number=42, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EstimateTxSize', index=35, number=43, + name='MessageType_EstimateTxSize', index=34, number=43, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxSize', index=36, number=44, + name='MessageType_TxSize', index=35, number=44, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_RecoveryDevice', index=37, number=45, + name='MessageType_RecoveryDevice', index=36, number=45, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_WordRequest', index=38, number=46, + name='MessageType_WordRequest', index=37, number=46, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_WordAck', index=39, number=47, + name='MessageType_WordAck', index=38, number=47, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkDecision', index=40, number=100, + name='MessageType_DebugLinkDecision', index=39, number=100, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkGetState', index=41, number=101, + name='MessageType_DebugLinkGetState', index=40, number=101, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkState', index=42, number=102, + name='MessageType_DebugLinkState', index=41, number=102, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkStop', index=43, number=103, + name='MessageType_DebugLinkStop', index=42, number=103, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkLog', index=44, number=104, + name='MessageType_DebugLinkLog', index=43, number=104, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), ], containing_type=None, options=None, - serialized_start=2881, - serialized_end=4462, + serialized_start=2875, + serialized_end=4422, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -232,8 +228,7 @@ MessageType_PinMatrixRequest = 18 MessageType_PinMatrixAck = 19 MessageType_Cancel = 20 MessageType_TxRequest = 21 -MessageType_TxInput = 23 -MessageType_TxOutput = 24 +MessageType_TxAck = 22 MessageType_ApplySettings = 25 MessageType_ButtonRequest = 26 MessageType_ButtonAck = 27 @@ -1535,7 +1530,7 @@ _TXREQUEST = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='request_index', full_name='TxRequest.request_index', index=0, - number=1, type=5, cpp_type=1, label=1, + number=1, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -1548,8 +1543,8 @@ _TXREQUEST = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='signed_index', full_name='TxRequest.signed_index', index=2, - number=3, type=5, cpp_type=1, label=1, + name='signature_index', full_name='TxRequest.signature_index', index=2, + number=3, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -1568,31 +1563,17 @@ _TXREQUEST = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - extension_ranges=[], - serialized_start=2235, - serialized_end=2369, -) - - -_TXINPUT = _descriptor.Descriptor( - name='TxInput', - full_name='TxInput', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ _descriptor.FieldDescriptor( - name='input', full_name='TxInput.input', index=0, - number=1, type=11, cpp_type=10, label=2, - has_default_value=False, default_value=None, + name='tx_hash', full_name='TxRequest.tx_hash', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='finished', full_name='TxRequest.finished', index=6, + number=7, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1605,21 +1586,21 @@ _TXINPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2371, - serialized_end=2409, + serialized_start=2235, + serialized_end=2407, ) -_TXOUTPUT = _descriptor.Descriptor( - name='TxOutput', - full_name='TxOutput', +_TXACK = _descriptor.Descriptor( + name='TxAck', + full_name='TxAck', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='output', full_name='TxOutput.output', index=0, - number=1, type=11, cpp_type=10, label=2, + name='tx', full_name='TxAck.tx', index=0, + number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -1633,8 +1614,8 @@ _TXOUTPUT = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2411, - serialized_end=2452, + serialized_start=2409, + serialized_end=2446, ) @@ -1654,8 +1635,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2454, - serialized_end=2469, + serialized_start=2448, + serialized_end=2463, ) @@ -1682,8 +1663,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2471, - serialized_end=2504, + serialized_start=2465, + serialized_end=2498, ) @@ -1710,8 +1691,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2506, - serialized_end=2541, + serialized_start=2500, + serialized_end=2535, ) @@ -1731,8 +1712,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2543, - serialized_end=2562, + serialized_start=2537, + serialized_end=2556, ) @@ -1822,8 +1803,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2565, - serialized_end=2800, + serialized_start=2559, + serialized_end=2794, ) @@ -1843,8 +1824,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2802, - serialized_end=2817, + serialized_start=2796, + serialized_end=2811, ) @@ -1885,8 +1866,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2819, - serialized_end=2878, + serialized_start=2813, + serialized_end=2872, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -1899,8 +1880,7 @@ _SIMPLESIGNTX.fields_by_name['inputs'].message_type = types_pb2._TXINPUTTYPE _SIMPLESIGNTX.fields_by_name['outputs'].message_type = types_pb2._TXOUTPUTTYPE _SIMPLESIGNTX.fields_by_name['transactions'].message_type = types_pb2._TRANSACTIONTYPE _TXREQUEST.fields_by_name['request_type'].enum_type = types_pb2._REQUESTTYPE -_TXINPUT.fields_by_name['input'].message_type = types_pb2._TXINPUTTYPE -_TXOUTPUT.fields_by_name['output'].message_type = types_pb2._TXOUTPUTTYPE +_TXACK.fields_by_name['tx'].message_type = types_pb2._TRANSACTIONTYPE _DEBUGLINKSTATE.fields_by_name['node'].message_type = types_pb2._HDNODETYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE DESCRIPTOR.message_types_by_name['Features'] = _FEATURES @@ -1938,8 +1918,7 @@ DESCRIPTOR.message_types_by_name['TxSize'] = _TXSIZE DESCRIPTOR.message_types_by_name['SignTx'] = _SIGNTX DESCRIPTOR.message_types_by_name['SimpleSignTx'] = _SIMPLESIGNTX DESCRIPTOR.message_types_by_name['TxRequest'] = _TXREQUEST -DESCRIPTOR.message_types_by_name['TxInput'] = _TXINPUT -DESCRIPTOR.message_types_by_name['TxOutput'] = _TXOUTPUT +DESCRIPTOR.message_types_by_name['TxAck'] = _TXACK DESCRIPTOR.message_types_by_name['FirmwareErase'] = _FIRMWAREERASE DESCRIPTOR.message_types_by_name['FirmwareUpload'] = _FIRMWAREUPLOAD DESCRIPTOR.message_types_by_name['DebugLinkDecision'] = _DEBUGLINKDECISION @@ -2164,17 +2143,11 @@ class TxRequest(_message.Message): # @@protoc_insertion_point(class_scope:TxRequest) -class TxInput(_message.Message): - __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _TXINPUT - - # @@protoc_insertion_point(class_scope:TxInput) - -class TxOutput(_message.Message): +class TxAck(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _TXOUTPUT + DESCRIPTOR = _TXACK - # @@protoc_insertion_point(class_scope:TxOutput) + # @@protoc_insertion_point(class_scope:TxAck) class FirmwareErase(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType @@ -2263,10 +2236,8 @@ _MESSAGETYPE.values_by_name["MessageType_Cancel"].has_options = True _MESSAGETYPE.values_by_name["MessageType_Cancel"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_TxRequest"].has_options = True _MESSAGETYPE.values_by_name["MessageType_TxRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') -_MESSAGETYPE.values_by_name["MessageType_TxInput"].has_options = True -_MESSAGETYPE.values_by_name["MessageType_TxInput"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') -_MESSAGETYPE.values_by_name["MessageType_TxOutput"].has_options = True -_MESSAGETYPE.values_by_name["MessageType_TxOutput"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_TxAck"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_TxAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_ApplySettings"].has_options = True _MESSAGETYPE.values_by_name["MessageType_ApplySettings"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_ButtonRequest"].has_options = True diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 109b9ce4e..75e5cfa19 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"|\n\x0fTransactionType\x12\x12\n\x07version\x18\x01 \x01(\r:\x01\x31\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x14\n\tlock_time\x18\x04 \x01(\r:\x01\x30*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*(\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\x9a\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\"\n\x0bour_outputs\x18\x04 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x05 \x01(\r*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*4\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,8 +74,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=706, - serialized_end=1039, + serialized_start=737, + serialized_end=1070, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -96,8 +96,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1041, - serialized_end=1092, + serialized_start=1072, + serialized_end=1123, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -115,11 +115,15 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( name='TXOUTPUT', index=1, number=1, options=None, type=None), + _descriptor.EnumValueDescriptor( + name='TXMETA', index=2, number=2, + options=None, + type=None), ], containing_type=None, options=None, - serialized_start=1094, - serialized_end=1134, + serialized_start=1125, + serialized_end=1177, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -164,8 +168,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1137, - serialized_end=1399, + serialized_start=1180, + serialized_end=1442, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -190,8 +194,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1401, - serialized_end=1528, + serialized_start=1444, + serialized_end=1571, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -211,6 +215,7 @@ PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 TXINPUT = 0 TXOUTPUT = 1 +TXMETA = 2 ButtonRequest_Other = 1 ButtonRequest_FeeOverThreshold = 2 ButtonRequest_ConfirmOutput = 3 @@ -526,7 +531,7 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( _descriptor.FieldDescriptor( name='version', full_name='TransactionType.version', index=0, number=1, type=13, cpp_type=3, label=1, - has_default_value=True, default_value=1, + has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -545,9 +550,16 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='lock_time', full_name='TransactionType.lock_time', index=3, - number=4, type=13, cpp_type=3, label=1, - has_default_value=True, default_value=0, + name='our_outputs', full_name='TransactionType.our_outputs', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='lock_time', full_name='TransactionType.lock_time', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -560,13 +572,14 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=579, - serialized_end=703, + serialized_start=580, + serialized_end=734, ) _TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _SCRIPTTYPE _TRANSACTIONTYPE.fields_by_name['inputs'].message_type = _TXINPUTTYPE _TRANSACTIONTYPE.fields_by_name['outputs'].message_type = _TXOUTPUTBINTYPE +_TRANSACTIONTYPE.fields_by_name['our_outputs'].message_type = _TXOUTPUTTYPE DESCRIPTOR.message_types_by_name['HDNodeType'] = _HDNODETYPE DESCRIPTOR.message_types_by_name['CoinType'] = _COINTYPE DESCRIPTOR.message_types_by_name['TxInputType'] = _TXINPUTTYPE From dc0d7fd1d60399d08d224ad1a184410a04c80080 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 27 Mar 2014 19:10:24 +0100 Subject: [PATCH 0278/1535] initialize version/lock_time in TransactionType --- tests/config.py | 4 ++-- tests/test_msg_simplesigntx.py | 4 +++- trezorlib/api_blockchain.py | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/config.py b/tests/config.py index 9ff6e75fb..3fc402fca 100644 --- a/tests/config.py +++ b/tests/config.py @@ -27,8 +27,8 @@ if len(devices) > 0: else: print 'Using Emulator' TRANSPORT = PipeTransport - TRANSPORT_ARGS = ('../../trezor-emu/pipe.trezor', False) + TRANSPORT_ARGS = ('/tmp/pipe.trezor', False) TRANSPORT_KWARGS = {} DEBUG_TRANSPORT = PipeTransport - DEBUG_TRANSPORT_ARGS = ('../../trezor-emu/pipe.trezor_debug', False) + DEBUG_TRANSPORT_ARGS = ('/tmp/pipe.trezor_debug', False) DEBUG_TRANSPORT_KWARGS = {} diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index d8b906cfb..8bc4871b0 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -14,7 +14,7 @@ class FakeTestnetBlockchain(object): if txhash != '6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54': raise Exception("Unexpected hash") - t = proto_types.TransactionType(version = 1, lock_time = 0) + t = proto_types.TransactionType() i = t.inputs.add() i.prev_hash = binascii.unhexlify('ee336e79153d51f4f3e45278f1f77ab29fd5bb135dce467282e2aff22cb9c570') @@ -34,6 +34,8 @@ class FakeTestnetBlockchain(object): o.amount = 1000000000 o.script_pubkey = binascii.unhexlify('76a91424a56db43cf6f2b02e838ea493f95d8d6047423188ac') + t.version = 1 + t.lock_time = 0 return t class TestMsgSimplesigntx(common.TrezorTest): diff --git a/trezorlib/api_blockchain.py b/trezorlib/api_blockchain.py index cc4e0b9b7..8c65c8ca0 100644 --- a/trezorlib/api_blockchain.py +++ b/trezorlib/api_blockchain.py @@ -30,7 +30,7 @@ class BlockchainApi(object): def get_tx(self, txhash): # Build protobuf transaction structure from blockchain.info d = self._raw_tx(txhash) - t = proto_types.TransactionType(version = 1, lock_time = 0) + t = proto_types.TransactionType() for inp in d['inputs']: di = self._raw_tx(inp['prev_out']['tx_index']) @@ -44,6 +44,8 @@ class BlockchainApi(object): o.amount = output['value'] o.script_pubkey = binascii.unhexlify(output['script']) + t.version = 1 + t.lock_time = 0 return t if __name__ == '__main__': From 412528d52250cd1ec67f0826daf50634034fb919 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 28 Mar 2014 16:26:48 +0100 Subject: [PATCH 0279/1535] fix PinMatrixRequest type enum --- trezorlib/client.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index e05e5b339..8dccbb325 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -139,7 +139,15 @@ class TextUIMixin(object): return proto.ButtonAck() def callback_PinMatrixRequest(self, msg): - pin = raw_input("PIN required: %s " % msg.message) + if msg.type == 1: + desc = 'old PIN' + elif msg.type == 2: + desc = 'new PIN' + elif msg.type == 3: + desc = 'new PIN again' + else: + desc = 'PIN' + pin = raw_input("Please enter %s: " % desc) return proto.PinMatrixAck(pin=pin) def callback_PassphraseRequest(self, msg): From 860aa753c90fda5f63cb455692885aa8f6f608d4 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 28 Mar 2014 19:47:53 +0100 Subject: [PATCH 0280/1535] put TXAPIs into one location --- cmd.py | 4 +- tests/common.py | 4 +- tests/test_msg_simplesigntx.py | 34 ++------------- trezorlib/api_blockchain.py | 53 ------------------------ trezorlib/client.py | 11 ++--- trezorlib/tx_api.py | 76 ++++++++++++++++++++++++++++++++++ 6 files changed, 87 insertions(+), 95 deletions(-) delete mode 100644 trezorlib/api_blockchain.py create mode 100644 trezorlib/tx_api.py diff --git a/cmd.py b/cmd.py index 5c71ca802..bca325734 100755 --- a/cmd.py +++ b/cmd.py @@ -6,7 +6,7 @@ import json import base64 from trezorlib.client import TrezorClientDebug -from trezorlib.api_blockchain import BlockchainApi +from trezorlib.tx_api import TXAPIBlockchain from trezorlib.protobuf_json import pb2json def parse_args(commands): @@ -324,7 +324,7 @@ def main(): transport = get_transport(args.transport, args.path) client = TrezorClientDebug(transport) - client.set_tx_func(BlockchainApi().get_tx) + client.set_tx_api(TXAPIBlockchain()) cmds = Commands(client) res = args.func(cmds, args) diff --git a/tests/common.py b/tests/common.py index 8e5112586..6694268ad 100644 --- a/tests/common.py +++ b/tests/common.py @@ -2,7 +2,7 @@ import unittest import config from trezorlib.client import TrezorDebugClient -from trezorlib.api_blockchain import BlockchainApi +from trezorlib.tx_api import TXAPIBlockchain class TrezorTest(unittest.TestCase): def setUp(self): @@ -10,7 +10,7 @@ class TrezorTest(unittest.TestCase): self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS, **config.TRANSPORT_KWARGS) self.client = TrezorDebugClient(self.transport) self.client.set_debuglink(self.debug_transport) - self.client.set_tx_func(BlockchainApi().get_tx) + self.client.set_tx_api(TXAPIBlockchain()) # 1 2 3 4 5 6 7 8 9 10 11 12 self.mnemonic12 = 'alcohol woman abuse must during monitor noble actual mixed trade anger aisle' diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index 8bc4871b0..5f90a7ee3 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -8,35 +8,7 @@ import binascii import trezorlib.messages_pb2 as proto import trezorlib.types_pb2 as proto_types from trezorlib.client import CallException - -class FakeTestnetBlockchain(object): - def get_tx(self, txhash): - if txhash != '6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54': - raise Exception("Unexpected hash") - - t = proto_types.TransactionType() - - i = t.inputs.add() - i.prev_hash = binascii.unhexlify('ee336e79153d51f4f3e45278f1f77ab29fd5bb135dce467282e2aff22cb9c570') - i.prev_index = 1 - i.script_sig = binascii.unhexlify('483045022066c418874dbe5628296700382d727ce1734928796068c26271472df09dccf1a20221009dec59d19f9d73db381fcd35c0fff757ad73e54ef59157b0d7c57e6739a092f00121033fef08c603943dc7d25f4ce65771762143b1cd8678343d660a1a76b9d1d3ced7') - - i = t.inputs.add() - i.prev_hash = binascii.unhexlify('2fe4d8af2b44faccc10dd5a6578c923491d2d21269a1dfe8c83f492a30fb8f9f') - i.prev_index = 1 - i.script_sig = binascii.unhexlify('47304402206fbb8e14be706b8557a2280d2a2a75c0a65c4f7936d90d510f0971c93f41f74402201b79c8c4e4ac4c944913611633c230193558296e70a36269b7fc3a80efa27d120121030cb5be79bdc36a4ff4443dbac43068cc43d638ea06ff2fa1b8dab389e39aefc7') - - o = t.outputs.add() - o.amount = 403850989 - o.script_pubkey = binascii.unhexlify('76a914f5a05c2664b40d3116b1c5086c9ba38ed15b742e88ac') - - o = t.outputs.add() - o.amount = 1000000000 - o.script_pubkey = binascii.unhexlify('76a91424a56db43cf6f2b02e838ea493f95d8d6047423188ac') - - t.version = 1 - t.lock_time = 0 - return t +from trezorlib.tx_api import TXAPITestnetFake class TestMsgSimplesigntx(common.TrezorTest): @@ -89,7 +61,7 @@ class TestMsgSimplesigntx(common.TrezorTest): ) with self.client: - self.client.set_tx_func(FakeTestnetBlockchain().get_tx) + self.client.set_tx_api(TXAPITestnetFake()) msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change @@ -121,7 +93,7 @@ class TestMsgSimplesigntx(common.TrezorTest): ) with self.client: - self.client.set_tx_func(FakeTestnetBlockchain().get_tx) + self.client.set_tx_api(TXAPITestnetFake()) msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change diff --git a/trezorlib/api_blockchain.py b/trezorlib/api_blockchain.py deleted file mode 100644 index 8c65c8ca0..000000000 --- a/trezorlib/api_blockchain.py +++ /dev/null @@ -1,53 +0,0 @@ -''' - Blockchain API implementing Blockchain.info interface -''' -import binascii -import urllib2 -import json -try: - from filecache import filecache, MONTH -except: - def filecache(x): - def _inner(y): - return y - return _inner - MONTH = None - -import types_pb2 as proto_types - -class BlockchainApi(object): - def _raw_tx(self, txhash): - # Download tx data from blockchain.info - url = 'http://blockchain.info/rawtx/%s?scripts=true' % txhash - print "Downloading", url - f = urllib2.urlopen(url) - return json.load(f) - - def submit(self, tx): - raise Exception("Not implemented yet") - - @filecache(MONTH) - def get_tx(self, txhash): - # Build protobuf transaction structure from blockchain.info - d = self._raw_tx(txhash) - t = proto_types.TransactionType() - - for inp in d['inputs']: - di = self._raw_tx(inp['prev_out']['tx_index']) - i = t.inputs.add() - i.prev_hash = binascii.unhexlify(di['hash']) - i.prev_index = inp['prev_out']['n'] - i.script_sig = binascii.unhexlify(inp['script']) - - for output in d['out']: - o = t.outputs.add() - o.amount = output['value'] - o.script_pubkey = binascii.unhexlify(output['script']) - - t.version = 1 - t.lock_time = 0 - return t - -if __name__ == '__main__': - api = BlockchainApi() - print api.get_tx('b9f382b8dfc34accc05491712a1ad8f7f075a02056dc4821d1f60702fb3fdb2f') diff --git a/trezorlib/client.py b/trezorlib/client.py index 8dccbb325..50a08b905 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -286,13 +286,10 @@ class ProtocolMixin(object): def __init__(self, *args, **kwargs): super(ProtocolMixin, self).__init__(*args, **kwargs) self.init_device() - - def get_tx_func_placeholder(txhash): - raise Exception("Please call set_tx_func() first.") - self.get_tx_func = get_tx_func_placeholder + self.tx_api = None - def set_tx_func(self, tx_func): - self.get_tx_func = tx_func + def set_tx_api(self, tx_api): + self.tx_api = tx_api def init_device(self): self.features = expect(proto.Features)(self.call)(proto.Initialize()) @@ -430,7 +427,7 @@ class ProtocolMixin(object): continue tx = msg.transactions.add() - tx.CopyFrom(self.get_tx_func(binascii.hexlify(inp.prev_hash))) + tx.CopyFrom(self.tx_api.get_tx(binascii.hexlify(inp.prev_hash))) known_hashes.append(inp.prev_hash) return msg diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py new file mode 100644 index 000000000..f89ff8e8f --- /dev/null +++ b/trezorlib/tx_api.py @@ -0,0 +1,76 @@ +import binascii +import urllib2 +import json +try: + from filecache import filecache, MONTH +except: + def filecache(x): + def _inner(y): + return y + return _inner + MONTH = None + +import types_pb2 as proto_types + +class TXAPIBlockchain(object): + def _raw_tx(self, txhash): + # Download tx data from blockchain.info + url = 'http://blockchain.info/rawtx/%s?scripts=true' % txhash + print "Downloading", url + f = urllib2.urlopen(url) + return json.load(f) + + @filecache(MONTH) + def get_tx(self, txhash): + # Build protobuf transaction structure from blockchain.info + d = self._raw_tx(txhash) + t = proto_types.TransactionType() + + for inp in d['inputs']: + di = self._raw_tx(inp['prev_out']['tx_index']) + i = t.inputs.add() + i.prev_hash = binascii.unhexlify(di['hash']) + i.prev_index = inp['prev_out']['n'] + i.script_sig = binascii.unhexlify(inp['script']) + + for output in d['out']: + o = t.outputs.add() + o.amount = output['value'] + o.script_pubkey = binascii.unhexlify(output['script']) + + t.version = 1 + t.lock_time = 0 + return t + +class TXAPITestnetFake(object): + def get_tx(self, txhash): + if txhash != '6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54': + raise Exception("Unexpected hash") + + t = proto_types.TransactionType() + + i = t.inputs.add() + i.prev_hash = binascii.unhexlify('ee336e79153d51f4f3e45278f1f77ab29fd5bb135dce467282e2aff22cb9c570') + i.prev_index = 1 + i.script_sig = binascii.unhexlify('483045022066c418874dbe5628296700382d727ce1734928796068c26271472df09dccf1a20221009dec59d19f9d73db381fcd35c0fff757ad73e54ef59157b0d7c57e6739a092f00121033fef08c603943dc7d25f4ce65771762143b1cd8678343d660a1a76b9d1d3ced7') + + i = t.inputs.add() + i.prev_hash = binascii.unhexlify('2fe4d8af2b44faccc10dd5a6578c923491d2d21269a1dfe8c83f492a30fb8f9f') + i.prev_index = 1 + i.script_sig = binascii.unhexlify('47304402206fbb8e14be706b8557a2280d2a2a75c0a65c4f7936d90d510f0971c93f41f74402201b79c8c4e4ac4c944913611633c230193558296e70a36269b7fc3a80efa27d120121030cb5be79bdc36a4ff4443dbac43068cc43d638ea06ff2fa1b8dab389e39aefc7') + + o = t.outputs.add() + o.amount = 403850989 + o.script_pubkey = binascii.unhexlify('76a914f5a05c2664b40d3116b1c5086c9ba38ed15b742e88ac') + + o = t.outputs.add() + o.amount = 1000000000 + o.script_pubkey = binascii.unhexlify('76a91424a56db43cf6f2b02e838ea493f95d8d6047423188ac') + + t.version = 1 + t.lock_time = 0 + return t + +if __name__ == '__main__': + api = TXAPIBlockchain() + print api.get_tx('b9f382b8dfc34accc05491712a1ad8f7f075a02056dc4821d1f60702fb3fdb2f') From 38ed16934f241bf0ff72470463b1edeb640c8477 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 28 Mar 2014 21:34:15 +0100 Subject: [PATCH 0281/1535] use bitcore for tx api --- cmd.py | 4 +- tests/common.py | 4 +- tests/test_msg_simplesigntx.py | 6 +-- trezorlib/tx_api.py | 82 ++++++++++++---------------------- 4 files changed, 35 insertions(+), 61 deletions(-) diff --git a/cmd.py b/cmd.py index bca325734..e9eb1726a 100755 --- a/cmd.py +++ b/cmd.py @@ -6,7 +6,7 @@ import json import base64 from trezorlib.client import TrezorClientDebug -from trezorlib.tx_api import TXAPIBlockchain +from trezorlib.tx_api import TXAPIBitcoin from trezorlib.protobuf_json import pb2json def parse_args(commands): @@ -324,7 +324,7 @@ def main(): transport = get_transport(args.transport, args.path) client = TrezorClientDebug(transport) - client.set_tx_api(TXAPIBlockchain()) + client.set_tx_api(TXAPIBitcoin()) cmds = Commands(client) res = args.func(cmds, args) diff --git a/tests/common.py b/tests/common.py index 6694268ad..c2b2dd288 100644 --- a/tests/common.py +++ b/tests/common.py @@ -2,7 +2,7 @@ import unittest import config from trezorlib.client import TrezorDebugClient -from trezorlib.tx_api import TXAPIBlockchain +from trezorlib.tx_api import TXAPIBitcoin class TrezorTest(unittest.TestCase): def setUp(self): @@ -10,7 +10,7 @@ class TrezorTest(unittest.TestCase): self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS, **config.TRANSPORT_KWARGS) self.client = TrezorDebugClient(self.transport) self.client.set_debuglink(self.debug_transport) - self.client.set_tx_api(TXAPIBlockchain()) + self.client.set_tx_api(TXAPIBitcoin()) # 1 2 3 4 5 6 7 8 9 10 11 12 self.mnemonic12 = 'alcohol woman abuse must during monitor noble actual mixed trade anger aisle' diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index 5f90a7ee3..9ad1014f0 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -8,7 +8,7 @@ import binascii import trezorlib.messages_pb2 as proto import trezorlib.types_pb2 as proto_types from trezorlib.client import CallException -from trezorlib.tx_api import TXAPITestnetFake +from trezorlib.tx_api import TXAPITestnet class TestMsgSimplesigntx(common.TrezorTest): @@ -61,7 +61,7 @@ class TestMsgSimplesigntx(common.TrezorTest): ) with self.client: - self.client.set_tx_api(TXAPITestnetFake()) + self.client.set_tx_api(TXAPITestnet()) msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change @@ -93,7 +93,7 @@ class TestMsgSimplesigntx(common.TrezorTest): ) with self.client: - self.client.set_tx_api(TXAPITestnetFake()) + self.client.set_tx_api(TXAPITestnet()) msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index f89ff8e8f..77c2af765 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -12,65 +12,39 @@ except: import types_pb2 as proto_types -class TXAPIBlockchain(object): - def _raw_tx(self, txhash): - # Download tx data from blockchain.info - url = 'http://blockchain.info/rawtx/%s?scripts=true' % txhash - print "Downloading", url - f = urllib2.urlopen(url) - return json.load(f) +def bitcore_tx(url): + f = urllib2.urlopen(url) + data = json.load(f) - @filecache(MONTH) - def get_tx(self, txhash): - # Build protobuf transaction structure from blockchain.info - d = self._raw_tx(txhash) - t = proto_types.TransactionType() - - for inp in d['inputs']: - di = self._raw_tx(inp['prev_out']['tx_index']) - i = t.inputs.add() - i.prev_hash = binascii.unhexlify(di['hash']) - i.prev_index = inp['prev_out']['n'] - i.script_sig = binascii.unhexlify(inp['script']) - - for output in d['out']: - o = t.outputs.add() - o.amount = output['value'] - o.script_pubkey = binascii.unhexlify(output['script']) - - t.version = 1 - t.lock_time = 0 - return t - -class TXAPITestnetFake(object): - def get_tx(self, txhash): - if txhash != '6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54': - raise Exception("Unexpected hash") - - t = proto_types.TransactionType() + t = proto_types.TransactionType() + t.version = data['version'] + t.lock_time = data['locktime'] + for vin in data['vin']: i = t.inputs.add() - i.prev_hash = binascii.unhexlify('ee336e79153d51f4f3e45278f1f77ab29fd5bb135dce467282e2aff22cb9c570') - i.prev_index = 1 - i.script_sig = binascii.unhexlify('483045022066c418874dbe5628296700382d727ce1734928796068c26271472df09dccf1a20221009dec59d19f9d73db381fcd35c0fff757ad73e54ef59157b0d7c57e6739a092f00121033fef08c603943dc7d25f4ce65771762143b1cd8678343d660a1a76b9d1d3ced7') - - i = t.inputs.add() - i.prev_hash = binascii.unhexlify('2fe4d8af2b44faccc10dd5a6578c923491d2d21269a1dfe8c83f492a30fb8f9f') - i.prev_index = 1 - i.script_sig = binascii.unhexlify('47304402206fbb8e14be706b8557a2280d2a2a75c0a65c4f7936d90d510f0971c93f41f74402201b79c8c4e4ac4c944913611633c230193558296e70a36269b7fc3a80efa27d120121030cb5be79bdc36a4ff4443dbac43068cc43d638ea06ff2fa1b8dab389e39aefc7') + i.prev_hash = binascii.unhexlify(vin['txid']) + i.prev_index = vin['vout'] + asm = [ binascii.unhexlify(x) for x in vin['scriptSig']['asm'].split(' ') ] + i.script_sig = chr(len(asm[0])) + asm[0] + chr(len(asm[1])) + asm[1] # TODO: should be op_push(x) instead of chr(len(x)) + for vout in data['vout']: o = t.outputs.add() - o.amount = 403850989 - o.script_pubkey = binascii.unhexlify('76a914f5a05c2664b40d3116b1c5086c9ba38ed15b742e88ac') + o.amount = int(vout['value'] * 100000000) + asm = vout['scriptPubKey']['asm'].split(' ') # we suppose it's OP_DUP OP_HASH160 pubkey OP_EQUALVERIFY OP_CHECKSIG + o.script_pubkey = binascii.unhexlify('76a914' + asm[2] + '88ac') - o = t.outputs.add() - o.amount = 1000000000 - o.script_pubkey = binascii.unhexlify('76a91424a56db43cf6f2b02e838ea493f95d8d6047423188ac') + return t + +class TXAPIBitcoin(object): + + @filecache(MONTH) + def get_tx(self, txhash): + url = 'http://live.bitcore.io/api/tx/%s' % txhash + return bitcore_tx(url) - t.version = 1 - t.lock_time = 0 - return t +class TXAPITestnet(object): -if __name__ == '__main__': - api = TXAPIBlockchain() - print api.get_tx('b9f382b8dfc34accc05491712a1ad8f7f075a02056dc4821d1f60702fb3fdb2f') + @filecache(MONTH) + def get_tx(self, txhash): + url = 'http://test.bitcore.io/api/tx/%s' % txhash + return bitcore_tx(url) From 7a1e2827c8c2725c527f7fb07e94db7c6a1c0ae4 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 28 Mar 2014 21:48:48 +0100 Subject: [PATCH 0282/1535] check for known scriptPubKey asm --- trezorlib/tx_api.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index 77c2af765..d01a551a2 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -30,7 +30,10 @@ def bitcore_tx(url): for vout in data['vout']: o = t.outputs.add() o.amount = int(vout['value'] * 100000000) - asm = vout['scriptPubKey']['asm'].split(' ') # we suppose it's OP_DUP OP_HASH160 pubkey OP_EQUALVERIFY OP_CHECKSIG + asm = vout['scriptPubKey']['asm'].split(' ') + # we suppose it's OP_DUP OP_HASH160 pubkey OP_EQUALVERIFY OP_CHECKSIG + if len(asm) != 5 or asm[0] != 'OP_DUP' or asm[1] != 'OP_HASH160' or asm[3] != 'OP_EQUALVERIFY' or asm[4] != 'OP_CHECKSIG': + raise Exception('Unknown scriptPubKey asm: %s' % asm) o.script_pubkey = binascii.unhexlify('76a914' + asm[2] + '88ac') return t From 49eec8b78e3f4a5d375707d0936780cc088b1a89 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 29 Mar 2014 21:31:17 +0100 Subject: [PATCH 0283/1535] txapi cleanup --- trezorlib/tx_api.py | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index d01a551a2..b1b86d8ae 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -12,6 +12,33 @@ except: import types_pb2 as proto_types +def op_push(i): + if i<0x4c: + return chr(i) + elif i<0xff: + return '\x4c' + chr(i) + elif i<0xffff: + return '\x4d' + struct.pack(" Date: Sun, 30 Mar 2014 00:44:42 +0100 Subject: [PATCH 0284/1535] parse sequence in txapi as well --- trezorlib/tx_api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index b1b86d8ae..7f4aa5d90 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -54,6 +54,7 @@ def bitcore_tx(url): asm = vin['scriptSig']['asm'].split(' ') asm = [ opcode_serialize(x) for x in asm ] i.script_sig = ''.join(asm) + i.sequence = vin['sequence'] for vout in data['vout']: o = t.outputs.add() From e9dbedfd333c8d25ed3923b7b4b502d35029a1e7 Mon Sep 17 00:00:00 2001 From: slush0 Date: Wed, 2 Apr 2014 18:54:19 +0200 Subject: [PATCH 0285/1535] Added unit test for PAYTOSCRIPTHASH --- tests/test_msg_simplesigntx.py | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index 9ad1014f0..114198502 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -8,7 +8,7 @@ import binascii import trezorlib.messages_pb2 as proto import trezorlib.types_pb2 as proto_types from trezorlib.client import CallException -from trezorlib.tx_api import TXAPITestnet +from trezorlib.tx_api import TXAPITestnet, TXAPIBitcoin class TestMsgSimplesigntx(common.TrezorTest): @@ -216,6 +216,7 @@ class TestMsgSimplesigntx(common.TrezorTest): self.assertEqual(binascii.hexlify(tx.serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') ''' + def test_255_outputs(self): self.setup_mnemonic_nopin_nopassphrase() @@ -254,8 +255,8 @@ class TestMsgSimplesigntx(common.TrezorTest): tx = self.client.call(msg) self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') - ''' + ''' def test_fee_too_high(self): self.setup_mnemonic_nopin_nopassphrase() @@ -312,5 +313,30 @@ class TestMsgSimplesigntx(common.TrezorTest): else: self.assert_(False, "types.Failure_NotEnoughFunds expected") + def test_p2sh(self): + self.setup_mnemonic_nopin_nopassphrase() + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=400000, + prev_hash=binascii.unhexlify('54aa5680dea781f45ebb536e53dffc526d68c0eb5c00547e323b2c32382dfba3'), + prev_index=1, + ) + + out1 = proto_types.TxOutputType(address='3DKGE1pvPpBAgZj94MbCinwmksewUNNYVR', # p2sh + amount=400000 - 10000, + script_type=proto_types.PAYTOSCRIPTHASH, + ) + + with self.client: + self.client.set_tx_api(TXAPIBitcoin()) + msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(finished=True)]) + tx = self.client.call(msg) + + # Accepted by network: tx 8cc1f4adf7224ce855cf535a5104594a0004cb3b640d6714fdb00b9128832dd5 + self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001a3fb2d38322c3b327e54005cebc0686d52fcdf536e53bb5ef481a7de8056aa54010000006b4830450221009e020b0390ccad533b73b552f8a99a9d827212c558e4f755503674d07c92ad4502202d606f7316990e0461c51d4add25054f19c697aa3e3c2ced4d568f0b2c57e62f0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0170f305000000000017a9147f844bdb0b8fd54b64e3d16c85dc1170f1ff97c18700000000') + if __name__ == '__main__': unittest.main() From c3f74420a4db3bd39e94b6b88c312a82ecf64703 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 2 Apr 2014 19:18:14 +0200 Subject: [PATCH 0286/1535] add OP_EQUAL to txapi parser --- trezorlib/tx_api.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index 7f4aa5d90..6fc8ef004 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -28,6 +28,8 @@ def opcode_serialize(opcode): return '\x76' if opcode == 'OP_HASH160': return '\xa9' + if opcode == 'OP_EQUAL': + return '\x87' if opcode == 'OP_EQUALVERIFY': return '\x88' if opcode == 'OP_CHECKSIG': From 60df691bb2d78d2059b656ce5a716005deffb892 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 2 Apr 2014 19:31:47 +0200 Subject: [PATCH 0287/1535] make txapi class more universal --- trezorlib/tx_api.py | 49 +++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index 6fc8ef004..e042f91ed 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -12,32 +12,41 @@ except: import types_pb2 as proto_types -def op_push(i): - if i<0x4c: - return chr(i) - elif i<0xff: - return '\x4c' + chr(i) - elif i<0xffff: - return '\x4d' + struct.pack(" Date: Wed, 2 Apr 2014 20:06:54 +0200 Subject: [PATCH 0288/1535] Fixed spacing --- trezorlib/client.py | 93 ++------------------------------------------- 1 file changed, 4 insertions(+), 89 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 50a08b905..d17be0377 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -140,13 +140,13 @@ class TextUIMixin(object): def callback_PinMatrixRequest(self, msg): if msg.type == 1: - desc = 'old PIN' + desc = 'old PIN' elif msg.type == 2: - desc = 'new PIN' + desc = 'new PIN' elif msg.type == 3: - desc = 'new PIN again' + desc = 'new PIN again' else: - desc = 'PIN' + desc = 'PIN' pin = raw_input("Please enter %s: " % desc) return proto.PinMatrixAck(pin=pin) @@ -588,91 +588,6 @@ class TrezorDebugClient(ProtocolMixin, DebugLinkMixin, DebugWireMixin, BaseClien pass ''' -class TrezorClient(object): - def _pprint(self, msg): - ser = msg.SerializeToString() - return "<%s> (%d bytes):\n%s" % (msg.__class__.__name__, len(ser), msg) - - def call(self, msg, expected=None, expected_buttonrequests=None): - # TODO split this into normal and debug mode - if self.debug: - print '----------------------' - print "Sending", self._pprint(msg) - - try: - self.transport.session_begin() - - self.transport.write(msg) - resp = self.transport.read_blocking() - - if isinstance(resp, proto.ButtonRequest): - _pprint(self, msg): - ser = msg.SerializeToString() - if expected_buttonrequests != None: - try: - exp = expected_buttonrequests.pop(0) - if resp.code != exp: - raise CallException(types.Failure_Other, "Expected %s, got %s" % \ - (self._get_buttonrequest_value(exp), - self._get_buttonrequest_value(resp.code))) - except IndexError: - raise CallException(types.Failure_Other, - "Got %s, but no ButtonRequest has been expected" % \ - self._get_buttonrequest_value(resp.code)) - - print "ButtonRequest code:", self._get_buttonrequest_value(resp.code) - if self.debuglink and self.debug_button: - print "Pressing button", self.debug_button - self.debuglink.press_button(self.debug_button) - - return self.call(proto.ButtonAck(), expected_buttonrequests=expected_buttonrequests) - - if isinstance(resp, proto.PinMatrixRequest): - if self.debuglink: - if self.debug_pin == 1: - pin = self.debuglink.read_pin_encoded() - msg2 = proto.PinMatrixAck(pin=pin) - elif self.debug_pin == -1: - msg2 = proto.Cancel() - else: - msg2 = proto.PinMatrixAck(pin='444444222222') - - else: - pin = self.pin_func("PIN required: ", resp.message) - msg2 = proto.PinMatrixAck(pin=pin) - - return self.call(msg2, expected=expected, expected_buttonrequests=expected_buttonrequests) - - if isinstance(resp, proto.PassphraseRequest): - passphrase = self.passphrase_func("Passphrase required: ") - ms(object)g2 = proto.PassphraseAck(passphrase=passphrase) - return self.call(msg2, expected=expected, expected_buttonrequests=expected_buttonrequests) - - finally: - self.transport.session_end() - - if isinstance(resp, proto.Failure): - self.message_func(resp.message) - - if resp.code in (types.Failure_PinInvalid, - types.Failure_PinCancelled, types.Failure_PinExpected): - raise PinException(resp.code, resp.message) - - raise CallException(resp.code, resp.message) - - if self.debug: - print "Received", self._pprint(resp) - - if expected and not isinstance(resp, expected): - raise CallException("Expected %s message, got %s message" % (expected.DESCRIPTOR.name, resp.DESCRIPTOR.name)) - - if expected_buttonrequests != None and len(expected_buttonrequests): - raise CallException(types.Failure_Other, - "Following ButtonRequests were not in use: %s" % \ - [ self._get_buttonrequest_value(x) for x in expected_buttonrequests]) - - return resp - def _sign_tx(self, coin_name, inputs, outputs): '' inputs: list of TxInput From 5dc0be857c8e3e89fb00a6bfd2627402c7aa0590 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 7 Apr 2014 18:36:22 +0200 Subject: [PATCH 0289/1535] update pb --- trezorlib/messages_pb2.py | 4 ++-- trezorlib/types_pb2.py | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index bfad63dc7..a7b6dcd54 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xbd\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\xac\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x17\n\x0fsignature_index\x18\x03 \x01(\r\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\x12\x0f\n\x07tx_hash\x18\x06 \x01(\x0c\x12\x10\n\x08\x66inished\x18\x07 \x01(\x08\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x8b\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x39\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xbd\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\xac\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x17\n\x0fsignature_index\x18\x03 \x01(\r\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\x12\x0f\n\x07tx_hash\x18\x06 \x01(\x0c\x12\x10\n\x08\x66inished\x18\x07 \x01(\x08\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x8b\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -2193,7 +2193,7 @@ class DebugLinkLog(_message.Message): DESCRIPTOR.has_options = True -DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), '\n(org.multibit.hd.hardware.trezor.protobufB\rTrezorMessage') +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), '\n\037com.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE.values_by_name["MessageType_Initialize"].has_options = True _MESSAGETYPE.values_by_name["MessageType_Initialize"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_Ping"].has_options = True diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 75e5cfa19..4ea003c5d 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\x9a\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12!\n\x07outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\"\n\x0bour_outputs\x18\x04 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x05 \x01(\r*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*4\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42\x36\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\x9a\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*4\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -543,22 +543,22 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='outputs', full_name='TransactionType.outputs', index=2, + name='bin_outputs', full_name='TransactionType.bin_outputs', index=2, number=3, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='our_outputs', full_name='TransactionType.our_outputs', index=3, - number=4, type=11, cpp_type=10, label=3, + name='outputs', full_name='TransactionType.outputs', index=3, + number=5, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( name='lock_time', full_name='TransactionType.lock_time', index=4, - number=5, type=13, cpp_type=3, label=1, + number=4, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -578,8 +578,8 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( _TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _SCRIPTTYPE _TRANSACTIONTYPE.fields_by_name['inputs'].message_type = _TXINPUTTYPE -_TRANSACTIONTYPE.fields_by_name['outputs'].message_type = _TXOUTPUTBINTYPE -_TRANSACTIONTYPE.fields_by_name['our_outputs'].message_type = _TXOUTPUTTYPE +_TRANSACTIONTYPE.fields_by_name['bin_outputs'].message_type = _TXOUTPUTBINTYPE +_TRANSACTIONTYPE.fields_by_name['outputs'].message_type = _TXOUTPUTTYPE DESCRIPTOR.message_types_by_name['HDNodeType'] = _HDNODETYPE DESCRIPTOR.message_types_by_name['CoinType'] = _COINTYPE DESCRIPTOR.message_types_by_name['TxInputType'] = _TXINPUTTYPE @@ -629,5 +629,5 @@ google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_in) google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_out) DESCRIPTOR.has_options = True -DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), '\n(org.multibit.hd.hardware.trezor.protobufB\nTrezorType') +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), '\n\037com.satoshilabs.trezor.protobufB\nTrezorType') # @@protoc_insertion_point(module_scope) From 345f6d68142ab62b7e8f02dc1551f27c18b9edc8 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 7 Apr 2014 16:08:54 +0200 Subject: [PATCH 0290/1535] Compiled pb --- trezorlib/messages_pb2.py | 86 ++++++++++----------------- trezorlib/types_pb2.py | 118 ++++++++++++++++++++++++++++++++++---- 2 files changed, 137 insertions(+), 67 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index a7b6dcd54..b1bb9c8c7 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xbd\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\xac\x01\n\tTxRequest\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\"\n\x0crequest_type\x18\x02 \x01(\x0e\x32\x0c.RequestType\x12\x17\n\x0fsignature_index\x18\x03 \x01(\r\x12\x11\n\tsignature\x18\x04 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x05 \x01(\x0c\x12\x0f\n\x07tx_hash\x18\x06 \x01(\x0c\x12\x10\n\x08\x66inished\x18\x07 \x01(\x08\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x8b\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xbd\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x8b\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -202,8 +202,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2875, - serialized_end=4422, + serialized_start=2836, + serialized_end=4383, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -1529,51 +1529,23 @@ _TXREQUEST = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='request_index', full_name='TxRequest.request_index', index=0, - number=1, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='request_type', full_name='TxRequest.request_type', index=1, - number=2, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='signature_index', full_name='TxRequest.signature_index', index=2, - number=3, type=13, cpp_type=3, label=1, + name='request_type', full_name='TxRequest.request_type', index=0, + number=1, type=14, cpp_type=8, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='signature', full_name='TxRequest.signature', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='serialized_tx', full_name='TxRequest.serialized_tx', index=4, - number=5, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='tx_hash', full_name='TxRequest.tx_hash', index=5, - number=6, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + name='details', full_name='TxRequest.details', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='finished', full_name='TxRequest.finished', index=6, - number=7, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, + name='serialized', full_name='TxRequest.serialized', index=2, + number=3, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1587,7 +1559,7 @@ _TXREQUEST = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=2235, - serialized_end=2407, + serialized_end=2368, ) @@ -1614,8 +1586,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2409, - serialized_end=2446, + serialized_start=2370, + serialized_end=2407, ) @@ -1635,8 +1607,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2448, - serialized_end=2463, + serialized_start=2409, + serialized_end=2424, ) @@ -1663,8 +1635,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2465, - serialized_end=2498, + serialized_start=2426, + serialized_end=2459, ) @@ -1691,8 +1663,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2500, - serialized_end=2535, + serialized_start=2461, + serialized_end=2496, ) @@ -1712,8 +1684,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2537, - serialized_end=2556, + serialized_start=2498, + serialized_end=2517, ) @@ -1803,8 +1775,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2559, - serialized_end=2794, + serialized_start=2520, + serialized_end=2755, ) @@ -1824,8 +1796,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2796, - serialized_end=2811, + serialized_start=2757, + serialized_end=2772, ) @@ -1866,8 +1838,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2813, - serialized_end=2872, + serialized_start=2774, + serialized_end=2833, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -1880,6 +1852,8 @@ _SIMPLESIGNTX.fields_by_name['inputs'].message_type = types_pb2._TXINPUTTYPE _SIMPLESIGNTX.fields_by_name['outputs'].message_type = types_pb2._TXOUTPUTTYPE _SIMPLESIGNTX.fields_by_name['transactions'].message_type = types_pb2._TRANSACTIONTYPE _TXREQUEST.fields_by_name['request_type'].enum_type = types_pb2._REQUESTTYPE +_TXREQUEST.fields_by_name['details'].message_type = types_pb2._TXREQUESTDETAILSTYPE +_TXREQUEST.fields_by_name['serialized'].message_type = types_pb2._TXREQUESTSERIALIZEDTYPE _TXACK.fields_by_name['tx'].message_type = types_pb2._TRANSACTIONTYPE _DEBUGLINKSTATE.fields_by_name['node'].message_type = types_pb2._HDNODETYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 4ea003c5d..c5c4b8422 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\x9a\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*4\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\x9a\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,8 +74,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=737, - serialized_end=1070, + serialized_start=895, + serialized_end=1228, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -96,8 +96,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1072, - serialized_end=1123, + serialized_start=1230, + serialized_end=1281, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -119,11 +119,15 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( name='TXMETA', index=2, number=2, options=None, type=None), + _descriptor.EnumValueDescriptor( + name='TXFINISHED', index=3, number=3, + options=None, + type=None), ], containing_type=None, options=None, - serialized_start=1125, - serialized_end=1177, + serialized_start=1283, + serialized_end=1351, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -168,8 +172,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1180, - serialized_end=1442, + serialized_start=1354, + serialized_end=1616, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -194,8 +198,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1444, - serialized_end=1571, + serialized_start=1618, + serialized_end=1745, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -216,6 +220,7 @@ PAYTOSCRIPTHASH = 1 TXINPUT = 0 TXOUTPUT = 1 TXMETA = 2 +TXFINISHED = 3 ButtonRequest_Other = 1 ButtonRequest_FeeOverThreshold = 2 ButtonRequest_ConfirmOutput = 3 @@ -576,6 +581,83 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( serialized_end=734, ) + +_TXREQUESTDETAILSTYPE = _descriptor.Descriptor( + name='TxRequestDetailsType', + full_name='TxRequestDetailsType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='request_index', full_name='TxRequestDetailsType.request_index', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='tx_hash', full_name='TxRequestDetailsType.tx_hash', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=736, + serialized_end=798, +) + + +_TXREQUESTSERIALIZEDTYPE = _descriptor.Descriptor( + name='TxRequestSerializedType', + full_name='TxRequestSerializedType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='signature_index', full_name='TxRequestSerializedType.signature_index', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='signature', full_name='TxRequestSerializedType.signature', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='serialized_tx', full_name='TxRequestSerializedType.serialized_tx', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=800, + serialized_end=892, +) + _TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _SCRIPTTYPE _TRANSACTIONTYPE.fields_by_name['inputs'].message_type = _TXINPUTTYPE _TRANSACTIONTYPE.fields_by_name['bin_outputs'].message_type = _TXOUTPUTBINTYPE @@ -586,6 +668,8 @@ DESCRIPTOR.message_types_by_name['TxInputType'] = _TXINPUTTYPE DESCRIPTOR.message_types_by_name['TxOutputType'] = _TXOUTPUTTYPE DESCRIPTOR.message_types_by_name['TxOutputBinType'] = _TXOUTPUTBINTYPE DESCRIPTOR.message_types_by_name['TransactionType'] = _TRANSACTIONTYPE +DESCRIPTOR.message_types_by_name['TxRequestDetailsType'] = _TXREQUESTDETAILSTYPE +DESCRIPTOR.message_types_by_name['TxRequestSerializedType'] = _TXREQUESTSERIALIZEDTYPE class HDNodeType(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType @@ -623,6 +707,18 @@ class TransactionType(_message.Message): # @@protoc_insertion_point(class_scope:TransactionType) +class TxRequestDetailsType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _TXREQUESTDETAILSTYPE + + # @@protoc_insertion_point(class_scope:TxRequestDetailsType) + +class TxRequestSerializedType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _TXREQUESTSERIALIZEDTYPE + + # @@protoc_insertion_point(class_scope:TxRequestSerializedType) + google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_in) google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_out) google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_in) From ff77261a61274f76e9c75cbdb6c895aa6a40c171 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 7 Apr 2014 16:25:03 +0200 Subject: [PATCH 0291/1535] Fixed bin_output --- trezorlib/tx_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index e042f91ed..c34d60f35 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -68,7 +68,7 @@ def bitcore_tx(url): i.sequence = vin['sequence'] for vout in data['vout']: - o = t.outputs.add() + o = t.bin_outputs.add() o.amount = int(vout['value'] * 100000000) asm = vout['scriptPubKey']['asm'].split(' ') asm = [ opcode_serialize(x) for x in asm ] From 400f3e669fb98c5f72717f8dfdfaf14bb0171274 Mon Sep 17 00:00:00 2001 From: slush0 Date: Wed, 9 Apr 2014 21:42:30 +0200 Subject: [PATCH 0292/1535] Reworked RequestTx --- trezorlib/client.py | 98 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 3 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index d17be0377..552d73e94 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -1,4 +1,5 @@ import os +import time import binascii import hashlib import unicodedata @@ -433,15 +434,106 @@ class ProtocolMixin(object): return msg @field('serialized_tx') - @expect(proto.TxRequest) + @expect(types.TxRequestSerializedType) def simple_sign_tx(self, coin_name, inputs, outputs): # TODO Deserialize tx and check if inputs/outputs fits msg = self._prepare_simple_sign_tx(coin_name, inputs, outputs) - return self.call(msg) + return self.call(msg).serialized + + def _prepare_sign_tx(self, coin_name, inputs, outputs): + tx = types.TransactionType() + tx.inputs.extend(inputs) + tx.outputs.extend (outputs) + + txes = {} + txes[''] = tx + + known_hashes = [] + for inp in inputs: + if inp.prev_hash in known_hashes: + continue + + txes[inp.prev_hash] = self.tx_api.get_tx(binascii.hexlify(inp.prev_hash)) + known_hashes.append(inp.prev_hash) + + return txes def sign_tx(self, coin_name, inputs, outputs): # Temporary solution, until streaming is implemented in the firmware - return self.simple_sign_tx(coin_name, inputs, outputs) + # return self.simple_sign_tx(coin_name, inputs, outputs) + + start = time.time() + txes = self._prepare_sign_tx(coin_name, inputs, outputs) + + try: + self.transport.session_begin() + + # Prepare and send initial message + tx = proto.SignTx() + tx.inputs_count = len(inputs) + tx.outputs_count = len(outputs) + tx.coin_name = coin_name + res = self.call(tx) + + # Prepare structure for signatures + signatures = [None] * len(inputs) + serialized_tx = '' + + counter = 0 + while True: + counter += 1 + + if isinstance(res, proto.Failure): + raise CallException("Signing failed") + + if not isinstance(res, proto.TxRequest): + raise CallException("Unexpected message") + + # If there's some part of signed transaction, let's add it + if res.HasField('serialized_tx'): + print "!!! RECEIVED PART OF SERIALIED TX (%d BYTES)" % len(res.serialized_tx) + serialized_tx += res.serialized_tx + + if res.HasField('signature_index') and res.HasField('signature'): + print "!!! SIGNED INPUT", res.signature_index + signatures[res.signature_index] = res.signature + + if res.request_type == types.TXFINISHED: + # Device didn't ask for more information, finish workflow + break + + # Device asked for one more information, let's process it. + current_tx = txes[res.tx_hash] + + if res.request_type == types.TXMETA: + print "REQUESTING META OF", binascii.hexlify(res.tx_hash) + msg = types.TransactionType() + msg.version = current_tx.version + msg.lock_time = current_tx.lock_time + res = self.call(proto.TxAck(tx=msg)) + continue + + elif res.request_type == types.TXINPUT: + print "REQUESTING INPUT", res.request_index, "OF", binascii.hexlify(res.tx_hash) + msg = types.TransactionType() + msg.inputs.extend([current_tx.inputs[res.request_index], ]) + res = self.call(proto.TxAck(tx=msg)) + continue + + elif res.request_type == types.TXOUTPUT: + print "REQUESTING OUTOUT", res.request_index, "OF", binascii.hexlify(res.tx_hash) + msg = types.TransactionType() + msg.outputs.extend([current_tx.outputs[res.request_index], ]) + res = self.call(proto.TxAck(tx=msg)) + continue + + finally: + self.transport.session_end() + + print "SIGNED IN %.03f SECONDS, CALLED %d MESSAGES, %d BYTES" % \ + (time.time() - start, counter, len(serialized_tx)) + + return (signatures, serialized_tx) @field('message') @expect(proto.Success) From d017ae2adfa55bc1443a8f2e23ff33c10bf93bb2 Mon Sep 17 00:00:00 2001 From: slush0 Date: Wed, 9 Apr 2014 21:42:54 +0200 Subject: [PATCH 0293/1535] Fixed RequestTx structure --- tests/test_msg_simplesigntx.py | 36 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index 114198502..896f4238a 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -33,11 +33,11 @@ class TestMsgSimplesigntx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(finished=True)]) + proto.TxRequest(request_type=proto_types.TXFINISHED)]) tx = self.client.call(msg) # Accepted by network: tx fd79435246dee76b2f159d2db08032d666c95adc544de64c8c49f474df4a7fee - self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') def test_testnet_one_two_fee(self): self.setup_mnemonic_nopin_nopassphrase() @@ -66,10 +66,10 @@ class TestMsgSimplesigntx(common.TrezorTest): self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(finished=True)]) + proto.TxRequest(request_type=proto_types.TXFINISHED)]) tx = self.client.call(msg) - self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b4830450221009c2d30385519fdb13dce13d5ac038be07d7b2dad0b0f7b2c1c339d7255bcf553022056a2f5bceab3cd0ffed4d388387e631f419d67ff9ce7798e3d7dfe6a6d6ec4bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0280ce341d000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') + self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b4830450221009c2d30385519fdb13dce13d5ac038be07d7b2dad0b0f7b2c1c339d7255bcf553022056a2f5bceab3cd0ffed4d388387e631f419d67ff9ce7798e3d7dfe6a6d6ec4bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0280ce341d000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') def test_testnet_fee_too_high(self): self.setup_mnemonic_nopin_nopassphrase() @@ -99,10 +99,10 @@ class TestMsgSimplesigntx(common.TrezorTest): # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(finished=True)]) + proto.TxRequest(request_type=proto_types.TXFINISHED)]) tx = self.client.call(msg) - self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') + self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') def test_one_two_fee(self): self.setup_mnemonic_nopin_nopassphrase() @@ -131,10 +131,10 @@ class TestMsgSimplesigntx(common.TrezorTest): self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(finished=True)]) + proto.TxRequest(request_type=proto_types.TXFINISHED)]) tx = self.client.call(msg) - self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef1702201d481d04216b319dc549ffe2333143629ba18828a4e2d1783ab719a6aa263eb70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') + self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef1702201d481d04216b319dc549ffe2333143629ba18828a4e2d1783ab719a6aa263eb70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') def test_one_three_fee(self): self.setup_mnemonic_nopin_nopassphrase() @@ -169,10 +169,10 @@ class TestMsgSimplesigntx(common.TrezorTest): proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(finished=True)]) + proto.TxRequest(request_type=proto_types.TXFINISHED)]) tx = self.client.call(msg) - self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02207b0879a81408a11e23b11d4c7965c62b5fc6d5c2d92340f5ee2da7b40e99314a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') + self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02207b0879a81408a11e23b11d4c7965c62b5fc6d5c2d92340f5ee2da7b40e99314a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') def test_two_two(self): self.setup_mnemonic_nopin_nopassphrase() @@ -209,11 +209,11 @@ class TestMsgSimplesigntx(common.TrezorTest): self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(finished=True)]) + proto.TxRequest(request_type=proto_types.TXFINISHED)]) tx = self.client.call(msg) # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb - self.assertEqual(binascii.hexlify(tx.serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') + self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') ''' @@ -251,10 +251,10 @@ class TestMsgSimplesigntx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], outputs) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), ] * 255 + \ [proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(finished=True)]) + proto.TxRequest(request_type=proto_types.TXFINISHED)]) tx = self.client.call(msg) - self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') + self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') ''' def test_fee_too_high(self): @@ -279,10 +279,10 @@ class TestMsgSimplesigntx(common.TrezorTest): self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(finished=True)]) + proto.TxRequest(request_type=proto_types.TXFINISHED)]) tx = self.client.call(msg) - self.assertEqual(binascii.hexlify(tx.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') def test_not_enough_funds(self): self.setup_mnemonic_nopin_nopassphrase() @@ -332,11 +332,11 @@ class TestMsgSimplesigntx(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(finished=True)]) + proto.TxRequest(request_type=proto_types.TXFINISHED)]) tx = self.client.call(msg) # Accepted by network: tx 8cc1f4adf7224ce855cf535a5104594a0004cb3b640d6714fdb00b9128832dd5 - self.assertEqual(binascii.hexlify(tx.serialized_tx), '0100000001a3fb2d38322c3b327e54005cebc0686d52fcdf536e53bb5ef481a7de8056aa54010000006b4830450221009e020b0390ccad533b73b552f8a99a9d827212c558e4f755503674d07c92ad4502202d606f7316990e0461c51d4add25054f19c697aa3e3c2ced4d568f0b2c57e62f0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0170f305000000000017a9147f844bdb0b8fd54b64e3d16c85dc1170f1ff97c18700000000') + self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '0100000001a3fb2d38322c3b327e54005cebc0686d52fcdf536e53bb5ef481a7de8056aa54010000006b4830450221009e020b0390ccad533b73b552f8a99a9d827212c558e4f755503674d07c92ad4502202d606f7316990e0461c51d4add25054f19c697aa3e3c2ced4d568f0b2c57e62f0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0170f305000000000017a9147f844bdb0b8fd54b64e3d16c85dc1170f1ff97c18700000000') if __name__ == '__main__': unittest.main() From cbe8b42eedc600217f7a9b53c283819ee67bd569 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 10 Apr 2014 15:22:01 +0200 Subject: [PATCH 0294/1535] First unit test for streaming tx --- tests/test_msg_signtx.py | 60 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py index 56c941086..50e61a949 100644 --- a/tests/test_msg_signtx.py +++ b/tests/test_msg_signtx.py @@ -1,3 +1,57 @@ +# tx 4a7b7e0403ae5607e473949cfa03f09f2cd8b0f404bf99ce10b7303d86280bf7 +# 100 UTXO for spending for unittests + +import unittest +import common +import binascii + +import trezorlib.messages_pb2 as proto +import trezorlib.types_pb2 as proto_types +from trezorlib.client import CallException +from trezorlib.tx_api import TXAPITestnet, TXAPIBitcoin + +class TestMsgSigntx(common.TrezorTest): + def test_two_two(self): + self.setup_mnemonic_nopin_nopassphrase() + + # tx: c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c + # input 1: 0.0010 BTC + # tx: 58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e + # input 1: 0.0011 BTC + + inp1 = proto_types.TxInputType(address_n=[1], # 1CK7SJdcb8z9HuvVft3D91HLpLC6KSsGb + # amount=100000, + prev_hash=binascii.unhexlify('c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c'), + prev_index=1, + ) + + inp2 = proto_types.TxInputType(address_n=[2], # 15AeAhtNJNKyowK8qPHwgpXkhsokzLtUpG + # amount=110000, + prev_hash=binascii.unhexlify('58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e'), + prev_index=1, + ) + + out1 = proto_types.TxOutputType(address='15Jvu3nZNP7u2ipw2533Q9VVgEu2Lu9F2B', + amount=210000 - 100000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + out2 = proto_types.TxOutputType(address_n=[3], # 1CmzyJp9w3NafXMSEFH4SLYUPAVCSUrrJ5 + amount=100000, + script_type=proto_types.PAYTOADDRESS, + ) + + with self.client: + # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change + # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + # proto.TxRequest(finished=True)]) + (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, inp2], [out1, out2]) + + # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb + self.assertEqual(binascii.hexlify(serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') + + ''' def test_signtx(self): expected_tx = '01000000012de70f7d6ffed0db70f8882f3fca90db9bb09f0e99bce27468c23d3c994fcd56' \ @@ -33,8 +87,7 @@ ) print binascii.hexlify(self.client.sign_tx([inp1], [out1, out2])[1]) - ''' - ''' + def test_workflow(self): inp1 = proto.TxInput(index=0, address_n=[1,0], @@ -159,3 +212,6 @@ print binascii.hexlify(serialized) ''' + +if __name__ == '__main__': + unittest.main() From 2964cc4f9c7683df7153f9f67b21529a85b75af4 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 10 Apr 2014 15:22:21 +0200 Subject: [PATCH 0295/1535] Temporary disabled unit test --- tests/test_msg_verifymessage.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_msg_verifymessage.py b/tests/test_msg_verifymessage.py index d5be691a6..b13952d13 100644 --- a/tests/test_msg_verifymessage.py +++ b/tests/test_msg_verifymessage.py @@ -5,6 +5,7 @@ import base64 from trezorlib.client import CallException +''' class TestMsgVerifymessage(common.TrezorTest): def test_too_long(self): self.setup_mnemonic_nopin_nopassphrase() @@ -103,3 +104,4 @@ class TestMsgVerifymessage(common.TrezorTest): if __name__ == '__main__': unittest.main() +''' From 7ae88942142fb1e9a1e6b3e5a84e652a75efa6cd Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 11 Apr 2014 15:17:36 +0200 Subject: [PATCH 0296/1535] fix two more unit tests --- tests/test_protection_levels.py | 2 +- tests/test_zerosig.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_protection_levels.py b/tests/test_protection_levels.py index bb550acd6..14242de47 100644 --- a/tests/test_protection_levels.py +++ b/tests/test_protection_levels.py @@ -150,7 +150,7 @@ class TestProtectionLevels(common.TrezorTest): proto.PassphraseRequest(), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(finished=True)]) + proto.TxRequest(request_type=proto_types.TXFINISHED)]) self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) # def test_firmware_erase(self): diff --git a/tests/test_zerosig.py b/tests/test_zerosig.py index 15fa04778..937d7ba69 100644 --- a/tests/test_zerosig.py +++ b/tests/test_zerosig.py @@ -56,8 +56,8 @@ class TestZeroSig(common.TrezorTest): ) msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1], [out1]) - tx = self.client.call(msg) - siglen = ord(tx.serialized_tx[44]) + tx = self.client.call(msg) + siglen = ord(tx.serialized.serialized_tx[44]) # Trezor must strip leading zero from signature self.assertEqual(siglen, 67) @@ -79,7 +79,7 @@ class TestZeroSig(common.TrezorTest): msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1], [out1]) tx = self.client.call(msg) - siglen = ord(tx.serialized_tx[44]) + siglen = ord(tx.serialized.serialized_tx[44]) # Trezor must strip leading zero from signature self.assertEqual(siglen, 66) From 994ff45a307f33567677ef4a291f586fc826313f Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 17 Apr 2014 08:30:10 +0200 Subject: [PATCH 0297/1535] Updated TransactionType --- trezorlib/types_pb2.py | 46 +++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index c5c4b8422..de78f102e 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\x9a\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc7\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x14\n\x0cinputs_count\x18\x06 \x01(\r\x12\x15\n\routputs_count\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,8 +74,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=895, - serialized_end=1228, + serialized_start=940, + serialized_end=1273, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -96,8 +96,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1230, - serialized_end=1281, + serialized_start=1275, + serialized_end=1326, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -126,8 +126,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1283, - serialized_end=1351, + serialized_start=1328, + serialized_end=1396, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -172,8 +172,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1354, - serialized_end=1616, + serialized_start=1399, + serialized_end=1661, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -198,8 +198,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1618, - serialized_end=1745, + serialized_start=1663, + serialized_end=1790, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -568,6 +568,20 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='inputs_count', full_name='TransactionType.inputs_count', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='outputs_count', full_name='TransactionType.outputs_count', index=6, + number=7, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -578,7 +592,7 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=580, - serialized_end=734, + serialized_end=779, ) @@ -612,8 +626,8 @@ _TXREQUESTDETAILSTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=736, - serialized_end=798, + serialized_start=781, + serialized_end=843, ) @@ -654,8 +668,8 @@ _TXREQUESTSERIALIZEDTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=800, - serialized_end=892, + serialized_start=845, + serialized_end=937, ) _TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _SCRIPTTYPE From 48ad2f678525dc1ff4b09a40b1c579ab84fd26bf Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 17 Apr 2014 08:30:34 +0200 Subject: [PATCH 0298/1535] Updates stream signing algo --- trezorlib/client.py | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 552d73e94..f68c911ec 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -443,7 +443,7 @@ class ProtocolMixin(object): def _prepare_sign_tx(self, coin_name, inputs, outputs): tx = types.TransactionType() tx.inputs.extend(inputs) - tx.outputs.extend (outputs) + tx.outputs.extend(outputs) txes = {} txes[''] = tx @@ -490,40 +490,48 @@ class ProtocolMixin(object): raise CallException("Unexpected message") # If there's some part of signed transaction, let's add it - if res.HasField('serialized_tx'): - print "!!! RECEIVED PART OF SERIALIED TX (%d BYTES)" % len(res.serialized_tx) - serialized_tx += res.serialized_tx + if res.HasField('serialized') and res.serialized.HasField('serialized_tx'): + print "!!! RECEIVED PART OF SERIALIED TX (%d BYTES)" % len(res.serialized.serialized_tx) + serialized_tx += res.serialized.serialized_tx - if res.HasField('signature_index') and res.HasField('signature'): - print "!!! SIGNED INPUT", res.signature_index - signatures[res.signature_index] = res.signature + if res.HasField('serialized') and res.serialized.HasField('signature_index'): + print "!!! SIGNED INPUT", res.serialized.signature_index + signatures[res.serialized.signature_index] = res.serialized.signature if res.request_type == types.TXFINISHED: # Device didn't ask for more information, finish workflow break # Device asked for one more information, let's process it. - current_tx = txes[res.tx_hash] + current_tx = txes[res.details.tx_hash] if res.request_type == types.TXMETA: - print "REQUESTING META OF", binascii.hexlify(res.tx_hash) + print "REQUESTING META OF", binascii.hexlify(res.details.tx_hash) msg = types.TransactionType() msg.version = current_tx.version msg.lock_time = current_tx.lock_time + msg.inputs_count = len(current_tx.inputs) + if res.details.tx_hash: + msg.outputs_count = len(current_tx.bin_outputs) + else: + msg.outputs_count = len(current_tx.outputs) res = self.call(proto.TxAck(tx=msg)) continue elif res.request_type == types.TXINPUT: - print "REQUESTING INPUT", res.request_index, "OF", binascii.hexlify(res.tx_hash) + print "REQUESTING INPUT", res.details.request_index, "OF", binascii.hexlify(res.details.tx_hash) msg = types.TransactionType() - msg.inputs.extend([current_tx.inputs[res.request_index], ]) + msg.inputs.extend([current_tx.inputs[res.details.request_index], ]) res = self.call(proto.TxAck(tx=msg)) continue elif res.request_type == types.TXOUTPUT: - print "REQUESTING OUTOUT", res.request_index, "OF", binascii.hexlify(res.tx_hash) + print "REQUESTING OUTOUT", res.details.request_index, "OF", binascii.hexlify(res.details.tx_hash) msg = types.TransactionType() - msg.outputs.extend([current_tx.outputs[res.request_index], ]) + if res.details.tx_hash: + msg.bin_outputs.extend([current_tx.bin_outputs[res.details.request_index], ]) + else: + msg.outputs.extend([current_tx.outputs[res.details.request_index], ]) res = self.call(proto.TxAck(tx=msg)) continue From 96966309d3aea59ed475d38fc895ac030c16f6cf Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 17 Apr 2014 14:05:38 +0200 Subject: [PATCH 0299/1535] Compiled pb --- trezorlib/types_pb2.py | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index de78f102e..6d86bedc6 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc7\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x14\n\x0cinputs_count\x18\x06 \x01(\r\x12\x15\n\routputs_count\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,8 +74,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=940, - serialized_end=1273, + serialized_start=936, + serialized_end=1269, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -96,8 +96,8 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1275, - serialized_end=1326, + serialized_start=1271, + serialized_end=1322, ) ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) @@ -126,8 +126,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1328, - serialized_end=1396, + serialized_start=1324, + serialized_end=1392, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -172,8 +172,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1399, - serialized_end=1661, + serialized_start=1395, + serialized_end=1657, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -198,8 +198,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1663, - serialized_end=1790, + serialized_start=1659, + serialized_end=1786, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -569,14 +569,14 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='inputs_count', full_name='TransactionType.inputs_count', index=5, + name='inputs_cnt', full_name='TransactionType.inputs_cnt', index=5, number=6, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='outputs_count', full_name='TransactionType.outputs_count', index=6, + name='outputs_cnt', full_name='TransactionType.outputs_cnt', index=6, number=7, type=13, cpp_type=3, label=1, has_default_value=False, default_value=0, message_type=None, enum_type=None, containing_type=None, @@ -592,7 +592,7 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=580, - serialized_end=779, + serialized_end=775, ) @@ -626,8 +626,8 @@ _TXREQUESTDETAILSTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=781, - serialized_end=843, + serialized_start=777, + serialized_end=839, ) @@ -668,8 +668,8 @@ _TXREQUESTSERIALIZEDTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=845, - serialized_end=937, + serialized_start=841, + serialized_end=933, ) _TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _SCRIPTTYPE From 1d46bd70a91556faea019d6c7e4e3a33df35a4ff Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 17 Apr 2014 14:05:45 +0200 Subject: [PATCH 0300/1535] Reworked TransactionType (again) --- trezorlib/client.py | 91 ++------------------------------------------- 1 file changed, 4 insertions(+), 87 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index f68c911ec..18c94a546 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -491,11 +491,10 @@ class ProtocolMixin(object): # If there's some part of signed transaction, let's add it if res.HasField('serialized') and res.serialized.HasField('serialized_tx'): - print "!!! RECEIVED PART OF SERIALIED TX (%d BYTES)" % len(res.serialized.serialized_tx) + print "RECEIVED PART OF SERIALIED TX (%d BYTES)" % len(res.serialized.serialized_tx) serialized_tx += res.serialized.serialized_tx if res.HasField('serialized') and res.serialized.HasField('signature_index'): - print "!!! SIGNED INPUT", res.serialized.signature_index signatures[res.serialized.signature_index] = res.serialized.signature if res.request_type == types.TXFINISHED: @@ -506,27 +505,24 @@ class ProtocolMixin(object): current_tx = txes[res.details.tx_hash] if res.request_type == types.TXMETA: - print "REQUESTING META OF", binascii.hexlify(res.details.tx_hash) msg = types.TransactionType() msg.version = current_tx.version msg.lock_time = current_tx.lock_time - msg.inputs_count = len(current_tx.inputs) + msg.inputs_cnt = len(current_tx.inputs) if res.details.tx_hash: - msg.outputs_count = len(current_tx.bin_outputs) + msg.outputs_cnt = len(current_tx.bin_outputs) else: - msg.outputs_count = len(current_tx.outputs) + msg.outputs_cnt = len(current_tx.outputs) res = self.call(proto.TxAck(tx=msg)) continue elif res.request_type == types.TXINPUT: - print "REQUESTING INPUT", res.details.request_index, "OF", binascii.hexlify(res.details.tx_hash) msg = types.TransactionType() msg.inputs.extend([current_tx.inputs[res.details.request_index], ]) res = self.call(proto.TxAck(tx=msg)) continue elif res.request_type == types.TXOUTPUT: - print "REQUESTING OUTOUT", res.details.request_index, "OF", binascii.hexlify(res.details.tx_hash) msg = types.TransactionType() if res.details.tx_hash: msg.bin_outputs.extend([current_tx.bin_outputs[res.details.request_index], ]) @@ -686,82 +682,3 @@ class TrezorClientDebug(ProtocolMixin, TextUIMixin, DebugWireMixin, BaseClient): class TrezorDebugClient(ProtocolMixin, DebugLinkMixin, DebugWireMixin, BaseClient): pass - -''' - def _sign_tx(self, coin_name, inputs, outputs): - '' - inputs: list of TxInput - outputs: list of TxOutput - - proto.TxInput(index=0, - address_n=0, - amount=0, - prev_hash='', - prev_index=0, - #script_sig= - ) - proto.TxOutput(index=0, - address='1Bitkey', - #address_n=[], - amount=100000000, - script_type=proto.PAYTOADDRESS, - #script_args= - ) - '' - - start = time.time() - - try: - self.transport.session_begin() - - # Prepare and send initial message - tx = proto.SignTx() - tx.inputs_count = len(inputs) - tx.outputs_count = len(outputs) - res = self.call(tx) - - # Prepare structure for signatures - signatures = [None]*len(inputs) - serialized_tx = '' - - counter = 0 - while True: - counter += 1 - - if isinstance(res, proto.Failure): - raise CallException("Signing failed") - - if not isinstance(res, proto.TxRequest): - raise CallException("Unexpected message") - - # If there's some part of signed transaction, let's add it - if res.serialized_tx: - print "!!! RECEIVED PART OF SERIALIED TX (%d BYTES)" % len(res.serialized_tx) - serialized_tx += res.serialized_tx - - if res.signed_index >= 0 and res.signature: - print "!!! SIGNED INPUT", res.signed_index - signatures[res.signed_index] = res.signature - - if res.request_index < 0: - # Device didn't ask for more information, finish workflow - break - - # Device asked for one more information, let's process it. - if res.request_type == types.TXOUTPUT: - res = self.call(outputs[res.request_index]) - continue - - elif res.request_type == types.TXINPUT: - print "REQUESTING", res.request_index - res = self.call(inputs[res.request_index]) - continue - - finally: - self.transport.session_end() - - print "SIGNED IN %.03f SECONDS, CALLED %d MESSAGES, %d BYTES" % \ - (time.time() - start, counter, len(serialized_tx)) - - return (signatures, serialized_tx) -''' From c642605ad23e454d42de0c1bb6b2bc3254a3baed Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 17 Apr 2014 16:27:00 +0200 Subject: [PATCH 0301/1535] modify simplesigntx to match signtx semantics --- tests/test_msg_simplesigntx.py | 48 ++++++++++++++-------------------- trezorlib/client.py | 7 +---- 2 files changed, 20 insertions(+), 35 deletions(-) diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index 896f4238a..7705479a7 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -30,14 +30,13 @@ class TestMsgSimplesigntx(common.TrezorTest): ) with self.client: - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXFINISHED)]) - tx = self.client.call(msg) + serialized_tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) # Accepted by network: tx fd79435246dee76b2f159d2db08032d666c95adc544de64c8c49f474df4a7fee - self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') def test_testnet_one_two_fee(self): self.setup_mnemonic_nopin_nopassphrase() @@ -62,14 +61,13 @@ class TestMsgSimplesigntx(common.TrezorTest): with self.client: self.client.set_tx_api(TXAPITestnet()) - msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXFINISHED)]) - tx = self.client.call(msg) + serialized_tx = self.client.simple_sign_tx('Testnet', [inp1, ], [out1, out2]) - self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b4830450221009c2d30385519fdb13dce13d5ac038be07d7b2dad0b0f7b2c1c339d7255bcf553022056a2f5bceab3cd0ffed4d388387e631f419d67ff9ce7798e3d7dfe6a6d6ec4bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0280ce341d000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b4830450221009c2d30385519fdb13dce13d5ac038be07d7b2dad0b0f7b2c1c339d7255bcf553022056a2f5bceab3cd0ffed4d388387e631f419d67ff9ce7798e3d7dfe6a6d6ec4bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0280ce341d000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') def test_testnet_fee_too_high(self): self.setup_mnemonic_nopin_nopassphrase() @@ -94,15 +92,14 @@ class TestMsgSimplesigntx(common.TrezorTest): with self.client: self.client.set_tx_api(TXAPITestnet()) - msg = self.client._prepare_simple_sign_tx('Testnet', [inp1, ], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXFINISHED)]) - tx = self.client.call(msg) + serialized_tx = self.client.simple_sign_tx('Testnet', [inp1, ], [out1, out2]) - self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') def test_one_two_fee(self): self.setup_mnemonic_nopin_nopassphrase() @@ -127,14 +124,13 @@ class TestMsgSimplesigntx(common.TrezorTest): ) with self.client: - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXFINISHED)]) - tx = self.client.call(msg) + serialized_tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, out2]) - self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef1702201d481d04216b319dc549ffe2333143629ba18828a4e2d1783ab719a6aa263eb70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef1702201d481d04216b319dc549ffe2333143629ba18828a4e2d1783ab719a6aa263eb70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') def test_one_three_fee(self): self.setup_mnemonic_nopin_nopassphrase() @@ -164,15 +160,14 @@ class TestMsgSimplesigntx(common.TrezorTest): ) with self.client: - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, out2, out3]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXFINISHED)]) - tx = self.client.call(msg) + serialized_tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, out2, out3]) - self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02207b0879a81408a11e23b11d4c7965c62b5fc6d5c2d92340f5ee2da7b40e99314a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02207b0879a81408a11e23b11d4c7965c62b5fc6d5c2d92340f5ee2da7b40e99314a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') def test_two_two(self): self.setup_mnemonic_nopin_nopassphrase() @@ -205,15 +200,14 @@ class TestMsgSimplesigntx(common.TrezorTest): ) with self.client: - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], [out1, out2]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXFINISHED)]) - tx = self.client.call(msg) + serialized_tx = self.client.simple_sign_tx('Bitcoin', [inp1, inp2], [out1, out2]) # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb - self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') ''' @@ -248,13 +242,12 @@ class TestMsgSimplesigntx(common.TrezorTest): outputs.append(out) with self.client: - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, inp2], outputs) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), ] * 255 + \ [proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXFINISHED)]) - tx = self.client.call(msg) + serialized_tx = self.client.simple_sign_tx('Bitcoin', [inp1, inp2], outputs) - self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') ''' def test_fee_too_high(self): @@ -275,14 +268,13 @@ class TestMsgSimplesigntx(common.TrezorTest): ) with self.client: - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXFINISHED)]) - tx = self.client.call(msg) + serialized_tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) - self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') def test_not_enough_funds(self): self.setup_mnemonic_nopin_nopassphrase() @@ -302,12 +294,11 @@ class TestMsgSimplesigntx(common.TrezorTest): ) with self.client: - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.Failure(code=proto_types.Failure_NotEnoughFunds)]) try: - self.client.call(msg) + self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) except CallException as e: self.assertEqual(e.args[0], proto_types.Failure_NotEnoughFunds) else: @@ -329,14 +320,13 @@ class TestMsgSimplesigntx(common.TrezorTest): with self.client: self.client.set_tx_api(TXAPIBitcoin()) - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXFINISHED)]) - tx = self.client.call(msg) + serialized_tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) # Accepted by network: tx 8cc1f4adf7224ce855cf535a5104594a0004cb3b640d6714fdb00b9128832dd5 - self.assertEqual(binascii.hexlify(tx.serialized.serialized_tx), '0100000001a3fb2d38322c3b327e54005cebc0686d52fcdf536e53bb5ef481a7de8056aa54010000006b4830450221009e020b0390ccad533b73b552f8a99a9d827212c558e4f755503674d07c92ad4502202d606f7316990e0461c51d4add25054f19c697aa3e3c2ced4d568f0b2c57e62f0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0170f305000000000017a9147f844bdb0b8fd54b64e3d16c85dc1170f1ff97c18700000000') + self.assertEqual(binascii.hexlify(serialized_tx), '0100000001a3fb2d38322c3b327e54005cebc0686d52fcdf536e53bb5ef481a7de8056aa54010000006b4830450221009e020b0390ccad533b73b552f8a99a9d827212c558e4f755503674d07c92ad4502202d606f7316990e0461c51d4add25054f19c697aa3e3c2ced4d568f0b2c57e62f0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0170f305000000000017a9147f844bdb0b8fd54b64e3d16c85dc1170f1ff97c18700000000') if __name__ == '__main__': unittest.main() diff --git a/trezorlib/client.py b/trezorlib/client.py index 18c94a546..b768bba8c 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -433,12 +433,9 @@ class ProtocolMixin(object): return msg - @field('serialized_tx') - @expect(types.TxRequestSerializedType) def simple_sign_tx(self, coin_name, inputs, outputs): - # TODO Deserialize tx and check if inputs/outputs fits msg = self._prepare_simple_sign_tx(coin_name, inputs, outputs) - return self.call(msg).serialized + return self.call(msg).serialized.serialized_tx def _prepare_sign_tx(self, coin_name, inputs, outputs): tx = types.TransactionType() @@ -459,8 +456,6 @@ class ProtocolMixin(object): return txes def sign_tx(self, coin_name, inputs, outputs): - # Temporary solution, until streaming is implemented in the firmware - # return self.simple_sign_tx(coin_name, inputs, outputs) start = time.time() txes = self._prepare_sign_tx(coin_name, inputs, outputs) From b91bd9d628d6bfdd49c2271994e0dad3e0ba8a1d Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 17 Apr 2014 16:37:09 +0200 Subject: [PATCH 0302/1535] use simplesigntx tests for signtx --- tests/test_msg_signtx.py | 278 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 277 insertions(+), 1 deletion(-) diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py index 50e61a949..16588c421 100644 --- a/tests/test_msg_signtx.py +++ b/tests/test_msg_signtx.py @@ -11,6 +11,164 @@ from trezorlib.client import CallException from trezorlib.tx_api import TXAPITestnet, TXAPIBitcoin class TestMsgSigntx(common.TrezorTest): + + def test_one_one_fee(self): + self.setup_mnemonic_nopin_nopassphrase() + + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=390000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + with self.client: + # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) + + # Accepted by network: tx fd79435246dee76b2f159d2db08032d666c95adc544de64c8c49f474df4a7fee + self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b4830450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede7810121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0160cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + + def test_testnet_one_two_fee(self): + self.setup_mnemonic_nopin_nopassphrase() + + # tx: 6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54 + # input 1: 10.00000000 BTC + inp1 = proto_types.TxInputType(address_n=[0], # mirio8q3gtv7fhdnmb3TpZ4EuafdzSs7zL + # amount=1000000000, + prev_hash=binascii.unhexlify('6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54'), + prev_index=1, + ) + + out1 = proto_types.TxOutputType(address='mfiGQVPcRcaEvQPYDErR34DcCovtxYvUUV', + amount=1000000000 - 500000000 - 10000000, + script_type=proto_types.PAYTOADDRESS, + ) + + out2 = proto_types.TxOutputType(address_n=[2], + amount=500000000, + script_type=proto_types.PAYTOADDRESS, + ) + + with self.client: + self.client.set_tx_api(TXAPITestnet()) + # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change + # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + (signatures, serialized_tx) = self.client.sign_tx('Testnet', [inp1, ], [out1, out2]) + + self.assertEqual(binascii.hexlify(serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b4830450221009c2d30385519fdb13dce13d5ac038be07d7b2dad0b0f7b2c1c339d7255bcf553022056a2f5bceab3cd0ffed4d388387e631f419d67ff9ce7798e3d7dfe6a6d6ec4bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0280ce341d000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') + + def test_testnet_fee_too_high(self): + self.setup_mnemonic_nopin_nopassphrase() + + # tx: 6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54 + # input 1: 10.00000000 BTC + inp1 = proto_types.TxInputType(address_n=[0], # mirio8q3gtv7fhdnmb3TpZ4EuafdzSs7zL + # amount=1000000000, + prev_hash=binascii.unhexlify('6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54'), + prev_index=1, + ) + + out1 = proto_types.TxOutputType(address='mfiGQVPcRcaEvQPYDErR34DcCovtxYvUUV', + amount=1000000000 - 500000000 - 20000000, + script_type=proto_types.PAYTOADDRESS, + ) + + out2 = proto_types.TxOutputType(address_n=[2], + amount=500000000, + script_type=proto_types.PAYTOADDRESS, + ) + + with self.client: + self.client.set_tx_api(TXAPITestnet()) + # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change + # proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), + # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + (signatures, serialized_tx) = self.client.sign_tx('Testnet', [inp1, ], [out1, out2]) + + self.assertEqual(binascii.hexlify(serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') + + def test_one_two_fee(self): + self.setup_mnemonic_nopin_nopassphrase() + + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=390000 - 80000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + out2 = proto_types.TxOutputType(address_n=[1], + amount=80000, + script_type=proto_types.PAYTOADDRESS, + ) + + with self.client: + # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change + # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, out2]) + + self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef1702201d481d04216b319dc549ffe2333143629ba18828a4e2d1783ab719a6aa263eb70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') + + def test_one_three_fee(self): + self.setup_mnemonic_nopin_nopassphrase() + + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=390000 - 80000 - 12000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + out2 = proto_types.TxOutputType(address='13uaUYn6XAooo88QvAqAVsiVvr2mAXutqP', + amount=12000, + script_type=proto_types.PAYTOADDRESS, + ) + + out3 = proto_types.TxOutputType(address_n=[1], + amount=80000, + script_type=proto_types.PAYTOADDRESS, + ) + + with self.client: + # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change + # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, out2, out3]) + + self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02207b0879a81408a11e23b11d4c7965c62b5fc6d5c2d92340f5ee2da7b40e99314a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') + def test_two_two(self): self.setup_mnemonic_nopin_nopassphrase() @@ -45,12 +203,130 @@ class TestMsgSigntx(common.TrezorTest): # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - # proto.TxRequest(finished=True)]) + # proto.TxRequest(request_type=proto_types.TXFINISHED)]) (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, inp2], [out1, out2]) # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb self.assertEqual(binascii.hexlify(serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') + ''' + + def test_255_outputs(self): + self.setup_mnemonic_nopin_nopassphrase() + + # Tests if device implements serialization of len(outputs) correctly + + # tx: c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb + # index 1: 0.0010 BTC + # tx: 39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5 + # index 1: 0.0254 BTC + + inp1 = proto_types.TxInputType(address_n=[3], # 1CmzyJp9w3NafXMSEFH4SLYUPAVCSUrrJ5 + # amount=100000, + prev_hash=binascii.unhexlify('c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb'), + prev_index=1, + ) + + inp2 = proto_types.TxInputType(address_n=[3], # 1CmzyJp9w3NafXMSEFH4SLYUPAVCSUrrJ5 + # amount=2540000, + prev_hash=binascii.unhexlify('39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5'), + prev_index=1, + ) + + outputs = [] + for _ in range(255): + out = proto_types.TxOutputType(address='1NwN6UduuVkJi6sw3gSiKZaCY5rHgVXC2h', + amount=10200, + script_type=proto_types.PAYTOADDRESS, + ) + outputs.append(out) + + with self.client: + # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), ] * 255 + \ + # [proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, inp2], outputs) + + self.assertEqual(binascii.hexlify(serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') + + ''' + def test_fee_too_high(self): + self.setup_mnemonic_nopin_nopassphrase() + + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=390000 - 50000, + script_type=proto_types.PAYTOADDRESS, + ) + + with self.client: + # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), + # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) + + self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + + def test_not_enough_funds(self): + self.setup_mnemonic_nopin_nopassphrase() + + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=400000, + script_type=proto_types.PAYTOADDRESS, + ) + + with self.client: + # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # proto.Failure(code=proto_types.Failure_NotEnoughFunds)]) + + try: + self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + except CallException as e: + self.assertEqual(e.args[0], proto_types.Failure_NotEnoughFunds) + else: + self.assert_(False, "types.Failure_NotEnoughFunds expected") + + def test_p2sh(self): + self.setup_mnemonic_nopin_nopassphrase() + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=400000, + prev_hash=binascii.unhexlify('54aa5680dea781f45ebb536e53dffc526d68c0eb5c00547e323b2c32382dfba3'), + prev_index=1, + ) + + out1 = proto_types.TxOutputType(address='3DKGE1pvPpBAgZj94MbCinwmksewUNNYVR', # p2sh + amount=400000 - 10000, + script_type=proto_types.PAYTOSCRIPTHASH, + ) + + with self.client: + self.client.set_tx_api(TXAPIBitcoin()) + # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) + + # Accepted by network: tx 8cc1f4adf7224ce855cf535a5104594a0004cb3b640d6714fdb00b9128832dd5 + self.assertEqual(binascii.hexlify(serialized_tx), '0100000001a3fb2d38322c3b327e54005cebc0686d52fcdf536e53bb5ef481a7de8056aa54010000006b4830450221009e020b0390ccad533b73b552f8a99a9d827212c558e4f755503674d07c92ad4502202d606f7316990e0461c51d4add25054f19c697aa3e3c2ced4d568f0b2c57e62f0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0170f305000000000017a9147f844bdb0b8fd54b64e3d16c85dc1170f1ff97c18700000000') ''' def test_signtx(self): From 35661161c9aa8fa5c8d2c36dbb3afab77d3ae2d2 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 17 Apr 2014 18:33:26 +0200 Subject: [PATCH 0303/1535] simplify test_255_outputs --- tests/test_msg_signtx.py | 3 ++- tests/test_msg_simplesigntx.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py index 16588c421..aff11a968 100644 --- a/tests/test_msg_signtx.py +++ b/tests/test_msg_signtx.py @@ -247,9 +247,10 @@ class TestMsgSigntx(common.TrezorTest): # proto.TxRequest(request_type=proto_types.TXFINISHED)]) (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, inp2], outputs) - self.assertEqual(binascii.hexlify(serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00' + 'd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac' * 255 + '00000000') ''' + def test_fee_too_high(self): self.setup_mnemonic_nopin_nopassphrase() diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index 7705479a7..a71784c62 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -247,9 +247,10 @@ class TestMsgSimplesigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXFINISHED)]) serialized_tx = self.client.simple_sign_tx('Bitcoin', [inp1, inp2], outputs) - self.assertEqual(binascii.hexlify(serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00d8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088acd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00' + 'd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac' * 255 + '00000000') ''' + def test_fee_too_high(self): self.setup_mnemonic_nopin_nopassphrase() From 72753fa91407aeb89e467900604a9ecb772606fb Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 17 Apr 2014 18:40:50 +0200 Subject: [PATCH 0304/1535] fix typo --- trezorlib/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index b768bba8c..e711c4f05 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -486,7 +486,7 @@ class ProtocolMixin(object): # If there's some part of signed transaction, let's add it if res.HasField('serialized') and res.serialized.HasField('serialized_tx'): - print "RECEIVED PART OF SERIALIED TX (%d BYTES)" % len(res.serialized.serialized_tx) + print "RECEIVED PART OF SERIALIZED TX (%d BYTES)" % len(res.serialized.serialized_tx) serialized_tx += res.serialized.serialized_tx if res.HasField('serialized') and res.serialized.HasField('signature_index'): From de1bef95334ec17f7f1efa6db33a152ea05416d5 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 18 Apr 2014 18:09:39 +0200 Subject: [PATCH 0305/1535] Check if all signatures has been provided correctly --- trezorlib/client.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/trezorlib/client.py b/trezorlib/client.py index e711c4f05..783d4e4a8 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -490,6 +490,8 @@ class ProtocolMixin(object): serialized_tx += res.serialized.serialized_tx if res.HasField('serialized') and res.serialized.HasField('signature_index'): + if signatures[res.serialized.signature_index] != None: + raise Exception("Signature for index %d already filled" % res.serialized.signature_index) signatures[res.serialized.signature_index] = res.serialized.signature if res.request_type == types.TXFINISHED: @@ -529,6 +531,9 @@ class ProtocolMixin(object): finally: self.transport.session_end() + if None in signatures: + raise Exception("Some signatures are missing!") + print "SIGNED IN %.03f SECONDS, CALLED %d MESSAGES, %d BYTES" % \ (time.time() - start, counter, len(serialized_tx)) From 54bc7239ce01cea9e248b49d401c4f83e6b486ef Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 18 Apr 2014 18:56:12 +0200 Subject: [PATCH 0306/1535] Adde debug_processor to sign_tx() for unittest purposes --- trezorlib/client.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 783d4e4a8..807fc4bf5 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -455,7 +455,7 @@ class ProtocolMixin(object): return txes - def sign_tx(self, coin_name, inputs, outputs): + def sign_tx(self, coin_name, inputs, outputs, debug_processor=None): start = time.time() txes = self._prepare_sign_tx(coin_name, inputs, outputs) @@ -525,6 +525,13 @@ class ProtocolMixin(object): msg.bin_outputs.extend([current_tx.bin_outputs[res.details.request_index], ]) else: msg.outputs.extend([current_tx.outputs[res.details.request_index], ]) + + if debug_processor != None: + # If debug_processor function is provided, + # pass thru it the request and prepared response. + # This is useful for unit tests, see test_msg_signtx + msg = debug_processor(res, msg) + res = self.call(proto.TxAck(tx=msg)) continue From 99af68388ddce1630506cca4d4b34327128dfcb2 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 18 Apr 2014 18:57:00 +0200 Subject: [PATCH 0307/1535] Added unittest test_attack_change_outputs Removed obsolete tests, enabled test with 255 outputs --- tests/test_msg_signtx.py | 213 ++++++++++----------------------------- 1 file changed, 54 insertions(+), 159 deletions(-) diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py index aff11a968..60c99d473 100644 --- a/tests/test_msg_signtx.py +++ b/tests/test_msg_signtx.py @@ -11,7 +11,6 @@ from trezorlib.client import CallException from trezorlib.tx_api import TXAPITestnet, TXAPIBitcoin class TestMsgSigntx(common.TrezorTest): - def test_one_one_fee(self): self.setup_mnemonic_nopin_nopassphrase() @@ -209,8 +208,6 @@ class TestMsgSigntx(common.TrezorTest): # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb self.assertEqual(binascii.hexlify(serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') - ''' - def test_255_outputs(self): self.setup_mnemonic_nopin_nopassphrase() @@ -249,8 +246,6 @@ class TestMsgSigntx(common.TrezorTest): self.assertEqual(binascii.hexlify(serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00' + 'd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac' * 255 + '00000000') - ''' - def test_fee_too_high(self): self.setup_mnemonic_nopin_nopassphrase() @@ -329,166 +324,66 @@ class TestMsgSigntx(common.TrezorTest): # Accepted by network: tx 8cc1f4adf7224ce855cf535a5104594a0004cb3b640d6714fdb00b9128832dd5 self.assertEqual(binascii.hexlify(serialized_tx), '0100000001a3fb2d38322c3b327e54005cebc0686d52fcdf536e53bb5ef481a7de8056aa54010000006b4830450221009e020b0390ccad533b73b552f8a99a9d827212c558e4f755503674d07c92ad4502202d606f7316990e0461c51d4add25054f19c697aa3e3c2ced4d568f0b2c57e62f0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0170f305000000000017a9147f844bdb0b8fd54b64e3d16c85dc1170f1ff97c18700000000') -''' - def test_signtx(self): - expected_tx = '01000000012de70f7d6ffed0db70f8882f3fca90db9bb09f0e99bce27468c23d3c994fcd56' \ - '010000008b4830450221009b985e14d53cfeed3496846db6ddaa77a0206138d0df4c2ccd3b' \ - '759e91bae3e1022004c76e10f99ccac8ced761719181a96bae25a74829eab3ecb8f29eb07f' \ - 'e18f7e01410436ae8595f03a7324d1d1482ede8560a4508c767fbc662559482d5759b32209' \ - 'a62964699995f6e018cfbeb7a71a66d4c64fa38875d79ead0a9ac66f59c1c8b3a3ffffffff' \ - '0250c30000000000001976a91444ce5c6789b0bb0e8a9ab9a4769fe181cb274c4688aca086' \ - '0100000000001976a9149e03078026388661b197129a43f0f64f88379ce688ac00000000' - - inp1 = proto.TxInput(index=0, - address_n=[1, 0], - amount=200000, # 0.002 BTC - prev_hash=binascii.unhexlify('56cd4f993c3dc26874e2bc990e9fb09bdb90ca3f2f88f870dbd0fe6f7d0fe72d'), + def test_attack_change_outputs(self): + # This unit test attempts to modify data sent during ping-pong of streaming signing. + # Because device is asking for human confirmation only during first pass (first input), + # device must detect that data has been modified during other passes and fail to sign + # such modified data (which has not been confirmed by the user). + + # Test firstly prepare normal transaction and send it to device. Then it send the same + # transaction again, but change amount of output 1 during signing the second input. + + self.setup_mnemonic_nopin_nopassphrase() + + inp1 = proto_types.TxInputType(address_n=[1], # 1CK7SJdcb8z9HuvVft3D91HLpLC6KSsGb + # amount=100000, + prev_hash=binascii.unhexlify('c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c'), prev_index=1, - #script_sig= - ) - - out1 = proto.TxOutput(index=0, - address='1GnnT11aZeH6QZCtT7EjCvRF3EXHoY3owE', - address_n=[0, 1], - amount=50000, # 0.0005 BTC - script_type=proto.PAYTOADDRESS, - #script_args= - ) - - out2 = proto.TxOutput(index=1, - address='1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv', - #address_n=[], - amount=100000, # 0.001 BTC - script_type=proto.PAYTOADDRESS, - #script_args= - ) + ) + + inp2 = proto_types.TxInputType(address_n=[2], # 15AeAhtNJNKyowK8qPHwgpXkhsokzLtUpG + # amount=110000, + prev_hash=binascii.unhexlify('58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e'), + prev_index=1, + ) - print binascii.hexlify(self.client.sign_tx([inp1], [out1, out2])[1]) - - def test_workflow(self): - inp1 = proto.TxInput(index=0, - address_n=[1,0], - amount=100000000, - prev_hash='prevhash1234354346543456543654', - prev_index=11, - ) - - inp2 = proto.TxInput(index=1, - address_n=[2,0], - amount=100000000, - prev_hash='prevhash2222254346543456543654', - prev_index=11, - ) - - out1 = proto.TxOutput(index=0, - address='1BitkeyP2nDd5oa647AjvBbbwST54W5Zmx', - amount=100000000, - script_type=proto.PAYTOADDRESS, + out1 = proto_types.TxOutputType(address='15Jvu3nZNP7u2ipw2533Q9VVgEu2Lu9F2B', + amount=210000 - 100000 - 10000, + script_type=proto_types.PAYTOADDRESS, ) - out2 = proto.TxOutput(index=1, - address='1BitkeyP2nDd5oa647AjvBbbwST54W5Zmx', - #address_n=[], - amount=100000000, - script_type=proto.PAYTOADDRESS, - #script_args= + out2 = proto_types.TxOutputType(address_n=[3], # 1CmzyJp9w3NafXMSEFH4SLYUPAVCSUrrJ5 + amount=100000, + script_type=proto_types.PAYTOADDRESS, ) - serialized = '' - - # Prepare and send initial message - tx = proto.SignTx() - tx.algo = proto.ELECTRUM - tx.random = self.client._get_local_entropy() - tx.inputs_count = 2 - tx.outputs_count = 2 - - res = self.client.call(tx) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXINPUT) - self.assertEqual(res.request_index, 0) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - # FIRST SIGNATURE - res = self.client.call(inp1) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXINPUT) - self.assertEqual(res.request_index, 1) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - res = self.client.call(inp2) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, 0) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - res = self.client.call(out1) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, 1) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - res = self.client.call(out2) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXINPUT) - self.assertEqual(res.request_index, 0) - self.assertNotEqual(res.signature, '') - self.assertNotEqual(res.serialized_tx, '') - serialized += res.serialized_tx - - # SECOND SIGNATURE - res = self.client.call(inp1) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXINPUT) - self.assertEqual(res.request_index, 1) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - res = self.client.call(inp2) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, 0) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - res = self.client.call(out1) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, 1) - self.assertEqual(res.signature, '') - self.assertEqual(res.serialized_tx, '') - - res = self.client.call(out2) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, 0) - self.assertNotEqual(res.signature, '') - self.assertNotEqual(res.serialized_tx, '') - serialized += res.serialized_tx - - # FINALIZING OUTPUTS - res = self.client.call(out1) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, 1) - self.assertEqual(res.signature, '') - self.assertNotEqual(res.serialized_tx, '') - serialized += res.serialized_tx - - res = self.client.call(out2) - self.assertIsInstance(res, proto.TxRequest) - self.assertEqual(res.request_type, proto.TXOUTPUT) - self.assertEqual(res.request_index, -1) - self.assertEqual(res.signature, '') - self.assertNotEqual(res.serialized_tx, '') - serialized += res.serialized_tx - - print binascii.hexlify(serialized) -''' + global run_attack + run_attack = False + + def attack_processor(req, msg): + global run_attack + + if req.details.tx_hash != '': + return msg + + if req.details.request_index != 1: + return msg + + if not run_attack: + run_attack = True + return msg + + msg.outputs[0].amount = 9999999 # Sign output with another amount + return msg + + # Test if the transaction can be signed normally + (_, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, inp2], [out1, out2]) + + # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb + self.assertEqual(binascii.hexlify(serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') + + # Now run the attack, must trigger the exception + self.assertRaises(CallException, self.client.sign_tx, 'Bitcoin', [inp1, inp2], [out1, out2], attack_processor) if __name__ == '__main__': unittest.main() From 3865d22c56e3e65c3815c499aee81e57f845677b Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 23 Apr 2014 23:44:56 +0200 Subject: [PATCH 0308/1535] add expected responses to test_msg_signtx.test_one_one_fee unit test --- tests/test_msg_signtx.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py index 60c99d473..679adcdcb 100644 --- a/tests/test_msg_signtx.py +++ b/tests/test_msg_signtx.py @@ -29,9 +29,20 @@ class TestMsgSigntx(common.TrezorTest): ) with self.client: - # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) + (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) # Accepted by network: tx fd79435246dee76b2f159d2db08032d666c95adc544de64c8c49f474df4a7fee From 615473409a6024e148d2529a6b10b2f91ede863c Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 24 Apr 2014 15:59:10 +0200 Subject: [PATCH 0309/1535] add expected responses to test_msg_signtx test --- tests/test_msg_signtx.py | 1204 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 1169 insertions(+), 35 deletions(-) diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py index 679adcdcb..25aa2d2eb 100644 --- a/tests/test_msg_signtx.py +++ b/tests/test_msg_signtx.py @@ -71,10 +71,22 @@ class TestMsgSigntx(common.TrezorTest): with self.client: self.client.set_tx_api(TXAPITestnet()) - # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - # # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change - # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) (signatures, serialized_tx) = self.client.sign_tx('Testnet', [inp1, ], [out1, out2]) self.assertEqual(binascii.hexlify(serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b4830450221009c2d30385519fdb13dce13d5ac038be07d7b2dad0b0f7b2c1c339d7255bcf553022056a2f5bceab3cd0ffed4d388387e631f419d67ff9ce7798e3d7dfe6a6d6ec4bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0280ce341d000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') @@ -102,11 +114,23 @@ class TestMsgSigntx(common.TrezorTest): with self.client: self.client.set_tx_api(TXAPITestnet()) - # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - # # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change - # proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), - # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) (signatures, serialized_tx) = self.client.sign_tx('Testnet', [inp1, ], [out1, out2]) self.assertEqual(binascii.hexlify(serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') @@ -134,10 +158,21 @@ class TestMsgSigntx(common.TrezorTest): ) with self.client: - # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - # # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change - # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, out2]) self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100c1400d8485d3bdcae7413e123148f35ece84806fc387ab88c66b469df89aef1702201d481d04216b319dc549ffe2333143629ba18828a4e2d1783ab719a6aa263eb70121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff02e0930400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') @@ -170,11 +205,24 @@ class TestMsgSigntx(common.TrezorTest): ) with self.client: - # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - # # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change - # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=2)), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=2)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, out2, out3]) self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100e695e2c530c7c0fc32e6b79b7cff56a7f70a8c9da787534f46b4204070f914fc02207b0879a81408a11e23b11d4c7965c62b5fc6d5c2d92340f5ee2da7b40e99314a0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0300650400000000001976a914de9b2a8da088824e8fe51debea566617d851537888ace02e0000000000001976a9141fe1d337fb81afca42818051e12fd18245d1b17288ac80380100000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac00000000') @@ -210,10 +258,31 @@ class TestMsgSigntx(common.TrezorTest): ) with self.client: - # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - # # proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), # don't confirm change - # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, inp2], [out1, out2]) # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb @@ -250,9 +319,1045 @@ class TestMsgSigntx(common.TrezorTest): outputs.append(out) with self.client: - # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), ] * 255 + \ - # [proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=2)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=3)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=4)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=5)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=6)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=7)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=8)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=9)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=10)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=11)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=12)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=13)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=14)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=15)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=16)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=17)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=18)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=19)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=20)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=21)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=22)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=23)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=24)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=25)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=26)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=27)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=28)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=29)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=30)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=31)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=32)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=33)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=34)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=35)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=36)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=37)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=38)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=39)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=40)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=41)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=42)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=43)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=44)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=45)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=46)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=47)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=48)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=49)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=50)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=51)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=52)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=53)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=54)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=55)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=56)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=57)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=58)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=59)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=60)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=61)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=62)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=63)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=64)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=65)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=66)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=67)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=68)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=69)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=70)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=71)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=72)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=73)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=74)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=75)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=76)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=77)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=78)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=79)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=80)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=81)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=82)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=83)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=84)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=85)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=86)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=87)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=88)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=89)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=90)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=91)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=92)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=93)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=94)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=95)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=96)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=97)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=98)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=99)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=100)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=101)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=102)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=103)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=104)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=105)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=106)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=107)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=108)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=109)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=110)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=111)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=112)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=113)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=114)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=115)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=116)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=117)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=118)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=119)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=120)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=121)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=122)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=123)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=124)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=125)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=126)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=127)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=128)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=129)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=130)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=131)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=132)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=133)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=134)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=135)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=136)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=137)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=138)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=139)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=140)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=141)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=142)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=143)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=144)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=145)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=146)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=147)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=148)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=149)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=150)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=151)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=152)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=153)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=154)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=155)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=156)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=157)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=158)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=159)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=160)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=161)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=162)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=163)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=164)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=165)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=166)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=167)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=168)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=169)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=170)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=171)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=172)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=173)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=174)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=175)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=176)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=177)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=178)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=179)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=180)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=181)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=182)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=183)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=184)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=185)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=186)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=187)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=188)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=189)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=190)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=191)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=192)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=193)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=194)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=195)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=196)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=197)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=198)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=199)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=200)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=201)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=202)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=203)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=204)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=205)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=206)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=207)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=208)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=209)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=210)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=211)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=212)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=213)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=214)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=215)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=216)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=217)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=218)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=219)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=220)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=221)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=222)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=223)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=224)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=225)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=226)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=227)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=228)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=229)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=230)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=231)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=232)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=233)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=234)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=235)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=236)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=237)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=238)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=239)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=240)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=241)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=242)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=243)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=244)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=245)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=246)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=247)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=248)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=249)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=250)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=251)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=252)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=253)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=254)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=2)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=3)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=4)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=5)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=6)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=7)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=8)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=9)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=10)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=11)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=12)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=13)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=14)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=15)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=16)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=17)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=18)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=19)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=20)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=21)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=22)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=23)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=24)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=25)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=26)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=27)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=28)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=29)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=30)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=31)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=32)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=33)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=34)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=35)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=36)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=37)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=38)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=39)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=40)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=41)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=42)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=43)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=44)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=45)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=46)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=47)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=48)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=49)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=50)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=51)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=52)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=53)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=54)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=55)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=56)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=57)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=58)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=59)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=60)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=61)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=62)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=63)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=64)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=65)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=66)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=67)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=68)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=69)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=70)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=71)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=72)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=73)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=74)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=75)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=76)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=77)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=78)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=79)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=80)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=81)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=82)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=83)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=84)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=85)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=86)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=87)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=88)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=89)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=90)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=91)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=92)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=93)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=94)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=95)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=96)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=97)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=98)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=99)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=100)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=101)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=102)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=103)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=104)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=105)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=106)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=107)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=108)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=109)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=110)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=111)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=112)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=113)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=114)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=115)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=116)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=117)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=118)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=119)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=120)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=121)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=122)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=123)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=124)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=125)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=126)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=127)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=128)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=129)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=130)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=131)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=132)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=133)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=134)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=135)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=136)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=137)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=138)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=139)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=140)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=141)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=142)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=143)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=144)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=145)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=146)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=147)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=148)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=149)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=150)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=151)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=152)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=153)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=154)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=155)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=156)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=157)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=158)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=159)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=160)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=161)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=162)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=163)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=164)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=165)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=166)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=167)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=168)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=169)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=170)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=171)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=172)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=173)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=174)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=175)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=176)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=177)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=178)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=179)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=180)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=181)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=182)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=183)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=184)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=185)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=186)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=187)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=188)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=189)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=190)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=191)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=192)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=193)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=194)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=195)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=196)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=197)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=198)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=199)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=200)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=201)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=202)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=203)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=204)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=205)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=206)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=207)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=208)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=209)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=210)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=211)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=212)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=213)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=214)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=215)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=216)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=217)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=218)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=219)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=220)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=221)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=222)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=223)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=224)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=225)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=226)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=227)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=228)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=229)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=230)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=231)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=232)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=233)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=234)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=235)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=236)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=237)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=238)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=239)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=240)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=241)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=242)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=243)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=244)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=245)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=246)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=247)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=248)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=249)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=250)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=251)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=252)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=253)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=254)), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=2)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=3)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=4)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=5)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=6)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=7)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=8)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=9)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=10)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=11)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=12)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=13)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=14)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=15)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=16)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=17)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=18)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=19)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=20)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=21)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=22)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=23)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=24)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=25)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=26)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=27)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=28)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=29)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=30)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=31)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=32)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=33)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=34)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=35)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=36)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=37)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=38)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=39)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=40)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=41)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=42)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=43)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=44)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=45)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=46)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=47)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=48)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=49)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=50)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=51)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=52)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=53)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=54)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=55)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=56)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=57)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=58)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=59)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=60)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=61)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=62)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=63)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=64)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=65)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=66)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=67)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=68)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=69)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=70)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=71)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=72)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=73)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=74)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=75)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=76)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=77)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=78)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=79)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=80)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=81)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=82)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=83)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=84)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=85)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=86)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=87)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=88)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=89)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=90)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=91)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=92)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=93)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=94)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=95)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=96)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=97)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=98)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=99)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=100)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=101)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=102)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=103)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=104)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=105)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=106)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=107)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=108)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=109)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=110)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=111)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=112)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=113)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=114)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=115)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=116)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=117)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=118)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=119)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=120)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=121)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=122)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=123)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=124)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=125)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=126)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=127)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=128)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=129)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=130)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=131)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=132)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=133)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=134)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=135)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=136)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=137)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=138)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=139)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=140)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=141)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=142)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=143)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=144)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=145)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=146)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=147)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=148)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=149)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=150)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=151)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=152)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=153)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=154)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=155)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=156)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=157)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=158)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=159)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=160)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=161)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=162)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=163)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=164)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=165)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=166)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=167)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=168)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=169)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=170)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=171)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=172)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=173)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=174)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=175)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=176)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=177)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=178)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=179)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=180)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=181)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=182)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=183)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=184)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=185)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=186)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=187)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=188)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=189)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=190)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=191)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=192)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=193)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=194)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=195)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=196)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=197)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=198)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=199)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=200)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=201)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=202)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=203)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=204)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=205)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=206)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=207)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=208)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=209)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=210)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=211)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=212)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=213)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=214)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=215)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=216)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=217)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=218)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=219)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=220)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=221)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=222)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=223)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=224)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=225)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=226)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=227)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=228)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=229)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=230)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=231)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=232)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=233)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=234)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=235)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=236)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=237)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=238)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=239)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=240)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=241)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=242)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=243)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=244)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=245)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=246)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=247)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=248)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=249)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=250)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=251)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=252)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=253)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=254)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, inp2], outputs) self.assertEqual(binascii.hexlify(serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00' + 'd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac' * 255 + '00000000') @@ -275,10 +1380,20 @@ class TestMsgSigntx(common.TrezorTest): ) with self.client: - # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - # proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), - # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') @@ -301,11 +1416,20 @@ class TestMsgSigntx(common.TrezorTest): ) with self.client: - # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - # proto.Failure(code=proto_types.Failure_NotEnoughFunds)]) + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.Failure(code=proto_types.Failure_NotEnoughFunds) + ]) try: - self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) except CallException as e: self.assertEqual(e.args[0], proto_types.Failure_NotEnoughFunds) else: @@ -327,9 +1451,19 @@ class TestMsgSigntx(common.TrezorTest): with self.client: self.client.set_tx_api(TXAPIBitcoin()) - # self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - # proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - # proto.TxRequest(request_type=proto_types.TXFINISHED)]) + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("54aa5680dea781f45ebb536e53dffc526d68c0eb5c00547e323b2c32382dfba3"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("54aa5680dea781f45ebb536e53dffc526d68c0eb5c00547e323b2c32382dfba3"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("54aa5680dea781f45ebb536e53dffc526d68c0eb5c00547e323b2c32382dfba3"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("54aa5680dea781f45ebb536e53dffc526d68c0eb5c00547e323b2c32382dfba3"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) # Accepted by network: tx 8cc1f4adf7224ce855cf535a5104594a0004cb3b640d6714fdb00b9128832dd5 From deec6fc2fcf025e7374868792bf9534aa557445a Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 24 Apr 2014 16:23:06 +0200 Subject: [PATCH 0310/1535] simplify test for test_255_outputs using list comprehensions --- tests/test_msg_signtx.py | 1033 +------------------------------------- 1 file changed, 13 insertions(+), 1020 deletions(-) diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py index 25aa2d2eb..e2b9438cc 100644 --- a/tests/test_msg_signtx.py +++ b/tests/test_msg_signtx.py @@ -4,6 +4,7 @@ import unittest import common import binascii +import itertools import trezorlib.messages_pb2 as proto import trezorlib.types_pb2 as proto_types @@ -328,516 +329,12 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=2)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=3)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=4)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=5)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=6)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=7)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=8)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=9)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=10)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=11)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=12)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=13)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=14)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=15)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=16)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=17)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=18)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=19)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=20)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=21)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=22)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=23)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=24)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=25)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=26)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=27)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=28)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=29)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=30)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=31)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=32)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=33)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=34)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=35)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=36)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=37)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=38)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=39)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=40)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=41)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=42)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=43)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=44)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=45)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=46)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=47)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=48)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=49)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=50)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=51)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=52)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=53)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=54)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=55)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=56)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=57)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=58)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=59)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=60)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=61)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=62)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=63)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=64)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=65)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=66)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=67)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=68)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=69)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=70)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=71)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=72)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=73)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=74)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=75)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=76)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=77)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=78)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=79)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=80)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=81)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=82)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=83)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=84)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=85)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=86)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=87)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=88)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=89)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=90)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=91)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=92)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=93)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=94)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=95)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=96)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=97)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=98)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=99)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=100)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=101)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=102)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=103)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=104)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=105)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=106)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=107)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=108)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=109)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=110)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=111)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=112)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=113)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=114)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=115)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=116)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=117)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=118)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=119)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=120)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=121)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=122)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=123)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=124)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=125)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=126)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=127)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=128)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=129)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=130)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=131)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=132)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=133)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=134)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=135)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=136)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=137)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=138)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=139)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=140)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=141)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=142)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=143)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=144)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=145)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=146)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=147)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=148)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=149)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=150)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=151)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=152)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=153)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=154)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=155)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=156)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=157)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=158)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=159)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=160)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=161)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=162)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=163)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=164)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=165)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=166)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=167)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=168)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=169)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=170)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=171)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=172)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=173)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=174)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=175)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=176)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=177)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=178)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=179)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=180)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=181)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=182)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=183)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=184)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=185)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=186)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=187)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=188)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=189)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=190)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=191)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=192)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=193)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=194)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=195)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=196)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=197)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=198)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=199)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=200)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=201)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=202)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=203)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=204)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=205)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=206)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=207)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=208)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=209)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=210)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=211)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=212)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=213)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=214)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=215)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=216)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=217)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=218)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=219)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=220)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=221)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=222)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=223)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=224)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=225)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=226)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=227)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=228)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=229)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=230)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=231)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=232)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=233)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=234)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=235)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=236)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=237)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=238)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=239)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=240)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=241)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=242)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=243)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=244)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=245)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=246)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=247)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=248)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=249)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=250)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=251)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=252)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=253)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=254)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + ] + [ + item for items in itertools.izip( + [proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=I)) for I in range(255)], + [proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput)] * 255 + ) for item in items + ] + [ proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), @@ -845,517 +342,13 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=2)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=3)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=4)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=5)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=6)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=7)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=8)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=9)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=10)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=11)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=12)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=13)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=14)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=15)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=16)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=17)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=18)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=19)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=20)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=21)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=22)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=23)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=24)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=25)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=26)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=27)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=28)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=29)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=30)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=31)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=32)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=33)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=34)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=35)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=36)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=37)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=38)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=39)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=40)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=41)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=42)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=43)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=44)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=45)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=46)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=47)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=48)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=49)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=50)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=51)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=52)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=53)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=54)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=55)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=56)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=57)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=58)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=59)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=60)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=61)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=62)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=63)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=64)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=65)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=66)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=67)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=68)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=69)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=70)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=71)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=72)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=73)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=74)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=75)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=76)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=77)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=78)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=79)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=80)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=81)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=82)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=83)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=84)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=85)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=86)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=87)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=88)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=89)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=90)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=91)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=92)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=93)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=94)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=95)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=96)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=97)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=98)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=99)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=100)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=101)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=102)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=103)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=104)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=105)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=106)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=107)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=108)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=109)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=110)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=111)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=112)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=113)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=114)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=115)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=116)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=117)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=118)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=119)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=120)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=121)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=122)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=123)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=124)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=125)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=126)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=127)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=128)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=129)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=130)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=131)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=132)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=133)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=134)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=135)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=136)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=137)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=138)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=139)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=140)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=141)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=142)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=143)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=144)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=145)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=146)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=147)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=148)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=149)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=150)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=151)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=152)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=153)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=154)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=155)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=156)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=157)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=158)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=159)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=160)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=161)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=162)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=163)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=164)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=165)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=166)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=167)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=168)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=169)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=170)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=171)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=172)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=173)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=174)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=175)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=176)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=177)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=178)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=179)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=180)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=181)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=182)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=183)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=184)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=185)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=186)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=187)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=188)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=189)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=190)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=191)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=192)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=193)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=194)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=195)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=196)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=197)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=198)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=199)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=200)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=201)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=202)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=203)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=204)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=205)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=206)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=207)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=208)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=209)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=210)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=211)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=212)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=213)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=214)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=215)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=216)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=217)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=218)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=219)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=220)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=221)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=222)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=223)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=224)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=225)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=226)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=227)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=228)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=229)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=230)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=231)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=232)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=233)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=234)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=235)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=236)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=237)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=238)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=239)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=240)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=241)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=242)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=243)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=244)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=245)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=246)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=247)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=248)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=249)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=250)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=251)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=252)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=253)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=254)), + ] + [ + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=I)) for I in range(255) + ] + [ proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=2)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=3)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=4)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=5)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=6)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=7)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=8)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=9)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=10)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=11)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=12)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=13)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=14)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=15)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=16)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=17)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=18)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=19)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=20)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=21)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=22)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=23)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=24)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=25)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=26)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=27)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=28)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=29)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=30)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=31)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=32)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=33)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=34)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=35)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=36)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=37)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=38)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=39)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=40)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=41)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=42)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=43)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=44)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=45)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=46)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=47)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=48)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=49)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=50)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=51)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=52)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=53)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=54)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=55)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=56)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=57)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=58)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=59)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=60)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=61)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=62)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=63)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=64)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=65)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=66)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=67)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=68)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=69)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=70)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=71)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=72)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=73)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=74)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=75)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=76)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=77)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=78)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=79)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=80)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=81)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=82)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=83)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=84)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=85)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=86)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=87)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=88)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=89)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=90)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=91)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=92)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=93)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=94)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=95)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=96)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=97)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=98)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=99)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=100)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=101)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=102)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=103)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=104)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=105)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=106)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=107)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=108)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=109)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=110)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=111)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=112)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=113)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=114)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=115)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=116)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=117)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=118)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=119)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=120)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=121)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=122)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=123)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=124)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=125)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=126)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=127)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=128)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=129)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=130)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=131)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=132)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=133)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=134)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=135)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=136)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=137)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=138)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=139)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=140)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=141)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=142)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=143)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=144)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=145)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=146)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=147)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=148)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=149)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=150)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=151)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=152)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=153)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=154)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=155)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=156)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=157)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=158)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=159)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=160)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=161)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=162)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=163)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=164)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=165)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=166)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=167)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=168)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=169)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=170)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=171)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=172)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=173)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=174)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=175)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=176)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=177)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=178)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=179)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=180)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=181)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=182)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=183)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=184)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=185)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=186)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=187)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=188)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=189)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=190)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=191)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=192)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=193)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=194)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=195)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=196)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=197)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=198)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=199)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=200)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=201)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=202)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=203)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=204)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=205)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=206)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=207)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=208)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=209)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=210)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=211)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=212)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=213)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=214)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=215)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=216)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=217)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=218)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=219)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=220)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=221)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=222)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=223)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=224)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=225)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=226)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=227)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=228)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=229)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=230)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=231)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=232)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=233)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=234)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=235)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=236)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=237)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=238)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=239)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=240)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=241)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=242)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=243)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=244)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=245)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=246)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=247)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=248)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=249)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=250)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=251)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=252)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=253)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=254)), + ] + [ + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=I)) for I in range(255) + ] + [ proto.TxRequest(request_type=proto_types.TXFINISHED), ]) (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, inp2], outputs) From cff0b5fbf7e9bc0be3a7d2f2a1751e3388d4cf1a Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 27 Apr 2014 23:06:06 +0200 Subject: [PATCH 0311/1535] add test_signtx to test_protection_levels --- tests/test_protection_levels.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/test_protection_levels.py b/tests/test_protection_levels.py index 14242de47..26a76410e 100644 --- a/tests/test_protection_levels.py +++ b/tests/test_protection_levels.py @@ -153,6 +153,38 @@ class TestProtectionLevels(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXFINISHED)]) self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + def test_signtx(self): + self.setup_mnemonic_pin_passphrase() + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=390000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + with self.client: + + self.client.set_expected_responses([ + proto.PinMatrixRequest(), + proto.PassphraseRequest(), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) + self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) + # def test_firmware_erase(self): # pass From b7f5849ecca928e30438091bae5bd4fd90d5ba34 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 28 Apr 2014 14:39:05 +0200 Subject: [PATCH 0312/1535] fix ButtonRequestType in Ping and GetEntropy --- tests/test_msg_getentropy.py | 2 +- tests/test_msg_ping.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_msg_getentropy.py b/tests/test_msg_getentropy.py index 5eae42d45..8cf7a6585 100644 --- a/tests/test_msg_getentropy.py +++ b/tests/test_msg_getentropy.py @@ -23,7 +23,7 @@ class TestMsgGetentropy(common.TrezorTest): def test_entropy(self): for l in [0, 1, 2, 3, 4, 5, 8, 9, 16, 17, 32, 33, 64, 65, 128, 129, 256, 257, 512, 513, 1024]: with self.client: - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other), proto.Entropy()]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ProtectCall), proto.Entropy()]) ent = self.client.get_entropy(l) self.assertTrue(len(ent) >= l) print 'entropy = ', entropy(ent) diff --git a/tests/test_msg_ping.py b/tests/test_msg_ping.py index 8fc5326ad..f5df25d6c 100644 --- a/tests/test_msg_ping.py +++ b/tests/test_msg_ping.py @@ -16,7 +16,7 @@ class TestPing(common.TrezorTest): self.assertEqual(res, 'random data') with self.client: - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other), proto.Success()]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ProtectCall), proto.Success()]) res = self.client.ping('random data', button_protection=True) self.assertEqual(res, 'random data') @@ -34,13 +34,13 @@ class TestPing(common.TrezorTest): self.setup_mnemonic_pin_passphrase() with self.client: - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other), proto.PinMatrixRequest(), proto.PassphraseRequest(), proto.Success()]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ProtectCall), proto.PinMatrixRequest(), proto.PassphraseRequest(), proto.Success()]) res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) self.assertEqual(res, 'random data') with self.client: # pin and passphrase are cached - self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_Other), proto.Success()]) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ProtectCall), proto.Success()]) res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) self.assertEqual(res, 'random data') From 258e6e7fb2b4ad7589ee55b538ef5aefec6f4eed Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 26 May 2014 00:59:42 +0200 Subject: [PATCH 0313/1535] rebuild pb --- trezorlib/messages_pb2.py | 183 ++++++++++++++++++++------------------ 1 file changed, 95 insertions(+), 88 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index b1bb9c8c7..ddbb7a7e1 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xbd\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x8b\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x8b\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -202,8 +202,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2836, - serialized_end=4383, + serialized_start=2854, + serialized_end=4401, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -380,6 +380,13 @@ _FEATURES = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='imported', full_name='Features.imported', index=14, + number=15, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -390,7 +397,7 @@ _FEATURES = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=46, - serialized_end=363, + serialized_end=381, ) @@ -424,8 +431,8 @@ _APPLYSETTINGS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=365, - serialized_end=413, + serialized_start=383, + serialized_end=431, ) @@ -452,8 +459,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=415, - serialized_end=442, + serialized_start=433, + serialized_end=460, ) @@ -501,8 +508,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=444, - serialized_end=549, + serialized_start=462, + serialized_end=567, ) @@ -529,8 +536,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=551, - serialized_end=577, + serialized_start=569, + serialized_end=595, ) @@ -564,8 +571,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=579, - serialized_end=633, + serialized_start=597, + serialized_end=651, ) @@ -599,8 +606,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=635, - serialized_end=698, + serialized_start=653, + serialized_end=716, ) @@ -620,8 +627,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=700, - serialized_end=711, + serialized_start=718, + serialized_end=729, ) @@ -648,8 +655,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=713, - serialized_end=768, + serialized_start=731, + serialized_end=786, ) @@ -676,8 +683,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=770, - serialized_end=797, + serialized_start=788, + serialized_end=815, ) @@ -697,8 +704,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=799, - serialized_end=807, + serialized_start=817, + serialized_end=825, ) @@ -718,8 +725,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=809, - serialized_end=828, + serialized_start=827, + serialized_end=846, ) @@ -746,8 +753,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=830, - serialized_end=865, + serialized_start=848, + serialized_end=883, ) @@ -774,8 +781,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=867, - serialized_end=893, + serialized_start=885, + serialized_end=911, ) @@ -802,8 +809,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=895, - serialized_end=921, + serialized_start=913, + serialized_end=939, ) @@ -830,8 +837,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=923, - serialized_end=956, + serialized_start=941, + serialized_end=974, ) @@ -858,8 +865,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=958, - serialized_end=996, + serialized_start=976, + serialized_end=1014, ) @@ -893,8 +900,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=998, - serialized_end=1057, + serialized_start=1016, + serialized_end=1075, ) @@ -921,8 +928,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1059, - serialized_end=1085, + serialized_start=1077, + serialized_end=1103, ) @@ -942,8 +949,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1087, - serialized_end=1099, + serialized_start=1105, + serialized_end=1117, ) @@ -1012,8 +1019,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1102, - serialized_end=1268, + serialized_start=1120, + serialized_end=1286, ) @@ -1075,8 +1082,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1271, - serialized_end=1428, + serialized_start=1289, + serialized_end=1446, ) @@ -1096,8 +1103,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1430, - serialized_end=1446, + serialized_start=1448, + serialized_end=1464, ) @@ -1124,8 +1131,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1448, - serialized_end=1477, + serialized_start=1466, + serialized_end=1495, ) @@ -1187,8 +1194,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1480, - serialized_end=1639, + serialized_start=1498, + serialized_end=1657, ) @@ -1208,8 +1215,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1641, - serialized_end=1654, + serialized_start=1659, + serialized_end=1672, ) @@ -1236,8 +1243,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1656, - serialized_end=1679, + serialized_start=1674, + serialized_end=1697, ) @@ -1278,8 +1285,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1681, - serialized_end=1758, + serialized_start=1699, + serialized_end=1776, ) @@ -1320,8 +1327,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1760, - serialized_end=1828, + serialized_start=1778, + serialized_end=1846, ) @@ -1355,8 +1362,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1830, - serialized_end=1884, + serialized_start=1848, + serialized_end=1902, ) @@ -1397,8 +1404,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1886, - serialized_end=1975, + serialized_start=1904, + serialized_end=1993, ) @@ -1425,8 +1432,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1977, - serialized_end=2002, + serialized_start=1995, + serialized_end=2020, ) @@ -1467,8 +1474,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2004, - serialized_end=2085, + serialized_start=2022, + serialized_end=2103, ) @@ -1516,8 +1523,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2088, - serialized_end=2232, + serialized_start=2106, + serialized_end=2250, ) @@ -1558,8 +1565,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2235, - serialized_end=2368, + serialized_start=2253, + serialized_end=2386, ) @@ -1586,8 +1593,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2370, - serialized_end=2407, + serialized_start=2388, + serialized_end=2425, ) @@ -1607,8 +1614,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2409, - serialized_end=2424, + serialized_start=2427, + serialized_end=2442, ) @@ -1635,8 +1642,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2426, - serialized_end=2459, + serialized_start=2444, + serialized_end=2477, ) @@ -1663,8 +1670,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2461, - serialized_end=2496, + serialized_start=2479, + serialized_end=2514, ) @@ -1684,8 +1691,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2498, - serialized_end=2517, + serialized_start=2516, + serialized_end=2535, ) @@ -1775,8 +1782,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2520, - serialized_end=2755, + serialized_start=2538, + serialized_end=2773, ) @@ -1796,8 +1803,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2757, - serialized_end=2772, + serialized_start=2775, + serialized_end=2790, ) @@ -1838,8 +1845,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2774, - serialized_end=2833, + serialized_start=2792, + serialized_end=2851, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From 78a3fcb38497a5294c67a845ad1cba87b3903702 Mon Sep 17 00:00:00 2001 From: slush0 Date: Tue, 27 May 2014 14:50:13 +0200 Subject: [PATCH 0314/1535] cmd.py renamed to cmdtr.py, it was interfering with system module 'cmd' --- cmd.py => cmdtr.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename cmd.py => cmdtr.py (100%) diff --git a/cmd.py b/cmdtr.py similarity index 100% rename from cmd.py rename to cmdtr.py From 4e963cfd3c79ceca333c3055eff06191ce1fbdf8 Mon Sep 17 00:00:00 2001 From: slush0 Date: Wed, 28 May 2014 14:38:44 +0200 Subject: [PATCH 0315/1535] Fixed handling of coinbase tx --- trezorlib/tx_api.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index c34d60f35..12df49fe5 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -1,6 +1,7 @@ import binascii import urllib2 import json +from decimal import Decimal try: from filecache import filecache, MONTH except: @@ -60,16 +61,23 @@ def bitcore_tx(url): for vin in data['vin']: i = t.inputs.add() - i.prev_hash = binascii.unhexlify(vin['txid']) - i.prev_index = vin['vout'] - asm = vin['scriptSig']['asm'].split(' ') - asm = [ opcode_serialize(x) for x in asm ] - i.script_sig = ''.join(asm) - i.sequence = vin['sequence'] + if 'coinbase' in vin.keys(): + i.prev_hash = "\0"*32 + i.prev_index = 0xffffffff # signed int -1 + i.script_sig = binascii.unhexlify(vin['coinbase']) + i.sequence = vin['sequence'] + + else: + i.prev_hash = binascii.unhexlify(vin['txid']) + i.prev_index = vin['vout'] + asm = vin['scriptSig']['asm'].split(' ') + asm = [ opcode_serialize(x) for x in asm ] + i.script_sig = ''.join(asm) + i.sequence = vin['sequence'] for vout in data['vout']: o = t.bin_outputs.add() - o.amount = int(vout['value'] * 100000000) + o.amount = int(Decimal(vout['value']) * 100000000) asm = vout['scriptPubKey']['asm'].split(' ') asm = [ opcode_serialize(x) for x in asm ] o.script_pubkey = ''.join(asm) From 3077b752d4631de69d03c6fdd66c4185803375b6 Mon Sep 17 00:00:00 2001 From: slush0 Date: Wed, 28 May 2014 14:39:09 +0200 Subject: [PATCH 0316/1535] test_spend_coinbase --- tests/test_msg_signtx.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py index e2b9438cc..a5caee9b4 100644 --- a/tests/test_msg_signtx.py +++ b/tests/test_msg_signtx.py @@ -523,5 +523,43 @@ class TestMsgSigntx(common.TrezorTest): # Now run the attack, must trigger the exception self.assertRaises(CallException, self.client.sign_tx, 'Bitcoin', [inp1, inp2], [out1, out2], attack_processor) + def test_spend_coinbase(self): + # 25 TEST generated to m/1 (mfiGQVPcRcaEvQPYDErR34DcCovtxYvUUV) + # tx: d6da21677d7cca5f42fbc7631d062c9ae918a0254f7c6c22de8e8cb7fd5b8236 + # input 0: 25.0027823 BTC + + self.setup_mnemonic_nopin_nopassphrase() + + + inp1 = proto_types.TxInputType(address_n=[1], # mfiGQVPcRcaEvQPYDErR34DcCovtxYvUUV + # amount=390000, + prev_hash=binascii.unhexlify('d6da21677d7cca5f42fbc7631d062c9ae918a0254f7c6c22de8e8cb7fd5b8236'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='mm6FM31rM5Vc3sw5D7kztiBg3jHUzyqF1g', + amount=2500278230 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + with self.client: + self.client.set_tx_api(TXAPITestnet()) + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("d6da21677d7cca5f42fbc7631d062c9ae918a0254f7c6c22de8e8cb7fd5b8236"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d6da21677d7cca5f42fbc7631d062c9ae918a0254f7c6c22de8e8cb7fd5b8236"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d6da21677d7cca5f42fbc7631d062c9ae918a0254f7c6c22de8e8cb7fd5b8236"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) + (signatures, serialized_tx) = self.client.sign_tx('Testnet', [inp1, ], [out1, ]) + + # Accepted by network: tx + self.assertEqual(binascii.hexlify(serialized_tx), '010000000136825bfdb78c8ede226c7c4f25a018e99a2c061d63c7fb425fca7c7d6721dad6000000006a473044022047845c366eb24f40be315c7815a154513c444c7989eb80f7ce7ff6aeb703d26a022007c1f5efadf67c5889634fd7ac39a7ce78bffac291673e8772ecd8389c901d9f01210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff01c6100795000000001976a9143d2496e67f5f57a924353da42d4725b318e7a8ea88ac00000000') + if __name__ == '__main__': unittest.main() From 83c93ba3a00138084acae58c70209615ef8ce56f Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 28 May 2014 14:54:06 +0200 Subject: [PATCH 0317/1535] copy test_spend_coinbase to simplesigntx suite as well --- tests/test_msg_signtx.py | 1 - tests/test_msg_simplesigntx.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py index a5caee9b4..cebf30337 100644 --- a/tests/test_msg_signtx.py +++ b/tests/test_msg_signtx.py @@ -530,7 +530,6 @@ class TestMsgSigntx(common.TrezorTest): self.setup_mnemonic_nopin_nopassphrase() - inp1 = proto_types.TxInputType(address_n=[1], # mfiGQVPcRcaEvQPYDErR34DcCovtxYvUUV # amount=390000, prev_hash=binascii.unhexlify('d6da21677d7cca5f42fbc7631d062c9ae918a0254f7c6c22de8e8cb7fd5b8236'), diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index a71784c62..c94a357dd 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -329,5 +329,33 @@ class TestMsgSimplesigntx(common.TrezorTest): # Accepted by network: tx 8cc1f4adf7224ce855cf535a5104594a0004cb3b640d6714fdb00b9128832dd5 self.assertEqual(binascii.hexlify(serialized_tx), '0100000001a3fb2d38322c3b327e54005cebc0686d52fcdf536e53bb5ef481a7de8056aa54010000006b4830450221009e020b0390ccad533b73b552f8a99a9d827212c558e4f755503674d07c92ad4502202d606f7316990e0461c51d4add25054f19c697aa3e3c2ced4d568f0b2c57e62f0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0170f305000000000017a9147f844bdb0b8fd54b64e3d16c85dc1170f1ff97c18700000000') + def test_spend_coinbase(self): + # 25 TEST generated to m/1 (mfiGQVPcRcaEvQPYDErR34DcCovtxYvUUV) + # tx: d6da21677d7cca5f42fbc7631d062c9ae918a0254f7c6c22de8e8cb7fd5b8236 + # input 0: 25.0027823 BTC + + self.setup_mnemonic_nopin_nopassphrase() + + inp1 = proto_types.TxInputType(address_n=[1], # mfiGQVPcRcaEvQPYDErR34DcCovtxYvUUV + # amount=390000, + prev_hash=binascii.unhexlify('d6da21677d7cca5f42fbc7631d062c9ae918a0254f7c6c22de8e8cb7fd5b8236'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='mm6FM31rM5Vc3sw5D7kztiBg3jHUzyqF1g', + amount=2500278230 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + with self.client: + self.client.set_tx_api(TXAPITestnet()) + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXFINISHED)]) + serialized_tx = self.client.simple_sign_tx('Testnet', [inp1, ], [out1, ]) + + # Accepted by network: tx + self.assertEqual(binascii.hexlify(serialized_tx), '010000000136825bfdb78c8ede226c7c4f25a018e99a2c061d63c7fb425fca7c7d6721dad6000000006a473044022047845c366eb24f40be315c7815a154513c444c7989eb80f7ce7ff6aeb703d26a022007c1f5efadf67c5889634fd7ac39a7ce78bffac291673e8772ecd8389c901d9f01210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff01c6100795000000001976a9143d2496e67f5f57a924353da42d4725b318e7a8ea88ac00000000') + if __name__ == '__main__': unittest.main() From c921bd802a8250ccbab5a1caa0dd0fc3a31c6efc Mon Sep 17 00:00:00 2001 From: slush0 Date: Wed, 28 May 2014 15:52:40 +0200 Subject: [PATCH 0318/1535] Fixed sign_message --- cmdtr.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmdtr.py b/cmdtr.py index e9eb1726a..50f5dd52c 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -135,7 +135,8 @@ class Commands(object): args.pin_protection, args.label, 'english') def sign_message(self, args): - ret = self.client.sign_message(args.coin, args.n, args.message) + address_n = self.client.expand_path(args.n) + ret = self.client.sign_message(args.coin, address_n, args.message) output = { 'message': args.message, 'address': ret.address, @@ -230,7 +231,7 @@ class Commands(object): sign_message.arguments = ( (('-c', '--coin'), {'type': str, 'default': 'Bitcoin'}), - (('n',), {'metavar': 'N', 'type': int, 'nargs': '+'}), + (('-n', '-address'), {'type': str}), (('message',), {'type': str}), ) From c06a45c1a88a6731bfcaf1258a1b93b70121c0f3 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 2 Jun 2014 17:53:20 +0200 Subject: [PATCH 0319/1535] disable utf tests for sign/verify message for now --- tests/test_msg_signmessage.py | 14 ++++++++------ tests/test_msg_verifymessage.py | 32 +++++++++++++++++--------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/tests/test_msg_signmessage.py b/tests/test_msg_signmessage.py index 78cdb6d9b..24c83c621 100644 --- a/tests/test_msg_signmessage.py +++ b/tests/test_msg_signmessage.py @@ -19,6 +19,13 @@ class TestMsgSignmessage(common.TrezorTest): self.assertEqual(sig.address, 'mirio8q3gtv7fhdnmb3TpZ4EuafdzSs7zL') self.assertEqual(binascii.hexlify(sig.signature), '209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80') + def test_too_long(self): + self.setup_mnemonic_nopin_nopassphrase() + + # Message cannot be longer than 255 bytes + self.assertRaises(CallException, self.client.sign_message, 'Bitcoin', [0], '1' * 256) + + """ def test_sign_utf(self): self.setup_mnemonic_nopin_nopassphrase() @@ -32,12 +39,7 @@ class TestMsgSignmessage(common.TrezorTest): sig_nfc = self.client.sign_message('Bitcoin', [0], words_nfc) self.assertEqual(sig_nfc.address, '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e') self.assertEqual(binascii.hexlify(sig_nfc.signature), '1fd0ec02ed8da8df23e7fe9e680e7867cc290312fe1c970749d8306ddad1a1eda4e39588e4ec2b6a22dda4ec4f562f06e91129eea9a844a7193812de82d47c496b') - - def test_too_long(self): - self.setup_mnemonic_nopin_nopassphrase() - - # Message cannot be longer than 255 bytes - self.assertRaises(CallException, self.client.sign_message, 'Bitcoin', [0], '1' * 256) + """ if __name__ == '__main__': unittest.main() diff --git a/tests/test_msg_verifymessage.py b/tests/test_msg_verifymessage.py index b13952d13..02e1f1774 100644 --- a/tests/test_msg_verifymessage.py +++ b/tests/test_msg_verifymessage.py @@ -5,11 +5,10 @@ import base64 from trezorlib.client import CallException -''' class TestMsgVerifymessage(common.TrezorTest): + def test_too_long(self): self.setup_mnemonic_nopin_nopassphrase() - ret = self.client.verify_message('1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), '1' * 256 @@ -17,12 +16,14 @@ class TestMsgVerifymessage(common.TrezorTest): self.assertFalse(ret) def test_message_testnet(self): + self.setup_mnemonic_nopin_nopassphrase() sig = base64.b64decode('IFP/nvQalDo9lWCI7kScOzRkz/fiiScdkw7tFAKPoGbl6S8AY3wEws43s2gR57AfwZP8/8y7+F+wvGK9phQghN4=') ret = self.client.verify_message('moRDikgmxcpouFtqnKnVVzLYgkDD2gQ3sk', sig, 'Ahoj') - self.assertTrue(ret) def test_message_verify(self): + self.setup_mnemonic_nopin_nopassphrase() + # uncompressed pubkey - OK res = self.client.verify_message( '1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', @@ -70,6 +71,18 @@ class TestMsgVerifymessage(common.TrezorTest): ) self.assertFalse(res) + """ + def test_verify_bitcoind(self): + self.setup_mnemonic_nopin_nopassphrase() + + res = self.client.verify_message( + '1KzXE97kV7DrpxCViCN3HbGbiKhzzPM7TQ', + binascii.unhexlify('1cc694f0f23901dfe3603789142f36a3fc582d0d5c0ec7215cf2ccd641e4e37228504f3d4dc3eea28bbdbf5da27c49d4635c097004d9f228750ccd836a8e1460c0'), + u'\u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy' + ) + + self.assertTrue(res) + def test_verify_utf(self): self.setup_mnemonic_nopin_nopassphrase() @@ -90,18 +103,7 @@ class TestMsgVerifymessage(common.TrezorTest): self.assertTrue(res_nfkd) self.assertTrue(res_nfc) - - def test_verify_bitcoind(self): - self.setup_mnemonic_nopin_nopassphrase() - - res = self.client.verify_message( - '1KzXE97kV7DrpxCViCN3HbGbiKhzzPM7TQ', - binascii.unhexlify('1cc694f0f23901dfe3603789142f36a3fc582d0d5c0ec7215cf2ccd641e4e37228504f3d4dc3eea28bbdbf5da27c49d4635c097004d9f228750ccd836a8e1460c0'), - u'\u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy' - ) - - self.assertTrue(res) + """ if __name__ == '__main__': unittest.main() -''' From 0307307dad927f2a17c12ad7b87241c94ecbed23 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 4 Jun 2014 17:59:16 +0200 Subject: [PATCH 0320/1535] fix tests to match reality :) --- tests/test.py | 54 --------------------------------- tests/test_protect_call.py | 26 +++------------- tests/test_protection_levels.py | 5 +-- 3 files changed, 8 insertions(+), 77 deletions(-) delete mode 100755 tests/test.py diff --git a/tests/test.py b/tests/test.py deleted file mode 100755 index 08055d891..000000000 --- a/tests/test.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/python -''' - -TODO: - -x ApplySettings -x ChangePin -x Ping -x GetEntropy -x GetPublicKey -x GetAddress -x WipeDevice -x LoadDevice -x ResetDevice -x RecoveryDevice -x SignMessage -x VerifyMessage -x EstimateTxSize -- SignTx -x SimpleSignTx -- FirmwareErase -- FirmwareUpload - -x protection levels -x neuspesna zmena pinu - -pin backoff predelat pred zadanim pinu - -- zrejme v sucinnosti s inymi testami - x ButtonRequest/ButtonAck workflow - x PinMatrixRequest/PinMatrixAck workflow - x PassphraseRequest/PassphraseAck workflow - -- rozsirit test_sign.tx o viac transakcii (zlozitejsich) - x fee over threshold - x not enough funds - x viac ako jeden vstup a jeden vystup - x iny cointype ako 0 - -- chceme v tomto release(?) - x SignMessage workflow - x VerifyMessage workflow - -otestovat session handling (tento test bude zrejme failovat na RPi) -Failure_NotInitialized -Features reflects all variations of LoadDevice - -x Zero signature test - -x test bip39, utf, passphrase -x Clear session on ChangePin - -Test s invalid adresou pro vystup -''' diff --git a/tests/test_protect_call.py b/tests/test_protect_call.py index 3ce98c68b..fbe67fcda 100644 --- a/tests/test_protect_call.py +++ b/tests/test_protect_call.py @@ -9,6 +9,7 @@ from trezorlib.client import PinException, CallException # FIXME TODO Add passphrase tests class TestProtectCall(common.TrezorTest): + def _some_protected_call(self, button, pin, passphrase): # This method perform any call which have protection in the device res = self.client.ping('random data', @@ -17,6 +18,7 @@ class TestProtectCall(common.TrezorTest): passphrase_protection=passphrase) self.assertEqual(res, 'random data') + """ def test_expected_responses(self): self.setup_mnemonic_pin_passphrase() @@ -57,6 +59,7 @@ class TestProtectCall(common.TrezorTest): proto.Success(message='wrong data')]) self._some_protected_call(True, True, True) self.assertRaises(CallException, scenario5) + """ def test_no_protection(self): self.setup_mnemonic_nopin_nopassphrase() @@ -93,36 +96,17 @@ class TestProtectCall(common.TrezorTest): self.client.setup_debuglink(button=True, pin_correct=False) def test_backoff(attempts, start): - expected = 1.8 ** attempts + expected = 0.2 * (2 ** attempts) got = time.time() - start msg = "Pin delay expected to be at least %s seconds, got %s" % (expected, got) print msg self.assertLessEqual(expected, got, msg) - for attempt in range(1, 4): + for attempt in range(1, 6): start = time.time() self.assertRaises(PinException, self._some_protected_call, False, True, False) test_backoff(attempt, start) -''' - # Unplug Trezor now - self.client.debuglink.stop() - self.client.close() - - # Give it some time to reboot (it may take some time on RPi) - boot_delay = 20 - time.sleep(boot_delay) - - # Connect to Trezor again - start = time.time() - self.setUp() - expected = 1.8 ** attempt / 2 # This test isn't accurate, let's expect at least some delay - took = time.time() - start - print "Expected reboot time at least %s seconds" % expected - print "Rebooted in %s seconds" % took - self.assertLessEqual(expected, time.time() - start, "Bootup took %s seconds, expected %s seconds or more!" % (took, expected)) - ''' - if __name__ == '__main__': unittest.main() diff --git a/tests/test_protection_levels.py b/tests/test_protection_levels.py index 26a76410e..e92948893 100644 --- a/tests/test_protection_levels.py +++ b/tests/test_protection_levels.py @@ -75,8 +75,9 @@ class TestProtectionLevels(common.TrezorTest): def test_load_device(self): with self.client: - self.client.set_expected_responses([proto.Success(), - proto.Features()]) + self.client.set_expected_responses([proto.ButtonRequest(), + proto.Success(), + proto.Features()]) self.client.load_device_by_mnemonic('this is mnemonic', '1234', True, 'label', 'english', skip_checksum=True) # This must fail, because device is already initialized From 0f246028321d6c7a424669e92809efbf1877b243 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 6 Jun 2014 14:39:50 +0200 Subject: [PATCH 0321/1535] compiled pb --- trezorlib/messages_pb2.py | 288 ++++++++++++++++++++++++-------------- trezorlib/types_pb2.py | 145 ++++++++++++++----- 2 files changed, 296 insertions(+), 137 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index ddbb7a7e1..41bf17a25 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x8b\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xb1\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -112,98 +112,102 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ApplySettings', index=22, number=25, + name='MessageType_CipherKeyValue', index=22, number=23, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonRequest', index=23, number=26, + name='MessageType_ApplySettings', index=23, number=25, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_ButtonRequest', index=24, number=26, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonAck', index=24, number=27, + name='MessageType_ButtonAck', index=25, number=27, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_GetAddress', index=25, number=29, + name='MessageType_GetAddress', index=26, number=29, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_Address', index=26, number=30, + name='MessageType_Address', index=27, number=30, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyRequest', index=27, number=35, + name='MessageType_EntropyRequest', index=28, number=35, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyAck', index=28, number=36, + name='MessageType_EntropyAck', index=29, number=36, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_SignMessage', index=29, number=38, + name='MessageType_SignMessage', index=30, number=38, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_VerifyMessage', index=30, number=39, + name='MessageType_VerifyMessage', index=31, number=39, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_MessageSignature', index=31, number=40, + name='MessageType_MessageSignature', index=32, number=40, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PassphraseRequest', index=32, number=41, + name='MessageType_PassphraseRequest', index=33, number=41, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PassphraseAck', index=33, number=42, + name='MessageType_PassphraseAck', index=34, number=42, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EstimateTxSize', index=34, number=43, + name='MessageType_EstimateTxSize', index=35, number=43, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxSize', index=35, number=44, + name='MessageType_TxSize', index=36, number=44, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_RecoveryDevice', index=36, number=45, + name='MessageType_RecoveryDevice', index=37, number=45, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_WordRequest', index=37, number=46, + name='MessageType_WordRequest', index=38, number=46, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_WordAck', index=38, number=47, + name='MessageType_WordAck', index=39, number=47, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkDecision', index=39, number=100, + name='MessageType_DebugLinkDecision', index=40, number=100, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkGetState', index=40, number=101, + name='MessageType_DebugLinkGetState', index=41, number=101, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkState', index=41, number=102, + name='MessageType_DebugLinkState', index=42, number=102, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkStop', index=42, number=103, + name='MessageType_DebugLinkStop', index=43, number=103, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkLog', index=43, number=104, + name='MessageType_DebugLinkLog', index=44, number=104, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), ], containing_type=None, options=None, - serialized_start=2854, - serialized_end=4401, + serialized_start=3002, + serialized_end=4587, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -229,6 +233,7 @@ MessageType_PinMatrixAck = 19 MessageType_Cancel = 20 MessageType_TxRequest = 21 MessageType_TxAck = 22 +MessageType_CipherKeyValue = 23 MessageType_ApplySettings = 25 MessageType_ButtonRequest = 26 MessageType_ButtonAck = 27 @@ -527,6 +532,13 @@ _SUCCESS = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='payload', full_name='Success.payload', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -537,7 +549,7 @@ _SUCCESS = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=569, - serialized_end=595, + serialized_end=612, ) @@ -571,8 +583,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=597, - serialized_end=651, + serialized_start=614, + serialized_end=668, ) @@ -606,8 +618,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=653, - serialized_end=716, + serialized_start=670, + serialized_end=733, ) @@ -627,8 +639,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=718, - serialized_end=729, + serialized_start=735, + serialized_end=746, ) @@ -655,8 +667,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=731, - serialized_end=786, + serialized_start=748, + serialized_end=803, ) @@ -683,8 +695,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=788, - serialized_end=815, + serialized_start=805, + serialized_end=832, ) @@ -704,8 +716,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=817, - serialized_end=825, + serialized_start=834, + serialized_end=842, ) @@ -725,8 +737,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=827, - serialized_end=846, + serialized_start=844, + serialized_end=863, ) @@ -753,8 +765,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=848, - serialized_end=883, + serialized_start=865, + serialized_end=900, ) @@ -781,8 +793,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=885, - serialized_end=911, + serialized_start=902, + serialized_end=928, ) @@ -809,8 +821,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=913, - serialized_end=939, + serialized_start=930, + serialized_end=956, ) @@ -837,8 +849,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=941, - serialized_end=974, + serialized_start=958, + serialized_end=991, ) @@ -865,8 +877,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=976, - serialized_end=1014, + serialized_start=993, + serialized_end=1031, ) @@ -900,8 +912,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1016, - serialized_end=1075, + serialized_start=1033, + serialized_end=1092, ) @@ -928,8 +940,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1077, - serialized_end=1103, + serialized_start=1094, + serialized_end=1120, ) @@ -949,8 +961,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1105, - serialized_end=1117, + serialized_start=1122, + serialized_end=1134, ) @@ -1019,8 +1031,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1120, - serialized_end=1286, + serialized_start=1137, + serialized_end=1303, ) @@ -1082,8 +1094,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1289, - serialized_end=1446, + serialized_start=1306, + serialized_end=1463, ) @@ -1103,8 +1115,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1448, - serialized_end=1464, + serialized_start=1465, + serialized_end=1481, ) @@ -1131,8 +1143,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1466, - serialized_end=1495, + serialized_start=1483, + serialized_end=1512, ) @@ -1194,8 +1206,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1498, - serialized_end=1657, + serialized_start=1515, + serialized_end=1674, ) @@ -1215,8 +1227,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1659, - serialized_end=1672, + serialized_start=1676, + serialized_end=1689, ) @@ -1243,8 +1255,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1674, - serialized_end=1697, + serialized_start=1691, + serialized_end=1714, ) @@ -1285,8 +1297,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1699, - serialized_end=1776, + serialized_start=1716, + serialized_end=1793, ) @@ -1327,8 +1339,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1778, - serialized_end=1846, + serialized_start=1795, + serialized_end=1863, ) @@ -1362,8 +1374,71 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1848, - serialized_end=1902, + serialized_start=1865, + serialized_end=1919, +) + + +_CIPHERKEYVALUE = _descriptor.Descriptor( + name='CipherKeyValue', + full_name='CipherKeyValue', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='address_n', full_name='CipherKeyValue.address_n', index=0, + number=1, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='key', full_name='CipherKeyValue.key', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='CipherKeyValue.value', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='encrypt', full_name='CipherKeyValue.encrypt', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ask_on_encrypt', full_name='CipherKeyValue.ask_on_encrypt', index=4, + number=5, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='ask_on_decrypt', full_name='CipherKeyValue.ask_on_decrypt', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1922, + serialized_end=2050, ) @@ -1404,8 +1479,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1904, - serialized_end=1993, + serialized_start=2052, + serialized_end=2141, ) @@ -1432,8 +1507,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1995, - serialized_end=2020, + serialized_start=2143, + serialized_end=2168, ) @@ -1474,8 +1549,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2022, - serialized_end=2103, + serialized_start=2170, + serialized_end=2251, ) @@ -1523,8 +1598,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2106, - serialized_end=2250, + serialized_start=2254, + serialized_end=2398, ) @@ -1565,8 +1640,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2253, - serialized_end=2386, + serialized_start=2401, + serialized_end=2534, ) @@ -1593,8 +1668,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2388, - serialized_end=2425, + serialized_start=2536, + serialized_end=2573, ) @@ -1614,8 +1689,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2427, - serialized_end=2442, + serialized_start=2575, + serialized_end=2590, ) @@ -1642,8 +1717,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2444, - serialized_end=2477, + serialized_start=2592, + serialized_end=2625, ) @@ -1670,8 +1745,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2479, - serialized_end=2514, + serialized_start=2627, + serialized_end=2662, ) @@ -1691,8 +1766,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2516, - serialized_end=2535, + serialized_start=2664, + serialized_end=2683, ) @@ -1782,8 +1857,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2538, - serialized_end=2773, + serialized_start=2686, + serialized_end=2921, ) @@ -1803,8 +1878,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2775, - serialized_end=2790, + serialized_start=2923, + serialized_end=2938, ) @@ -1845,8 +1920,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2792, - serialized_end=2851, + serialized_start=2940, + serialized_end=2999, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -1894,6 +1969,7 @@ DESCRIPTOR.message_types_by_name['WordAck'] = _WORDACK DESCRIPTOR.message_types_by_name['SignMessage'] = _SIGNMESSAGE DESCRIPTOR.message_types_by_name['VerifyMessage'] = _VERIFYMESSAGE DESCRIPTOR.message_types_by_name['MessageSignature'] = _MESSAGESIGNATURE +DESCRIPTOR.message_types_by_name['CipherKeyValue'] = _CIPHERKEYVALUE DESCRIPTOR.message_types_by_name['EstimateTxSize'] = _ESTIMATETXSIZE DESCRIPTOR.message_types_by_name['TxSize'] = _TXSIZE DESCRIPTOR.message_types_by_name['SignTx'] = _SIGNTX @@ -2094,6 +2170,12 @@ class MessageSignature(_message.Message): # @@protoc_insertion_point(class_scope:MessageSignature) +class CipherKeyValue(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _CIPHERKEYVALUE + + # @@protoc_insertion_point(class_scope:CipherKeyValue) + class EstimateTxSize(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _ESTIMATETXSIZE @@ -2219,6 +2301,8 @@ _MESSAGETYPE.values_by_name["MessageType_TxRequest"].has_options = True _MESSAGETYPE.values_by_name["MessageType_TxRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_TxAck"].has_options = True _MESSAGETYPE.values_by_name["MessageType_TxAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_CipherKeyValue"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_CipherKeyValue"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_ApplySettings"].has_options = True _MESSAGETYPE.values_by_name["MessageType_ApplySettings"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_ButtonRequest"].has_options = True diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 6d86bedc6..9c9058358 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"y\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\"y\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12 \n\x0bscript_type\x18\x04 \x02(\x0e\x32\x0b.ScriptType\x12\x13\n\x0bscript_args\x18\x05 \x03(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*3\n\nScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"?\n\x18MultisigRedeemScriptType\x12\x0f\n\x07pubkeys\x18\x01 \x03(\x0c\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"j\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*9\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,14 +74,14 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=936, - serialized_end=1269, + serialized_start=1085, + serialized_end=1418, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) -_SCRIPTTYPE = _descriptor.EnumDescriptor( - name='ScriptType', - full_name='ScriptType', +_OUTPUTSCRIPTTYPE = _descriptor.EnumDescriptor( + name='OutputScriptType', + full_name='OutputScriptType', filename=None, file=DESCRIPTOR, values=[ @@ -96,11 +96,33 @@ _SCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1271, - serialized_end=1322, + serialized_start=1420, + serialized_end=1477, ) -ScriptType = enum_type_wrapper.EnumTypeWrapper(_SCRIPTTYPE) +OutputScriptType = enum_type_wrapper.EnumTypeWrapper(_OUTPUTSCRIPTTYPE) +_INPUTSCRIPTTYPE = _descriptor.EnumDescriptor( + name='InputScriptType', + full_name='InputScriptType', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SPENDADDRESS', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='SPENDMULTISIG', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1479, + serialized_end=1533, +) + +InputScriptType = enum_type_wrapper.EnumTypeWrapper(_INPUTSCRIPTTYPE) _REQUESTTYPE = _descriptor.EnumDescriptor( name='RequestType', full_name='RequestType', @@ -126,8 +148,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1324, - serialized_end=1392, + serialized_start=1535, + serialized_end=1603, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -172,8 +194,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1395, - serialized_end=1657, + serialized_start=1606, + serialized_end=1868, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -198,8 +220,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1659, - serialized_end=1786, + serialized_start=1870, + serialized_end=1997, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -217,6 +239,8 @@ Failure_NotInitialized = 11 Failure_FirmwareError = 99 PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 +SPENDADDRESS = 0 +SPENDMULTISIG = 1 TXINPUT = 0 TXOUTPUT = 1 TXMETA = 2 @@ -379,6 +403,41 @@ _COINTYPE = _descriptor.Descriptor( ) +_MULTISIGREDEEMSCRIPTTYPE = _descriptor.Descriptor( + name='MultisigRedeemScriptType', + full_name='MultisigRedeemScriptType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='pubkeys', full_name='MultisigRedeemScriptType.pubkeys', index=0, + number=1, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='signatures', full_name='MultisigRedeemScriptType.signatures', index=1, + number=2, type=12, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=275, + serialized_end=338, +) + + _TXINPUTTYPE = _descriptor.Descriptor( name='TxInputType', full_name='TxInputType', @@ -421,6 +480,20 @@ _TXINPUTTYPE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='script_type', full_name='TxInputType.script_type', index=5, + number=6, type=14, cpp_type=8, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='multisig', full_name='TxInputType.multisig', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -430,8 +503,8 @@ _TXINPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=275, - serialized_end=396, + serialized_start=341, + serialized_end=560, ) @@ -470,13 +543,6 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - _descriptor.FieldDescriptor( - name='script_args', full_name='TxOutputType.script_args', index=4, - number=5, type=12, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -486,8 +552,8 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=398, - serialized_end=519, + serialized_start=562, + serialized_end=668, ) @@ -521,8 +587,8 @@ _TXOUTPUTBINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=521, - serialized_end=577, + serialized_start=670, + serialized_end=726, ) @@ -591,8 +657,8 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=580, - serialized_end=775, + serialized_start=729, + serialized_end=924, ) @@ -626,8 +692,8 @@ _TXREQUESTDETAILSTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=777, - serialized_end=839, + serialized_start=926, + serialized_end=988, ) @@ -668,16 +734,19 @@ _TXREQUESTSERIALIZEDTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=841, - serialized_end=933, + serialized_start=990, + serialized_end=1082, ) -_TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _SCRIPTTYPE +_TXINPUTTYPE.fields_by_name['script_type'].enum_type = _INPUTSCRIPTTYPE +_TXINPUTTYPE.fields_by_name['multisig'].message_type = _MULTISIGREDEEMSCRIPTTYPE +_TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _OUTPUTSCRIPTTYPE _TRANSACTIONTYPE.fields_by_name['inputs'].message_type = _TXINPUTTYPE _TRANSACTIONTYPE.fields_by_name['bin_outputs'].message_type = _TXOUTPUTBINTYPE _TRANSACTIONTYPE.fields_by_name['outputs'].message_type = _TXOUTPUTTYPE DESCRIPTOR.message_types_by_name['HDNodeType'] = _HDNODETYPE DESCRIPTOR.message_types_by_name['CoinType'] = _COINTYPE +DESCRIPTOR.message_types_by_name['MultisigRedeemScriptType'] = _MULTISIGREDEEMSCRIPTTYPE DESCRIPTOR.message_types_by_name['TxInputType'] = _TXINPUTTYPE DESCRIPTOR.message_types_by_name['TxOutputType'] = _TXOUTPUTTYPE DESCRIPTOR.message_types_by_name['TxOutputBinType'] = _TXOUTPUTBINTYPE @@ -697,6 +766,12 @@ class CoinType(_message.Message): # @@protoc_insertion_point(class_scope:CoinType) +class MultisigRedeemScriptType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _MULTISIGREDEEMSCRIPTTYPE + + # @@protoc_insertion_point(class_scope:MultisigRedeemScriptType) + class TxInputType(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _TXINPUTTYPE From e4fe84cb524e86078f741953f26eb6181464473a Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 6 Jun 2014 14:40:07 +0200 Subject: [PATCH 0322/1535] Added client.encrypt_keyvalue, client.decrypt_keyvalue --- cmdtr.py | 31 ++++++++++++++++++++++++++++--- trezorlib/client.py | 22 ++++++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/cmdtr.py b/cmdtr.py index 50f5dd52c..07d6fb097 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -5,7 +5,7 @@ import argparse import json import base64 -from trezorlib.client import TrezorClientDebug +from trezorlib.client import TrezorClient from trezorlib.tx_api import TXAPIBitcoin from trezorlib.protobuf_json import pb2json @@ -148,6 +148,17 @@ class Commands(object): signature = base64.b64decode(args.signature) return self.client.verify_message(args.address, signature, args.message) + def encrypt(self, args): + address_n = self.client.expand_path(args.n) + ret = self.client.encrypt_keyvalue(address_n, args.key, args.value) + return binascii.hexlify(ret) + + def decrypt(self, args): + address_n = self.client.expand_path(args.n) + value = binascii.unhexlify(args.value) + ret = self.client.decrypt_keyvalue(address_n, args.key, value) + return ret + def firmware_update(self, args): if not args.file: raise Exception("Must provide firmware filename") @@ -173,6 +184,8 @@ class Commands(object): reset_device.help = 'Perform device setup and generate new seed' sign_message.help = 'Sign message using address of given path' verify_message.help = 'Verify message' + encrypt.help = 'Encrypt value by given key and path' + decrypt.help = 'Decrypt value by given key and path' firmware_update.help = 'Upload new firmware to device (must be in bootloader mode)' get_address.arguments = ( @@ -241,6 +254,18 @@ class Commands(object): (('message',), {'type': str}), ) + encrypt.arguments = ( + (('-n', '-address'), {'type': str}), + (('key',), {'type': str}), + (('value',), {'type': str}), + ) + + decrypt.arguments = ( + (('-n', '-address'), {'type': str}), + (('key',), {'type': str}), + (('value',), {'type': str}), + ) + get_public_node.arguments = ( (('-n', '-address'), {'type': str}), ) @@ -271,7 +296,7 @@ class PinMatrixThread(threading.Thread): from PyQt4.QtCore import QObject, SIGNAL a = QApplication(sys.argv) - +pass matrix = PinMatrixWidget() def clicked(): @@ -324,7 +349,7 @@ def main(): return transport = get_transport(args.transport, args.path) - client = TrezorClientDebug(transport) + client = TrezorClient(transport) client.set_tx_api(TXAPIBitcoin()) cmds = Commands(client) diff --git a/trezorlib/client.py b/trezorlib/client.py index 807fc4bf5..81e68cd96 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -407,6 +407,28 @@ class ProtocolMixin(object): return True return False + @field('payload') + @expect(proto.Success) + def encrypt_keyvalue(self, n, key, value, ask_on_encrypt=True, ask_on_decrypt=True): + n = self._convert_prime(n) + return self.call(proto.CipherKeyValue(address_n=n, + key=key, + value=value, + encrypt=True, + ask_on_encrypt=ask_on_encrypt, + ask_on_decrypt=ask_on_decrypt)) + + @field('payload') + @expect(proto.Success) + def decrypt_keyvalue(self, n, key, value, ask_on_encrypt=True, ask_on_decrypt=True): + n = self._convert_prime(n) + return self.call(proto.CipherKeyValue(address_n=n, + key=key, + value=value, + encrypt=False, + ask_on_encrypt=ask_on_encrypt, + ask_on_decrypt=ask_on_decrypt)) + @field('tx_size') @expect(proto.TxSize) def estimate_tx_size(self, coin_name, inputs, outputs): From 6f2a60f93204bce24504730acdc8e823f797231d Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 6 Jun 2014 14:50:01 +0200 Subject: [PATCH 0323/1535] Added --verbose parameter to comdtr --- cmdtr.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cmdtr.py b/cmdtr.py index 07d6fb097..2fe169989 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -5,12 +5,13 @@ import argparse import json import base64 -from trezorlib.client import TrezorClient +from trezorlib.client import TrezorClient, TrezorClientDebug from trezorlib.tx_api import TXAPIBitcoin from trezorlib.protobuf_json import pb2json def parse_args(commands): parser = argparse.ArgumentParser(description='Commandline tool for Trezor devices.') + parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', help='Prints communication to device') parser.add_argument('-t', '--transport', dest='transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Transport used for talking with the device") parser.add_argument('-p', '--path', dest='path', default='', help="Path used by the transport (usually serial port)") # parser.add_argument('-dt', '--debuglink-transport', dest='debuglink_transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Debuglink transport") @@ -349,7 +350,11 @@ def main(): return transport = get_transport(args.transport, args.path) - client = TrezorClient(transport) + if args.verbose: + client = TrezorClientDebug(transport) + else: + client = TrezorClient(transport) + client.set_tx_api(TXAPIBitcoin()) cmds = Commands(client) From 1038a0a3e6a513559d760880958be1d9ee8a424f Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 7 Jun 2014 19:48:52 +0200 Subject: [PATCH 0324/1535] added test for cipherkeyvalue --- tests/test_msg_cipherkeyvalue.py | 74 ++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 tests/test_msg_cipherkeyvalue.py diff --git a/tests/test_msg_cipherkeyvalue.py b/tests/test_msg_cipherkeyvalue.py new file mode 100644 index 000000000..1af6e19e9 --- /dev/null +++ b/tests/test_msg_cipherkeyvalue.py @@ -0,0 +1,74 @@ +import unittest +import common +import binascii + +from trezorlib.client import CallException + +class TestMsgCipherkeyvalue(common.TrezorTest): + + def test_encrypt(self): + self.setup_mnemonic_nopin_nopassphrase() + + # different ask values + res = self.client.encrypt_keyvalue([0, 1, 2], "test", "testing message!", ask_on_encrypt=True, ask_on_decrypt=True) + self.assertEqual(binascii.hexlify(res), '676faf8f13272af601776bc31bc14e8f') + + res = self.client.encrypt_keyvalue([0, 1, 2], "test", "testing message!", ask_on_encrypt=True, ask_on_decrypt=False) + self.assertEqual(binascii.hexlify(res), '5aa0fbcb9d7fa669880745479d80c622') + + res = self.client.encrypt_keyvalue([0, 1, 2], "test", "testing message!", ask_on_encrypt=False, ask_on_decrypt=True) + self.assertEqual(binascii.hexlify(res), '958d4f63269b61044aaedc900c8d6208') + + res = self.client.encrypt_keyvalue([0, 1, 2], "test", "testing message!", ask_on_encrypt=False, ask_on_decrypt=False) + self.assertEqual(binascii.hexlify(res), 'e0cf0eb0425947000eb546cc3994bc6c') + + # different key + res = self.client.encrypt_keyvalue([0, 1, 2], "test2", "testing message!", ask_on_encrypt=True, ask_on_decrypt=True) + self.assertEqual(binascii.hexlify(res), 'de247a6aa6be77a134bb3f3f925f13af') + + # different message + res = self.client.encrypt_keyvalue([0, 1, 2], "test", "testing message! it is different", ask_on_encrypt=True, ask_on_decrypt=True) + self.assertEqual(binascii.hexlify(res), '676faf8f13272af601776bc31bc14e8f3ae1c88536bf18f1b44f1e4c2c4a613d') + + # different path + res = self.client.encrypt_keyvalue([0, 1, 3], "test", "testing message!", ask_on_encrypt=True, ask_on_decrypt=True) + self.assertEqual(binascii.hexlify(res), 'b4811a9d492f5355a5186ddbfccaae7b') + + def test_decrypt(self): + self.setup_mnemonic_nopin_nopassphrase() + + # different ask values + res = self.client.decrypt_keyvalue([0, 1, 2], "test", binascii.unhexlify("676faf8f13272af601776bc31bc14e8f"), ask_on_encrypt=True, ask_on_decrypt=True) + self.assertEqual(res, 'testing message!') + + res = self.client.decrypt_keyvalue([0, 1, 2], "test", binascii.unhexlify("5aa0fbcb9d7fa669880745479d80c622"), ask_on_encrypt=True, ask_on_decrypt=False) + self.assertEqual(res, 'testing message!') + + res = self.client.decrypt_keyvalue([0, 1, 2], "test", binascii.unhexlify("958d4f63269b61044aaedc900c8d6208"), ask_on_encrypt=False, ask_on_decrypt=True) + self.assertEqual(res, 'testing message!') + + res = self.client.decrypt_keyvalue([0, 1, 2], "test", binascii.unhexlify("e0cf0eb0425947000eb546cc3994bc6c"), ask_on_encrypt=False, ask_on_decrypt=False) + self.assertEqual(res, 'testing message!') + + # different key + res = self.client.decrypt_keyvalue([0, 1, 2], "test2", binascii.unhexlify("de247a6aa6be77a134bb3f3f925f13af"), ask_on_encrypt=True, ask_on_decrypt=True) + self.assertEqual(res, 'testing message!') + + # different message + res = self.client.decrypt_keyvalue([0, 1, 2], "test", binascii.unhexlify("676faf8f13272af601776bc31bc14e8f3ae1c88536bf18f1b44f1e4c2c4a613d"), ask_on_encrypt=True, ask_on_decrypt=True) + self.assertEqual(res, 'testing message! it is different') + + # different path + res = self.client.decrypt_keyvalue([0, 1, 3], "test", binascii.unhexlify("b4811a9d492f5355a5186ddbfccaae7b"), ask_on_encrypt=True, ask_on_decrypt=True) + self.assertEqual(res, 'testing message!') + + def test_encrypt_badlen(self): + self.setup_mnemonic_nopin_nopassphrase() + self.assertRaises(Exception, self.client.encrypt_keyvalue, [0, 1, 2], "test", "testing") + + def test_decrypt_badlen(self): + self.setup_mnemonic_nopin_nopassphrase() + self.assertRaises(Exception, self.client.decrypt_keyvalue, [0, 1, 2], "test", "testing") + +if __name__ == '__main__': + unittest.main() From f17f7d0569755c455972805b5850a2578455c435 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 9 Jun 2014 15:33:54 +0200 Subject: [PATCH 0325/1535] don't use simplesigntx in tests where signtx can be used --- tests/test_msg_estimatetxsize.py | 2 +- tests/test_protection_levels.py | 7 ++----- tests/test_secexp.py | 10 ---------- tests/test_zerosig.py | 12 +++++------- 4 files changed, 8 insertions(+), 23 deletions(-) delete mode 100644 tests/test_secexp.py diff --git a/tests/test_msg_estimatetxsize.py b/tests/test_msg_estimatetxsize.py index 85283e84a..55796796f 100644 --- a/tests/test_msg_estimatetxsize.py +++ b/tests/test_msg_estimatetxsize.py @@ -25,7 +25,7 @@ class TestMsgEstimatetxsize(common.TrezorTest): est_size = self.client.estimate_tx_size('Bitcoin', [inp1, ], [out1, ]) self.assertEqual(est_size, 194) - tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + (_, tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) real_size = len(tx) self.assertGreaterEqual(est_size, real_size) diff --git a/tests/test_protection_levels.py b/tests/test_protection_levels.py index e92948893..7a52eda97 100644 --- a/tests/test_protection_levels.py +++ b/tests/test_protection_levels.py @@ -6,8 +6,6 @@ from trezorlib import messages_pb2 as proto from trezorlib import types_pb2 as proto_types class TestProtectionLevels(common.TrezorTest): - # Tests protection levels of all messages as defined here: - # https://github.com/trezor/documentation/wiki/Protection-Levels def test_initialize(self): with self.client: @@ -130,9 +128,7 @@ class TestProtectionLevels(common.TrezorTest): self.client.set_expected_responses([proto.TxSize()]) self.client.estimate_tx_size('Bitcoin', [], []) - #def test_signtx(self): - # pass - + """ def test_simplesigntx(self): self.setup_mnemonic_pin_passphrase() @@ -153,6 +149,7 @@ class TestProtectionLevels(common.TrezorTest): proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXFINISHED)]) self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) + """ def test_signtx(self): self.setup_mnemonic_pin_passphrase() diff --git a/tests/test_secexp.py b/tests/test_secexp.py deleted file mode 100644 index 1fb8dc9c1..000000000 --- a/tests/test_secexp.py +++ /dev/null @@ -1,10 +0,0 @@ -''' -TODO: Test private key generation. -Requires changes in DebugLink protocol - -address N -> secexp -1KqYyzL53R8oA1LdYvyv7m6JUryFfGJDpa 0 -> 58076025150540604300740730208658111746901313722419801903949973414685471840010 -13MzKU6YjjdyiW3dZJDa5VU4AWGczQsdYD 2 -> 24964362473980156971921866787933161040275203024491680251157021262214416818504 -1FQVPnjrbkPWeA8poUoEnX9U3n9DyhAVtv 3 -> 12500609616964965377900270839876716803428136543899720278159495092510064965376 -1C9DHmWBpvGcFKXEiWWC3EK3EY5Bj79nze 9 -> 67160564554915396199427939496499570939355460294705808200742756759419289432145 -''' \ No newline at end of file diff --git a/tests/test_zerosig.py b/tests/test_zerosig.py index 937d7ba69..d2fc485be 100644 --- a/tests/test_zerosig.py +++ b/tests/test_zerosig.py @@ -20,7 +20,7 @@ class TestZeroSig(common.TrezorTest): prev_index=0, ) - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1, ], []) + msg = self.client._prepare_sign_tx('Bitcoin', [inp1, ], []) for n in range(3500, 200000): out1 = proto_types.TxOutputType(address_n=[n], @@ -55,9 +55,8 @@ class TestZeroSig(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1], [out1]) - tx = self.client.call(msg) - siglen = ord(tx.serialized.serialized_tx[44]) + (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) + siglen = ord(serialized_tx[44]) # Trezor must strip leading zero from signature self.assertEqual(siglen, 67) @@ -77,9 +76,8 @@ class TestZeroSig(common.TrezorTest): script_type=proto_types.PAYTOADDRESS, ) - msg = self.client._prepare_simple_sign_tx('Bitcoin', [inp1], [out1]) - tx = self.client.call(msg) - siglen = ord(tx.serialized.serialized_tx[44]) + (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) + siglen = ord(serialized_tx[44]) # Trezor must strip leading zero from signature self.assertEqual(siglen, 66) From c38f4346f688fa54ce537002412706896ea1b464 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 11 Jun 2014 19:56:19 +0200 Subject: [PATCH 0326/1535] add run-separate.sh script --- tests/run-separate.sh | 5 +++++ 1 file changed, 5 insertions(+) create mode 100755 tests/run-separate.sh diff --git a/tests/run-separate.sh b/tests/run-separate.sh new file mode 100755 index 000000000..fe71ad772 --- /dev/null +++ b/tests/run-separate.sh @@ -0,0 +1,5 @@ +#!/bin/bash +for i in test_*.py; do + echo Starting: $i + python $i > $i.out +done From f164e59d865d6b87cff4869812791dab1466bb4a Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 12 Jun 2014 13:26:24 +0200 Subject: [PATCH 0327/1535] Redirects text UI to error log instead of stdout (useful for scripting) --- trezorlib/client.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 81e68cd96..949addcfa 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -1,4 +1,5 @@ import os +import sys import time import binascii import hashlib @@ -23,6 +24,10 @@ def pprint(msg): else: return "<%s> (%d bytes):\n%s" % (msg.__class__.__name__, msg.ByteSize(), msg) +def log(msg): + sys.stderr.write("%s\n" % msg) + sys.stderr.flush() + class CallException(Exception): def __init__(self, code, message): super(CallException, self).__init__() @@ -120,9 +125,9 @@ class BaseClient(object): class DebugWireMixin(object): def call_raw(self, msg): - print "SENDING", pprint(msg) + log("SENDING " + pprint(msg)) resp = super(DebugWireMixin, self).call_raw(msg) - print "RECEIVED", pprint(resp) + log("RECEIVED" + pprint(resp)) return resp class TextUIMixin(object): @@ -136,7 +141,7 @@ class TextUIMixin(object): super(TextUIMixin, self).__init__(*args, **kwargs) def callback_ButtonRequest(self, msg): - print "Sending ButtonAck for %s " % get_buttonrequest_value(msg.code) + log("Sending ButtonAck for %s " % get_buttonrequest_value(msg.code)) return proto.ButtonAck() def callback_PinMatrixRequest(self, msg): @@ -255,9 +260,9 @@ class DebugLinkMixin(object): "Expected %s, got %s" % (pprint(expected), pprint(msg))) def callback_ButtonRequest(self, msg): - print "ButtonRequest code:", get_buttonrequest_value(msg.code) + log("ButtonRequest code: " + get_buttonrequest_value(msg.code)) - print "Pressing button", self.button + log("Pressing button " + self.button) self.debug.press_button(self.button) return proto.ButtonAck() @@ -269,7 +274,7 @@ class DebugLinkMixin(object): return proto.PinMatrixAck(pin=pin) def callback_PassphraseRequest(self, msg): - print "Provided passphrase: '%s'" % self.passphrase + log("Provided passphrase: '%s'" % self.passphrase) return proto.PassphraseAck(passphrase=self.passphrase) def callback_WordRequest(self, msg): @@ -508,7 +513,7 @@ class ProtocolMixin(object): # If there's some part of signed transaction, let's add it if res.HasField('serialized') and res.serialized.HasField('serialized_tx'): - print "RECEIVED PART OF SERIALIZED TX (%d BYTES)" % len(res.serialized.serialized_tx) + log("RECEIVED PART OF SERIALIZED TX (%d BYTES)" % len(res.serialized.serialized_tx)) serialized_tx += res.serialized.serialized_tx if res.HasField('serialized') and res.serialized.HasField('signature_index'): @@ -563,8 +568,8 @@ class ProtocolMixin(object): if None in signatures: raise Exception("Some signatures are missing!") - print "SIGNED IN %.03f SECONDS, CALLED %d MESSAGES, %d BYTES" % \ - (time.time() - start, counter, len(serialized_tx)) + log("SIGNED IN %.03f SECONDS, CALLED %d MESSAGES, %d BYTES" % \ + (time.time() - start, counter, len(serialized_tx))) return (signatures, serialized_tx) @@ -613,7 +618,7 @@ class ProtocolMixin(object): raise Exception("Invalid response, expected EntropyRequest") external_entropy = self._get_local_entropy() - print "Computer generated entropy:", binascii.hexlify(external_entropy) + log("Computer generated entropy: " + binascii.hexlify(external_entropy)) ret = self.call(proto.EntropyAck(entropy=external_entropy)) self.init_device() return ret From aa4fa425a30c1960f5a7348664b70eeddbd553f4 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 12 Jun 2014 16:08:20 +0200 Subject: [PATCH 0328/1535] encrypt->encrypt_keyvalue, decrypt->decrypt_keyvalue --- cmdtr.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cmdtr.py b/cmdtr.py index 2fe169989..50ce2bd35 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -149,12 +149,12 @@ class Commands(object): signature = base64.b64decode(args.signature) return self.client.verify_message(args.address, signature, args.message) - def encrypt(self, args): + def encrypt_keyvalue(self, args): address_n = self.client.expand_path(args.n) ret = self.client.encrypt_keyvalue(address_n, args.key, args.value) return binascii.hexlify(ret) - def decrypt(self, args): + def decrypt_keyvalue(self, args): address_n = self.client.expand_path(args.n) value = binascii.unhexlify(args.value) ret = self.client.decrypt_keyvalue(address_n, args.key, value) @@ -185,8 +185,8 @@ class Commands(object): reset_device.help = 'Perform device setup and generate new seed' sign_message.help = 'Sign message using address of given path' verify_message.help = 'Verify message' - encrypt.help = 'Encrypt value by given key and path' - decrypt.help = 'Decrypt value by given key and path' + encrypt_keyvalue.help = 'Encrypt value by given key and path' + decrypt_keyvalue.help = 'Decrypt value by given key and path' firmware_update.help = 'Upload new firmware to device (must be in bootloader mode)' get_address.arguments = ( @@ -255,13 +255,13 @@ class Commands(object): (('message',), {'type': str}), ) - encrypt.arguments = ( + encrypt_keyvalue.arguments = ( (('-n', '-address'), {'type': str}), (('key',), {'type': str}), (('value',), {'type': str}), ) - decrypt.arguments = ( + decrypt_keyvalue.arguments = ( (('-n', '-address'), {'type': str}), (('key',), {'type': str}), (('value',), {'type': str}), From 1aee7956e96be11627a8ff454d53b268cb8c66e1 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 12 Jun 2014 16:39:29 +0200 Subject: [PATCH 0329/1535] Demonstration usage of Trezor as a EncFS unlocking key --- tools/encfs_aes_getpass.py | 105 +++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100755 tools/encfs_aes_getpass.py diff --git a/tools/encfs_aes_getpass.py b/tools/encfs_aes_getpass.py new file mode 100755 index 000000000..0b228609b --- /dev/null +++ b/tools/encfs_aes_getpass.py @@ -0,0 +1,105 @@ +#!/usr/bin/python + +''' +Use Trezor as a hardware key for opening EncFS filesystem! + +Demo usage: + +encfs --standard --extpass=./encfs_aes_getpass.py ~/.crypt ~/crypt +''' + +import os +import sys +import base64 +import binascii + +from trezorlib.client import TrezorClient +from trezorlib.transport_hid import HidTransport + +def wait_for_devices(): + devices = HidTransport.enumerate() + while not len(devices): + sys.stderr.write("Please connect Trezor to computer and press Enter...") + raw_input() + devices = HidTransport.enumerate() + + return devices + +def list_devices(devices): + i = 0 + sys.stderr.write("----------------------------\n") + sys.stderr.write("Available devices:\n") + for d in devices: + try: + t = HidTransport(d) + except IOError: + sys.stderr.write("[-] \n") + continue + + client = TrezorClient(t) + + if client.features.label: + sys.stderr.write("[%d] %s\n" % (i, client.features.label)) + else: + sys.stderr.write("[%d] \n" % i) + t.close() + i += 1 + + sys.stderr.write("----------------------------\n") + sys.stderr.write("Please choice device to use: ") + + try: + device_id = int(raw_input()) + HidTransport(devices[device_id]) + except: + raise Exception("Invalid choice, exiting...") + + return device_id + +def main(): + + devices = wait_for_devices() + + if len(devices) > 1: + device_id = list_devices(devices) + else: + device_id = 0 + + transport = HidTransport(devices[device_id]) + client = TrezorClient(transport) + + rootdir = os.environ['encfs_root'] # Read "man encfs" for more + passw_file = os.path.join(rootdir, 'password.dat') + + if os.path.exists(passw_file): + # Existing encfs drive, let's load password + + label, passw_encrypted = open(passw_file, 'r').read().split(',') + passw = client.decrypt_keyvalue([10, 0], + binascii.unhexlify(label), + binascii.unhexlify(passw_encrypted), + False, True) + print passw + + else: + # New encfs drive, let's generate password + + sys.stderr.write('Please provide label for new drive: ') + label = raw_input() + + passw = base64.b64encode(os.urandom(24)) # 32 bytes in base64, good for AES + + if len(passw) != 32: + raise Exception("32 bytes password expected") + + passw_encrypted = client.encrypt_keyvalue([10, 0], + label, passw, False, True) + + f = open(passw_file, 'wb') + f.write(binascii.hexlify(label) + ',' + binascii.hexlify(passw_encrypted)) + f.close() + + print passw + +if __name__ == '__main__': + main() From 8ea46f34a2d75f569a159e65cc36a1ed1e770c98 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 12 Jun 2014 17:02:46 +0200 Subject: [PATCH 0330/1535] add EncryptMessage and DecryptMessage --- cmdtr.py | 29 +++++- trezorlib/client.py | 12 +++ trezorlib/messages_pb2.py | 205 ++++++++++++++++++++++++++++++-------- 3 files changed, 202 insertions(+), 44 deletions(-) diff --git a/cmdtr.py b/cmdtr.py index 50ce2bd35..b519d5169 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -149,6 +149,19 @@ class Commands(object): signature = base64.b64decode(args.signature) return self.client.verify_message(args.address, signature, args.message) + def encrypt_message(self, args): + address_n = self.client.expand_path(args.n) + pubkey = binascii.unhexlify(args.pubkey) + ret = self.client.encrypt_message(address_n, pubkey, args.message) + return binascii.hexlify(ret) + + def decrypt_message(self, args): + address_n = self.client.expand_path(args.n) + pubkey = binascii.unhexlify(args.pubkey) + message = binascii.unhexlify(args.message) + ret = self.client.decrypt_message(address_n, pubkey, message, args.show_only) + return ret + def encrypt_keyvalue(self, args): address_n = self.client.expand_path(args.n) ret = self.client.encrypt_keyvalue(address_n, args.key, args.value) @@ -156,7 +169,6 @@ class Commands(object): def decrypt_keyvalue(self, args): address_n = self.client.expand_path(args.n) - value = binascii.unhexlify(args.value) ret = self.client.decrypt_keyvalue(address_n, args.key, value) return ret @@ -185,6 +197,8 @@ class Commands(object): reset_device.help = 'Perform device setup and generate new seed' sign_message.help = 'Sign message using address of given path' verify_message.help = 'Verify message' + encrypt_message.help = 'Encrypt message' + decrypt_message.help = 'Decrypt message' encrypt_keyvalue.help = 'Encrypt value by given key and path' decrypt_keyvalue.help = 'Decrypt value by given key and path' firmware_update.help = 'Upload new firmware to device (must be in bootloader mode)' @@ -249,6 +263,19 @@ class Commands(object): (('message',), {'type': str}), ) + encrypt_message.arguments = ( + (('-n', '-address'), {'type': str}), + (('pubkey',), {'type': str}), + (('message',), {'type': str}), + ) + + decrypt_message.arguments = ( + (('-n', '-address'), {'type': str}), + (('pubkey',), {'type': str}), + (('message',), {'type': str}), + (('-s', '--show-only'), {'action': 'store_true', 'default': False}), + ) + verify_message.arguments = ( (('address',), {'type': str}), (('signature',), {'type': str}), diff --git a/trezorlib/client.py b/trezorlib/client.py index 949addcfa..9c7ad37aa 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -412,6 +412,18 @@ class ProtocolMixin(object): return True return False + @field('payload') + @expect(proto.Success) + def encrypt_message(self, n, pubkey, message): + n = self._convert_prime(n) + return self.call(proto.EncryptMessage(address_n=n, pubkey=pubkey, message=message)) + + @field('payload') + @expect(proto.Success) + def decrypt_message(self, n, pubkey, message, show_only): + n = self._convert_prime(n) + return self.call(proto.DecryptMessage(address_n=n, pubkey=pubkey, message=message, show_only=show_only)) + @field('payload') @expect(proto.Success) def encrypt_keyvalue(self, n, key, value, ask_on_encrypt=True, ask_on_decrypt=True): diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 41bf17a25..b5f81def6 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xb1\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"D\n\x0e\x45ncryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"W\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x11\n\tshow_only\x18\x04 \x01(\x08\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xfd\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -156,58 +156,66 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PassphraseRequest', index=33, number=41, + name='MessageType_EncryptMessage', index=33, number=48, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_DecryptMessage', index=34, number=49, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_PassphraseRequest', index=35, number=41, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PassphraseAck', index=34, number=42, + name='MessageType_PassphraseAck', index=36, number=42, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EstimateTxSize', index=35, number=43, + name='MessageType_EstimateTxSize', index=37, number=43, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxSize', index=36, number=44, + name='MessageType_TxSize', index=38, number=44, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_RecoveryDevice', index=37, number=45, + name='MessageType_RecoveryDevice', index=39, number=45, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_WordRequest', index=38, number=46, + name='MessageType_WordRequest', index=40, number=46, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_WordAck', index=39, number=47, + name='MessageType_WordAck', index=41, number=47, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkDecision', index=40, number=100, + name='MessageType_DebugLinkDecision', index=42, number=100, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkGetState', index=41, number=101, + name='MessageType_DebugLinkGetState', index=43, number=101, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkState', index=42, number=102, + name='MessageType_DebugLinkState', index=44, number=102, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkStop', index=43, number=103, + name='MessageType_DebugLinkStop', index=45, number=103, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkLog', index=44, number=104, + name='MessageType_DebugLinkLog', index=46, number=104, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), ], containing_type=None, options=None, - serialized_start=3002, - serialized_end=4587, + serialized_start=3161, + serialized_end=4822, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -244,6 +252,8 @@ MessageType_EntropyAck = 36 MessageType_SignMessage = 38 MessageType_VerifyMessage = 39 MessageType_MessageSignature = 40 +MessageType_EncryptMessage = 48 +MessageType_DecryptMessage = 49 MessageType_PassphraseRequest = 41 MessageType_PassphraseAck = 42 MessageType_EstimateTxSize = 43 @@ -1379,6 +1389,97 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( ) +_ENCRYPTMESSAGE = _descriptor.Descriptor( + name='EncryptMessage', + full_name='EncryptMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='address_n', full_name='EncryptMessage.address_n', index=0, + number=1, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pubkey', full_name='EncryptMessage.pubkey', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message', full_name='EncryptMessage.message', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1921, + serialized_end=1989, +) + + +_DECRYPTMESSAGE = _descriptor.Descriptor( + name='DecryptMessage', + full_name='DecryptMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='address_n', full_name='DecryptMessage.address_n', index=0, + number=1, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='pubkey', full_name='DecryptMessage.pubkey', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message', full_name='DecryptMessage.message', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='show_only', full_name='DecryptMessage.show_only', index=3, + number=4, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1991, + serialized_end=2078, +) + + _CIPHERKEYVALUE = _descriptor.Descriptor( name='CipherKeyValue', full_name='CipherKeyValue', @@ -1437,8 +1538,8 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1922, - serialized_end=2050, + serialized_start=2081, + serialized_end=2209, ) @@ -1479,8 +1580,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2052, - serialized_end=2141, + serialized_start=2211, + serialized_end=2300, ) @@ -1507,8 +1608,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2143, - serialized_end=2168, + serialized_start=2302, + serialized_end=2327, ) @@ -1549,8 +1650,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2170, - serialized_end=2251, + serialized_start=2329, + serialized_end=2410, ) @@ -1598,8 +1699,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2254, - serialized_end=2398, + serialized_start=2413, + serialized_end=2557, ) @@ -1640,8 +1741,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2401, - serialized_end=2534, + serialized_start=2560, + serialized_end=2693, ) @@ -1668,8 +1769,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2536, - serialized_end=2573, + serialized_start=2695, + serialized_end=2732, ) @@ -1689,8 +1790,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2575, - serialized_end=2590, + serialized_start=2734, + serialized_end=2749, ) @@ -1717,8 +1818,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2592, - serialized_end=2625, + serialized_start=2751, + serialized_end=2784, ) @@ -1745,8 +1846,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2627, - serialized_end=2662, + serialized_start=2786, + serialized_end=2821, ) @@ -1766,8 +1867,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2664, - serialized_end=2683, + serialized_start=2823, + serialized_end=2842, ) @@ -1857,8 +1958,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2686, - serialized_end=2921, + serialized_start=2845, + serialized_end=3080, ) @@ -1878,8 +1979,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2923, - serialized_end=2938, + serialized_start=3082, + serialized_end=3097, ) @@ -1920,8 +2021,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2940, - serialized_end=2999, + serialized_start=3099, + serialized_end=3158, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -1969,6 +2070,8 @@ DESCRIPTOR.message_types_by_name['WordAck'] = _WORDACK DESCRIPTOR.message_types_by_name['SignMessage'] = _SIGNMESSAGE DESCRIPTOR.message_types_by_name['VerifyMessage'] = _VERIFYMESSAGE DESCRIPTOR.message_types_by_name['MessageSignature'] = _MESSAGESIGNATURE +DESCRIPTOR.message_types_by_name['EncryptMessage'] = _ENCRYPTMESSAGE +DESCRIPTOR.message_types_by_name['DecryptMessage'] = _DECRYPTMESSAGE DESCRIPTOR.message_types_by_name['CipherKeyValue'] = _CIPHERKEYVALUE DESCRIPTOR.message_types_by_name['EstimateTxSize'] = _ESTIMATETXSIZE DESCRIPTOR.message_types_by_name['TxSize'] = _TXSIZE @@ -2170,6 +2273,18 @@ class MessageSignature(_message.Message): # @@protoc_insertion_point(class_scope:MessageSignature) +class EncryptMessage(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _ENCRYPTMESSAGE + + # @@protoc_insertion_point(class_scope:EncryptMessage) + +class DecryptMessage(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DECRYPTMESSAGE + + # @@protoc_insertion_point(class_scope:DecryptMessage) + class CipherKeyValue(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _CIPHERKEYVALUE @@ -2323,6 +2438,10 @@ _MESSAGETYPE.values_by_name["MessageType_VerifyMessage"].has_options = True _MESSAGETYPE.values_by_name["MessageType_VerifyMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_MessageSignature"].has_options = True _MESSAGETYPE.values_by_name["MessageType_MessageSignature"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_EncryptMessage"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_EncryptMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_DecryptMessage"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_DecryptMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_PassphraseRequest"].has_options = True _MESSAGETYPE.values_by_name["MessageType_PassphraseRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_PassphraseAck"].has_options = True From 9b9f0e941591d7ed0accce370f0be176fdf16002 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 12 Jun 2014 17:22:22 +0200 Subject: [PATCH 0331/1535] Removed all outputs to stdout, uses stderr instead --- trezorlib/client.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 9c7ad37aa..7131cc9c5 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -141,7 +141,7 @@ class TextUIMixin(object): super(TextUIMixin, self).__init__(*args, **kwargs) def callback_ButtonRequest(self, msg): - log("Sending ButtonAck for %s " % get_buttonrequest_value(msg.code)) + # log("Sending ButtonAck for %s " % get_buttonrequest_value(msg.code)) return proto.ButtonAck() def callback_PinMatrixRequest(self, msg): @@ -153,17 +153,21 @@ class TextUIMixin(object): desc = 'new PIN again' else: desc = 'PIN' - pin = raw_input("Please enter %s: " % desc) + + log("Please enter %s: " % desc) + pin = raw_input() return proto.PinMatrixAck(pin=pin) def callback_PassphraseRequest(self, msg): - passphrase = raw_input("Passphrase required: ") + log("Passphrase required: ") + passphrase = raw_input() passphrase = unicode(str(bytearray(passphrase, 'utf-8')), 'utf-8') return proto.PassphraseAck(passphrase=passphrase) def callback_WordRequest(self, msg): - word = raw_input("Enter one word of mnemonic: ") + log("Enter one word of mnemonic: ") + word = raw_input() return proto.WordAck(word=word) class DebugLinkMixin(object): From d102520388c0971a4e6120638702e0f19a85c7b6 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 12 Jun 2014 17:39:50 +0200 Subject: [PATCH 0332/1535] Storing bip32 path to password file, using Trezor entropy for generating EncFS password --- tools/encfs_aes_getpass.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/tools/encfs_aes_getpass.py b/tools/encfs_aes_getpass.py index 0b228609b..6df793ed1 100755 --- a/tools/encfs_aes_getpass.py +++ b/tools/encfs_aes_getpass.py @@ -10,10 +10,12 @@ encfs --standard --extpass=./encfs_aes_getpass.py ~/.crypt ~/crypt import os import sys +import json import base64 +import hashlib import binascii -from trezorlib.client import TrezorClient +from trezorlib.client import TrezorClient, TrezorClientDebug from trezorlib.transport_hid import HidTransport def wait_for_devices(): @@ -50,7 +52,8 @@ def list_devices(devices): try: device_id = int(raw_input()) - HidTransport(devices[device_id]) + t = HidTransport(devices[device_id]) + t.close() except: raise Exception("Invalid choice, exiting...") @@ -74,8 +77,9 @@ def main(): if os.path.exists(passw_file): # Existing encfs drive, let's load password - label, passw_encrypted = open(passw_file, 'r').read().split(',') - passw = client.decrypt_keyvalue([10, 0], + sys.stderr.write('Please confirm action on your device.\n') + label, passw_encrypted, bip32_path = open(passw_file, 'r').read().split(',') + passw = client.decrypt_keyvalue(json.loads(binascii.unhexlify(bip32_path)), binascii.unhexlify(label), binascii.unhexlify(passw_encrypted), False, True) @@ -87,16 +91,23 @@ def main(): sys.stderr.write('Please provide label for new drive: ') label = raw_input() - passw = base64.b64encode(os.urandom(24)) # 32 bytes in base64, good for AES + sys.stderr.write('Computer asked Trezor for new strong password.\nPlease confirm action on your device.\n') + + # 32 bytes, good for AES + trezor_entropy = client.get_entropy(32) + urandom_entropy = os.urandom(32) + passw = hashlib.sha256(trezor_entropy + urandom_entropy).digest() if len(passw) != 32: raise Exception("32 bytes password expected") - passw_encrypted = client.encrypt_keyvalue([10, 0], + bip32_path = [10, 0] + passw_encrypted = client.encrypt_keyvalue(bip32_path, label, passw, False, True) f = open(passw_file, 'wb') - f.write(binascii.hexlify(label) + ',' + binascii.hexlify(passw_encrypted)) + f.write(binascii.hexlify(label) + ',' + binascii.hexlify(passw_encrypted) + \ + ',' + binascii.hexlify(json.dumps(bip32_path))) f.close() print passw From 461380e9d25839a839ce81e339ef7990b2dc16fa Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 12 Jun 2014 19:13:46 +0200 Subject: [PATCH 0333/1535] typo --- tools/encfs_aes_getpass.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/encfs_aes_getpass.py b/tools/encfs_aes_getpass.py index 6df793ed1..0cb42074d 100755 --- a/tools/encfs_aes_getpass.py +++ b/tools/encfs_aes_getpass.py @@ -48,7 +48,7 @@ def list_devices(devices): i += 1 sys.stderr.write("----------------------------\n") - sys.stderr.write("Please choice device to use: ") + sys.stderr.write("Please choose device to use: ") try: device_id = int(raw_input()) From 430362bd319aab9e32e68a22e5753faacb7e8084 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 12 Jun 2014 19:16:30 +0200 Subject: [PATCH 0334/1535] Refactored choosing of devices --- tools/encfs_aes_getpass.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tools/encfs_aes_getpass.py b/tools/encfs_aes_getpass.py index 0cb42074d..d799ba3b7 100755 --- a/tools/encfs_aes_getpass.py +++ b/tools/encfs_aes_getpass.py @@ -27,7 +27,7 @@ def wait_for_devices(): return devices -def list_devices(devices): +def choose_device(devices): i = 0 sys.stderr.write("----------------------------\n") sys.stderr.write("Available devices:\n") @@ -52,23 +52,21 @@ def list_devices(devices): try: device_id = int(raw_input()) - t = HidTransport(devices[device_id]) - t.close() + transport = HidTransport(devices[device_id]) except: raise Exception("Invalid choice, exiting...") - return device_id + return transport def main(): devices = wait_for_devices() if len(devices) > 1: - device_id = list_devices(devices) + transport = choose_device(devices) else: - device_id = 0 + transport = HidTransport(devices[0]) - transport = HidTransport(devices[device_id]) client = TrezorClient(transport) rootdir = os.environ['encfs_root'] # Read "man encfs" for more From f48646ac834234fde40de2ad4e93e7d125842a35 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 12 Jun 2014 19:19:56 +0200 Subject: [PATCH 0335/1535] Refactored decrypting of password, now uses the same path for both create and mount --- tools/encfs_aes_getpass.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/tools/encfs_aes_getpass.py b/tools/encfs_aes_getpass.py index d799ba3b7..dd32968e6 100755 --- a/tools/encfs_aes_getpass.py +++ b/tools/encfs_aes_getpass.py @@ -72,18 +72,7 @@ def main(): rootdir = os.environ['encfs_root'] # Read "man encfs" for more passw_file = os.path.join(rootdir, 'password.dat') - if os.path.exists(passw_file): - # Existing encfs drive, let's load password - - sys.stderr.write('Please confirm action on your device.\n') - label, passw_encrypted, bip32_path = open(passw_file, 'r').read().split(',') - passw = client.decrypt_keyvalue(json.loads(binascii.unhexlify(bip32_path)), - binascii.unhexlify(label), - binascii.unhexlify(passw_encrypted), - False, True) - print passw - - else: + if not os.path.exists(passw_file): # New encfs drive, let's generate password sys.stderr.write('Please provide label for new drive: ') @@ -108,7 +97,16 @@ def main(): ',' + binascii.hexlify(json.dumps(bip32_path))) f.close() - print passw + # Let's load password + + sys.stderr.write('Please confirm action on your device.\n') + label, passw_encrypted, bip32_path = open(passw_file, 'r').read().split(',') + passw = client.decrypt_keyvalue(json.loads(binascii.unhexlify(bip32_path)), + binascii.unhexlify(label), + binascii.unhexlify(passw_encrypted), + False, True) + print passw + if __name__ == '__main__': main() From fc64a407696e81ccd63d8ac422b3ae7ac13082c9 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 12 Jun 2014 21:45:33 +0200 Subject: [PATCH 0336/1535] Refactored password.dat format, backward incompatible change. --- tools/encfs_aes_getpass.py | 47 +++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/tools/encfs_aes_getpass.py b/tools/encfs_aes_getpass.py index dd32968e6..6f0aa7c9c 100755 --- a/tools/encfs_aes_getpass.py +++ b/tools/encfs_aes_getpass.py @@ -11,7 +11,6 @@ encfs --standard --extpass=./encfs_aes_getpass.py ~/.crypt ~/crypt import os import sys import json -import base64 import hashlib import binascii @@ -28,6 +27,15 @@ def wait_for_devices(): return devices def choose_device(devices): + if not len(devices): + raise Exception("No Trezor connected!") + + if len(devices) == 1: + try: + return HidTransport(devices[0]) + except IOError: + raise Exception("Device is currently in use") + i = 0 sys.stderr.write("----------------------------\n") sys.stderr.write("Available devices:\n") @@ -52,21 +60,13 @@ def choose_device(devices): try: device_id = int(raw_input()) - transport = HidTransport(devices[device_id]) + return HidTransport(devices[device_id]) except: raise Exception("Invalid choice, exiting...") - return transport - def main(): - devices = wait_for_devices() - - if len(devices) > 1: - transport = choose_device(devices) - else: - transport = HidTransport(devices[0]) - + transport = choose_device(devices) client = TrezorClient(transport) rootdir = os.environ['encfs_root'] # Read "man encfs" for more @@ -78,7 +78,8 @@ def main(): sys.stderr.write('Please provide label for new drive: ') label = raw_input() - sys.stderr.write('Computer asked Trezor for new strong password.\nPlease confirm action on your device.\n') + sys.stderr.write('Computer asked Trezor for new strong password.\n') + sys.stderr.write('Please confirm action on your device.\n') # 32 bytes, good for AES trezor_entropy = client.get_entropy(32) @@ -89,24 +90,24 @@ def main(): raise Exception("32 bytes password expected") bip32_path = [10, 0] - passw_encrypted = client.encrypt_keyvalue(bip32_path, - label, passw, False, True) + passw_encrypted = client.encrypt_keyvalue(bip32_path, label, passw, False, True) - f = open(passw_file, 'wb') - f.write(binascii.hexlify(label) + ',' + binascii.hexlify(passw_encrypted) + \ - ',' + binascii.hexlify(json.dumps(bip32_path))) - f.close() + data = {'label': label, + 'bip32_path': bip32_path, + 'password_encrypted_hex': binascii.hexlify(passw_encrypted)} + + json.dump(data, open(passw_file, 'wb')) # Let's load password + data = json.load(open(passw_file, 'r')) sys.stderr.write('Please confirm action on your device.\n') - label, passw_encrypted, bip32_path = open(passw_file, 'r').read().split(',') - passw = client.decrypt_keyvalue(json.loads(binascii.unhexlify(bip32_path)), - binascii.unhexlify(label), - binascii.unhexlify(passw_encrypted), + passw = client.decrypt_keyvalue(data['bip32_path'], + data['label'], + binascii.unhexlify(data['password_encrypted_hex']), False, True) - print passw + print passw if __name__ == '__main__': main() From cfc8fdc21440e4650c728d149c75bb39952bf066 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 13 Jun 2014 16:37:06 +0200 Subject: [PATCH 0337/1535] adapt new API of EncryptMessage / DecryptMessage --- cmdtr.py | 10 ++-- trezorlib/client.py | 9 ++-- trezorlib/messages_pb2.py | 98 +++++++++++++++++---------------------- 3 files changed, 49 insertions(+), 68 deletions(-) diff --git a/cmdtr.py b/cmdtr.py index b519d5169..56aa726c6 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -150,16 +150,14 @@ class Commands(object): return self.client.verify_message(args.address, signature, args.message) def encrypt_message(self, args): - address_n = self.client.expand_path(args.n) pubkey = binascii.unhexlify(args.pubkey) - ret = self.client.encrypt_message(address_n, pubkey, args.message) + ret = self.client.encrypt_message(pubkey, args.message, args.display_only) return binascii.hexlify(ret) def decrypt_message(self, args): address_n = self.client.expand_path(args.n) - pubkey = binascii.unhexlify(args.pubkey) message = binascii.unhexlify(args.message) - ret = self.client.decrypt_message(address_n, pubkey, message, args.show_only) + ret = self.client.decrypt_message(address_n, message) return ret def encrypt_keyvalue(self, args): @@ -264,16 +262,14 @@ class Commands(object): ) encrypt_message.arguments = ( - (('-n', '-address'), {'type': str}), (('pubkey',), {'type': str}), (('message',), {'type': str}), + (('-d', '--display-only'), {'action': 'store_true', 'default': False}), ) decrypt_message.arguments = ( (('-n', '-address'), {'type': str}), - (('pubkey',), {'type': str}), (('message',), {'type': str}), - (('-s', '--show-only'), {'action': 'store_true', 'default': False}), ) verify_message.arguments = ( diff --git a/trezorlib/client.py b/trezorlib/client.py index 7131cc9c5..6cf7e4288 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -418,15 +418,14 @@ class ProtocolMixin(object): @field('payload') @expect(proto.Success) - def encrypt_message(self, n, pubkey, message): - n = self._convert_prime(n) - return self.call(proto.EncryptMessage(address_n=n, pubkey=pubkey, message=message)) + def encrypt_message(self, pubkey, message, display_only): + return self.call(proto.EncryptMessage(pubkey=pubkey, message=message, display_only=display_only)) @field('payload') @expect(proto.Success) - def decrypt_message(self, n, pubkey, message, show_only): + def decrypt_message(self, n, message): n = self._convert_prime(n) - return self.call(proto.DecryptMessage(address_n=n, pubkey=pubkey, message=message, show_only=show_only)) + return self.call(proto.DecryptMessage(address_n=n, message=message)) @field('payload') @expect(proto.Success) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index b5f81def6..394391d61 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"D\n\x0e\x45ncryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"W\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0e\n\x06pubkey\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x11\n\tshow_only\x18\x04 \x01(\x08\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xfd\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"G\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\"4\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xfd\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -214,8 +214,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3161, - serialized_end=4822, + serialized_start=3129, + serialized_end=4790, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -1397,23 +1397,23 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='address_n', full_name='EncryptMessage.address_n', index=0, - number=1, type=13, cpp_type=3, label=3, - has_default_value=False, default_value=[], + name='pubkey', full_name='EncryptMessage.pubkey', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='pubkey', full_name='EncryptMessage.pubkey', index=1, + name='message', full_name='EncryptMessage.message', index=1, number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='message', full_name='EncryptMessage.message', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", + name='display_only', full_name='EncryptMessage.display_only', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -1427,7 +1427,7 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=1921, - serialized_end=1989, + serialized_end=1992, ) @@ -1446,26 +1446,12 @@ _DECRYPTMESSAGE = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='pubkey', full_name='DecryptMessage.pubkey', index=1, + name='message', full_name='DecryptMessage.message', index=1, number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - _descriptor.FieldDescriptor( - name='message', full_name='DecryptMessage.message', index=2, - number=3, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='show_only', full_name='DecryptMessage.show_only', index=3, - number=4, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -1475,8 +1461,8 @@ _DECRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1991, - serialized_end=2078, + serialized_start=1994, + serialized_end=2046, ) @@ -1538,8 +1524,8 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2081, - serialized_end=2209, + serialized_start=2049, + serialized_end=2177, ) @@ -1580,8 +1566,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2211, - serialized_end=2300, + serialized_start=2179, + serialized_end=2268, ) @@ -1608,8 +1594,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2302, - serialized_end=2327, + serialized_start=2270, + serialized_end=2295, ) @@ -1650,8 +1636,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2329, - serialized_end=2410, + serialized_start=2297, + serialized_end=2378, ) @@ -1699,8 +1685,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2413, - serialized_end=2557, + serialized_start=2381, + serialized_end=2525, ) @@ -1741,8 +1727,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2560, - serialized_end=2693, + serialized_start=2528, + serialized_end=2661, ) @@ -1769,8 +1755,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2695, - serialized_end=2732, + serialized_start=2663, + serialized_end=2700, ) @@ -1790,8 +1776,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2734, - serialized_end=2749, + serialized_start=2702, + serialized_end=2717, ) @@ -1818,8 +1804,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2751, - serialized_end=2784, + serialized_start=2719, + serialized_end=2752, ) @@ -1846,8 +1832,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2786, - serialized_end=2821, + serialized_start=2754, + serialized_end=2789, ) @@ -1867,8 +1853,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2823, - serialized_end=2842, + serialized_start=2791, + serialized_end=2810, ) @@ -1958,8 +1944,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2845, - serialized_end=3080, + serialized_start=2813, + serialized_end=3048, ) @@ -1979,8 +1965,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3082, - serialized_end=3097, + serialized_start=3050, + serialized_end=3065, ) @@ -2021,8 +2007,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3099, - serialized_end=3158, + serialized_start=3067, + serialized_end=3126, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From da329ce24a08792c8e00cfffa33cd6efa0afab69 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 13 Jun 2014 16:39:24 +0200 Subject: [PATCH 0338/1535] add cmdtr-emu.sh for easier work with emulator --- cmdtr-emu.sh | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 cmdtr-emu.sh diff --git a/cmdtr-emu.sh b/cmdtr-emu.sh new file mode 100755 index 000000000..6caefed6e --- /dev/null +++ b/cmdtr-emu.sh @@ -0,0 +1,2 @@ +#!/bin/sh +./cmdtr.py -t pipe -p /tmp/pipe.trezor $* From 1d84a3509545fd16d9d3063fda1e022ccd7810d7 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 13 Jun 2014 19:24:53 +0200 Subject: [PATCH 0339/1535] fix str+bool concat --- trezorlib/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 6cf7e4288..dc7aff351 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -266,7 +266,7 @@ class DebugLinkMixin(object): def callback_ButtonRequest(self, msg): log("ButtonRequest code: " + get_buttonrequest_value(msg.code)) - log("Pressing button " + self.button) + log("Pressing button " + str(self.button)) self.debug.press_button(self.button) return proto.ButtonAck() From a3d22dc56e464dd6326ee12b69c4dfdf3274d58b Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 16 Jun 2014 17:16:15 +0200 Subject: [PATCH 0340/1535] add tests for EncryptMessage/DecryptMessage --- tests/test_msg_decryptmessage.py | 25 +++++++++++++++++++++++++ tests/test_msg_encryptmessage.py | 29 +++++++++++++++++++++++++++++ trezorlib/client.py | 2 +- 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 tests/test_msg_decryptmessage.py create mode 100644 tests/test_msg_encryptmessage.py diff --git a/tests/test_msg_decryptmessage.py b/tests/test_msg_decryptmessage.py new file mode 100644 index 000000000..c5fd53fb1 --- /dev/null +++ b/tests/test_msg_decryptmessage.py @@ -0,0 +1,25 @@ +import unittest +import common +import binascii + +from trezorlib.client import CallException + +class TestMsgDecryptmessage(common.TrezorTest): + + def test_decrypt(self): + self.setup_mnemonic_nopin_nopassphrase() + + dec = self.client.decrypt_message([1], binascii.unhexlify('42494531025bef848e6a92f9361eeb23ba4f7d642191c9be17d6868b3e17839d8cb4b96045bbb05c7936312088ea97d473bcfbbe020c6c67028130601022ec45ec7b34c8eb47ee785922c308c9ad25da259aa59ec21a89e327af30e4213da31f3fc70ff5ae')) + self.assertEqual(dec, 'testing message!') + + dec = self.client.decrypt_message([1], binascii.unhexlify('42494531025bef848e6a92f9361eeb23ba4f7d642191c9be17d6868b3e17839d8cb4b96045bbb05c7936312088ea97d473bcfbbe02f14a9778cbb1c5b75f8cef70581ad2c34acb7f9eb7918b17ea323123148251d8eb6d63d16ac8a86f3623855450b70d95')) + self.assertEqual(dec, '') # display only + + dec = self.client.decrypt_message([1, -2], binascii.unhexlify('424945310238cba33fd1ed1d2adebd4cc4bbd89913ecb34922c1b387c3a10d70d9de6d9ea627b49044ce1dbf26cca8a727a40366dcb1f9c9a2d5eafa90817fd0d967ca25127bea98a5e93c150544bf457b48fdd667c72b8c9c31ccd0ad2aea2f1b50ec0ce6')) + self.assertEqual(dec, 'testing message!') + + dec = self.client.decrypt_message([1, -2], binascii.unhexlify('424945310238cba33fd1ed1d2adebd4cc4bbd89913ecb34922c1b387c3a10d70d9de6d9ea627b49044ce1dbf26cca8a727a40366dc1b16f7f6acb09645d91c73619baf458ed3262da40ff25f8f64db3fd5ff19bf50fb589db3ae6cfb5b546af720aa711d81')) + self.assertEqual(dec, '') # display only + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_msg_encryptmessage.py b/tests/test_msg_encryptmessage.py new file mode 100644 index 000000000..ac76d6ccd --- /dev/null +++ b/tests/test_msg_encryptmessage.py @@ -0,0 +1,29 @@ +import unittest +import common +import binascii + +from trezorlib.client import CallException + +class TestMsgEncryptmessage(common.TrezorTest): + + def test_encrypt(self): + self.setup_mnemonic_nopin_nopassphrase() + + pubkey1 = self.client.get_public_node([1]).public_key + + enc = self.client.encrypt_message(pubkey1, 'testing message!', display_only=False) + self.assertEqual(binascii.hexlify(enc), '42494531025bef848e6a92f9361eeb23ba4f7d642191c9be17d6868b3e17839d8cb4b96045bbb05c7936312088ea97d473bcfbbe020c6c67028130601022ec45ec7b34c8eb47ee785922c308c9ad25da259aa59ec21a89e327af30e4213da31f3fc70ff5ae') + + enc = self.client.encrypt_message(pubkey1, 'testing message!', display_only=True) + self.assertEqual(binascii.hexlify(enc), '42494531025bef848e6a92f9361eeb23ba4f7d642191c9be17d6868b3e17839d8cb4b96045bbb05c7936312088ea97d473bcfbbe02f14a9778cbb1c5b75f8cef70581ad2c34acb7f9eb7918b17ea323123148251d8eb6d63d16ac8a86f3623855450b70d95') + + pubkey2 = self.client.get_public_node([1, -2]).public_key + + enc = self.client.encrypt_message(pubkey2, 'testing message!', display_only=False) + self.assertEqual(binascii.hexlify(enc), '424945310238cba33fd1ed1d2adebd4cc4bbd89913ecb34922c1b387c3a10d70d9de6d9ea627b49044ce1dbf26cca8a727a40366dcb1f9c9a2d5eafa90817fd0d967ca25127bea98a5e93c150544bf457b48fdd667c72b8c9c31ccd0ad2aea2f1b50ec0ce6') + + enc = self.client.encrypt_message(pubkey2, 'testing message!', display_only=True) + self.assertEqual(binascii.hexlify(enc), '424945310238cba33fd1ed1d2adebd4cc4bbd89913ecb34922c1b387c3a10d70d9de6d9ea627b49044ce1dbf26cca8a727a40366dc1b16f7f6acb09645d91c73619baf458ed3262da40ff25f8f64db3fd5ff19bf50fb589db3ae6cfb5b546af720aa711d81') + +if __name__ == '__main__': + unittest.main() diff --git a/trezorlib/client.py b/trezorlib/client.py index dc7aff351..29b5990e2 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -127,7 +127,7 @@ class DebugWireMixin(object): def call_raw(self, msg): log("SENDING " + pprint(msg)) resp = super(DebugWireMixin, self).call_raw(msg) - log("RECEIVED" + pprint(resp)) + log("RECEIVED " + pprint(resp)) return resp class TextUIMixin(object): From 260a4322a6e45fdbf789c245e5fd3553d9819e55 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 17 Jun 2014 15:31:10 +0200 Subject: [PATCH 0341/1535] add ClearSession message with unit test --- cmdtr.py | 4 + tests/test_msg_clearsession.py | 39 +++++ trezorlib/client.py | 5 + trezorlib/messages_pb2.py | 269 +++++++++++++++++++-------------- 4 files changed, 200 insertions(+), 117 deletions(-) create mode 100644 tests/test_msg_clearsession.py diff --git a/cmdtr.py b/cmdtr.py index 56aa726c6..146d5867e 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -108,6 +108,9 @@ class Commands(object): def set_label(self, args): return self.client.apply_settings(label=args.label) + def clear_session(self, args): + return self.client.clear_session() + def change_pin(self, args): return self.client.change_pin(args.remove) @@ -187,6 +190,7 @@ class Commands(object): get_features.help = 'Retrieve device features and settings' get_public_node.help = 'Get public node of given path' set_label.help = 'Set new wallet label' + clear_session.help = 'Clear session (remove cached PIN, passphrase, etc.)' change_pin.help = 'Change new PIN or remove existing' list_coins.help = 'List all supported coin types by the device' wipe_device.help = 'Reset device to factory defaults and remove all private data.' diff --git a/tests/test_msg_clearsession.py b/tests/test_msg_clearsession.py new file mode 100644 index 000000000..38a87f2c9 --- /dev/null +++ b/tests/test_msg_clearsession.py @@ -0,0 +1,39 @@ +import time +import unittest +import common + +from trezorlib import messages_pb2 as proto +from trezorlib import types_pb2 as proto_types + +class TestMsgClearsession(common.TrezorTest): + + def test_clearsession(self): + self.setup_mnemonic_pin_passphrase() + + with self.client: + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ProtectCall), proto.PinMatrixRequest(), proto.PassphraseRequest(), proto.Success()]) + res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) + self.assertEqual(res, 'random data') + + with self.client: + # pin and passphrase are cached + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ProtectCall), proto.Success()]) + res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) + self.assertEqual(res, 'random data') + + self.client.clear_session() + + # session cache is cleared + with self.client: + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ProtectCall), proto.PinMatrixRequest(), proto.PassphraseRequest(), proto.Success()]) + res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) + self.assertEqual(res, 'random data') + + with self.client: + # pin and passphrase are cached + self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ProtectCall), proto.Success()]) + res = self.client.ping('random data', button_protection=True, pin_protection=True, passphrase_protection=True) + self.assertEqual(res, 'random data') + +if __name__ == '__main__': + unittest.main() diff --git a/trezorlib/client.py b/trezorlib/client.py index 29b5990e2..34ecefd64 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -378,6 +378,11 @@ class ProtocolMixin(object): self.init_device() # Reload Features return out + @field('message') + @expect(proto.Success) + def clear_session(self): + return self.call(proto.ClearSession()) + @field('message') @expect(proto.Success) def change_pin(self, remove=False): diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 394391d61..472bfca64 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"G\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\"4\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xfd\x0c\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"G\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\"4\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xa1\r\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -116,106 +116,110 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ApplySettings', index=23, number=25, + name='MessageType_ClearSession', index=23, number=24, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonRequest', index=24, number=26, + name='MessageType_ApplySettings', index=24, number=25, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_ButtonRequest', index=25, number=26, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonAck', index=25, number=27, + name='MessageType_ButtonAck', index=26, number=27, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_GetAddress', index=26, number=29, + name='MessageType_GetAddress', index=27, number=29, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_Address', index=27, number=30, + name='MessageType_Address', index=28, number=30, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyRequest', index=28, number=35, + name='MessageType_EntropyRequest', index=29, number=35, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyAck', index=29, number=36, + name='MessageType_EntropyAck', index=30, number=36, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_SignMessage', index=30, number=38, + name='MessageType_SignMessage', index=31, number=38, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_VerifyMessage', index=31, number=39, + name='MessageType_VerifyMessage', index=32, number=39, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_MessageSignature', index=32, number=40, + name='MessageType_MessageSignature', index=33, number=40, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EncryptMessage', index=33, number=48, + name='MessageType_EncryptMessage', index=34, number=48, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DecryptMessage', index=34, number=49, + name='MessageType_DecryptMessage', index=35, number=49, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PassphraseRequest', index=35, number=41, + name='MessageType_PassphraseRequest', index=36, number=41, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PassphraseAck', index=36, number=42, + name='MessageType_PassphraseAck', index=37, number=42, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EstimateTxSize', index=37, number=43, + name='MessageType_EstimateTxSize', index=38, number=43, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxSize', index=38, number=44, + name='MessageType_TxSize', index=39, number=44, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_RecoveryDevice', index=39, number=45, + name='MessageType_RecoveryDevice', index=40, number=45, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_WordRequest', index=40, number=46, + name='MessageType_WordRequest', index=41, number=46, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_WordAck', index=41, number=47, + name='MessageType_WordAck', index=42, number=47, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkDecision', index=42, number=100, + name='MessageType_DebugLinkDecision', index=43, number=100, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkGetState', index=43, number=101, + name='MessageType_DebugLinkGetState', index=44, number=101, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkState', index=44, number=102, + name='MessageType_DebugLinkState', index=45, number=102, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkStop', index=45, number=103, + name='MessageType_DebugLinkStop', index=46, number=103, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkLog', index=46, number=104, + name='MessageType_DebugLinkLog', index=47, number=104, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), ], containing_type=None, options=None, - serialized_start=3129, - serialized_end=4790, + serialized_start=3145, + serialized_end=4842, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -242,6 +246,7 @@ MessageType_Cancel = 20 MessageType_TxRequest = 21 MessageType_TxAck = 22 MessageType_CipherKeyValue = 23 +MessageType_ClearSession = 24 MessageType_ApplySettings = 25 MessageType_ButtonRequest = 26 MessageType_ButtonAck = 27 @@ -416,6 +421,27 @@ _FEATURES = _descriptor.Descriptor( ) +_CLEARSESSION = _descriptor.Descriptor( + name='ClearSession', + full_name='ClearSession', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=383, + serialized_end=397, +) + + _APPLYSETTINGS = _descriptor.Descriptor( name='ApplySettings', full_name='ApplySettings', @@ -446,8 +472,8 @@ _APPLYSETTINGS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=383, - serialized_end=431, + serialized_start=399, + serialized_end=447, ) @@ -474,8 +500,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=433, - serialized_end=460, + serialized_start=449, + serialized_end=476, ) @@ -523,8 +549,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=462, - serialized_end=567, + serialized_start=478, + serialized_end=583, ) @@ -558,8 +584,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=569, - serialized_end=612, + serialized_start=585, + serialized_end=628, ) @@ -593,8 +619,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=614, - serialized_end=668, + serialized_start=630, + serialized_end=684, ) @@ -628,8 +654,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=670, - serialized_end=733, + serialized_start=686, + serialized_end=749, ) @@ -649,8 +675,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=735, - serialized_end=746, + serialized_start=751, + serialized_end=762, ) @@ -677,8 +703,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=748, - serialized_end=803, + serialized_start=764, + serialized_end=819, ) @@ -705,8 +731,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=805, - serialized_end=832, + serialized_start=821, + serialized_end=848, ) @@ -726,8 +752,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=834, - serialized_end=842, + serialized_start=850, + serialized_end=858, ) @@ -747,8 +773,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=844, - serialized_end=863, + serialized_start=860, + serialized_end=879, ) @@ -775,8 +801,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=865, - serialized_end=900, + serialized_start=881, + serialized_end=916, ) @@ -803,8 +829,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=902, - serialized_end=928, + serialized_start=918, + serialized_end=944, ) @@ -831,8 +857,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=930, - serialized_end=956, + serialized_start=946, + serialized_end=972, ) @@ -859,8 +885,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=958, - serialized_end=991, + serialized_start=974, + serialized_end=1007, ) @@ -887,8 +913,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=993, - serialized_end=1031, + serialized_start=1009, + serialized_end=1047, ) @@ -922,8 +948,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1033, - serialized_end=1092, + serialized_start=1049, + serialized_end=1108, ) @@ -950,8 +976,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1094, - serialized_end=1120, + serialized_start=1110, + serialized_end=1136, ) @@ -971,8 +997,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1122, - serialized_end=1134, + serialized_start=1138, + serialized_end=1150, ) @@ -1041,8 +1067,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1137, - serialized_end=1303, + serialized_start=1153, + serialized_end=1319, ) @@ -1104,8 +1130,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1306, - serialized_end=1463, + serialized_start=1322, + serialized_end=1479, ) @@ -1125,8 +1151,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1465, - serialized_end=1481, + serialized_start=1481, + serialized_end=1497, ) @@ -1153,8 +1179,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1483, - serialized_end=1512, + serialized_start=1499, + serialized_end=1528, ) @@ -1216,8 +1242,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1515, - serialized_end=1674, + serialized_start=1531, + serialized_end=1690, ) @@ -1237,8 +1263,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1676, - serialized_end=1689, + serialized_start=1692, + serialized_end=1705, ) @@ -1265,8 +1291,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1691, - serialized_end=1714, + serialized_start=1707, + serialized_end=1730, ) @@ -1307,8 +1333,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1716, - serialized_end=1793, + serialized_start=1732, + serialized_end=1809, ) @@ -1349,8 +1375,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1795, - serialized_end=1863, + serialized_start=1811, + serialized_end=1879, ) @@ -1384,8 +1410,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1865, - serialized_end=1919, + serialized_start=1881, + serialized_end=1935, ) @@ -1426,8 +1452,8 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1921, - serialized_end=1992, + serialized_start=1937, + serialized_end=2008, ) @@ -1461,8 +1487,8 @@ _DECRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1994, - serialized_end=2046, + serialized_start=2010, + serialized_end=2062, ) @@ -1524,8 +1550,8 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2049, - serialized_end=2177, + serialized_start=2065, + serialized_end=2193, ) @@ -1566,8 +1592,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2179, - serialized_end=2268, + serialized_start=2195, + serialized_end=2284, ) @@ -1594,8 +1620,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2270, - serialized_end=2295, + serialized_start=2286, + serialized_end=2311, ) @@ -1636,8 +1662,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2297, - serialized_end=2378, + serialized_start=2313, + serialized_end=2394, ) @@ -1685,8 +1711,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2381, - serialized_end=2525, + serialized_start=2397, + serialized_end=2541, ) @@ -1727,8 +1753,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2528, - serialized_end=2661, + serialized_start=2544, + serialized_end=2677, ) @@ -1755,8 +1781,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2663, - serialized_end=2700, + serialized_start=2679, + serialized_end=2716, ) @@ -1776,8 +1802,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2702, - serialized_end=2717, + serialized_start=2718, + serialized_end=2733, ) @@ -1804,8 +1830,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2719, - serialized_end=2752, + serialized_start=2735, + serialized_end=2768, ) @@ -1832,8 +1858,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2754, - serialized_end=2789, + serialized_start=2770, + serialized_end=2805, ) @@ -1853,8 +1879,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2791, - serialized_end=2810, + serialized_start=2807, + serialized_end=2826, ) @@ -1944,8 +1970,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2813, - serialized_end=3048, + serialized_start=2829, + serialized_end=3064, ) @@ -1965,8 +1991,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3050, - serialized_end=3065, + serialized_start=3066, + serialized_end=3081, ) @@ -2007,8 +2033,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3067, - serialized_end=3126, + serialized_start=3083, + serialized_end=3142, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -2027,6 +2053,7 @@ _TXACK.fields_by_name['tx'].message_type = types_pb2._TRANSACTIONTYPE _DEBUGLINKSTATE.fields_by_name['node'].message_type = types_pb2._HDNODETYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE DESCRIPTOR.message_types_by_name['Features'] = _FEATURES +DESCRIPTOR.message_types_by_name['ClearSession'] = _CLEARSESSION DESCRIPTOR.message_types_by_name['ApplySettings'] = _APPLYSETTINGS DESCRIPTOR.message_types_by_name['ChangePin'] = _CHANGEPIN DESCRIPTOR.message_types_by_name['Ping'] = _PING @@ -2085,6 +2112,12 @@ class Features(_message.Message): # @@protoc_insertion_point(class_scope:Features) +class ClearSession(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _CLEARSESSION + + # @@protoc_insertion_point(class_scope:ClearSession) + class ApplySettings(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _APPLYSETTINGS @@ -2404,6 +2437,8 @@ _MESSAGETYPE.values_by_name["MessageType_TxAck"].has_options = True _MESSAGETYPE.values_by_name["MessageType_TxAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_CipherKeyValue"].has_options = True _MESSAGETYPE.values_by_name["MessageType_CipherKeyValue"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_ClearSession"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_ClearSession"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_ApplySettings"].has_options = True _MESSAGETYPE.values_by_name["MessageType_ApplySettings"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_ButtonRequest"].has_options = True From d46bdf2f6e9dbc6ed80e1a1dcb1ec4cbd5c0164a Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 17 Jun 2014 16:02:21 +0200 Subject: [PATCH 0342/1535] reenable TestDebugLink.test_layout --- tests/test_debuglink.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/test_debuglink.py b/tests/test_debuglink.py index b1a777dd1..3ad80448a 100644 --- a/tests/test_debuglink.py +++ b/tests/test_debuglink.py @@ -9,12 +9,9 @@ from trezorlib.client import PinException class TestDebugLink(common.TrezorTest): - # disable for now - """ def test_layout(self): layout = self.client.debug.read_layout() self.assertEqual(len(layout), 1024) - """ def test_mnemonic(self): self.setup_mnemonic_nopin_nopassphrase() From 8b7575eeb349be3e7cb3962b060634c7487d8862 Mon Sep 17 00:00:00 2001 From: Timothy Hobbs Date: Tue, 17 Jun 2014 21:47:25 +0000 Subject: [PATCH 0343/1535] Delete repeated heading in readme --- README.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.rst b/README.rst index d12461ac1..9b110faae 100644 --- a/README.rst +++ b/README.rst @@ -5,9 +5,6 @@ Client side implementation for Trezor-compatible Bitcoin hardware wallets. See http://bitcointrezor.com for more information. -How to install (Debian/Ubuntu) ---------------------------------------- - How to install (Windows) ------------------------ * Install Python 2.7 (http://python.org) From 7305a77f3ee988528cc01ce2cecf70a3117a24f0 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 18 Jun 2014 17:13:11 +0200 Subject: [PATCH 0344/1535] make test_255_outputs more general and rename to test_lots_of_outputs new test test_lots_of_inputs --- tests/test_msg_signtx.py | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py index cebf30337..778377ff4 100644 --- a/tests/test_msg_signtx.py +++ b/tests/test_msg_signtx.py @@ -1,6 +1,3 @@ -# tx 4a7b7e0403ae5607e473949cfa03f09f2cd8b0f404bf99ce10b7303d86280bf7 -# 100 UTXO for spending for unittests - import unittest import common import binascii @@ -289,7 +286,24 @@ class TestMsgSigntx(common.TrezorTest): # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb self.assertEqual(binascii.hexlify(serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') - def test_255_outputs(self): + def test_lots_of_inputs(self): + self.setup_mnemonic_nopin_nopassphrase() + # Tests if device implements serialization of len(inputs) correctly + # tx 4a7b7e0403ae5607e473949cfa03f09f2cd8b0f404bf99ce10b7303d86280bf7 : 100 UTXO for spending for unittests + inputs = [] + for i in range(100): + inputs.append( proto_types.TxInputType(address_n=[4], # 1NwN6UduuVkJi6sw3gSiKZaCY5rHgVXC2h + prev_hash=binascii.unhexlify('4a7b7e0403ae5607e473949cfa03f09f2cd8b0f404bf99ce10b7303d86280bf7'), + prev_index=i) ) + out = proto_types.TxOutputType(address='19dvDdyxxptP9dGvozYe8BP6tgFV9L4jg5', + amount=100 * 26000 - 15 * 10000, + script_type=proto_types.PAYTOADDRESS) + with self.client: + (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', inputs, [out]) + # Accepted by network: tx 23d9d8eecf3abf6c0f0f3f8b0976a04792d7f1c9a4ea9b0a8931734949e27c92 + # too big put in unit test + + def test_lots_of_outputs(self): self.setup_mnemonic_nopin_nopassphrase() # Tests if device implements serialization of len(outputs) correctly @@ -312,9 +326,10 @@ class TestMsgSigntx(common.TrezorTest): ) outputs = [] - for _ in range(255): + cnt = 255 + for _ in range(cnt): out = proto_types.TxOutputType(address='1NwN6UduuVkJi6sw3gSiKZaCY5rHgVXC2h', - amount=10200, + amount=(100000 + 2540000 - 39000) / cnt, script_type=proto_types.PAYTOADDRESS, ) outputs.append(out) @@ -331,8 +346,8 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), ] + [ item for items in itertools.izip( - [proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=I)) for I in range(255)], - [proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput)] * 255 + [proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=I)) for I in range(cnt)], + [proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput)] * cnt ) for item in items ] + [ proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), @@ -343,17 +358,18 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), ] + [ - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=I)) for I in range(255) + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=I)) for I in range(cnt) ] + [ proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), ] + [ - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=I)) for I in range(255) + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=I)) for I in range(cnt) ] + [ proto.TxRequest(request_type=proto_types.TXFINISHED), ]) (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, inp2], outputs) - self.assertEqual(binascii.hexlify(serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00' + 'd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac' * 255 + '00000000') + if cnt == 255: + self.assertEqual(binascii.hexlify(serialized_tx), '0100000002fb792f470a58993e14964c9bd46cdf37cb4bbc3f61540cb651580c82ed243ec6010000006b483045022100969da46f94a81f34f3717b014e0c3e1826eda1b0022ec2f9ce39f3d750ab9235022026da269770993211a1503413566a339bbb4389a482fffcf8e1f76713fc3b94f5012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902ffffffffe56582d2119100cb1d3da8232291e053f71e25fb669c87b32a667749959ea239010000006a473044022052e1419bb237b9db400ab5e3df16db6355619d545fde9030924a360763ae9ad40220704beab04d72ecaeb42eca7d98faca7a0941e65f2e1341f183be2b83e6b09e1c012103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902fffffffffdff00' + 'd8270000000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac' * cnt + '00000000') def test_fee_too_high(self): self.setup_mnemonic_nopin_nopassphrase() From 69dda6c61c34d4a3dd7eebed85a09fbad1eec0f2 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 21 Jun 2014 00:31:16 +0200 Subject: [PATCH 0345/1535] fix decrypt_keyvalue --- cmdtr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmdtr.py b/cmdtr.py index 146d5867e..446ea68e1 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -170,7 +170,7 @@ class Commands(object): def decrypt_keyvalue(self, args): address_n = self.client.expand_path(args.n) - ret = self.client.decrypt_keyvalue(address_n, args.key, value) + ret = self.client.decrypt_keyvalue(address_n, args.key, args.value) return ret def firmware_update(self, args): From 2d2e31fa50b19b9bc4f301eb1fe0ea1d4167fa91 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 27 Jun 2014 17:02:44 +0200 Subject: [PATCH 0346/1535] refactor pprint (add new inspection fields, but comment them) --- tests/.gitignore | 1 + trezorlib/client.py | 14 ++++++++++++-- trezorlib/protobuf_json.py | 24 +++++++++++++----------- 3 files changed, 26 insertions(+), 13 deletions(-) create mode 100644 tests/.gitignore diff --git a/tests/.gitignore b/tests/.gitignore new file mode 100644 index 000000000..f47cb2045 --- /dev/null +++ b/tests/.gitignore @@ -0,0 +1 @@ +*.out diff --git a/trezorlib/client.py b/trezorlib/client.py index 34ecefd64..495a6a1d2 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -4,10 +4,13 @@ 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 @@ -19,10 +22,17 @@ def get_buttonrequest_value(code): 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__.__name__, msg.ByteSize()) + return "<%s> (%d bytes):\n" % (msg_class, msg_size) else: - return "<%s> (%d bytes):\n%s" % (msg.__class__.__name__, msg.ByteSize(), msg) + return "<%s> (%d bytes):\n%s" % (msg_class, msg_size, msg) def log(msg): sys.stderr.write("%s\n" % msg) diff --git a/trezorlib/protobuf_json.py b/trezorlib/protobuf_json.py index 2704fef6c..0ba7d26ba 100644 --- a/trezorlib/protobuf_json.py +++ b/trezorlib/protobuf_json.py @@ -37,12 +37,13 @@ Provide serialization and de-serialization of Google's protobuf Messages into/fr # Note that preservation of unknown fields is currently not available for Python (c) google docs # extensions is not supported from 0.0.5 (due to gpb2.3 changes) -__version__ = '0.0.5' -__author__ = 'Paul Dovbush ' +__version__='0.0.5' +__author__='Paul Dovbush ' -import json # py2.6+ TODO: add support for other JSON serialization modules +import json # py2.6+ TODO: add support for other JSON serialization modules from google.protobuf.descriptor import FieldDescriptor as FD +import binascii class ParseError(Exception): pass @@ -58,7 +59,7 @@ def json2pb(pb, js): elif field.type in _js2ftype: ftype = _js2ftype[field.type] else: - raise ParseError("Field %s.%s of type '%d' is not supported" % (pb.__class__.__name__, field.name, field.type,)) + raise ParseError("Field %s.%s of type '%d' is not supported" % (pb.__class__.__name__, field.name, field.type, )) value = js[field.name] if field.label == FD.LABEL_REPEATED: pb_value = getattr(pb, field.name, None) @@ -76,17 +77,18 @@ def json2pb(pb, js): -def pb2json(pb, js={}): +def pb2json(pb): ''' convert google.protobuf.descriptor instance to JSON string ''' + js = {} # fields = pb.DESCRIPTOR.fields #all fields - fields = pb.ListFields() # only filled (including extensions) - for field, value in fields: + fields = pb.ListFields() #only filled (including extensions) + for field,value in fields: if field.type == FD.TYPE_MESSAGE: ftype = pb2json elif field.type in _ftype2js: ftype = _ftype2js[field.type] else: - raise ParseError("Field %s.%s of type '%d' is not supported" % (pb.__class__.__name__, field.name, field.type,)) + raise ParseError("Field %s.%s of type '%d' is not supported" % (pb.__class__.__name__, field.name, field.type, )) if field.label == FD.LABEL_REPEATED: js_value = [] for v in value: @@ -107,8 +109,8 @@ _ftype2js = { FD.TYPE_FIXED32: float, FD.TYPE_BOOL: bool, FD.TYPE_STRING: unicode, - # FD.TYPE_MESSAGE: pb2json, #handled specially - FD.TYPE_BYTES: lambda x: x.encode('string_escape'), + #FD.TYPE_MESSAGE: pb2json, #handled specially + FD.TYPE_BYTES: lambda x: binascii.hexlify(x), FD.TYPE_UINT32: int, FD.TYPE_ENUM: int, FD.TYPE_SFIXED32: float, @@ -128,7 +130,7 @@ _js2ftype = { FD.TYPE_BOOL: bool, FD.TYPE_STRING: unicode, # FD.TYPE_MESSAGE: json2pb, #handled specially - FD.TYPE_BYTES: lambda x: x.decode('string_escape'), + FD.TYPE_BYTES: lambda x: binascii.unhexlify(x), FD.TYPE_UINT32: int, FD.TYPE_ENUM: int, FD.TYPE_SFIXED32: float, From c31157fea104ff1e86fc39d03336a6d302cdc6cb Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 2 Jul 2014 22:57:55 +0200 Subject: [PATCH 0347/1535] print firmware fingerprint on upload --- trezorlib/client.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 495a6a1d2..1e6edbedd 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -729,7 +729,11 @@ class ProtocolMixin(object): if isinstance(resp, proto.Failure) and resp.code == types.Failure_FirmwareError: return False - resp = self.call(proto.FirmwareUpload(payload=fp.read())) + data = fp.read() + fingerprint = hashlib.sha256(data[256:]).hexdigest() + log("Firmware fingerprint: " + fingerprint) + resp = self.call(proto.FirmwareUpload(payload=data)) + if isinstance(resp, proto.Success): return True From 0106e6b6fb05aa606aa7d07aa14a8fd3dc72842a Mon Sep 17 00:00:00 2001 From: slush0 Date: Wed, 9 Jul 2014 23:41:02 +0200 Subject: [PATCH 0348/1535] Added '?' to pinmatrix --- trezorlib/pinmatrix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/pinmatrix.py b/trezorlib/pinmatrix.py index 24f6ea473..749c69b54 100644 --- a/trezorlib/pinmatrix.py +++ b/trezorlib/pinmatrix.py @@ -7,7 +7,7 @@ from PyQt4.QtCore import QObject, SIGNAL, QRegExp, Qt class PinButton(QPushButton): def __init__(self, password, encoded_value): - super(PinButton, self).__init__() + super(PinButton, self).__init__('?') self.password = password self.encoded_value = encoded_value From 706807e0b642f8245498fdb3e66a03ae94ec0494 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 10 Jul 2014 00:02:34 +0200 Subject: [PATCH 0349/1535] Removed debugging print --- trezorlib/qt/pinmatrix.py | 110 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 trezorlib/qt/pinmatrix.py diff --git a/trezorlib/qt/pinmatrix.py b/trezorlib/qt/pinmatrix.py new file mode 100644 index 000000000..0ce8bef0e --- /dev/null +++ b/trezorlib/qt/pinmatrix.py @@ -0,0 +1,110 @@ +import sys +import math +import operator +from PyQt4.Qt import QApplication, QWidget, QGridLayout, QVBoxLayout, QHBoxLayout +from PyQt4.QtGui import QPushButton, QLineEdit, QSizePolicy, QRegExpValidator, QLabel +from PyQt4.QtCore import QObject, SIGNAL, QRegExp, Qt + +class PinButton(QPushButton): + def __init__(self, password, encoded_value): + super(PinButton, self).__init__('?') + self.password = password + self.encoded_value = encoded_value + + QObject.connect(self, SIGNAL('clicked()'), self._pressed) + + def _pressed(self): + self.password.setText(self.password.text() + str(self.encoded_value)) + self.password.setFocus() + +class PinMatrixWidget(QWidget): + ''' + Displays widget with nine blank buttons and password box. + Encodes button clicks into sequence of numbers for passing + into PinAck messages of Trezor. + + show_strength=True may be useful for entering new PIN + ''' + def __init__(self, show_strength=True, parent=None): + super(PinMatrixWidget, self).__init__(parent) + + self.password = QLineEdit() + self.password.setValidator(QRegExpValidator(QRegExp('[1-9]+'), None)) + self.password.setEchoMode(QLineEdit.Password) + QObject.connect(self.password, SIGNAL('textChanged(QString)'), self._password_changed) + + self.strength = QLabel() + self.strength.setMinimumWidth(75) + self.strength.setAlignment(Qt.AlignCenter) + self._set_strength(0) + + grid = QGridLayout() + grid.setSpacing(0) + for y in range(3)[::-1]: + for x in range(3): + button = PinButton(self.password, x + y * 3 + 1) + button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + button.setFocusPolicy(Qt.NoFocus) + grid.addWidget(button, 3 - y, x) + + hbox = QHBoxLayout() + hbox.addWidget(self.password) + if show_strength: + hbox.addWidget(self.strength) + + vbox = QVBoxLayout() + vbox.addLayout(grid) + vbox.addLayout(hbox) + self.setLayout(vbox) + + def _set_strength(self, strength): + if strength < 3000: + self.strength.setText('weak') + self.strength.setStyleSheet("QLabel { color : #d00; }") + elif strength < 60000: + self.strength.setText('fine') + self.strength.setStyleSheet("QLabel { color : #db0; }") + elif strength < 360000: + self.strength.setText('strong') + self.strength.setStyleSheet("QLabel { color : #0a0; }") + else: + self.strength.setText('ULTIMATE') + self.strength.setStyleSheet("QLabel { color : #000; font-weight: bold;}") + + def _password_changed(self, password): + self._set_strength(self.get_strength()) + + def get_strength(self): + digits = len(set(str(self.password.text()))) + strength = math.factorial(9) / math.factorial(9 - digits) + return strength + + def get_value(self): + return self.password.text() + +if __name__ == '__main__': + ''' + Demo application showing PinMatrix widget in action + ''' + a = QApplication(sys.argv) + + matrix = PinMatrixWidget() + + def clicked(): + print "PinMatrix value is", matrix.get_value() + print "Possible button combinations:", matrix.get_strength() + sys.exit() + + ok = QPushButton('OK') + QObject.connect(ok, SIGNAL('clicked()'), clicked) + + vbox = QVBoxLayout() + vbox.addWidget(matrix) + vbox.addWidget(ok) + + w = QWidget() + w.setLayout(vbox) + w.move(100, 100) + w.show() + + a.exec_() From aec4908fd7c1d32a1a90d12d4fe3586b4a750ad6 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 10 Jul 2014 00:44:46 +0200 Subject: [PATCH 0350/1535] HidTransport raises ConnectionException when disconnected during HID session --- trezorlib/pinmatrix.py | 111 ------------------------------------- trezorlib/transport.py | 3 + trezorlib/transport_hid.py | 20 ++++++- 3 files changed, 20 insertions(+), 114 deletions(-) delete mode 100644 trezorlib/pinmatrix.py diff --git a/trezorlib/pinmatrix.py b/trezorlib/pinmatrix.py deleted file mode 100644 index 749c69b54..000000000 --- a/trezorlib/pinmatrix.py +++ /dev/null @@ -1,111 +0,0 @@ -import sys -import math -import operator -from PyQt4.Qt import QApplication, QWidget, QGridLayout, QVBoxLayout, QHBoxLayout -from PyQt4.QtGui import QPushButton, QLineEdit, QSizePolicy, QRegExpValidator, QLabel -from PyQt4.QtCore import QObject, SIGNAL, QRegExp, Qt - -class PinButton(QPushButton): - def __init__(self, password, encoded_value): - super(PinButton, self).__init__('?') - self.password = password - self.encoded_value = encoded_value - - QObject.connect(self, SIGNAL('clicked()'), self._pressed) - - def _pressed(self): - self.password.setText(self.password.text() + str(self.encoded_value)) - print self.encoded_value - self.password.setFocus() - -class PinMatrixWidget(QWidget): - ''' - Displays widget with nine blank buttons and password box. - Encodes button clicks into sequence of numbers for passing - into PinAck messages of Trezor. - - show_strength=True may be useful for entering new PIN - ''' - def __init__(self, show_strength=True, parent=None): - super(PinMatrixWidget, self).__init__(parent) - - self.password = QLineEdit() - self.password.setValidator(QRegExpValidator(QRegExp('[1-9]+'), None)) - self.password.setEchoMode(QLineEdit.Password) - QObject.connect(self.password, SIGNAL('textChanged(QString)'), self._password_changed) - - self.strength = QLabel() - self.strength.setMinimumWidth(75) - self.strength.setAlignment(Qt.AlignCenter) - self._set_strength(0) - - grid = QGridLayout() - grid.setSpacing(0) - for y in range(3)[::-1]: - for x in range(3): - button = PinButton(self.password, x + y * 3 + 1) - button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - button.setFocusPolicy(Qt.NoFocus) - grid.addWidget(button, 3 - y, x) - - hbox = QHBoxLayout() - hbox.addWidget(self.password) - if show_strength: - hbox.addWidget(self.strength) - - vbox = QVBoxLayout() - vbox.addLayout(grid) - vbox.addLayout(hbox) - self.setLayout(vbox) - - def _set_strength(self, strength): - if strength < 3000: - self.strength.setText('weak') - self.strength.setStyleSheet("QLabel { color : #d00; }") - elif strength < 60000: - self.strength.setText('fine') - self.strength.setStyleSheet("QLabel { color : #db0; }") - elif strength < 360000: - self.strength.setText('strong') - self.strength.setStyleSheet("QLabel { color : #0a0; }") - else: - self.strength.setText('ULTIMATE') - self.strength.setStyleSheet("QLabel { color : #000; font-weight: bold;}") - - def _password_changed(self, password): - self._set_strength(self.get_strength()) - - def get_strength(self): - digits = len(set(str(self.password.text()))) - strength = math.factorial(9) / math.factorial(9 - digits) - return strength - - def get_value(self): - return self.password.text() - -if __name__ == '__main__': - ''' - Demo application showing PinMatrix widget in action - ''' - a = QApplication(sys.argv) - - matrix = PinMatrixWidget() - - def clicked(): - print "PinMatrix value is", matrix.get_value() - print "Possible button combinations:", matrix.get_strength() - sys.exit() - - ok = QPushButton('OK') - QObject.connect(ok, SIGNAL('clicked()'), clicked) - - vbox = QVBoxLayout() - vbox.addWidget(matrix) - vbox.addWidget(ok) - - w = QWidget() - w.setLayout(vbox) - w.move(100, 100) - w.show() - - a.exec_() diff --git a/trezorlib/transport.py b/trezorlib/transport.py index f2aaeb065..afe59d4c3 100644 --- a/trezorlib/transport.py +++ b/trezorlib/transport.py @@ -4,6 +4,9 @@ import mapping class NotImplementedException(Exception): pass +class ConnectionError(Exception): + pass + class Transport(object): def __init__(self, device, *args, **kwargs): self.device = device diff --git a/trezorlib/transport_hid.py b/trezorlib/transport_hid.py index bb1f9adf9..4a3cff505 100644 --- a/trezorlib/transport_hid.py +++ b/trezorlib/transport_hid.py @@ -3,7 +3,7 @@ import hid import time import platform -from transport import Transport, NotImplementedException +from transport import Transport, ConnectionError, NotImplementedException DEVICE_IDS = [ (0x10c4, 0xea80), # Shield @@ -17,11 +17,12 @@ class FakeRead(object): def read(self, size): return self.func(size) - + class HidTransport(Transport): def __init__(self, device, *args, **kwargs): self.hid = None self.buffer = '' + # self.read_timeout = kwargs.get('read_timeout') device = device[int(bool(kwargs.get('debug_link')))] super(HidTransport, self).__init__(device, *args, **kwargs) @@ -71,6 +72,13 @@ class HidTransport(Transport): # List of two-tuples (path_normal, path_debuglink) return devices.values() + + def is_connected(self): + # Check if the device is still connected + for d in hid.enumerate(0, 0): + if d['path'] == self.device: + return True + return False def _open(self): self.buffer = '' @@ -99,10 +107,16 @@ class HidTransport(Transport): (msg_type, datalen) = self._read_headers(FakeRead(self._raw_read)) return (msg_type, self._raw_read(datalen)) - def _raw_read(self, length): + def _raw_read(self, length): + start = time.time() while len(self.buffer) < length: data = self.hid.read(64) if not len(data): + if time.time() - start > 10 and not self.is_connected(): + # Over 10 of no response, let's check if + # device is still alive + raise ConnectionError("Connection failed") + time.sleep(0.05) continue From a0d73b25feed57848c405ef6cfc4d14bcdb5dfb2 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 10 Jul 2014 18:07:00 +0200 Subject: [PATCH 0351/1535] change logic of recovery --- tests/test_msg_recoverydevice.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/test_msg_recoverydevice.py b/tests/test_msg_recoverydevice.py index 47dbf23aa..cdc55f61e 100644 --- a/tests/test_msg_recoverydevice.py +++ b/tests/test_msg_recoverydevice.py @@ -25,7 +25,7 @@ class TestDeviceRecovery(common.TrezorTest): ret = self.client.call_raw(proto.PinMatrixAck(pin=pin_encoded)) fakes = 0 - for _ in range(int(12 * 1.5)): + for _ in range(int(12 * 2)): self.assertIsInstance(ret, proto.WordRequest) (word, pos) = self.client.debug.read_recovery_word() @@ -41,8 +41,8 @@ class TestDeviceRecovery(common.TrezorTest): # Workflow succesfully ended self.assertIsInstance(ret, proto.Success) - # 6 expected fake words and all words of mnemonic are used - self.assertEqual(fakes, 6) + # 12 expected fake words and all words of mnemonic are used + self.assertEqual(fakes, 12) self.assertEqual(mnemonic, [None] * 12) # Mnemonic is the same @@ -72,7 +72,7 @@ class TestDeviceRecovery(common.TrezorTest): enforce_wordlist=True)) fakes = 0 - for _ in range(int(12 * 1.5)): + for _ in range(int(12 * 2)): self.assertIsInstance(ret, proto.WordRequest) (word, pos) = self.client.debug.read_recovery_word() @@ -88,8 +88,8 @@ class TestDeviceRecovery(common.TrezorTest): # Workflow succesfully ended self.assertIsInstance(ret, proto.Success) - # 6 expected fake words and all words of mnemonic are used - self.assertEqual(fakes, 6) + # 12 expected fake words and all words of mnemonic are used + self.assertEqual(fakes, 12) self.assertEqual(mnemonic, [None] * 12) # Mnemonic is the same @@ -116,7 +116,7 @@ class TestDeviceRecovery(common.TrezorTest): enforce_wordlist=True)) self.assertIsInstance(ret, proto.WordRequest) - for _ in range(int(12 * 1.5)): + for _ in range(int(12 * 2)): (word, pos) = self.client.debug.read_recovery_word() if pos != 0: ret = self.client.call_raw(proto.WordAck(word='kwyjibo')) From 6414765316bd98ed8bc22933a25362ca2b7b1c7f Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 21 Jul 2014 17:54:15 +0200 Subject: [PATCH 0352/1535] expand gitignore --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 500d46e85..ebdc3784e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ +build/ +dist/ +python_trezor.egg-info/ *.pyc *.bin *.py.cache +distribute-*.egg +distribute-*.tar.gz From d6dd3c13818d9a2fd93ec372da74aa0e2474219c Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 21 Jul 2014 18:53:08 +0200 Subject: [PATCH 0353/1535] use pure setuptools in setup.py --- distribute_setup.py | 515 -------------------------------------------- setup.py | 22 +- 2 files changed, 18 insertions(+), 519 deletions(-) delete mode 100644 distribute_setup.py diff --git a/distribute_setup.py b/distribute_setup.py deleted file mode 100644 index fb6e4900f..000000000 --- a/distribute_setup.py +++ /dev/null @@ -1,515 +0,0 @@ -#!python -"""Bootstrap distribute installation - -If you want to use setuptools in your package's setup.py, just include this -file in the same directory with it, and add this to the top of your setup.py:: - - from distribute_setup import use_setuptools - use_setuptools() - -If you want to require a specific version of setuptools, set a download -mirror, or use an alternate download directory, you can do so by supplying -the appropriate options to ``use_setuptools()``. - -This file can also be run as a script to install or upgrade setuptools. -""" -import os -import sys -import time -import fnmatch -import tempfile -import tarfile -from distutils import log - -try: - from site import USER_SITE -except ImportError: - USER_SITE = None - -try: - import subprocess - - def _python_cmd(*args): - args = (sys.executable,) + args - return subprocess.call(args) == 0 - -except ImportError: - # will be used for python 2.3 - def _python_cmd(*args): - args = (sys.executable,) + args - # quoting arguments if windows - if sys.platform == 'win32': - def quote(arg): - if ' ' in arg: - return '"%s"' % arg - return arg - args = [quote(arg) for arg in args] - return os.spawnl(os.P_WAIT, sys.executable, *args) == 0 - -DEFAULT_VERSION = "0.6.28" -DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/" -SETUPTOOLS_FAKED_VERSION = "0.6c11" - -SETUPTOOLS_PKG_INFO = """\ -Metadata-Version: 1.0 -Name: setuptools -Version: %s -Summary: xxxx -Home-page: xxx -Author: xxx -Author-email: xxx -License: xxx -Description: xxx -""" % SETUPTOOLS_FAKED_VERSION - - -def _install(tarball, install_args=()): - # extracting the tarball - tmpdir = tempfile.mkdtemp() - log.warn('Extracting in %s', tmpdir) - old_wd = os.getcwd() - try: - os.chdir(tmpdir) - tar = tarfile.open(tarball) - _extractall(tar) - tar.close() - - # going in the directory - subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) - os.chdir(subdir) - log.warn('Now working in %s', subdir) - - # installing - log.warn('Installing Distribute') - if not _python_cmd('setup.py', 'install', *install_args): - log.warn('Something went wrong during the installation.') - log.warn('See the error message above.') - finally: - os.chdir(old_wd) - - -def _build_egg(egg, tarball, to_dir): - # extracting the tarball - tmpdir = tempfile.mkdtemp() - log.warn('Extracting in %s', tmpdir) - old_wd = os.getcwd() - try: - os.chdir(tmpdir) - tar = tarfile.open(tarball) - _extractall(tar) - tar.close() - - # going in the directory - subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) - os.chdir(subdir) - log.warn('Now working in %s', subdir) - - # building an egg - log.warn('Building a Distribute egg in %s', to_dir) - _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) - - finally: - os.chdir(old_wd) - # returning the result - log.warn(egg) - if not os.path.exists(egg): - raise IOError('Could not build the egg.') - - -def _do_download(version, download_base, to_dir, download_delay): - egg = os.path.join(to_dir, 'distribute-%s-py%d.%d.egg' - % (version, sys.version_info[0], sys.version_info[1])) - if not os.path.exists(egg): - tarball = download_setuptools(version, download_base, - to_dir, download_delay) - _build_egg(egg, tarball, to_dir) - sys.path.insert(0, egg) - import setuptools - setuptools.bootstrap_install_from = egg - - -def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, - to_dir=os.curdir, download_delay=15, no_fake=True): - # making sure we use the absolute path - to_dir = os.path.abspath(to_dir) - was_imported = 'pkg_resources' in sys.modules or \ - 'setuptools' in sys.modules - try: - try: - import pkg_resources - if not hasattr(pkg_resources, '_distribute'): - if not no_fake: - _fake_setuptools() - raise ImportError - except ImportError: - return _do_download(version, download_base, to_dir, download_delay) - try: - pkg_resources.require("distribute>=" + version) - return - except pkg_resources.VersionConflict: - e = sys.exc_info()[1] - if was_imported: - sys.stderr.write( - "The required version of distribute (>=%s) is not available,\n" - "and can't be installed while this script is running. Please\n" - "install a more recent version first, using\n" - "'easy_install -U distribute'." - "\n\n(Currently using %r)\n" % (version, e.args[0])) - sys.exit(2) - else: - del pkg_resources, sys.modules['pkg_resources'] # reload ok - return _do_download(version, download_base, to_dir, - download_delay) - except pkg_resources.DistributionNotFound: - return _do_download(version, download_base, to_dir, - download_delay) - finally: - if not no_fake: - _create_fake_setuptools_pkg_info(to_dir) - - -def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, - to_dir=os.curdir, delay=15): - """Download distribute from a specified location and return its filename - - `version` should be a valid distribute version number that is available - as an egg for download under the `download_base` URL (which should end - with a '/'). `to_dir` is the directory where the egg will be downloaded. - `delay` is the number of seconds to pause before an actual download - attempt. - """ - # making sure we use the absolute path - to_dir = os.path.abspath(to_dir) - try: - from urllib.request import urlopen - except ImportError: - from urllib2 import urlopen - tgz_name = "distribute-%s.tar.gz" % version - url = download_base + tgz_name - saveto = os.path.join(to_dir, tgz_name) - src = dst = None - if not os.path.exists(saveto): # Avoid repeated downloads - try: - log.warn("Downloading %s", url) - src = urlopen(url) - # Read/write all in one block, so we don't create a corrupt file - # if the download is interrupted. - data = src.read() - dst = open(saveto, "wb") - dst.write(data) - finally: - if src: - src.close() - if dst: - dst.close() - return os.path.realpath(saveto) - - -def _no_sandbox(function): - def __no_sandbox(*args, **kw): - try: - from setuptools.sandbox import DirectorySandbox - if not hasattr(DirectorySandbox, '_old'): - def violation(*args): - pass - DirectorySandbox._old = DirectorySandbox._violation - DirectorySandbox._violation = violation - patched = True - else: - patched = False - except ImportError: - patched = False - - try: - return function(*args, **kw) - finally: - if patched: - DirectorySandbox._violation = DirectorySandbox._old - del DirectorySandbox._old - - return __no_sandbox - - -def _patch_file(path, content): - """Will backup the file then patch it""" - existing_content = open(path).read() - if existing_content == content: - # already patched - log.warn('Already patched.') - return False - log.warn('Patching...') - _rename_path(path) - f = open(path, 'w') - try: - f.write(content) - finally: - f.close() - return True - -_patch_file = _no_sandbox(_patch_file) - - -def _same_content(path, content): - return open(path).read() == content - - -def _rename_path(path): - new_name = path + '.OLD.%s' % time.time() - log.warn('Renaming %s into %s', path, new_name) - os.rename(path, new_name) - return new_name - - -def _remove_flat_installation(placeholder): - if not os.path.isdir(placeholder): - log.warn('Unkown installation at %s', placeholder) - return False - found = False - for file in os.listdir(placeholder): - if fnmatch.fnmatch(file, 'setuptools*.egg-info'): - found = True - break - if not found: - log.warn('Could not locate setuptools*.egg-info') - return - - log.warn('Removing elements out of the way...') - pkg_info = os.path.join(placeholder, file) - if os.path.isdir(pkg_info): - patched = _patch_egg_dir(pkg_info) - else: - patched = _patch_file(pkg_info, SETUPTOOLS_PKG_INFO) - - if not patched: - log.warn('%s already patched.', pkg_info) - return False - # now let's move the files out of the way - for element in ('setuptools', 'pkg_resources.py', 'site.py'): - element = os.path.join(placeholder, element) - if os.path.exists(element): - _rename_path(element) - else: - log.warn('Could not find the %s element of the ' - 'Setuptools distribution', element) - return True - -_remove_flat_installation = _no_sandbox(_remove_flat_installation) - - -def _after_install(dist): - log.warn('After install bootstrap.') - placeholder = dist.get_command_obj('install').install_purelib - _create_fake_setuptools_pkg_info(placeholder) - - -def _create_fake_setuptools_pkg_info(placeholder): - if not placeholder or not os.path.exists(placeholder): - log.warn('Could not find the install location') - return - pyver = '%s.%s' % (sys.version_info[0], sys.version_info[1]) - setuptools_file = 'setuptools-%s-py%s.egg-info' % \ - (SETUPTOOLS_FAKED_VERSION, pyver) - pkg_info = os.path.join(placeholder, setuptools_file) - if os.path.exists(pkg_info): - log.warn('%s already exists', pkg_info) - return - - if not os.access(pkg_info, os.W_OK): - log.warn("Don't have permissions to write %s, skipping", pkg_info) - - log.warn('Creating %s', pkg_info) - f = open(pkg_info, 'w') - try: - f.write(SETUPTOOLS_PKG_INFO) - finally: - f.close() - - pth_file = os.path.join(placeholder, 'setuptools.pth') - log.warn('Creating %s', pth_file) - f = open(pth_file, 'w') - try: - f.write(os.path.join(os.curdir, setuptools_file)) - finally: - f.close() - -_create_fake_setuptools_pkg_info = _no_sandbox( - _create_fake_setuptools_pkg_info -) - - -def _patch_egg_dir(path): - # let's check if it's already patched - pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') - if os.path.exists(pkg_info): - if _same_content(pkg_info, SETUPTOOLS_PKG_INFO): - log.warn('%s already patched.', pkg_info) - return False - _rename_path(path) - os.mkdir(path) - os.mkdir(os.path.join(path, 'EGG-INFO')) - pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') - f = open(pkg_info, 'w') - try: - f.write(SETUPTOOLS_PKG_INFO) - finally: - f.close() - return True - -_patch_egg_dir = _no_sandbox(_patch_egg_dir) - - -def _before_install(): - log.warn('Before install bootstrap.') - _fake_setuptools() - - -def _under_prefix(location): - if 'install' not in sys.argv: - return True - args = sys.argv[sys.argv.index('install') + 1:] - for index, arg in enumerate(args): - for option in ('--root', '--prefix'): - if arg.startswith('%s=' % option): - top_dir = arg.split('root=')[-1] - return location.startswith(top_dir) - elif arg == option: - if len(args) > index: - top_dir = args[index + 1] - return location.startswith(top_dir) - if arg == '--user' and USER_SITE is not None: - return location.startswith(USER_SITE) - return True - - -def _fake_setuptools(): - log.warn('Scanning installed packages') - try: - import pkg_resources - except ImportError: - # we're cool - log.warn('Setuptools or Distribute does not seem to be installed.') - return - ws = pkg_resources.working_set - try: - setuptools_dist = ws.find( - pkg_resources.Requirement.parse('setuptools', replacement=False) - ) - except TypeError: - # old distribute API - setuptools_dist = ws.find( - pkg_resources.Requirement.parse('setuptools') - ) - - if setuptools_dist is None: - log.warn('No setuptools distribution found') - return - # detecting if it was already faked - setuptools_location = setuptools_dist.location - log.warn('Setuptools installation detected at %s', setuptools_location) - - # if --root or --preix was provided, and if - # setuptools is not located in them, we don't patch it - if not _under_prefix(setuptools_location): - log.warn('Not patching, --root or --prefix is installing Distribute' - ' in another location') - return - - # let's see if its an egg - if not setuptools_location.endswith('.egg'): - log.warn('Non-egg installation') - res = _remove_flat_installation(setuptools_location) - if not res: - return - else: - log.warn('Egg installation') - pkg_info = os.path.join(setuptools_location, 'EGG-INFO', 'PKG-INFO') - if (os.path.exists(pkg_info) and - _same_content(pkg_info, SETUPTOOLS_PKG_INFO)): - log.warn('Already patched.') - return - log.warn('Patching...') - # let's create a fake egg replacing setuptools one - res = _patch_egg_dir(setuptools_location) - if not res: - return - log.warn('Patched done.') - _relaunch() - - -def _relaunch(): - log.warn('Relaunching...') - # we have to relaunch the process - # pip marker to avoid a relaunch bug - _cmd = ['-c', 'install', '--single-version-externally-managed'] - if sys.argv[:3] == _cmd: - sys.argv[0] = 'setup.py' - args = [sys.executable] + sys.argv - sys.exit(subprocess.call(args)) - - -def _extractall(self, path=".", members=None): - """Extract all members from the archive to the current working - directory and set owner, modification time and permissions on - directories afterwards. `path' specifies a different directory - to extract to. `members' is optional and must be a subset of the - list returned by getmembers(). - """ - import copy - import operator - from tarfile import ExtractError - directories = [] - - if members is None: - members = self - - for tarinfo in members: - if tarinfo.isdir(): - # Extract directories with a safe mode. - directories.append(tarinfo) - tarinfo = copy.copy(tarinfo) - tarinfo.mode = 448 # decimal for oct 0700 - self.extract(tarinfo, path) - - # Reverse sort directories. - if sys.version_info < (2, 4): - def sorter(dir1, dir2): - return cmp(dir1.name, dir2.name) - directories.sort(sorter) - directories.reverse() - else: - directories.sort(key=operator.attrgetter('name'), reverse=True) - - # Set correct owner, mtime and filemode on directories. - for tarinfo in directories: - dirpath = os.path.join(path, tarinfo.name) - try: - self.chown(tarinfo, dirpath) - self.utime(tarinfo, dirpath) - self.chmod(tarinfo, dirpath) - except ExtractError: - e = sys.exc_info()[1] - if self.errorlevel > 1: - raise - else: - self._dbg(1, "tarfile: %s" % e) - - -def _build_install_args(argv): - install_args = [] - user_install = '--user' in argv - if user_install and sys.version_info < (2, 6): - log.warn("--user requires Python 2.6 or later") - raise SystemExit(1) - if user_install: - install_args.append('--user') - return install_args - - -def main(argv, version=DEFAULT_VERSION): - """Install or upgrade setuptools and EasyInstall""" - tarball = download_setuptools() - _install(tarball, _build_install_args(argv)) - - -if __name__ == '__main__': - main(sys.argv[1:]) diff --git a/setup.py b/setup.py index 27f8459eb..a0a682e01 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,3 @@ -from distribute_setup import use_setuptools -use_setuptools() - from setuptools import setup, find_packages from os.path import dirname, join @@ -12,7 +9,24 @@ setup( author_email='info@bitcointrezor.com', description='Python library for handling TREZOR hardware bitcoin wallet', long_description=open(join(here, 'README.rst')).read(), - packages=find_packages(), + py_modules=[ + 'trezorlib.ckd_public', + 'trezorlib.client', + 'trezorlib.debuglink', + 'trezorlib.mapping', + 'trezorlib.messages_pb2', + 'trezorlib.protobuf_json', + 'trezorlib.qt.pinmatrix', + 'trezorlib.tools', + 'trezorlib.transport', + 'trezorlib.transport_fake', + 'trezorlib.transport_hid', + 'trezorlib.transport_pipe', + 'trezorlib.transport_serial', + 'trezorlib.transport_socket', + 'trezorlib.tx_api', + 'trezorlib.types_pb2', + ], test_suite='tests', dependency_links=['https://github.com/trezor/python-mnemonic/archive/master.zip#egg=mnemonic-0.8'], install_requires=['ecdsa>=0.9', 'protobuf', 'mnemonic>=0.8', 'hidapi>=0.7.99'], From 58711df5d34843c9ada7b921ad949c1e78608f9e Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 26 Jul 2014 12:22:32 +0200 Subject: [PATCH 0354/1535] update setup.py file --- README.rst | 4 ++-- setup.py | 15 +++++++-------- 2 files changed, 9 insertions(+), 10 deletions(-) mode change 100644 => 100755 setup.py diff --git a/README.rst b/README.rst index 9b110faae..c06f4accc 100644 --- a/README.rst +++ b/README.rst @@ -1,5 +1,5 @@ -trezorlib-python -================ +python-trezor +============= Client side implementation for Trezor-compatible Bitcoin hardware wallets. diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 index a0a682e01..c4f32093a --- a/setup.py +++ b/setup.py @@ -1,14 +1,13 @@ -from setuptools import setup, find_packages -from os.path import dirname, join +#!/usr/bin/env python +from setuptools import setup -here = dirname(__file__) setup( - name='python-trezor', + name='trezor', version='0.5.0', author='Bitcoin TREZOR', author_email='info@bitcointrezor.com', - description='Python library for handling TREZOR hardware bitcoin wallet', - long_description=open(join(here, 'README.rst')).read(), + description='Python library for communicating with TREZOR Bitcoin Hardware Wallet', + url='https://github.com/trezor/python-trezor', py_modules=[ 'trezorlib.ckd_public', 'trezorlib.client', @@ -28,13 +27,13 @@ setup( 'trezorlib.types_pb2', ], test_suite='tests', - dependency_links=['https://github.com/trezor/python-mnemonic/archive/master.zip#egg=mnemonic-0.8'], install_requires=['ecdsa>=0.9', 'protobuf', 'mnemonic>=0.8', 'hidapi>=0.7.99'], include_package_data=True, zip_safe=False, classifiers=[ 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', 'Operating System :: POSIX :: Linux', - 'Operating System :: POSIX :: Windows', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: MacOS :: MacOS X', ], ) From a527456db5d7115282f6969307255a0ba876ad0f Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 26 Jul 2014 16:27:28 +0200 Subject: [PATCH 0355/1535] add transport for bridge --- cmdtr.py | 6 ++- tests/config.py | 3 +- trezorlib/protobuf_json.py | 8 ++-- trezorlib/transport.py | 13 +++--- trezorlib/transport_bridge.py | 74 +++++++++++++++++++++++++++++++++++ trezorlib/transport_fake.py | 4 +- trezorlib/transport_hid.py | 2 +- trezorlib/transport_pipe.py | 4 +- trezorlib/transport_serial.py | 4 +- trezorlib/transport_socket.py | 6 +-- 10 files changed, 103 insertions(+), 21 deletions(-) create mode 100644 trezorlib/transport_bridge.py diff --git a/cmdtr.py b/cmdtr.py index 446ea68e1..a04c5e739 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -12,7 +12,7 @@ from trezorlib.protobuf_json import pb2json def parse_args(commands): parser = argparse.ArgumentParser(description='Commandline tool for Trezor devices.') parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', help='Prints communication to device') - parser.add_argument('-t', '--transport', dest='transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Transport used for talking with the device") + parser.add_argument('-t', '--transport', dest='transport', choices=['usb', 'serial', 'pipe', 'socket', 'bridge'], default='usb', help="Transport used for talking with the device") parser.add_argument('-p', '--path', dest='path', default='', help="Path used by the transport (usually serial port)") # parser.add_argument('-dt', '--debuglink-transport', dest='debuglink_transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Debuglink transport") # parser.add_argument('-dp', '--debuglink-path', dest='debuglink_path', default='', help="Path used by the transport (usually serial port)") @@ -66,6 +66,10 @@ def get_transport(transport_string, path, **kwargs): if transport_string == 'socket': from trezorlib.transport_socket import SocketTransportClient return SocketTransportClient(path, **kwargs) + + if transport_string == 'bridge': + from trezorlib.transport_bridge import BridgeTransport + return BridgeTransport(path, **kwargs) if transport_string == 'fake': from trezorlib.transport_fake import FakeTransport diff --git a/tests/config.py b/tests/config.py index 3fc402fca..6c5fbd0a8 100644 --- a/tests/config.py +++ b/tests/config.py @@ -4,13 +4,14 @@ sys.path = ['../',] + sys.path from trezorlib.transport_pipe import PipeTransport from trezorlib.transport_hid import HidTransport from trezorlib.transport_socket import SocketTransportClient +from trezorlib.transport_bridge import BridgeTransport devices = HidTransport.enumerate() if len(devices) > 0: if devices[0][1] != None: print 'Using TREZOR' - TRANSPORT = HidTransport + TRANSPORT = BridgeTransport TRANSPORT_ARGS = (devices[0],) TRANSPORT_KWARGS = {'debug_link': False} DEBUG_TRANSPORT = HidTransport diff --git a/trezorlib/protobuf_json.py b/trezorlib/protobuf_json.py index 0ba7d26ba..412a88521 100644 --- a/trezorlib/protobuf_json.py +++ b/trezorlib/protobuf_json.py @@ -41,10 +41,10 @@ __version__='0.0.5' __author__='Paul Dovbush ' -import json # py2.6+ TODO: add support for other JSON serialization modules +import json from google.protobuf.descriptor import FieldDescriptor as FD import binascii - +import types_pb2 as types class ParseError(Exception): pass @@ -112,7 +112,7 @@ _ftype2js = { #FD.TYPE_MESSAGE: pb2json, #handled specially FD.TYPE_BYTES: lambda x: binascii.hexlify(x), FD.TYPE_UINT32: int, - FD.TYPE_ENUM: int, + FD.TYPE_ENUM: str, FD.TYPE_SFIXED32: float, FD.TYPE_SFIXED64: float, FD.TYPE_SINT32: int, @@ -132,7 +132,7 @@ _js2ftype = { # FD.TYPE_MESSAGE: json2pb, #handled specially FD.TYPE_BYTES: lambda x: binascii.unhexlify(x), FD.TYPE_UINT32: int, - FD.TYPE_ENUM: int, + FD.TYPE_ENUM: lambda x: getattr(types, x), FD.TYPE_SFIXED32: float, FD.TYPE_SFIXED64: float, FD.TYPE_SINT32: int, diff --git a/trezorlib/transport.py b/trezorlib/transport.py index afe59d4c3..63f0c729e 100644 --- a/trezorlib/transport.py +++ b/trezorlib/transport.py @@ -19,7 +19,7 @@ class Transport(object): def _close(self): raise NotImplementedException("Not implemented") - def _write(self, msg): + def _write(self, msg, protobuf_msg): raise NotImplementedException("Not implemented") def _read(self): @@ -51,7 +51,7 @@ class Transport(object): def write(self, msg): ser = msg.SerializeToString() header = struct.pack(">HL", mapping.get_type(msg), len(ser)) - self._write("##%s%s" % (header, ser)) + self._write("##%s%s" % (header, ser), msg) def read(self): if not self.ready_to_read(): @@ -73,9 +73,12 @@ class Transport(object): def _parse_message(self, data): (msg_type, data) = data - inst = mapping.get_class(msg_type)() - inst.ParseFromString(data) - return inst + if msg_type == 'protobuf': + return data + else: + inst = mapping.get_class(msg_type)() + inst.ParseFromString(data) + return inst def _read_headers(self, read_f): # Try to read headers until some sane value are detected diff --git a/trezorlib/transport_bridge.py b/trezorlib/transport_bridge.py new file mode 100644 index 000000000..77e864e47 --- /dev/null +++ b/trezorlib/transport_bridge.py @@ -0,0 +1,74 @@ +'''BridgeTransport implements transport TREZOR Bridge (aka trezord).''' + +import binascii +import requests +import protobuf_json +import json +import mapping +from transport import Transport +import messages_pb2 as proto + +TREZORD_HOST = 'http://localhost:21324' +CONFIG_URL = 'https://mytrezor.com/data/plugin/config_signed.bin' + +class BridgeTransport(Transport): + def __init__(self, device, *args, **kwargs): + + r = requests.get(CONFIG_URL) + if r.status_code != 200: + raise Exception('Could not fetch config from %s' % CONFIG_URL) + + config = binascii.unhexlify(r.text) + + r = requests.post(TREZORD_HOST + '/configure', data=config) + if r.status_code != 200: + raise Exception('trezord: Could not configure') + + r = requests.get(TREZORD_HOST + '/enumerate') + if r.status_code != 200: + raise Exception('trezord: Could not enumerate devices') + enum = r.json() + + if len(enum) < 1: + raise Exception('trezord: No devices found') + + self.path = enum[0]['path'] + self.session = None + self.response = None + + super(BridgeTransport, self).__init__(device, *args, **kwargs) + + def _open(self): + r = requests.post(TREZORD_HOST + '/acquire/%s' % self.path) + if r.status_code != 200: + raise Exception('trezord: Could not acquire session') + resp = r.json() + self.session = resp['session'] + + def _close(self): + r = requests.post(TREZORD_HOST + '/release/%s' % self.session) + if r.status_code != 200: + raise Exception('trezord: Could not release session') + else: + self.session = None + + def ready_to_read(self): + return self.response != None + + def _write(self, msg, protobuf_msg): + cls = protobuf_msg.__class__.__name__ + msg = protobuf_json.pb2json(protobuf_msg) + payload = '{"type": "%s","message": %s}' % (cls, json.dumps(msg)) + r = requests.post(TREZORD_HOST + '/call/%s' % self.session, data=payload) + if r.status_code != 200: + raise Exception('trezord: Could not write message') + else: + self.response = r.json() + + def _read(self): + if self.response == None: + raise Exception('No response stored') + cls = getattr(proto, self.response['type']) + inst = cls() + pb = protobuf_json.json2pb(inst, self.response['message']) + return ('protobuf', pb) diff --git a/trezorlib/transport_fake.py b/trezorlib/transport_fake.py index a56f44297..6ceb3f202 100644 --- a/trezorlib/transport_fake.py +++ b/trezorlib/transport_fake.py @@ -17,8 +17,8 @@ class FakeTransport(Transport): def ready_to_read(self): return False - def _write(self, msg): + def _write(self, msg, protobuf_msg): pass def _read(self): - raise NotImplementedException("Not implemented") \ No newline at end of file + raise NotImplementedException("Not implemented") diff --git a/trezorlib/transport_hid.py b/trezorlib/transport_hid.py index 4a3cff505..8db11a6e9 100644 --- a/trezorlib/transport_hid.py +++ b/trezorlib/transport_hid.py @@ -96,7 +96,7 @@ class HidTransport(Transport): def ready_to_read(self): return False - def _write(self, msg): + def _write(self, msg, protobuf_msg): msg = bytearray(msg) while len(msg): # Report ID, data padded to 63 bytes diff --git a/trezorlib/transport_pipe.py b/trezorlib/transport_pipe.py index 74b526de4..608733977 100644 --- a/trezorlib/transport_pipe.py +++ b/trezorlib/transport_pipe.py @@ -1,4 +1,4 @@ -'''TransportFake implements fake wire transport over local named pipe. +'''PipeTransport implements fake wire transport over local named pipe. Use this transport for talking with trezor simulator.''' import os @@ -42,7 +42,7 @@ class PipeTransport(Transport): rlist, _, _ = select([self.read_f], [], [], 0) return len(rlist) > 0 - def _write(self, msg): + def _write(self, msg, protobuf_msg): try: self.write_f.write(msg) self.write_f.flush() diff --git a/trezorlib/transport_serial.py b/trezorlib/transport_serial.py index 8568c944a..b76d86f51 100644 --- a/trezorlib/transport_serial.py +++ b/trezorlib/transport_serial.py @@ -22,7 +22,7 @@ class SerialTransport(Transport): rlist, _, _ = select([self.serial], [], [], 0) return len(rlist) > 0 - def _write(self, msg): + def _write(self, msg, protobuf_msg): try: self.serial.write(msg) self.serial.flush() @@ -36,4 +36,4 @@ class SerialTransport(Transport): return (msg_type, self.serial.read(datalen)) except serial.SerialException: print "Failed to read from device" - raise \ No newline at end of file + raise diff --git a/trezorlib/transport_socket.py b/trezorlib/transport_socket.py index a89737b25..d457b8fd0 100644 --- a/trezorlib/transport_socket.py +++ b/trezorlib/transport_socket.py @@ -29,7 +29,7 @@ class SocketTransportClient(Transport): rlist, _, _ = select([self.socket], [], [], 0) return len(rlist) > 0 - def _write(self, msg): + def _write(self, msg, protobuf_msg): self.socket.sendall(msg) def _read(self): @@ -89,7 +89,7 @@ class SocketTransport(Transport): return self.ready_to_read() return False - def _write(self, msg): + def _write(self, msg, protobuf_msg): if self.filelike: # None on disconnected client @@ -107,4 +107,4 @@ class SocketTransport(Transport): except Exception: print "Failed to read from device" self._disconnect_client() - return None \ No newline at end of file + return None From 70dd320c1fe58371e7cb603331d3f068e494b2c3 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 26 Jul 2014 17:15:12 +0200 Subject: [PATCH 0356/1535] fix protobuf_json while handling enums use error field from trezord --- trezorlib/protobuf_json.py | 8 +++++--- trezorlib/transport_bridge.py | 13 ++++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/trezorlib/protobuf_json.py b/trezorlib/protobuf_json.py index 412a88521..908b9065b 100644 --- a/trezorlib/protobuf_json.py +++ b/trezorlib/protobuf_json.py @@ -85,6 +85,8 @@ def pb2json(pb): for field,value in fields: if field.type == FD.TYPE_MESSAGE: ftype = pb2json + elif field.type == FD.TYPE_ENUM: + ftype = lambda x: field.enum_type.values[x].name elif field.type in _ftype2js: ftype = _ftype2js[field.type] else: @@ -109,10 +111,10 @@ _ftype2js = { FD.TYPE_FIXED32: float, FD.TYPE_BOOL: bool, FD.TYPE_STRING: unicode, - #FD.TYPE_MESSAGE: pb2json, #handled specially + #FD.TYPE_MESSAGE handled specially FD.TYPE_BYTES: lambda x: binascii.hexlify(x), FD.TYPE_UINT32: int, - FD.TYPE_ENUM: str, + # FD.TYPE_ENUM: handled specially FD.TYPE_SFIXED32: float, FD.TYPE_SFIXED64: float, FD.TYPE_SINT32: int, @@ -129,7 +131,7 @@ _js2ftype = { FD.TYPE_FIXED32: float, FD.TYPE_BOOL: bool, FD.TYPE_STRING: unicode, - # FD.TYPE_MESSAGE: json2pb, #handled specially + # FD.TYPE_MESSAGE handled specially FD.TYPE_BYTES: lambda x: binascii.unhexlify(x), FD.TYPE_UINT32: int, FD.TYPE_ENUM: lambda x: getattr(types, x), diff --git a/trezorlib/transport_bridge.py b/trezorlib/transport_bridge.py index 77e864e47..a0be923cb 100644 --- a/trezorlib/transport_bridge.py +++ b/trezorlib/transport_bridge.py @@ -11,6 +11,9 @@ import messages_pb2 as proto TREZORD_HOST = 'http://localhost:21324' CONFIG_URL = 'https://mytrezor.com/data/plugin/config_signed.bin' +def get_error(resp): + return ' (error=%d str=%s)' % (resp.status_code, resp.json()['error']) + class BridgeTransport(Transport): def __init__(self, device, *args, **kwargs): @@ -22,11 +25,11 @@ class BridgeTransport(Transport): r = requests.post(TREZORD_HOST + '/configure', data=config) if r.status_code != 200: - raise Exception('trezord: Could not configure') + raise Exception('trezord: Could not configure' + get_error(r)) r = requests.get(TREZORD_HOST + '/enumerate') if r.status_code != 200: - raise Exception('trezord: Could not enumerate devices') + raise Exception('trezord: Could not enumerate devices' + get_error(r)) enum = r.json() if len(enum) < 1: @@ -41,14 +44,14 @@ class BridgeTransport(Transport): def _open(self): r = requests.post(TREZORD_HOST + '/acquire/%s' % self.path) if r.status_code != 200: - raise Exception('trezord: Could not acquire session') + raise Exception('trezord: Could not acquire session' + get_error(r)) resp = r.json() self.session = resp['session'] def _close(self): r = requests.post(TREZORD_HOST + '/release/%s' % self.session) if r.status_code != 200: - raise Exception('trezord: Could not release session') + raise Exception('trezord: Could not release session' + get_error(r)) else: self.session = None @@ -61,7 +64,7 @@ class BridgeTransport(Transport): payload = '{"type": "%s","message": %s}' % (cls, json.dumps(msg)) r = requests.post(TREZORD_HOST + '/call/%s' % self.session, data=payload) if r.status_code != 200: - raise Exception('trezord: Could not write message') + raise Exception('trezord: Could not write message' + get_error(r)) else: self.response = r.json() From 608025419b717fc5d9d32c5e24cef7b92863a88e Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 27 Jul 2014 16:22:24 +0200 Subject: [PATCH 0357/1535] config will stay in hex form (IE) --- trezorlib/transport_bridge.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/trezorlib/transport_bridge.py b/trezorlib/transport_bridge.py index a0be923cb..3991dcc50 100644 --- a/trezorlib/transport_bridge.py +++ b/trezorlib/transport_bridge.py @@ -1,6 +1,5 @@ '''BridgeTransport implements transport TREZOR Bridge (aka trezord).''' -import binascii import requests import protobuf_json import json @@ -21,7 +20,7 @@ class BridgeTransport(Transport): if r.status_code != 200: raise Exception('Could not fetch config from %s' % CONFIG_URL) - config = binascii.unhexlify(r.text) + config = r.text r = requests.post(TREZORD_HOST + '/configure', data=config) if r.status_code != 200: @@ -61,7 +60,7 @@ class BridgeTransport(Transport): def _write(self, msg, protobuf_msg): cls = protobuf_msg.__class__.__name__ msg = protobuf_json.pb2json(protobuf_msg) - payload = '{"type": "%s","message": %s}' % (cls, json.dumps(msg)) + payload = '{"type": "%s", "message": %s}' % (cls, json.dumps(msg)) r = requests.post(TREZORD_HOST + '/call/%s' % self.session, data=payload) if r.status_code != 200: raise Exception('trezord: Could not write message' + get_error(r)) From 9ed0604b65e2fb599e734e1cd340e611488c16ab Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 29 Jul 2014 18:57:13 +0200 Subject: [PATCH 0358/1535] use HidTransport by default again --- tests/config.py | 2 +- tests/run-separate.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/config.py b/tests/config.py index 6c5fbd0a8..45ae8a9e5 100644 --- a/tests/config.py +++ b/tests/config.py @@ -11,7 +11,7 @@ devices = HidTransport.enumerate() if len(devices) > 0: if devices[0][1] != None: print 'Using TREZOR' - TRANSPORT = BridgeTransport + TRANSPORT = HidTransport TRANSPORT_ARGS = (devices[0],) TRANSPORT_KWARGS = {'debug_link': False} DEBUG_TRANSPORT = HidTransport diff --git a/tests/run-separate.sh b/tests/run-separate.sh index fe71ad772..4b04fb26f 100755 --- a/tests/run-separate.sh +++ b/tests/run-separate.sh @@ -1,5 +1,5 @@ #!/bin/bash for i in test_*.py; do echo Starting: $i - python $i > $i.out + python $i > $i.out 2> $i.err done From 9643834821e6747ccc32b2ba041eafb9608ab03b Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 30 Jul 2014 17:55:20 +0200 Subject: [PATCH 0359/1535] 256 is the new default strength --- cmdtr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmdtr.py b/cmdtr.py index a04c5e739..6f0a76c58 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -257,7 +257,7 @@ class Commands(object): ) reset_device.arguments = ( - (('-t', '--strength'), {'type': int, 'choices': [128, 192, 256], 'default': 128}), + (('-t', '--strength'), {'type': int, 'choices': [128, 192, 256], 'default': 256}), (('-p', '--pin-protection'), {'action': 'store_true', 'default': False}), (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), (('-l', '--label'), {'type': str, 'default': ''}), From 33c7f2c3d76abe25e0f776623aaa82c14b9089aa Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 30 Jul 2014 20:39:40 +0200 Subject: [PATCH 0360/1535] 0.5.1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c4f32093a..3acb41c77 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name='trezor', - version='0.5.0', + version='0.5.1', author='Bitcoin TREZOR', author_email='info@bitcointrezor.com', description='Python library for communicating with TREZOR Bitcoin Hardware Wallet', From c2de56eb460b93030ff72ba0b479fe57b0227de5 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 30 Jul 2014 21:04:34 +0200 Subject: [PATCH 0361/1535] add trezorlib/qt/__init__.py --- setup.py | 2 +- trezorlib/qt/__init__.py | 0 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 trezorlib/qt/__init__.py diff --git a/setup.py b/setup.py index 3acb41c77..a8f3ed54a 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name='trezor', - version='0.5.1', + version='0.5.2', author='Bitcoin TREZOR', author_email='info@bitcointrezor.com', description='Python library for communicating with TREZOR Bitcoin Hardware Wallet', diff --git a/trezorlib/qt/__init__.py b/trezorlib/qt/__init__.py new file mode 100644 index 000000000..e69de29bb From 4f621b1da03c345d7af51dcbd8c5e82748f6560f Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 31 Jul 2014 00:54:41 +0200 Subject: [PATCH 0362/1535] fix test_recovery_device in test_protection_levels.py --- tests/test_protection_levels.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_protection_levels.py b/tests/test_protection_levels.py index 7a52eda97..7c5e15071 100644 --- a/tests/test_protection_levels.py +++ b/tests/test_protection_levels.py @@ -96,7 +96,7 @@ class TestProtectionLevels(common.TrezorTest): def test_recovery_device(self): with self.client: self.client.set_mnemonic(self.mnemonic12) - self.client.set_expected_responses([proto.WordRequest()] * int(12 * 1.5) + \ + self.client.set_expected_responses([proto.WordRequest()] * 24 + \ [proto.Success(), proto.Features()]) self.client.recovery_device(12, False, False, 'label', 'english') From 3527a51669f4b21774e820762af7e4fe794cf078 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 7 Aug 2014 21:14:11 +0200 Subject: [PATCH 0363/1535] update pb --- trezorlib/client.py | 1 - trezorlib/messages_pb2.py | 131 ++++++++++++++++++++------------------ trezorlib/types_pb2.py | 13 ++-- 3 files changed, 78 insertions(+), 67 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 1e6edbedd..d1100de02 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -346,7 +346,6 @@ class ProtocolMixin(object): return path - @field('node') @expect(proto.PublicKey) def get_public_node(self, n): n = self._convert_prime(n) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 472bfca64..fd78e12d9 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"&\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"G\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\"4\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xa1\r\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"G\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\"4\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xa1\r\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -218,8 +218,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3145, - serialized_end=4842, + serialized_start=3159, + serialized_end=4856, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -904,6 +904,13 @@ _PUBLICKEY = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='xpub', full_name='PublicKey.xpub', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -914,7 +921,7 @@ _PUBLICKEY = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=1009, - serialized_end=1047, + serialized_end=1061, ) @@ -948,8 +955,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1049, - serialized_end=1108, + serialized_start=1063, + serialized_end=1122, ) @@ -976,8 +983,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1110, - serialized_end=1136, + serialized_start=1124, + serialized_end=1150, ) @@ -997,8 +1004,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1138, - serialized_end=1150, + serialized_start=1152, + serialized_end=1164, ) @@ -1067,8 +1074,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1153, - serialized_end=1319, + serialized_start=1167, + serialized_end=1333, ) @@ -1130,8 +1137,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1322, - serialized_end=1479, + serialized_start=1336, + serialized_end=1493, ) @@ -1151,8 +1158,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1481, - serialized_end=1497, + serialized_start=1495, + serialized_end=1511, ) @@ -1179,8 +1186,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1499, - serialized_end=1528, + serialized_start=1513, + serialized_end=1542, ) @@ -1242,8 +1249,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1531, - serialized_end=1690, + serialized_start=1545, + serialized_end=1704, ) @@ -1263,8 +1270,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1692, - serialized_end=1705, + serialized_start=1706, + serialized_end=1719, ) @@ -1291,8 +1298,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1707, - serialized_end=1730, + serialized_start=1721, + serialized_end=1744, ) @@ -1333,8 +1340,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1732, - serialized_end=1809, + serialized_start=1746, + serialized_end=1823, ) @@ -1375,8 +1382,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1811, - serialized_end=1879, + serialized_start=1825, + serialized_end=1893, ) @@ -1410,8 +1417,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1881, - serialized_end=1935, + serialized_start=1895, + serialized_end=1949, ) @@ -1452,8 +1459,8 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1937, - serialized_end=2008, + serialized_start=1951, + serialized_end=2022, ) @@ -1487,8 +1494,8 @@ _DECRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2010, - serialized_end=2062, + serialized_start=2024, + serialized_end=2076, ) @@ -1550,8 +1557,8 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2065, - serialized_end=2193, + serialized_start=2079, + serialized_end=2207, ) @@ -1592,8 +1599,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2195, - serialized_end=2284, + serialized_start=2209, + serialized_end=2298, ) @@ -1620,8 +1627,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2286, - serialized_end=2311, + serialized_start=2300, + serialized_end=2325, ) @@ -1662,8 +1669,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2313, - serialized_end=2394, + serialized_start=2327, + serialized_end=2408, ) @@ -1711,8 +1718,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2397, - serialized_end=2541, + serialized_start=2411, + serialized_end=2555, ) @@ -1753,8 +1760,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2544, - serialized_end=2677, + serialized_start=2558, + serialized_end=2691, ) @@ -1781,8 +1788,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2679, - serialized_end=2716, + serialized_start=2693, + serialized_end=2730, ) @@ -1802,8 +1809,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2718, - serialized_end=2733, + serialized_start=2732, + serialized_end=2747, ) @@ -1830,8 +1837,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2735, - serialized_end=2768, + serialized_start=2749, + serialized_end=2782, ) @@ -1858,8 +1865,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2770, - serialized_end=2805, + serialized_start=2784, + serialized_end=2819, ) @@ -1879,8 +1886,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2807, - serialized_end=2826, + serialized_start=2821, + serialized_end=2840, ) @@ -1970,8 +1977,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2829, - serialized_end=3064, + serialized_start=2843, + serialized_end=3078, ) @@ -1991,8 +1998,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3066, - serialized_end=3081, + serialized_start=3080, + serialized_end=3095, ) @@ -2033,8 +2040,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3083, - serialized_end=3142, + serialized_start=3097, + serialized_end=3156, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 9c9058358..af1aa18f1 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"?\n\x18MultisigRedeemScriptType\x12\x0f\n\x07pubkeys\x18\x01 \x03(\x0c\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"j\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*9\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\x86\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"?\n\x18MultisigRedeemScriptType\x12\x0f\n\x07pubkeys\x18\x01 \x03(\x0c\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"j\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*9\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xa7\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -191,11 +191,15 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( name='ButtonRequest_SignTx', index=7, number=8, options=None, type=None), + _descriptor.EnumValueDescriptor( + name='ButtonRequest_FirmwareCheck', index=8, number=9, + options=None, + type=None), ], containing_type=None, options=None, serialized_start=1606, - serialized_end=1868, + serialized_end=1901, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -220,8 +224,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1870, - serialized_end=1997, + serialized_start=1903, + serialized_end=2030, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -253,6 +257,7 @@ ButtonRequest_ConfirmWord = 5 ButtonRequest_WipeDevice = 6 ButtonRequest_ProtectCall = 7 ButtonRequest_SignTx = 8 +ButtonRequest_FirmwareCheck = 9 PinMatrixRequestType_Current = 1 PinMatrixRequestType_NewFirst = 2 PinMatrixRequestType_NewSecond = 3 From ef87f2e1d3834b412733e19dd2e5151d1e4e0a3a Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 8 Aug 2014 18:01:27 +0200 Subject: [PATCH 0364/1535] add GetAddress.show_display; ButtonRequest_Address --- cmdtr.py | 4 +- trezorlib/client.py | 4 +- trezorlib/messages_pb2.py | 127 ++++++++++++++++++++------------------ trezorlib/types_pb2.py | 13 ++-- 4 files changed, 80 insertions(+), 68 deletions(-) diff --git a/cmdtr.py b/cmdtr.py index 6f0a76c58..eb038e912 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -91,7 +91,7 @@ class Commands(object): def get_address(self, args): address_n = self.client.expand_path(args.n) - return self.client.get_address(args.coin, address_n) + return self.client.get_address(args.coin, address_n, args.show_display) def get_entropy(self, args): return binascii.hexlify(self.client.get_entropy(args.size)) @@ -211,8 +211,8 @@ class Commands(object): get_address.arguments = ( (('-c', '--coin'), {'type': str, 'default': 'Bitcoin'}), - # (('n',), {'metavar': 'N', 'type': int, 'nargs': '+'}), (('-n', '-address'), {'type': str}), + (('-d', '--show-display'), {'action': 'store_true', 'default': False}), ) get_entropy.arguments = ( diff --git a/trezorlib/client.py b/trezorlib/client.py index d1100de02..e6fbceafc 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -353,9 +353,9 @@ class ProtocolMixin(object): @field('address') @expect(proto.Address) - def get_address(self, coin_name, n): + def get_address(self, coin_name, n, show_display=False): n = self._convert_prime(n) - return self.call(proto.GetAddress(address_n=n, coin_name=coin_name)) + return self.call(proto.GetAddress(address_n=n, coin_name=coin_name, show_display=show_display)) @field('entropy') @expect(proto.Entropy) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index fd78e12d9..d5fbe3bae 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\";\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"G\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\"4\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xa1\r\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"Q\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"G\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\"4\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xa1\r\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -218,8 +218,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3159, - serialized_end=4856, + serialized_start=3181, + serialized_end=4878, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -946,6 +946,13 @@ _GETADDRESS = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='show_display', full_name='GetAddress.show_display', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -956,7 +963,7 @@ _GETADDRESS = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=1063, - serialized_end=1122, + serialized_end=1144, ) @@ -983,8 +990,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1124, - serialized_end=1150, + serialized_start=1146, + serialized_end=1172, ) @@ -1004,8 +1011,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1152, - serialized_end=1164, + serialized_start=1174, + serialized_end=1186, ) @@ -1074,8 +1081,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1167, - serialized_end=1333, + serialized_start=1189, + serialized_end=1355, ) @@ -1137,8 +1144,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1336, - serialized_end=1493, + serialized_start=1358, + serialized_end=1515, ) @@ -1158,8 +1165,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1495, - serialized_end=1511, + serialized_start=1517, + serialized_end=1533, ) @@ -1186,8 +1193,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1513, - serialized_end=1542, + serialized_start=1535, + serialized_end=1564, ) @@ -1249,8 +1256,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1545, - serialized_end=1704, + serialized_start=1567, + serialized_end=1726, ) @@ -1270,8 +1277,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1706, - serialized_end=1719, + serialized_start=1728, + serialized_end=1741, ) @@ -1298,8 +1305,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1721, - serialized_end=1744, + serialized_start=1743, + serialized_end=1766, ) @@ -1340,8 +1347,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1746, - serialized_end=1823, + serialized_start=1768, + serialized_end=1845, ) @@ -1382,8 +1389,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1825, - serialized_end=1893, + serialized_start=1847, + serialized_end=1915, ) @@ -1417,8 +1424,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1895, - serialized_end=1949, + serialized_start=1917, + serialized_end=1971, ) @@ -1459,8 +1466,8 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1951, - serialized_end=2022, + serialized_start=1973, + serialized_end=2044, ) @@ -1494,8 +1501,8 @@ _DECRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2024, - serialized_end=2076, + serialized_start=2046, + serialized_end=2098, ) @@ -1557,8 +1564,8 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2079, - serialized_end=2207, + serialized_start=2101, + serialized_end=2229, ) @@ -1599,8 +1606,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2209, - serialized_end=2298, + serialized_start=2231, + serialized_end=2320, ) @@ -1627,8 +1634,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2300, - serialized_end=2325, + serialized_start=2322, + serialized_end=2347, ) @@ -1669,8 +1676,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2327, - serialized_end=2408, + serialized_start=2349, + serialized_end=2430, ) @@ -1718,8 +1725,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2411, - serialized_end=2555, + serialized_start=2433, + serialized_end=2577, ) @@ -1760,8 +1767,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2558, - serialized_end=2691, + serialized_start=2580, + serialized_end=2713, ) @@ -1788,8 +1795,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2693, - serialized_end=2730, + serialized_start=2715, + serialized_end=2752, ) @@ -1809,8 +1816,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2732, - serialized_end=2747, + serialized_start=2754, + serialized_end=2769, ) @@ -1837,8 +1844,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2749, - serialized_end=2782, + serialized_start=2771, + serialized_end=2804, ) @@ -1865,8 +1872,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2784, - serialized_end=2819, + serialized_start=2806, + serialized_end=2841, ) @@ -1886,8 +1893,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2821, - serialized_end=2840, + serialized_start=2843, + serialized_end=2862, ) @@ -1977,8 +1984,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2843, - serialized_end=3078, + serialized_start=2865, + serialized_end=3100, ) @@ -1998,8 +2005,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3080, - serialized_end=3095, + serialized_start=3102, + serialized_end=3117, ) @@ -2040,8 +2047,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3097, - serialized_end=3156, + serialized_start=3119, + serialized_end=3178, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index af1aa18f1..c4bc4f13a 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"?\n\x18MultisigRedeemScriptType\x12\x0f\n\x07pubkeys\x18\x01 \x03(\x0c\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"j\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*9\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xa7\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"?\n\x18MultisigRedeemScriptType\x12\x0f\n\x07pubkeys\x18\x01 \x03(\x0c\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"j\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*9\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -195,11 +195,15 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( name='ButtonRequest_FirmwareCheck', index=8, number=9, options=None, type=None), + _descriptor.EnumValueDescriptor( + name='ButtonRequest_Address', index=9, number=10, + options=None, + type=None), ], containing_type=None, options=None, serialized_start=1606, - serialized_end=1901, + serialized_end=1928, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -224,8 +228,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1903, - serialized_end=2030, + serialized_start=1930, + serialized_end=2057, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -258,6 +262,7 @@ ButtonRequest_WipeDevice = 6 ButtonRequest_ProtectCall = 7 ButtonRequest_SignTx = 8 ButtonRequest_FirmwareCheck = 9 +ButtonRequest_Address = 10 PinMatrixRequestType_Current = 1 PinMatrixRequestType_NewFirst = 2 PinMatrixRequestType_NewSecond = 3 From 56790762a10f2f318653bbaf57888625f9b21c22 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 8 Aug 2014 18:24:56 +0200 Subject: [PATCH 0365/1535] 0.5.3 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a8f3ed54a..7df3dddec 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name='trezor', - version='0.5.2', + version='0.5.3', author='Bitcoin TREZOR', author_email='info@bitcointrezor.com', description='Python library for communicating with TREZOR Bitcoin Hardware Wallet', From 21c4358ea657cb2cf51160d27299d381ea4173a2 Mon Sep 17 00:00:00 2001 From: Marek Sebera Date: Sat, 9 Aug 2014 18:40:47 +0200 Subject: [PATCH 0366/1535] Double slashed Windows paths In Markdown single backslash was not displayed --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index c06f4accc..02e106b28 100644 --- a/README.rst +++ b/README.rst @@ -10,9 +10,9 @@ How to install (Windows) * Install Python 2.7 (http://python.org) * Install Cython (Windows binaries on http://cython.org/#download) * Install Microsoft Visual Studio 2008 Express -* Add "C:\Program Files (x86)\Microsoft Visual Studio 9.0" to system PATH +* Add "C:\\Program Files (x86)\\Microsoft Visual Studio 9.0" to system PATH * Clone repository (using TortoiseGit) to local directory -* Run c:\python27\python.exe setup.py install (or develop) +* Run C:\\python27\\python.exe setup.py install (or develop) How to install (Debian-Ubuntu) ------------------------------ From cffe8f7f7d2c19d4f17cfb55af18e1da96e876fc Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 11 Aug 2014 20:19:05 +0200 Subject: [PATCH 0367/1535] Helloworld example using trezorlib --- helloworld.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100755 helloworld.py diff --git a/helloworld.py b/helloworld.py new file mode 100755 index 000000000..15f9dc170 --- /dev/null +++ b/helloworld.py @@ -0,0 +1,28 @@ +#!/usr/bin/python + +from trezorlib.client import TrezorClient +from trezorlib.transport_hid import HidTransport + +def main(): + # List all connected TREZORs on USB + devices = HidTransport.enumerate() + + # Use first connected device + transport = HidTransport(devices[0]) + + # Creates object for manipulating TREZOR + client = TrezorClient(transport) + + # Print out TREZOR's features and settings + print client.features + + # Get first address of first BIP44 account + # (should be the same address as in mytrezor.com) + bip32_path = client.expand_path("44'/0'/0'/0/0") + address = client.get_address('Bitcoin', bip32_path, True) + print 'Bitcoin address:', address + + client.close() + +if __name__ == '__main__': + main() From dff60a0dd10aee0810a058e1497ac952a53e8ac0 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 11 Aug 2014 21:31:34 +0200 Subject: [PATCH 0368/1535] update example --- README.rst | 41 +++++++++++++++++++++++++++++++++++++++++ helloworld.py | 11 ++++++++--- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 02e106b28..51026575d 100644 --- a/README.rst +++ b/README.rst @@ -5,6 +5,47 @@ Client side implementation for Trezor-compatible Bitcoin hardware wallets. See http://bitcointrezor.com for more information. +Example +------- + +also found in ``helloworld.py`` + +.. code:: python + + #!/usr/bin/python + + from trezorlib.client import TrezorClient + from trezorlib.transport_hid import HidTransport + + def main(): + # List all connected TREZORs on USB + devices = HidTransport.enumerate() + + # Check whether we found any + if len(devices) == 0: + print 'No TREZOR found' + return + + # Use first connected device + transport = HidTransport(devices[0]) + + # Creates object for manipulating TREZOR + client = TrezorClient(transport) + + # Print out TREZOR's features and settings + print client.features + + # Get the first address of first BIP44 account + # (should be the same address as shown in mytrezor.com) + bip32_path = client.expand_path("44'/0'/0'/0/0") + address = client.get_address('Bitcoin', bip32_path) + print 'Bitcoin address:', address + + client.close() + + if __name__ == '__main__': + main() + How to install (Windows) ------------------------ * Install Python 2.7 (http://python.org) diff --git a/helloworld.py b/helloworld.py index 15f9dc170..a0c437666 100755 --- a/helloworld.py +++ b/helloworld.py @@ -7,6 +7,11 @@ def main(): # List all connected TREZORs on USB devices = HidTransport.enumerate() + # Check whether we found any + if len(devices) == 0: + print 'No TREZOR found' + return + # Use first connected device transport = HidTransport(devices[0]) @@ -16,10 +21,10 @@ def main(): # Print out TREZOR's features and settings print client.features - # Get first address of first BIP44 account - # (should be the same address as in mytrezor.com) + # Get the first address of first BIP44 account + # (should be the same address as shown in mytrezor.com) bip32_path = client.expand_path("44'/0'/0'/0/0") - address = client.get_address('Bitcoin', bip32_path, True) + address = client.get_address('Bitcoin', bip32_path) print 'Bitcoin address:', address client.close() From 81a6a1a6d2f1ed62d12093ddb469cfbc3ac2ee19 Mon Sep 17 00:00:00 2001 From: Liz Fong-Jones Date: Mon, 11 Aug 2014 19:25:36 -0400 Subject: [PATCH 0369/1535] Fix missing %s in format string --- trezorlib/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index e6fbceafc..5eba3e734 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -739,7 +739,7 @@ class ProtocolMixin(object): elif isinstance(resp, proto.Failure) and resp.code == types.Failure_FirmwareError: return False - raise Exception("Unexpected result " % resp) + raise Exception("Unexpected result %s" % resp) class TrezorClient(ProtocolMixin, TextUIMixin, BaseClient): pass From 30dcccf12f9e31a97f999f6cf015548c863fc1b1 Mon Sep 17 00:00:00 2001 From: Ondrej Mikle Date: Sat, 16 Aug 2014 23:02:54 +0200 Subject: [PATCH 0370/1535] decrypt_keyvalue in cmdtr.py takes value in hex from command line --- cmdtr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmdtr.py b/cmdtr.py index eb038e912..fcf9ad1cd 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -174,7 +174,7 @@ class Commands(object): def decrypt_keyvalue(self, args): address_n = self.client.expand_path(args.n) - ret = self.client.decrypt_keyvalue(address_n, args.key, args.value) + ret = self.client.decrypt_keyvalue(address_n, args.key, args.value.decode("hex")) return ret def firmware_update(self, args): From 0bbc33b7ea820965469dade06999c5e38f811a1b Mon Sep 17 00:00:00 2001 From: Timothy Date: Thu, 21 Aug 2014 17:04:10 +0000 Subject: [PATCH 0371/1535] Add basic documentation --- .gitignore | 2 + docs/Dockerfile | 3 + docs/Makefile | 12 ++ docs/client-BaseClient.rst | 6 + docs/client-ProtocolMixin.rst | 6 + docs/client-TextUIMixin.rst | 6 + docs/client.rst | 18 +++ docs/conf.py | 263 ++++++++++++++++++++++++++++++++++ docs/index.rst | 26 ++++ docs/qt.rst | 8 ++ docs/transport.rst | 6 + docs/transport_bridge.rst | 6 + docs/transport_fake.rst | 6 + docs/transport_hid.rst | 15 ++ docs/transport_pipe.rst | 6 + docs/transport_serial.rst | 6 + docs/transport_socket.rst | 6 + docs/transports.rst | 22 +++ 18 files changed, 423 insertions(+) create mode 100644 docs/Dockerfile create mode 100644 docs/Makefile create mode 100644 docs/client-BaseClient.rst create mode 100644 docs/client-ProtocolMixin.rst create mode 100644 docs/client-TextUIMixin.rst create mode 100644 docs/client.rst create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 docs/qt.rst create mode 100644 docs/transport.rst create mode 100644 docs/transport_bridge.rst create mode 100644 docs/transport_fake.rst create mode 100644 docs/transport_hid.rst create mode 100644 docs/transport_pipe.rst create mode 100644 docs/transport_serial.rst create mode 100644 docs/transport_socket.rst create mode 100644 docs/transports.rst diff --git a/.gitignore b/.gitignore index ebdc3784e..ad85dd1e9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ python_trezor.egg-info/ *.py.cache distribute-*.egg distribute-*.tar.gz +docs/_build +docs/.docs-build-environment diff --git a/docs/Dockerfile b/docs/Dockerfile new file mode 100644 index 000000000..bc08c335b --- /dev/null +++ b/docs/Dockerfile @@ -0,0 +1,3 @@ +FROM debian +RUN apt-get update && apt-get install -y python-pip cython python-dev libusb-1.0-0-dev python-qt4 libudev-dev +RUN pip install sphinx ecdsa protobuf mnemonic hidapi pyserial requests diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 000000000..cc31f6420 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,12 @@ +.docs-build-environment: Dockerfile + docker build -t python-trezor-docs-build-environment . + touch .docs-build-environment + +shell: .docs-build-environment + docker run -i -t -v $(subst $(notdir $(CURDIR)),,$(CURDIR)):/root -w /root python-trezor-docs-build-environment /bin/bash + +html: + sphinx-build -b html . ./_build/ + +clean: + rm -rf _build/ diff --git a/docs/client-BaseClient.rst b/docs/client-BaseClient.rst new file mode 100644 index 000000000..74126698c --- /dev/null +++ b/docs/client-BaseClient.rst @@ -0,0 +1,6 @@ +BaseClient class +-------------- + +.. autoclass:: trezorlib.client.BaseClient + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/client-ProtocolMixin.rst b/docs/client-ProtocolMixin.rst new file mode 100644 index 000000000..293c32ba5 --- /dev/null +++ b/docs/client-ProtocolMixin.rst @@ -0,0 +1,6 @@ +ProtocolMixin class +----------------- + +.. autoclass:: trezorlib.client.ProtocolMixin + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/client-TextUIMixin.rst b/docs/client-TextUIMixin.rst new file mode 100644 index 000000000..fe8838659 --- /dev/null +++ b/docs/client-TextUIMixin.rst @@ -0,0 +1,6 @@ +TextUIMixin class +------------------ + +.. autoclass:: trezorlib.client.TextUIMixin + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/client.rst b/docs/client.rst new file mode 100644 index 000000000..13c9fc023 --- /dev/null +++ b/docs/client.rst @@ -0,0 +1,18 @@ +TrezorClient class +---------------- + +TrezorClient objects allow us to interact with TREZOR devices. + +.. autoclass:: trezorlib.client.TrezorClient + :members: + :undoc-members: + +The TrezorClient class inherits from three base classes: + +.. toctree:: + :maxdepth: 2 + + client-ProtocolMixin + client-BaseClient + client-TextUIMixin + diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 000000000..bb39957b6 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,263 @@ +# -*- coding: utf-8 -*- +# +# TREZOR Python API documentation build configuration file, created by +# sphinx-quickstart on Thu Aug 21 14:42:32 2014. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +sys.path.append("/root/") + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.viewcode', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'TREZOR Python API' +copyright = u'2014, SatoshiLabs' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '0' +# The full version, including alpha/beta/rc tags. +release = '0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'TREZORPythonAPIdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { +# The paper size ('letterpaper' or 'a4paper'). +#'papersize': 'letterpaper', + +# The font size ('10pt', '11pt' or '12pt'). +#'pointsize': '10pt', + +# Additional stuff for the LaTeX preamble. +#'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ('index', 'TREZORPythonAPI.tex', u'TREZOR Python API Documentation', + u'SatoshiLabs', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'trezorpythonapi', u'TREZOR Python API Documentation', + [u'SatoshiLabs'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'TREZORPythonAPI', u'TREZOR Python API Documentation', + u'SatoshiLabs', 'TREZORPythonAPI', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 000000000..9f5eac73f --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,26 @@ +.. TREZOR Python API documentation master file, created by + sphinx-quickstart on Thu Aug 21 14:42:32 2014. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to TREZOR Python API's documentation! +============================================= + +Contents: + +The Python TREZOR API is a comprehensive API which covers all aspects of communicating with your TREZOR device. It includes tools for connecting to the TREZOR using a varienty of transport methods, displaying standard TREZOR GUI elements, and debugging programs which use the API using moc up TREZOR devices. + +.. toctree:: + :maxdepth: 2 + + transports + client + qt + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/docs/qt.rst b/docs/qt.rst new file mode 100644 index 000000000..28a2acacb --- /dev/null +++ b/docs/qt.rst @@ -0,0 +1,8 @@ +QT GUI Elements for TREZOR applications +------------------------- + +These qt based GUI elements are intended to ease the inclusion of TREZOR specific GUI elemements in your TREZOR application as well as standardize the TREZOR user experience across TREZOR clients. + +.. automodule:: trezorlib.qt.pinmatrix + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/transport.rst b/docs/transport.rst new file mode 100644 index 000000000..929103710 --- /dev/null +++ b/docs/transport.rst @@ -0,0 +1,6 @@ +Transport class +-------------- + +.. automodule:: trezorlib.transport + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/transport_bridge.rst b/docs/transport_bridge.rst new file mode 100644 index 000000000..ed42b5214 --- /dev/null +++ b/docs/transport_bridge.rst @@ -0,0 +1,6 @@ +Transport via TREZOR Bridge +-------------- + +.. automodule:: trezorlib.transport_bridge + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/transport_fake.rst b/docs/transport_fake.rst new file mode 100644 index 000000000..f4c9ed8ab --- /dev/null +++ b/docs/transport_fake.rst @@ -0,0 +1,6 @@ +Fake Transport for debugging +-------------- + +.. automodule:: trezorlib.transport_fake + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/transport_hid.rst b/docs/transport_hid.rst new file mode 100644 index 000000000..b60c1a90e --- /dev/null +++ b/docs/transport_hid.rst @@ -0,0 +1,15 @@ +Transport via USB HID +-------------- + +To get a list of TREZORs that are currently plugged into our computer, we use the enumerate method. + +.. code-block:: python + + import trezorlib.transport_hid + list_of_trezor_devices = trezorlib.transport_hid.enumerate() + +We can now interact with our TREZORs by creating a :doc:`TrezorClient ` object. + +.. automodule:: trezorlib.transport_hid + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/transport_pipe.rst b/docs/transport_pipe.rst new file mode 100644 index 000000000..312b2fee1 --- /dev/null +++ b/docs/transport_pipe.rst @@ -0,0 +1,6 @@ +Transport via pipe +-------------- + +.. automodule:: trezorlib.transport_pipe + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/transport_serial.rst b/docs/transport_serial.rst new file mode 100644 index 000000000..30710a5f5 --- /dev/null +++ b/docs/transport_serial.rst @@ -0,0 +1,6 @@ +Transport via serial +-------------- + +.. automodule:: trezorlib.transport_serial + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/transport_socket.rst b/docs/transport_socket.rst new file mode 100644 index 000000000..6f9acd83f --- /dev/null +++ b/docs/transport_socket.rst @@ -0,0 +1,6 @@ +Transport via socket +-------------- + +.. automodule:: trezorlib.transport_socket + :members: + :undoc-members: \ No newline at end of file diff --git a/docs/transports.rst b/docs/transports.rst new file mode 100644 index 000000000..763cad63c --- /dev/null +++ b/docs/transports.rst @@ -0,0 +1,22 @@ +Transport methods +------------------ + +Transports are ways in which your program can communicate with your TREZOR device. This can be: + + - direct via US + - indirect: through the TREZOR bridge or network + - fake: for debugging purposes + +Each transport method is represented as an instance of :doc:`the Transport class `. + +The following transport methos are supported: + +.. toctree:: + :maxdepth: 2 + + transport_hid + transport_bridge + transport_fake + transport_pipe + transport_serial + transport_socket \ No newline at end of file From b3f7fa97307dcd0051ab4037e5be1e611dac1cba Mon Sep 17 00:00:00 2001 From: Timothy Date: Tue, 26 Aug 2014 13:53:21 +0000 Subject: [PATCH 0372/1535] Add newline at end of Makefile --- docs/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Makefile b/docs/Makefile index cc31f6420..89e5f96eb 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -10,3 +10,4 @@ html: clean: rm -rf _build/ + From 78e9afae6ea6afe4535b1bce1a9363cb2987b5d1 Mon Sep 17 00:00:00 2001 From: Timothy Date: Tue, 26 Aug 2014 13:54:06 +0000 Subject: [PATCH 0373/1535] Document Transport class --- docs/transport.rst | 12 +++++++++++- trezorlib/transport.py | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/docs/transport.rst b/docs/transport.rst index 929103710..e774d5650 100644 --- a/docs/transport.rst +++ b/docs/transport.rst @@ -1,6 +1,16 @@ Transport class -------------- -.. automodule:: trezorlib.transport +.. autoclass:: trezorlib.transport.Transport + :members: + :undoc-members: + +Exceptions: + +.. autoclass:: trezorlib.transport.ConnectionError + :members: + :undoc-members: + +.. autoclass:: trezorlib.transport.NotImplementedException :members: :undoc-members: \ No newline at end of file diff --git a/trezorlib/transport.py b/trezorlib/transport.py index 63f0c729e..71160f0f4 100644 --- a/trezorlib/transport.py +++ b/trezorlib/transport.py @@ -32,28 +32,47 @@ class Transport(object): pass def ready_to_read(self): + """ + Returns True if there is data to be read from the transport. Otherwise, False. + """ raise NotImplementedException("Not implemented") def session_begin(self): + """ + Apply a lock to the device in order to preform synchronous multistep "conversations" with the device. For example, before entering the transaction signing workflow, one begins a session. After the transaction is complete, the session may be ended. + """ if self.session_depth == 0: self._session_begin() self.session_depth += 1 def session_end(self): + """ + End a session. Se session_begin for an in depth description of TREZOR sessions. + """ self.session_depth -= 1 self.session_depth = max(0, self.session_depth) if self.session_depth == 0: self._session_end() def close(self): + """ + Close the connection to the physical device or file descriptor represented by the Transport. + """ self._close() def write(self, msg): + """ + Write mesage to tansport. msg should be a member of a valid `protobuf class `_ with a SerializeToString() method. + """ ser = msg.SerializeToString() header = struct.pack(">HL", mapping.get_type(msg), len(ser)) self._write("##%s%s" % (header, ser), msg) def read(self): + """ + If there is data available to be read from the transport, reads the data and tries to parse it as a protobuf message. If the parsing succeeds, return a protobuf object. + Otherwise, returns None. + """ if not self.ready_to_read(): return None @@ -64,6 +83,9 @@ class Transport(object): return self._parse_message(data) def read_blocking(self): + """ + Same as read, except blocks untill data is available to be read. + """ while True: data = self._read() if data != None: From e7cb1d474a49e060629ec08df599cd3dd4fe5ab1 Mon Sep 17 00:00:00 2001 From: Timothy Date: Tue, 26 Aug 2014 14:06:19 +0000 Subject: [PATCH 0374/1535] Document transport_hid class --- docs/transport_hid.rst | 2 +- trezorlib/transport_hid.py | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/transport_hid.rst b/docs/transport_hid.rst index b60c1a90e..02b1ea419 100644 --- a/docs/transport_hid.rst +++ b/docs/transport_hid.rst @@ -10,6 +10,6 @@ To get a list of TREZORs that are currently plugged into our computer, we use th We can now interact with our TREZORs by creating a :doc:`TrezorClient ` object. -.. automodule:: trezorlib.transport_hid +.. autoclass:: trezorlib.transport_hid.HidTransport :members: :undoc-members: \ No newline at end of file diff --git a/trezorlib/transport_hid.py b/trezorlib/transport_hid.py index 8db11a6e9..114679cbf 100644 --- a/trezorlib/transport_hid.py +++ b/trezorlib/transport_hid.py @@ -54,6 +54,9 @@ class HidTransport(Transport): @classmethod def enumerate(cls): + """ + Return a list of available TREZOR devices. + """ devices = {} for d in hid.enumerate(0, 0): vendor_id = d['vendor_id'] @@ -74,7 +77,9 @@ class HidTransport(Transport): return devices.values() def is_connected(self): - # Check if the device is still connected + """ + Check if the device is still connected. + """ for d in hid.enumerate(0, 0): if d['path'] == self.device: return True From 2ceef0f07c6529696eea6551ea7f87f77776662d Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 29 Aug 2014 23:42:35 +0200 Subject: [PATCH 0375/1535] pin protobuf dependency to 2.5.0 --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 7df3dddec..d430d5dd0 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name='trezor', - version='0.5.3', + version='0.5.4', author='Bitcoin TREZOR', author_email='info@bitcointrezor.com', description='Python library for communicating with TREZOR Bitcoin Hardware Wallet', @@ -27,7 +27,7 @@ setup( 'trezorlib.types_pb2', ], test_suite='tests', - install_requires=['ecdsa>=0.9', 'protobuf', 'mnemonic>=0.8', 'hidapi>=0.7.99'], + install_requires=['ecdsa>=0.9', 'protobuf==2.5.0', 'mnemonic>=0.8', 'hidapi>=0.7.99'], include_package_data=True, zip_safe=False, classifiers=[ From 06214d52b428de8dc067ecc3e0feba08e4000f3b Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 22 Oct 2014 00:26:07 +0200 Subject: [PATCH 0376/1535] fix unittests using client.get_public_node method --- .gitignore | 1 + .gitmodules | 3 --- tests/test_msg_encryptmessage.py | 4 ++-- tests/test_msg_getaddress.py | 4 ++-- tests/test_msg_getpublickey.py | 22 +++++++++++----------- 5 files changed, 16 insertions(+), 18 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitignore b/.gitignore index ad85dd1e9..2bfa335eb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ build/ dist/ python_trezor.egg-info/ +trezor.egg-info/ *.pyc *.bin *.py.cache diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index d22c9dbfa..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "trezor-common"] - path = trezor-common - url = https://github.com/trezor/trezor-common.git diff --git a/tests/test_msg_encryptmessage.py b/tests/test_msg_encryptmessage.py index ac76d6ccd..a6729d903 100644 --- a/tests/test_msg_encryptmessage.py +++ b/tests/test_msg_encryptmessage.py @@ -9,7 +9,7 @@ class TestMsgEncryptmessage(common.TrezorTest): def test_encrypt(self): self.setup_mnemonic_nopin_nopassphrase() - pubkey1 = self.client.get_public_node([1]).public_key + pubkey1 = self.client.get_public_node([1]).node.public_key enc = self.client.encrypt_message(pubkey1, 'testing message!', display_only=False) self.assertEqual(binascii.hexlify(enc), '42494531025bef848e6a92f9361eeb23ba4f7d642191c9be17d6868b3e17839d8cb4b96045bbb05c7936312088ea97d473bcfbbe020c6c67028130601022ec45ec7b34c8eb47ee785922c308c9ad25da259aa59ec21a89e327af30e4213da31f3fc70ff5ae') @@ -17,7 +17,7 @@ class TestMsgEncryptmessage(common.TrezorTest): enc = self.client.encrypt_message(pubkey1, 'testing message!', display_only=True) self.assertEqual(binascii.hexlify(enc), '42494531025bef848e6a92f9361eeb23ba4f7d642191c9be17d6868b3e17839d8cb4b96045bbb05c7936312088ea97d473bcfbbe02f14a9778cbb1c5b75f8cef70581ad2c34acb7f9eb7918b17ea323123148251d8eb6d63d16ac8a86f3623855450b70d95') - pubkey2 = self.client.get_public_node([1, -2]).public_key + pubkey2 = self.client.get_public_node([1, -2]).node.public_key enc = self.client.encrypt_message(pubkey2, 'testing message!', display_only=False) self.assertEqual(binascii.hexlify(enc), '424945310238cba33fd1ed1d2adebd4cc4bbd89913ecb34922c1b387c3a10d70d9de6d9ea627b49044ce1dbf26cca8a727a40366dcb1f9c9a2d5eafa90817fd0d967ca25127bea98a5e93c150544bf457b48fdd667c72b8c9c31ccd0ad2aea2f1b50ec0ce6') diff --git a/tests/test_msg_getaddress.py b/tests/test_msg_getaddress.py index b13a4b422..cc427c8e2 100644 --- a/tests/test_msg_getaddress.py +++ b/tests/test_msg_getaddress.py @@ -27,8 +27,8 @@ class TestMsgGetaddress(common.TrezorTest): def test_public_ckd(self): self.setup_mnemonic_nopin_nopassphrase() - node = self.client.get_public_node([]) - node_sub1 = self.client.get_public_node([1]) + node = self.client.get_public_node([]).node + node_sub1 = self.client.get_public_node([1]).node node_sub2 = bip32.public_ckd(node, [1]) self.assertEqual(node_sub1.chain_code, node_sub2.chain_code) diff --git a/tests/test_msg_getpublickey.py b/tests/test_msg_getpublickey.py index 3dc74cd04..a0989b056 100644 --- a/tests/test_msg_getpublickey.py +++ b/tests/test_msg_getpublickey.py @@ -6,23 +6,23 @@ class TestMsgGetpublic_key(common.TrezorTest): def test_btc(self): self.setup_mnemonic_nopin_nopassphrase() - self.assertEqual(bip32.serialize(self.client.get_public_node([]), 0x0488B21E), 'xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') - self.assertEqual(bip32.serialize(self.client.get_public_node([1]), 0x0488B21E), 'xpub68zNxjsTrV8y9AadThLW7dTAqEpZ7xBLFSyJ3X9pjTv6Njg6kxgjXJkzxq8u3ttnjBw1jupQHMP3gpGZzZqd1eh5S4GjkaMhPR18vMyUi8N') - self.assertEqual(bip32.serialize(self.client.get_public_node([0, -1]), 0x0488B21E), 'xpub6A3FoZqYXj1AbW4thRwBh26YwZWbmoyjTaZwwxJjY1oKUpefLepL3RFS9DHKQrjAfxDrzDepYMDZPqXN6upQm3bHQ9xaXD5a3mqni3goF4v') - self.assertEqual(bip32.serialize(self.client.get_public_node([-9, 0]), 0x0488B21E), 'xpub6A2h5mzLDfYginoD7q7wCWbq18wTbN9gducRr2w5NRTwdLeoT3cJSwefFqW7uXTpVFGtpUyDMBNYs3DNvvXx6NPjF9YEbUQrtxFSWnPtVrv') - self.assertEqual(bip32.serialize(self.client.get_public_node([0, 9999999]), 0x0488B21E), 'xpub6A3FoZqQEK6iwLZ4HFkqSo5fb35BH4bpjC4SPZ63prfLdGYPwYxEuC6o91bUvFFdMzKWe5rs3axHRUjxJaSvBnKKFtnfLwDACRxPxabsv2r') + self.assertEqual(bip32.serialize(self.client.get_public_node([]).node, 0x0488B21E), 'xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') + self.assertEqual(bip32.serialize(self.client.get_public_node([1]).node, 0x0488B21E), 'xpub68zNxjsTrV8y9AadThLW7dTAqEpZ7xBLFSyJ3X9pjTv6Njg6kxgjXJkzxq8u3ttnjBw1jupQHMP3gpGZzZqd1eh5S4GjkaMhPR18vMyUi8N') + self.assertEqual(bip32.serialize(self.client.get_public_node([0, -1]).node, 0x0488B21E), 'xpub6A3FoZqYXj1AbW4thRwBh26YwZWbmoyjTaZwwxJjY1oKUpefLepL3RFS9DHKQrjAfxDrzDepYMDZPqXN6upQm3bHQ9xaXD5a3mqni3goF4v') + self.assertEqual(bip32.serialize(self.client.get_public_node([-9, 0]).node, 0x0488B21E), 'xpub6A2h5mzLDfYginoD7q7wCWbq18wTbN9gducRr2w5NRTwdLeoT3cJSwefFqW7uXTpVFGtpUyDMBNYs3DNvvXx6NPjF9YEbUQrtxFSWnPtVrv') + self.assertEqual(bip32.serialize(self.client.get_public_node([0, 9999999]).node, 0x0488B21E), 'xpub6A3FoZqQEK6iwLZ4HFkqSo5fb35BH4bpjC4SPZ63prfLdGYPwYxEuC6o91bUvFFdMzKWe5rs3axHRUjxJaSvBnKKFtnfLwDACRxPxabsv2r') def test_ltc(self): self.setup_mnemonic_nopin_nopassphrase() - self.assertEqual(bip32.serialize(self.client.get_public_node([]), 0x019dA462), 'Ltub2SSUS19CirucVPGDKDBatBDBEM2s9UbH66pBURfaKrMocCPLhQ7Z7hecy5VYLHA5fRdXwB2e61j2VJCNzVsqKTCVEU1vECjqi5EyczFX9xp') - self.assertEqual(bip32.serialize(self.client.get_public_node([1]), 0x019dA462), 'Ltub2VRVRP5VjvSyPXra4BLVyVZPv397sjhUNjBGsbtw6xko77JuQyBULxFSKheviJJ3KQLbL3Cx8P2RnudguTw4raUVjCACRG7jsumUptYx55C') - self.assertEqual(bip32.serialize(self.client.get_public_node([0, -1]), 0x019dA462), 'Ltub2WUNGD3aRAKAqsLqHuwBYtCn2MqAXbVsarmvn33quWe2DCHTzfK4s4jsW5oM5G8RGAdSaM3NPNrwVvtV1ourbyNhhHr3BtqcYGc8caf5GoT') - self.assertEqual(bip32.serialize(self.client.get_public_node([-9, 0]), 0x019dA462), 'Ltub2WToYRCN76rgyA59iK7w4Ni45wG2M9fpmBpQg7gBjvJeMiHc7473Gb96ci29Zvs55TgUQcMmCD1vy8aVqpdPwJB9YHRhGAAuPT1nRLLXmFu') - self.assertEqual(bip32.serialize(self.client.get_public_node([0, 9999999]), 0x019dA462), 'Ltub2WUNGD3S7kQjBhpzsjkqJfBtfqPk2r7xrUGRDdqACMW3MeBCbZSyiqbEVt7WaeesxCj6EDFQtcbfXa75DUYN2i6jZ2g81cyCgvijs9J2u2n') + self.assertEqual(bip32.serialize(self.client.get_public_node([]).node, 0x019dA462), 'Ltub2SSUS19CirucVPGDKDBatBDBEM2s9UbH66pBURfaKrMocCPLhQ7Z7hecy5VYLHA5fRdXwB2e61j2VJCNzVsqKTCVEU1vECjqi5EyczFX9xp') + self.assertEqual(bip32.serialize(self.client.get_public_node([1]).node, 0x019dA462), 'Ltub2VRVRP5VjvSyPXra4BLVyVZPv397sjhUNjBGsbtw6xko77JuQyBULxFSKheviJJ3KQLbL3Cx8P2RnudguTw4raUVjCACRG7jsumUptYx55C') + self.assertEqual(bip32.serialize(self.client.get_public_node([0, -1]).node, 0x019dA462), 'Ltub2WUNGD3aRAKAqsLqHuwBYtCn2MqAXbVsarmvn33quWe2DCHTzfK4s4jsW5oM5G8RGAdSaM3NPNrwVvtV1ourbyNhhHr3BtqcYGc8caf5GoT') + self.assertEqual(bip32.serialize(self.client.get_public_node([-9, 0]).node, 0x019dA462), 'Ltub2WToYRCN76rgyA59iK7w4Ni45wG2M9fpmBpQg7gBjvJeMiHc7473Gb96ci29Zvs55TgUQcMmCD1vy8aVqpdPwJB9YHRhGAAuPT1nRLLXmFu') + self.assertEqual(bip32.serialize(self.client.get_public_node([0, 9999999]).node, 0x019dA462), 'Ltub2WUNGD3S7kQjBhpzsjkqJfBtfqPk2r7xrUGRDdqACMW3MeBCbZSyiqbEVt7WaeesxCj6EDFQtcbfXa75DUYN2i6jZ2g81cyCgvijs9J2u2n') def test_tbtc(self): self.setup_mnemonic_nopin_nopassphrase() - self.assertEqual(bip32.serialize(self.client.get_public_node([111, 42]), 0x043587CF), 'tpubDAgixSyai5PWbc8N1mBkHDR5nLgAnHFtY7r4y5EzxqAxrt9YUDpZL3kaRoHVvCfrcwNo31c2isBP2uTHcZxEosuKbyJhCAbrvGoPuLUZ7Mz') + self.assertEqual(bip32.serialize(self.client.get_public_node([111, 42]).node, 0x043587CF), 'tpubDAgixSyai5PWbc8N1mBkHDR5nLgAnHFtY7r4y5EzxqAxrt9YUDpZL3kaRoHVvCfrcwNo31c2isBP2uTHcZxEosuKbyJhCAbrvGoPuLUZ7Mz') if __name__ == '__main__': unittest.main() From 7963db8455df29e3737231cf6763dc3e8e81f921 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 22 Oct 2014 19:48:45 +0200 Subject: [PATCH 0377/1535] update protobuf --- trezorlib/messages_pb2.py | 75 +++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index d5fbe3bae..bbbdac093 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"Q\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"G\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\"4\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xa1\r\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"Q\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Z\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\"4\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xa1\r\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -218,8 +218,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3181, - serialized_end=4878, + serialized_start=3200, + serialized_end=4897, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -1457,6 +1457,13 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='address_n', full_name='EncryptMessage.address_n', index=3, + number=4, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -1467,7 +1474,7 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=1973, - serialized_end=2044, + serialized_end=2063, ) @@ -1501,8 +1508,8 @@ _DECRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2046, - serialized_end=2098, + serialized_start=2065, + serialized_end=2117, ) @@ -1564,8 +1571,8 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2101, - serialized_end=2229, + serialized_start=2120, + serialized_end=2248, ) @@ -1606,8 +1613,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2231, - serialized_end=2320, + serialized_start=2250, + serialized_end=2339, ) @@ -1634,8 +1641,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2322, - serialized_end=2347, + serialized_start=2341, + serialized_end=2366, ) @@ -1676,8 +1683,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2349, - serialized_end=2430, + serialized_start=2368, + serialized_end=2449, ) @@ -1725,8 +1732,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2433, - serialized_end=2577, + serialized_start=2452, + serialized_end=2596, ) @@ -1767,8 +1774,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2580, - serialized_end=2713, + serialized_start=2599, + serialized_end=2732, ) @@ -1795,8 +1802,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2715, - serialized_end=2752, + serialized_start=2734, + serialized_end=2771, ) @@ -1816,8 +1823,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2754, - serialized_end=2769, + serialized_start=2773, + serialized_end=2788, ) @@ -1844,8 +1851,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2771, - serialized_end=2804, + serialized_start=2790, + serialized_end=2823, ) @@ -1872,8 +1879,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2806, - serialized_end=2841, + serialized_start=2825, + serialized_end=2860, ) @@ -1893,8 +1900,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2843, - serialized_end=2862, + serialized_start=2862, + serialized_end=2881, ) @@ -1984,8 +1991,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2865, - serialized_end=3100, + serialized_start=2884, + serialized_end=3119, ) @@ -2005,8 +2012,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3102, - serialized_end=3117, + serialized_start=3121, + serialized_end=3136, ) @@ -2047,8 +2054,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3119, - serialized_end=3178, + serialized_start=3138, + serialized_end=3197, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From d65d7cb8555efde7e7d3fd3fe2dedc7ef5264c2d Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 30 Oct 2014 00:48:06 +0100 Subject: [PATCH 0378/1535] update protobuf --- trezorlib/client.py | 5 +-- trezorlib/messages_pb2.py | 75 +++++++++++++++++++++------------------ 2 files changed, 44 insertions(+), 36 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 5eba3e734..d1fe9aa27 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -432,8 +432,9 @@ class ProtocolMixin(object): @field('payload') @expect(proto.Success) - def encrypt_message(self, pubkey, message, display_only): - return self.call(proto.EncryptMessage(pubkey=pubkey, message=message, display_only=display_only)) + def encrypt_message(self, pubkey, message, display_only, coin_name, n): + n = self._convert_prime(n) + return self.call(proto.EncryptMessage(pubkey=pubkey, message=message, display_only=display_only, coin_name=coin_name, address_n=n)) @field('payload') @expect(proto.Success) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index bbbdac093..86279ebe6 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"Q\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"Z\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\"4\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xa1\r\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"Q\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"4\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xa1\r\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -218,8 +218,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3200, - serialized_end=4897, + serialized_start=3228, + serialized_end=4925, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -1464,6 +1464,13 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='coin_name', full_name='EncryptMessage.coin_name', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=True, default_value=unicode("Bitcoin", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -1474,7 +1481,7 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=1973, - serialized_end=2063, + serialized_end=2091, ) @@ -1508,8 +1515,8 @@ _DECRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2065, - serialized_end=2117, + serialized_start=2093, + serialized_end=2145, ) @@ -1571,8 +1578,8 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2120, - serialized_end=2248, + serialized_start=2148, + serialized_end=2276, ) @@ -1613,8 +1620,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2250, - serialized_end=2339, + serialized_start=2278, + serialized_end=2367, ) @@ -1641,8 +1648,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2341, - serialized_end=2366, + serialized_start=2369, + serialized_end=2394, ) @@ -1683,8 +1690,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2368, - serialized_end=2449, + serialized_start=2396, + serialized_end=2477, ) @@ -1732,8 +1739,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2452, - serialized_end=2596, + serialized_start=2480, + serialized_end=2624, ) @@ -1774,8 +1781,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2599, - serialized_end=2732, + serialized_start=2627, + serialized_end=2760, ) @@ -1802,8 +1809,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2734, - serialized_end=2771, + serialized_start=2762, + serialized_end=2799, ) @@ -1823,8 +1830,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2773, - serialized_end=2788, + serialized_start=2801, + serialized_end=2816, ) @@ -1851,8 +1858,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2790, - serialized_end=2823, + serialized_start=2818, + serialized_end=2851, ) @@ -1879,8 +1886,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2825, - serialized_end=2860, + serialized_start=2853, + serialized_end=2888, ) @@ -1900,8 +1907,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2862, - serialized_end=2881, + serialized_start=2890, + serialized_end=2909, ) @@ -1991,8 +1998,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2884, - serialized_end=3119, + serialized_start=2912, + serialized_end=3147, ) @@ -2012,8 +2019,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3121, - serialized_end=3136, + serialized_start=3149, + serialized_end=3164, ) @@ -2054,8 +2061,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3138, - serialized_end=3197, + serialized_start=3166, + serialized_end=3225, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From 399d4e10d71136fe26cb58795d6c9e60c040ea13 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 2 Nov 2014 16:16:22 +0100 Subject: [PATCH 0379/1535] create test_ecies for testing ECIES --- tests/test_ecies.py | 36 ++++++++++++++++++++++++++++++++ tests/test_msg_decryptmessage.py | 25 ---------------------- tests/test_msg_encryptmessage.py | 29 ------------------------- 3 files changed, 36 insertions(+), 54 deletions(-) create mode 100644 tests/test_ecies.py delete mode 100644 tests/test_msg_decryptmessage.py delete mode 100644 tests/test_msg_encryptmessage.py diff --git a/tests/test_ecies.py b/tests/test_ecies.py new file mode 100644 index 000000000..376231cf2 --- /dev/null +++ b/tests/test_ecies.py @@ -0,0 +1,36 @@ +import unittest +import common +import binascii + +from trezorlib.client import CallException + +class TestEcies(common.TrezorTest): + + def test_ecies(self): + self.setup_mnemonic_nopin_nopassphrase() + + pubkey = self.client.get_public_node([1]).node.public_key + + # encrypt without signature + enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=False, coin_name='Bitcoin', n=[]) + dec = self.client.decrypt_message([1], enc) + self.assertEqual(dec, 'testing message!') + + # encrypt with signature + enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=False, coin_name='Bitcoin', n=[2]) + dec = self.client.decrypt_message([1], enc) + self.assertEqual(dec, 'testing message!') + + # encrypt without signature, show only on display + enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=True, coin_name='Bitcoin', n=[]) + dec = self.client.decrypt_message([1], enc) + self.assertEqual(dec, '') + + # encrypt with signature, show only on display + enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=True, coin_name='Bitcoin', n=[2]) + dec = self.client.decrypt_message([1], enc) + self.assertEqual(dec, '') + + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_msg_decryptmessage.py b/tests/test_msg_decryptmessage.py deleted file mode 100644 index c5fd53fb1..000000000 --- a/tests/test_msg_decryptmessage.py +++ /dev/null @@ -1,25 +0,0 @@ -import unittest -import common -import binascii - -from trezorlib.client import CallException - -class TestMsgDecryptmessage(common.TrezorTest): - - def test_decrypt(self): - self.setup_mnemonic_nopin_nopassphrase() - - dec = self.client.decrypt_message([1], binascii.unhexlify('42494531025bef848e6a92f9361eeb23ba4f7d642191c9be17d6868b3e17839d8cb4b96045bbb05c7936312088ea97d473bcfbbe020c6c67028130601022ec45ec7b34c8eb47ee785922c308c9ad25da259aa59ec21a89e327af30e4213da31f3fc70ff5ae')) - self.assertEqual(dec, 'testing message!') - - dec = self.client.decrypt_message([1], binascii.unhexlify('42494531025bef848e6a92f9361eeb23ba4f7d642191c9be17d6868b3e17839d8cb4b96045bbb05c7936312088ea97d473bcfbbe02f14a9778cbb1c5b75f8cef70581ad2c34acb7f9eb7918b17ea323123148251d8eb6d63d16ac8a86f3623855450b70d95')) - self.assertEqual(dec, '') # display only - - dec = self.client.decrypt_message([1, -2], binascii.unhexlify('424945310238cba33fd1ed1d2adebd4cc4bbd89913ecb34922c1b387c3a10d70d9de6d9ea627b49044ce1dbf26cca8a727a40366dcb1f9c9a2d5eafa90817fd0d967ca25127bea98a5e93c150544bf457b48fdd667c72b8c9c31ccd0ad2aea2f1b50ec0ce6')) - self.assertEqual(dec, 'testing message!') - - dec = self.client.decrypt_message([1, -2], binascii.unhexlify('424945310238cba33fd1ed1d2adebd4cc4bbd89913ecb34922c1b387c3a10d70d9de6d9ea627b49044ce1dbf26cca8a727a40366dc1b16f7f6acb09645d91c73619baf458ed3262da40ff25f8f64db3fd5ff19bf50fb589db3ae6cfb5b546af720aa711d81')) - self.assertEqual(dec, '') # display only - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_msg_encryptmessage.py b/tests/test_msg_encryptmessage.py deleted file mode 100644 index a6729d903..000000000 --- a/tests/test_msg_encryptmessage.py +++ /dev/null @@ -1,29 +0,0 @@ -import unittest -import common -import binascii - -from trezorlib.client import CallException - -class TestMsgEncryptmessage(common.TrezorTest): - - def test_encrypt(self): - self.setup_mnemonic_nopin_nopassphrase() - - pubkey1 = self.client.get_public_node([1]).node.public_key - - enc = self.client.encrypt_message(pubkey1, 'testing message!', display_only=False) - self.assertEqual(binascii.hexlify(enc), '42494531025bef848e6a92f9361eeb23ba4f7d642191c9be17d6868b3e17839d8cb4b96045bbb05c7936312088ea97d473bcfbbe020c6c67028130601022ec45ec7b34c8eb47ee785922c308c9ad25da259aa59ec21a89e327af30e4213da31f3fc70ff5ae') - - enc = self.client.encrypt_message(pubkey1, 'testing message!', display_only=True) - self.assertEqual(binascii.hexlify(enc), '42494531025bef848e6a92f9361eeb23ba4f7d642191c9be17d6868b3e17839d8cb4b96045bbb05c7936312088ea97d473bcfbbe02f14a9778cbb1c5b75f8cef70581ad2c34acb7f9eb7918b17ea323123148251d8eb6d63d16ac8a86f3623855450b70d95') - - pubkey2 = self.client.get_public_node([1, -2]).node.public_key - - enc = self.client.encrypt_message(pubkey2, 'testing message!', display_only=False) - self.assertEqual(binascii.hexlify(enc), '424945310238cba33fd1ed1d2adebd4cc4bbd89913ecb34922c1b387c3a10d70d9de6d9ea627b49044ce1dbf26cca8a727a40366dcb1f9c9a2d5eafa90817fd0d967ca25127bea98a5e93c150544bf457b48fdd667c72b8c9c31ccd0ad2aea2f1b50ec0ce6') - - enc = self.client.encrypt_message(pubkey2, 'testing message!', display_only=True) - self.assertEqual(binascii.hexlify(enc), '424945310238cba33fd1ed1d2adebd4cc4bbd89913ecb34922c1b387c3a10d70d9de6d9ea627b49044ce1dbf26cca8a727a40366dc1b16f7f6acb09645d91c73619baf458ed3262da40ff25f8f64db3fd5ff19bf50fb589db3ae6cfb5b546af720aa711d81') - -if __name__ == '__main__': - unittest.main() From f9e45d8e94d4ee7039fb13cfa43031f50340deec Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 3 Nov 2014 19:42:22 +0100 Subject: [PATCH 0380/1535] rework EncryptMessage/DecryptMessage --- tests/test_ecies.py | 75 ++++++-- trezorlib/client.py | 18 +- trezorlib/messages_pb2.py | 396 ++++++++++++++++++++++++++------------ 3 files changed, 347 insertions(+), 142 deletions(-) diff --git a/tests/test_ecies.py b/tests/test_ecies.py index 376231cf2..2d2e1f194 100644 --- a/tests/test_ecies.py +++ b/tests/test_ecies.py @@ -1,36 +1,89 @@ import unittest import common import binascii +import base64 from trezorlib.client import CallException +# as described here: http://memwallet.info/btcmssgs.html + class TestEcies(common.TrezorTest): +# index: m/1 +# address: 1CK7SJdcb8z9HuvVft3D91HLpLC6KSsGb +# pubkey: 0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6 +# privkey: L5X3rf5hJfRt9ZjQzFopvSBGkpnSotn4jKGLL6ECJxcuT2JgGh65 + +# index: m/5 +# address: 1Csf6LVPkv24FBs6bpj4ELPszE6mGf6jeV +# pubkey: 0234716c01c2dd03fa7ee302705e2b8fbd1311895d94b1dca15e62eedea9b0968f +# privkey: L4uKPRgaZqL9iGmge3UBSLGTQC7gDFrLRhC1vM4LmGyrzNUBb1Zs + def test_ecies(self): self.setup_mnemonic_nopin_nopassphrase() - pubkey = self.client.get_public_node([1]).node.public_key + pubkey = binascii.unhexlify('0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6') # encrypt without signature enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=False, coin_name='Bitcoin', n=[]) - dec = self.client.decrypt_message([1], enc) - self.assertEqual(dec, 'testing message!') + print 'base64:', base64.b64encode(enc.nonce + enc.message + enc.hmac) + dec = self.client.decrypt_message([1], enc.nonce, enc.message, enc.hmac) + self.assertEqual(dec.message, 'testing message!') + self.assertEqual(dec.address, '') # encrypt with signature - enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=False, coin_name='Bitcoin', n=[2]) - dec = self.client.decrypt_message([1], enc) - self.assertEqual(dec, 'testing message!') + enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=False, coin_name='Bitcoin', n=[5]) + print 'base64:', base64.b64encode(enc.nonce + enc.message + enc.hmac) + dec = self.client.decrypt_message([1], enc.nonce, enc.message, enc.hmac) + self.assertEqual(dec.message, 'testing message!') + self.assertEqual(dec.address, '1Csf6LVPkv24FBs6bpj4ELPszE6mGf6jeV') # encrypt without signature, show only on display enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=True, coin_name='Bitcoin', n=[]) - dec = self.client.decrypt_message([1], enc) - self.assertEqual(dec, '') + dec = self.client.decrypt_message([1], enc.nonce, enc.message, enc.hmac) + self.assertEqual(dec.message, '') + self.assertEqual(dec.address, '') # encrypt with signature, show only on display - enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=True, coin_name='Bitcoin', n=[2]) - dec = self.client.decrypt_message([1], enc) - self.assertEqual(dec, '') + enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=True, coin_name='Bitcoin', n=[5]) + dec = self.client.decrypt_message([1], enc.nonce, enc.message, enc.hmac) + self.assertEqual(dec.message, '') + self.assertEqual(dec.address, '') + + def test_ecies_crosscheck(self): + self.setup_mnemonic_nopin_nopassphrase() + + # decrypt message without signature + payload = 'AhA1yCZStrmtuGSgliJ7K02eD8xWRoyRU1ryPu9kBloODFv9hATpqukL0YSzISfrQGygYVai5OirxU0=' + payload = base64.b64decode(payload) + nonce, msg, hmac = payload[:33], payload[33:-8], payload[-8:] + dec = self.client.decrypt_message([1], nonce, msg, hmac) + self.assertEqual(dec.message, 'testing message!') + self.assertEqual(dec.address, '') + + # decrypt message without signature (same message, different nonce) + payload = 'A9ragu6UTXisBWw6bTCcM/SeR7fmlQp6Qzg9mpJ5qKBv9BIgWX/v/u+OhdlKLZTx6C0Xooz5aIvWrqw=' + payload = base64.b64decode(payload) + nonce, msg, hmac = payload[:33], payload[33:-8], payload[-8:] + dec = self.client.decrypt_message([1], nonce, msg, hmac) + self.assertEqual(dec.message, 'testing message!') + self.assertEqual(dec.address, '') + + # decrypt message with signature + payload = 'A90Awe+vrQvmzFvm0hh8Ver7jcBbqiCxV4RGU9knKf6F3vvG1N45Q3kc+N1sd4inzXZnW/5KH74CXaCPGAKr/a0n4BUhADVfS2Ic9Luwcs6/cuYHSzJKKLSPUYC6N4hu1K0q1vR/02BJ+iZ0pfvChoGDmpOOO7NaIEoyiKAnZFNsHr6Ffplg3YVGJAAG7GgfSQ==' + payload = base64.b64decode(payload) + nonce, msg, hmac = payload[:33], payload[33:-8], payload[-8:] + dec = self.client.decrypt_message([1], nonce, msg, hmac) + self.assertEqual(dec.message, 'testing message!') + self.assertEqual(dec.address, '1Csf6LVPkv24FBs6bpj4ELPszE6mGf6jeV') + # decrypt message with signature (same message, different nonce) + payload = 'AyeglkkBSc3VLNrXETiNtiS+t2nIKeEVGMVfF7KlVM+plBuX3yc+2kf+Yo6L1NKoqEjSlRXn71OTOEWfB2zmtasIX9dQBfyGluEivbeUfqbwneepEzv9/i0XI3ywfSa2HSdic8B68nZ3D6Mms4qOpzk6AEPt/yI7fl8aUsN0lxT8nVBfMmmg10oydvH/86cWYA==' + payload = base64.b64decode(payload) + nonce, msg, hmac = payload[:33], payload[33:-8], payload[-8:] + dec = self.client.decrypt_message([1], nonce, msg, hmac) + self.assertEqual(dec.message, 'testing message!') + self.assertEqual(dec.address, '1Csf6LVPkv24FBs6bpj4ELPszE6mGf6jeV') if __name__ == '__main__': unittest.main() diff --git a/trezorlib/client.py b/trezorlib/client.py index d1fe9aa27..589fdbaee 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -430,20 +430,18 @@ class ProtocolMixin(object): return True return False - @field('payload') - @expect(proto.Success) + @expect(proto.EncryptedMessage) def encrypt_message(self, pubkey, message, display_only, coin_name, n): n = self._convert_prime(n) return self.call(proto.EncryptMessage(pubkey=pubkey, message=message, display_only=display_only, coin_name=coin_name, address_n=n)) - @field('payload') - @expect(proto.Success) - def decrypt_message(self, n, message): + @expect(proto.DecryptedMessage) + def decrypt_message(self, n, nonce, message, msg_hmac): n = self._convert_prime(n) - return self.call(proto.DecryptMessage(address_n=n, message=message)) + return self.call(proto.DecryptMessage(address_n=n, nonce=nonce, message=message, hmac=msg_hmac)) - @field('payload') - @expect(proto.Success) + @field('value') + @expect(proto.CipheredKeyValue) def encrypt_keyvalue(self, n, key, value, ask_on_encrypt=True, ask_on_decrypt=True): n = self._convert_prime(n) return self.call(proto.CipherKeyValue(address_n=n, @@ -453,8 +451,8 @@ class ProtocolMixin(object): ask_on_encrypt=ask_on_encrypt, ask_on_decrypt=ask_on_decrypt)) - @field('payload') - @expect(proto.Success) + @field('value') + @expect(proto.CipheredKeyValue) def decrypt_keyvalue(self, n, key, value, ask_on_encrypt=True, ask_on_decrypt=True): n = self._convert_prime(n) return self.call(proto.CipherKeyValue(address_n=n, diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 86279ebe6..c0ad08b89 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"+\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"Q\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"4\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x01(\x0c\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xa1\r\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x30\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"Q\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"@\n\x10\x45ncryptedMessage\x12\r\n\x05nonce\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0c\n\x04hmac\x18\x03 \x01(\x0c\"Q\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\r\n\x05nonce\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0c\n\x04hmac\x18\x04 \x01(\x0c\"4\n\x10\x44\x65\x63ryptedMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"!\n\x10\x43ipheredKeyValue\x12\r\n\x05value\x18\x01 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x99\x0e\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_CipheredKeyValue\x10\x30\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_EncryptedMessage\x10\x32\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x33\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_DecryptedMessage\x10\x34\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -116,110 +116,122 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ClearSession', index=23, number=24, + name='MessageType_CipheredKeyValue', index=23, number=48, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_ClearSession', index=24, number=24, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ApplySettings', index=24, number=25, + name='MessageType_ApplySettings', index=25, number=25, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonRequest', index=25, number=26, + name='MessageType_ButtonRequest', index=26, number=26, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonAck', index=26, number=27, + name='MessageType_ButtonAck', index=27, number=27, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_GetAddress', index=27, number=29, + name='MessageType_GetAddress', index=28, number=29, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_Address', index=28, number=30, + name='MessageType_Address', index=29, number=30, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyRequest', index=29, number=35, + name='MessageType_EntropyRequest', index=30, number=35, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyAck', index=30, number=36, + name='MessageType_EntropyAck', index=31, number=36, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_SignMessage', index=31, number=38, + name='MessageType_SignMessage', index=32, number=38, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_VerifyMessage', index=32, number=39, + name='MessageType_VerifyMessage', index=33, number=39, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_MessageSignature', index=33, number=40, + name='MessageType_MessageSignature', index=34, number=40, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EncryptMessage', index=34, number=48, + name='MessageType_EncryptMessage', index=35, number=49, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DecryptMessage', index=35, number=49, + name='MessageType_EncryptedMessage', index=36, number=50, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_DecryptMessage', index=37, number=51, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PassphraseRequest', index=36, number=41, + name='MessageType_DecryptedMessage', index=38, number=52, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PassphraseAck', index=37, number=42, + name='MessageType_PassphraseRequest', index=39, number=41, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_PassphraseAck', index=40, number=42, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EstimateTxSize', index=38, number=43, + name='MessageType_EstimateTxSize', index=41, number=43, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxSize', index=39, number=44, + name='MessageType_TxSize', index=42, number=44, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_RecoveryDevice', index=40, number=45, + name='MessageType_RecoveryDevice', index=43, number=45, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_WordRequest', index=41, number=46, + name='MessageType_WordRequest', index=44, number=46, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_WordAck', index=42, number=47, + name='MessageType_WordAck', index=45, number=47, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkDecision', index=43, number=100, + name='MessageType_DebugLinkDecision', index=46, number=100, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkGetState', index=44, number=101, + name='MessageType_DebugLinkGetState', index=47, number=101, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkState', index=45, number=102, + name='MessageType_DebugLinkState', index=48, number=102, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkStop', index=46, number=103, + name='MessageType_DebugLinkStop', index=49, number=103, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkLog', index=47, number=104, + name='MessageType_DebugLinkLog', index=50, number=104, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), ], containing_type=None, options=None, - serialized_start=3228, - serialized_end=4925, + serialized_start=3395, + serialized_end=5212, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -246,6 +258,7 @@ MessageType_Cancel = 20 MessageType_TxRequest = 21 MessageType_TxAck = 22 MessageType_CipherKeyValue = 23 +MessageType_CipheredKeyValue = 48 MessageType_ClearSession = 24 MessageType_ApplySettings = 25 MessageType_ButtonRequest = 26 @@ -257,8 +270,10 @@ MessageType_EntropyAck = 36 MessageType_SignMessage = 38 MessageType_VerifyMessage = 39 MessageType_MessageSignature = 40 -MessageType_EncryptMessage = 48 -MessageType_DecryptMessage = 49 +MessageType_EncryptMessage = 49 +MessageType_EncryptedMessage = 50 +MessageType_DecryptMessage = 51 +MessageType_DecryptedMessage = 52 MessageType_PassphraseRequest = 41 MessageType_PassphraseAck = 42 MessageType_EstimateTxSize = 43 @@ -568,13 +583,6 @@ _SUCCESS = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - _descriptor.FieldDescriptor( - name='payload', full_name='Success.payload', index=1, - number=2, type=12, cpp_type=9, label=1, - has_default_value=False, default_value="", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -585,7 +593,7 @@ _SUCCESS = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=585, - serialized_end=628, + serialized_end=611, ) @@ -619,8 +627,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=630, - serialized_end=684, + serialized_start=613, + serialized_end=667, ) @@ -654,8 +662,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=686, - serialized_end=749, + serialized_start=669, + serialized_end=732, ) @@ -675,8 +683,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=751, - serialized_end=762, + serialized_start=734, + serialized_end=745, ) @@ -703,8 +711,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=764, - serialized_end=819, + serialized_start=747, + serialized_end=802, ) @@ -731,8 +739,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=821, - serialized_end=848, + serialized_start=804, + serialized_end=831, ) @@ -752,8 +760,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=850, - serialized_end=858, + serialized_start=833, + serialized_end=841, ) @@ -773,8 +781,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=860, - serialized_end=879, + serialized_start=843, + serialized_end=862, ) @@ -801,8 +809,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=881, - serialized_end=916, + serialized_start=864, + serialized_end=899, ) @@ -829,8 +837,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=918, - serialized_end=944, + serialized_start=901, + serialized_end=927, ) @@ -857,8 +865,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=946, - serialized_end=972, + serialized_start=929, + serialized_end=955, ) @@ -885,8 +893,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=974, - serialized_end=1007, + serialized_start=957, + serialized_end=990, ) @@ -920,8 +928,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1009, - serialized_end=1061, + serialized_start=992, + serialized_end=1044, ) @@ -962,8 +970,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1063, - serialized_end=1144, + serialized_start=1046, + serialized_end=1127, ) @@ -990,8 +998,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1146, - serialized_end=1172, + serialized_start=1129, + serialized_end=1155, ) @@ -1011,8 +1019,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1174, - serialized_end=1186, + serialized_start=1157, + serialized_end=1169, ) @@ -1081,8 +1089,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1189, - serialized_end=1355, + serialized_start=1172, + serialized_end=1338, ) @@ -1144,8 +1152,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1358, - serialized_end=1515, + serialized_start=1341, + serialized_end=1498, ) @@ -1165,8 +1173,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1517, - serialized_end=1533, + serialized_start=1500, + serialized_end=1516, ) @@ -1193,8 +1201,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1535, - serialized_end=1564, + serialized_start=1518, + serialized_end=1547, ) @@ -1256,8 +1264,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1567, - serialized_end=1726, + serialized_start=1550, + serialized_end=1709, ) @@ -1277,8 +1285,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1728, - serialized_end=1741, + serialized_start=1711, + serialized_end=1724, ) @@ -1305,8 +1313,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1743, - serialized_end=1766, + serialized_start=1726, + serialized_end=1749, ) @@ -1347,8 +1355,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1768, - serialized_end=1845, + serialized_start=1751, + serialized_end=1828, ) @@ -1389,8 +1397,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1847, - serialized_end=1915, + serialized_start=1830, + serialized_end=1898, ) @@ -1424,8 +1432,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1917, - serialized_end=1971, + serialized_start=1900, + serialized_end=1954, ) @@ -1480,8 +1488,50 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1973, - serialized_end=2091, + serialized_start=1956, + serialized_end=2074, +) + + +_ENCRYPTEDMESSAGE = _descriptor.Descriptor( + name='EncryptedMessage', + full_name='EncryptedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='nonce', full_name='EncryptedMessage.nonce', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message', full_name='EncryptedMessage.message', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='hmac', full_name='EncryptedMessage.hmac', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=2076, + serialized_end=2140, ) @@ -1500,12 +1550,26 @@ _DECRYPTMESSAGE = _descriptor.Descriptor( is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='message', full_name='DecryptMessage.message', index=1, + name='nonce', full_name='DecryptMessage.nonce', index=1, number=2, type=12, cpp_type=9, label=1, has_default_value=False, default_value="", message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='message', full_name='DecryptMessage.message', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='hmac', full_name='DecryptMessage.hmac', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -1515,8 +1579,43 @@ _DECRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2093, - serialized_end=2145, + serialized_start=2142, + serialized_end=2223, +) + + +_DECRYPTEDMESSAGE = _descriptor.Descriptor( + name='DecryptedMessage', + full_name='DecryptedMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message', full_name='DecryptedMessage.message', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='address', full_name='DecryptedMessage.address', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=2225, + serialized_end=2277, ) @@ -1578,8 +1677,36 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2148, - serialized_end=2276, + serialized_start=2280, + serialized_end=2408, +) + + +_CIPHEREDKEYVALUE = _descriptor.Descriptor( + name='CipheredKeyValue', + full_name='CipheredKeyValue', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='value', full_name='CipheredKeyValue.value', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=2410, + serialized_end=2443, ) @@ -1620,8 +1747,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2278, - serialized_end=2367, + serialized_start=2445, + serialized_end=2534, ) @@ -1648,8 +1775,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2369, - serialized_end=2394, + serialized_start=2536, + serialized_end=2561, ) @@ -1690,8 +1817,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2396, - serialized_end=2477, + serialized_start=2563, + serialized_end=2644, ) @@ -1739,8 +1866,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2480, - serialized_end=2624, + serialized_start=2647, + serialized_end=2791, ) @@ -1781,8 +1908,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2627, - serialized_end=2760, + serialized_start=2794, + serialized_end=2927, ) @@ -1809,8 +1936,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2762, - serialized_end=2799, + serialized_start=2929, + serialized_end=2966, ) @@ -1830,8 +1957,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2801, - serialized_end=2816, + serialized_start=2968, + serialized_end=2983, ) @@ -1858,8 +1985,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2818, - serialized_end=2851, + serialized_start=2985, + serialized_end=3018, ) @@ -1886,8 +2013,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2853, - serialized_end=2888, + serialized_start=3020, + serialized_end=3055, ) @@ -1907,8 +2034,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2890, - serialized_end=2909, + serialized_start=3057, + serialized_end=3076, ) @@ -1998,8 +2125,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2912, - serialized_end=3147, + serialized_start=3079, + serialized_end=3314, ) @@ -2019,8 +2146,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3149, - serialized_end=3164, + serialized_start=3316, + serialized_end=3331, ) @@ -2061,8 +2188,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3166, - serialized_end=3225, + serialized_start=3333, + serialized_end=3392, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -2112,8 +2239,11 @@ DESCRIPTOR.message_types_by_name['SignMessage'] = _SIGNMESSAGE DESCRIPTOR.message_types_by_name['VerifyMessage'] = _VERIFYMESSAGE DESCRIPTOR.message_types_by_name['MessageSignature'] = _MESSAGESIGNATURE DESCRIPTOR.message_types_by_name['EncryptMessage'] = _ENCRYPTMESSAGE +DESCRIPTOR.message_types_by_name['EncryptedMessage'] = _ENCRYPTEDMESSAGE DESCRIPTOR.message_types_by_name['DecryptMessage'] = _DECRYPTMESSAGE +DESCRIPTOR.message_types_by_name['DecryptedMessage'] = _DECRYPTEDMESSAGE DESCRIPTOR.message_types_by_name['CipherKeyValue'] = _CIPHERKEYVALUE +DESCRIPTOR.message_types_by_name['CipheredKeyValue'] = _CIPHEREDKEYVALUE DESCRIPTOR.message_types_by_name['EstimateTxSize'] = _ESTIMATETXSIZE DESCRIPTOR.message_types_by_name['TxSize'] = _TXSIZE DESCRIPTOR.message_types_by_name['SignTx'] = _SIGNTX @@ -2326,18 +2456,36 @@ class EncryptMessage(_message.Message): # @@protoc_insertion_point(class_scope:EncryptMessage) +class EncryptedMessage(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _ENCRYPTEDMESSAGE + + # @@protoc_insertion_point(class_scope:EncryptedMessage) + class DecryptMessage(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _DECRYPTMESSAGE # @@protoc_insertion_point(class_scope:DecryptMessage) +class DecryptedMessage(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _DECRYPTEDMESSAGE + + # @@protoc_insertion_point(class_scope:DecryptedMessage) + class CipherKeyValue(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _CIPHERKEYVALUE # @@protoc_insertion_point(class_scope:CipherKeyValue) +class CipheredKeyValue(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _CIPHEREDKEYVALUE + + # @@protoc_insertion_point(class_scope:CipheredKeyValue) + class EstimateTxSize(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _ESTIMATETXSIZE @@ -2465,6 +2613,8 @@ _MESSAGETYPE.values_by_name["MessageType_TxAck"].has_options = True _MESSAGETYPE.values_by_name["MessageType_TxAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_CipherKeyValue"].has_options = True _MESSAGETYPE.values_by_name["MessageType_CipherKeyValue"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_CipheredKeyValue"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_CipheredKeyValue"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_ClearSession"].has_options = True _MESSAGETYPE.values_by_name["MessageType_ClearSession"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_ApplySettings"].has_options = True @@ -2489,8 +2639,12 @@ _MESSAGETYPE.values_by_name["MessageType_MessageSignature"].has_options = True _MESSAGETYPE.values_by_name["MessageType_MessageSignature"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_EncryptMessage"].has_options = True _MESSAGETYPE.values_by_name["MessageType_EncryptMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_EncryptedMessage"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_EncryptedMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DecryptMessage"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DecryptMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_DecryptedMessage"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_DecryptedMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_PassphraseRequest"].has_options = True _MESSAGETYPE.values_by_name["MessageType_PassphraseRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_PassphraseAck"].has_options = True From f790c95df0d0955606c7c8bf7e9b188f19c702dd Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 4 Nov 2014 16:19:32 +0100 Subject: [PATCH 0381/1535] add longer strings to ecies tests --- tests/test_ecies.py | 101 +++++++++++++++++++++++++++++++------------- 1 file changed, 72 insertions(+), 29 deletions(-) diff --git a/tests/test_ecies.py b/tests/test_ecies.py index 2d2e1f194..2ca238204 100644 --- a/tests/test_ecies.py +++ b/tests/test_ecies.py @@ -7,6 +7,37 @@ from trezorlib.client import CallException # as described here: http://memwallet.info/btcmssgs.html +def test_ecies_backforth(cls, test_string): + cls.setup_mnemonic_nopin_nopassphrase() + + pubkey = binascii.unhexlify('0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6') + + # encrypt without signature + enc = cls.client.encrypt_message(pubkey, test_string, display_only=False, coin_name='Bitcoin', n=[]) + print 'base64:', base64.b64encode(enc.nonce + enc.message + enc.hmac) + dec = cls.client.decrypt_message([1], enc.nonce, enc.message, enc.hmac) + cls.assertEqual(dec.message, test_string) + cls.assertEqual(dec.address, '') + + # encrypt with signature + enc = cls.client.encrypt_message(pubkey, test_string, display_only=False, coin_name='Bitcoin', n=[5]) + print 'base64:', base64.b64encode(enc.nonce + enc.message + enc.hmac) + dec = cls.client.decrypt_message([1], enc.nonce, enc.message, enc.hmac) + cls.assertEqual(dec.message, test_string) + cls.assertEqual(dec.address, '1Csf6LVPkv24FBs6bpj4ELPszE6mGf6jeV') + + # encrypt without signature, show only on display + enc = cls.client.encrypt_message(pubkey, test_string, display_only=True, coin_name='Bitcoin', n=[]) + dec = cls.client.decrypt_message([1], enc.nonce, enc.message, enc.hmac) + cls.assertEqual(dec.message, '') + cls.assertEqual(dec.address, '') + + # encrypt with signature, show only on display + enc = cls.client.encrypt_message(pubkey, test_string, display_only=True, coin_name='Bitcoin', n=[5]) + dec = cls.client.decrypt_message([1], enc.nonce, enc.message, enc.hmac) + cls.assertEqual(dec.message, '') + cls.assertEqual(dec.address, '') + class TestEcies(common.TrezorTest): # index: m/1 @@ -19,36 +50,11 @@ class TestEcies(common.TrezorTest): # pubkey: 0234716c01c2dd03fa7ee302705e2b8fbd1311895d94b1dca15e62eedea9b0968f # privkey: L4uKPRgaZqL9iGmge3UBSLGTQC7gDFrLRhC1vM4LmGyrzNUBb1Zs - def test_ecies(self): - self.setup_mnemonic_nopin_nopassphrase() - - pubkey = binascii.unhexlify('0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6') - - # encrypt without signature - enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=False, coin_name='Bitcoin', n=[]) - print 'base64:', base64.b64encode(enc.nonce + enc.message + enc.hmac) - dec = self.client.decrypt_message([1], enc.nonce, enc.message, enc.hmac) - self.assertEqual(dec.message, 'testing message!') - self.assertEqual(dec.address, '') - - # encrypt with signature - enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=False, coin_name='Bitcoin', n=[5]) - print 'base64:', base64.b64encode(enc.nonce + enc.message + enc.hmac) - dec = self.client.decrypt_message([1], enc.nonce, enc.message, enc.hmac) - self.assertEqual(dec.message, 'testing message!') - self.assertEqual(dec.address, '1Csf6LVPkv24FBs6bpj4ELPszE6mGf6jeV') - - # encrypt without signature, show only on display - enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=True, coin_name='Bitcoin', n=[]) - dec = self.client.decrypt_message([1], enc.nonce, enc.message, enc.hmac) - self.assertEqual(dec.message, '') - self.assertEqual(dec.address, '') + def test_ecies_backforth_short(self): + test_ecies_backforth(self, 'testing message!') - # encrypt with signature, show only on display - enc = self.client.encrypt_message(pubkey, 'testing message!', display_only=True, coin_name='Bitcoin', n=[5]) - dec = self.client.decrypt_message([1], enc.nonce, enc.message, enc.hmac) - self.assertEqual(dec.message, '') - self.assertEqual(dec.address, '') + def test_ecies_backforth_long(self): + test_ecies_backforth(self, 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin elementum libero in tortor condimentum malesuada. Quisque gravida semper sapien, ut ultrices dolor pharetra nec. Nulla hendrerit metus imperdiet, feugiat sapien eu, fermentum mauris. Suspendisse nec bibendum urna. Vivamus augue libero, mollis vel augue at, venenatis vestibulum nunc. Curabitur condimentum quam non nibh volutpat, at congue libero rutrum. Morbi at sollicitudin lectus. Donec commodo rutrum sollicitudin. Vivamus condimentum massa id ligula iaculis, et aliquet orci condimentum. Nullam non ex sit amet nisi porta suscipit.') def test_ecies_crosscheck(self): self.setup_mnemonic_nopin_nopassphrase() @@ -85,5 +91,42 @@ class TestEcies(common.TrezorTest): self.assertEqual(dec.message, 'testing message!') self.assertEqual(dec.address, '1Csf6LVPkv24FBs6bpj4ELPszE6mGf6jeV') + def test_ecies_crosscheck_long(self): + self.setup_mnemonic_nopin_nopassphrase() + + lipsum = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin elementum libero in tortor condimentum malesuada. Quisque gravida semper sapien, ut ultrices dolor pharetra nec. Nulla hendrerit metus imperdiet, feugiat sapien eu, fermentum mauris. Suspendisse nec bibendum urna. Vivamus augue libero, mollis vel augue at, venenatis vestibulum nunc. Curabitur condimentum quam non nibh volutpat, at congue libero rutrum. Morbi at sollicitudin lectus. Donec commodo rutrum sollicitudin. Vivamus condimentum massa id ligula iaculis, et aliquet orci condimentum. Nullam non ex sit amet nisi porta suscipit.' + + # decrypt message without signature + payload = 'AhnOXSv+7mI3Tvw0ekCxvEoMvophrWOGAwLT2IpyxaCd+zgftijj2uQoGtSktFwch8oABstTqwBjokH4AllH7PaL/8dWwOELwEVIXlbktf8nktUITBkJ0Abih8Imq451Bwrt8ZMt0tzoDBWeRLtZGHPduHnykGjq1O3A8Qjd4k8W+PkPBum+rNKlPOUqoNpSvOcPD9L6APkMByPKMmTq5K9nSeLKyXjOtWcx4BLRqRe9qgvG+SWFHsJ/90O76XZIB6GXDqGnCNR5rV/8Ho4bfagRL/tQPbeQ4iYWAyqdRlKuwnUrrZSJCdrsQJt1Ye5LcltE0YhJBKRmxob2/P+ziyceZk6cU3hS9k4B1GKlEeGxipvMswfbrEIy/5NYiGXEDwC3dHwM3g1Opz5oXbEKZ3NG/eEh5UxJFjfyx1qumQeSaIo5XFOf81A4dhH1vAT8MMEQN7bXXwCb1fxDC9wblCP9iVR1aey5FUFMNE7wfXYdrMxwzxrgJfSa8/vQgMmZI205OCBxAsmBYOTIy6kqcRn7+Ad6WEYvp2DRwcGN//9XFJi2DuJzA0ymeoSxnZg4GDytpvVFVyQvIDkPHrmVfaZot02XCCqTq/ZDgZLnnutWfP9dB1ckSpzXOM/pEgMBj6DcC1HbgHZaKhoNjsk8ITTYMnP5kFBoZdtPbNJB5rZOYtLHHDxfvk2d3USTxtbPiIE9w6JbBll18lKFMN8gvQuKcHyKwVNQGOVuBGtXv4hCBFF/VNRJ5GE8BX1ajHwldFiuTII9dcdSrZhL+Ds8Ui0siZ5Ai+KHjKZi8FciNQ+8q3tXUOiN1hONCN6iy5XjFd2I7NAqg+o4TnkGKSPMQSE3z2vY' + payload = base64.b64decode(payload) + nonce, msg, hmac = payload[:33], payload[33:-8], payload[-8:] + dec = self.client.decrypt_message([1], nonce, msg, hmac) + self.assertEqual(dec.message, lipsum) + self.assertEqual(dec.address, '') + + # decrypt message without signature (same message, different nonce) + payload = 'A2bVIKzpPVYJlPP6WMiwhpabJfJAHH927StDsUyRL2h3xc/aMPVN6rYA9GwcsPSDiZpPZdjCVYM4uDwFQ/kBNA1p5XlDs6IBGtGGgbR7P5wHgJaxcw1zWZ+TsWTIWVj3psy0CFg7zCfqeV2y0OzIvJc/p+ONdVb1f9TmTICPoVGJ9AVXdnfdqdIn+wLYScUklTp10ldfUCmt5iAsJJR1p+h+xa+wwUdyCxpvnxOZDxA0EFmxQskBhcDbLL2nmQkLm5RnLQgpefMCEJrdz5g9htC5y65eod2SFBV8oJrN1ryh4PdRn5+JyVcwWhQeCHTK3m6vOIwwht5lm2uCLpcEttDoxo5k3LcBPE4rlPVYCf8qja6sRKq/WYiLdwXnooX/qmmLQ7Lo2DBs4hB6VQGgPSSTH/3/rUb11bL2Ieyq73ZICeIbHCIvjFqhd/atkNvQTnCrNmFybyxdMqE/4Yrv7b//hJVkgI21AVGcSYF+Kp9pZ6XJVunDTS4XX7tjkXTFu7qbIv6q7mGgXV2/7udR9GF/lG/Us+wYsU1wmCEaUJ5Mx1yr4eLJ8cp6XPCMivEwKJ6CeHz2d/FYEeHE3YTy3VQT/+BJ5nS2+wDTD57wW9ZxUXn0cqPUhH0XveeRDOKEz1tgu6ChPrSyuu9E+pxDA2OA95NRt5j+UMdhZf6R0qgwfuDOcTs+0EuF9pQ5znPnmg4JqF6AkLlwE6txm1YTTjID8689yY4UsEc7CYJb1N3JvNxIHety5B5KWWAgnK1l9g9xnuKdGC4M7F+ajrbRqbw0qfTUvruD7GaYoqsyrdtDkEpEDXhZ0p56LALTUhL4+QVmeXvkH8cmBqdB6flZ48mlTgfy' + payload = base64.b64decode(payload) + nonce, msg, hmac = payload[:33], payload[33:-8], payload[-8:] + dec = self.client.decrypt_message([1], nonce, msg, hmac) + self.assertEqual(dec.message, lipsum) + self.assertEqual(dec.address, '') + + # decrypt message with signature + payload = 'ArJoHqnmLY22QiCePXk9yNQSK6g8BMGLkKkj72p35hCW1gxVajIZyptgbBp4A0LV8Fshe6MKnHO5PGw2BPQ6yTES5Q+7c8ZjC4m8JCKOOU8l7et4AcftPElxBdKimEv5B5egQmzSYds6dfB73VsWi2k9J/1RpckB2WDvXSrF1915XA4tMTMefB/DhzdrG9gkVTBqaROTgxlXWJhqdFag4aghVcXS5Ru6CQH0cLoxmZWf8mx/pK4liXyH1Gm+7fl8cd9iDkNTJEapzn/Ohh7JYxJrV/i4p0xE9L5CONL+UIL8DtGB8SgAWtd5cHdpLhMywRFxjDvho20nE3VyGREhqiv9i3ywXRox/zd6OFBkxSA3kuWNRrkDRBx4Q+2j49V5iQquuu5horUuRRYN1HVvoOYjVkfEJV70yvVg3xR2MeJouUa1aP7WF9JPo8vor252/ZU6L15mveE0JZH1HtoierC1Q5YDSFCYJ4hWJbWZEMwXvRBQL+FoZ5x6CSkrfTOYoP+uD/VnsMepI+0NgsssacU9h2PdDVy3pYnB0m04YpOftVnAARaun+nE9ti1FUFfnwSmD2vB2TfWEkFGQ3S6W6sjpX/gN+It6GViiNQO6yT9e3HO/4+JiS5yldOI7ryAlzNM598RANDdpI3kBy9IWKD5dENy/82TD/DAWoeRAz/LvvZaQBtpxZNEkRqqgbpBT7aJzjZudVMzZHPduF67eC994WB0EJHbKncXElbBVKXKMyoPruw9wwFP7VfeAAp4SLAmcs6YFkJ8lOeYO0bnPhvlrYV9XAkSpsHxBtita3WuyeoBHugHYEPzbNOdCoLRUgCS+4esrVV9aE1irlBzTmU+t8cWX5BQGsqnEuBKqPri7XWLrg57Up4ILkPFojgw/fIIkUNVCY2iqgFQCQZPM8dbE0wKK5ujd5YQwp8i/OrsXccin/TRjKXLtIkiEVg/Gl7aCRuXzGR0pfc=' + payload = base64.b64decode(payload) + nonce, msg, hmac = payload[:33], payload[33:-8], payload[-8:] + dec = self.client.decrypt_message([1], nonce, msg, hmac) + self.assertEqual(dec.message, lipsum) + self.assertEqual(dec.address, '1Csf6LVPkv24FBs6bpj4ELPszE6mGf6jeV') + + # decrypt message with signature (same message, different nonce) + payload = 'AjFarEh66x2DZ9S3T/n8/xnYZQRwnuugxCDfIIEDPKkdfgwYPjGhtg3k/9ryj42MDgmey71ZvDhUdj+igcBKaPiKAS7p88kQxl6R6sFkL/wKwTdXPboA/n63BnHrtNNDIp12Dlgn2m0nSCLOchlh2maIBqB68qIqy21tT10ZrMpTfPd+4MI4NOzs42BQJAOLy19rMTKoCXGWIsgEERG0qCm38onYVUmj5UvtQIdDLIZ/ta4WD+FqM3Y9pJsU648qV72l/xM27BjIxVqUsw6MHLrAUNTmmd+D7dPAIjL66Gr5hEHCTcHP8oCIkeC+MK2JVcHN12F1Rx+8iwNf4nsixUcZJ/RX9JOTxJj3CdxuTH3b0lDNdFwQQddYhHd6cv4t1cZ3wOWAVh1g+gmB/igmvJD200EfhQudHp/w+9BIFFfxFwAmf4/tlidJ0knIaPjNx5kBSkklhxWdBfen5kgkGFtcQdBkguADcV/bfAxCRpqVa9lgN4ja2na0fUMZaAnVjR+sk4MWTbSObw5FBos3B7awAgRxQx6L8p3PUwGc2B9oVf1zcw3c0mlVUpaVEc7tXipVX6LAtKF9jx+EeMHvWlUic7s4vaGa7VxNuU8Of65Ba3RmxAX9zxwTKHMBAhm2efaqBIxGUSO8ncDSdp2nO6tJUkUoyNK0nasXWF2Ras22We0Ma0yGv0MQRVWeksYQn116I7ahv+lvAzaJnhiYGCM36Vg051VZEmBh23U5HdqrLRT7w8u1DJZyCxo0KmiZ5c3sOiJPxcC/8hpnQ0Zc7ipEdi97hZG2X2HOtmEIFivF2yI26rieEDyebbg95CnhUFx1LEuiEApU8fVAuYoyEQGVVwQPEQlBrqkF4oE/cItesBqxIdoZlsvoYBvxa1huT6jsc/Uci1WRpwKmPxeHUkxZrwLG8+kUNGFn13s8HrPTncaCQU3fnu3KOKkfLdnpVnF3JfYlrruMWV4=' + payload = base64.b64decode(payload) + nonce, msg, hmac = payload[:33], payload[33:-8], payload[-8:] + dec = self.client.decrypt_message([1], nonce, msg, hmac) + self.assertEqual(dec.message, lipsum) + self.assertEqual(dec.address, '1Csf6LVPkv24FBs6bpj4ELPszE6mGf6jeV') + if __name__ == '__main__': unittest.main() From 86a46933b5175daee9dfe88462d8928483829097 Mon Sep 17 00:00:00 2001 From: David Dworken Date: Thu, 6 Nov 2014 19:09:53 -0500 Subject: [PATCH 0382/1535] Use getpass('') and confirm passphrase Added getpass as a dependency Switched pin entry from raw_input() to getpass.getpass('') Switch passphrase entry from raw_input() to getpass.getpass('') Ask user to confirm passphrase --- trezorlib/client.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 589fdbaee..af451965a 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -6,6 +6,7 @@ import hashlib import unicodedata import mapping import json +import getpass import tools import messages_pb2 as proto @@ -165,15 +166,19 @@ class TextUIMixin(object): desc = 'PIN' log("Please enter %s: " % desc) - pin = raw_input() + pin = getpass.getpass('') return proto.PinMatrixAck(pin=pin) def callback_PassphraseRequest(self, msg): log("Passphrase required: ") - passphrase = raw_input() - passphrase = unicode(str(bytearray(passphrase, 'utf-8')), 'utf-8') - - return proto.PassphraseAck(passphrase=passphrase) + passphrase = getpass.getpass('') + log("Confirm your Passphrase: ") + if passphrase == getpass(''): + passphrase = unicode(str(bytearray(passphrase, 'utf-8')), 'utf-8') + return proto.PassphraseAck(passphrase=passphrase) + else: + log("Passphrase did not match! ") + exit() def callback_WordRequest(self, msg): log("Enter one word of mnemonic: ") From 667577abc4564853a0c1bd2d1acdeccc91bdd5cc Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 7 Nov 2014 01:58:20 +0100 Subject: [PATCH 0383/1535] add screenshot feature (default disabled) --- trezorlib/client.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/trezorlib/client.py b/trezorlib/client.py index af451965a..f6e2511d7 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -15,6 +15,15 @@ import protobuf_json from trezorlib.debuglink import DebugLink from mnemonic import Mnemonic + +# try: +# from PIL import Image +# SCREENSHOT = True +# except: +# SCREENSHOT = False + +SCREENSHOT = False + # monkeypatching: text formatting of protobuf messages tools.monkeypatch_google_protobuf_text_format() @@ -200,6 +209,7 @@ class DebugLinkMixin(object): super(DebugLinkMixin, self).__init__(*args, **kwargs) self.debug = None self.in_with_statement = 0 + self.screenshot_id = 0 # Always press Yes and provide correct pin self.setup_debuglink(True, True) @@ -256,6 +266,19 @@ class DebugLinkMixin(object): self.mnemonic = unicode(str(bytearray(Mnemonic.normalize_string(mnemonic), 'utf-8')), 'utf-8').split(' ') def call_raw(self, msg): + + if SCREENSHOT and self.debug: + layout = self.debug.read_layout() + im = Image.new("RGB", (128, 64)) + pix = im.load() + for x in range(128): + for y in range(64): + rx, ry = 127 - x, 63 - y + if (ord(layout[rx + (ry / 8) * 128]) & (1 << (ry % 8))) > 0: + pix[x, y] = (255, 255, 255) + im.save('scr%05d.png' % self.screenshot_id) + self.screenshot_id += 1 + resp = super(DebugLinkMixin, self).call_raw(msg) self._check_request(resp) return resp From 1c6ed659213f24c27d52e955d9532b5963a0857c Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 7 Nov 2014 01:59:28 +0100 Subject: [PATCH 0384/1535] add more tests to test_msg_verifymessage --- tests/test_msg_verifymessage.py | 104 ++++++++++++++++++++++++++++++-- trezorlib/client.py | 5 +- 2 files changed, 104 insertions(+), 5 deletions(-) diff --git a/tests/test_msg_verifymessage.py b/tests/test_msg_verifymessage.py index 02e1f1774..7760dad7e 100644 --- a/tests/test_msg_verifymessage.py +++ b/tests/test_msg_verifymessage.py @@ -21,7 +21,7 @@ class TestMsgVerifymessage(common.TrezorTest): ret = self.client.verify_message('moRDikgmxcpouFtqnKnVVzLYgkDD2gQ3sk', sig, 'Ahoj') self.assertTrue(ret) - def test_message_verify(self): + def test_message_verify_address(self): self.setup_mnemonic_nopin_nopassphrase() # uncompressed pubkey - OK @@ -32,7 +32,7 @@ class TestMsgVerifymessage(common.TrezorTest): ) self.assertTrue(res) - # uncompressed pubkey - FAIL + # uncompressed pubkey - FAIL - wrong sig res = self.client.verify_message( '1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', binascii.unhexlify('1ba77e01a9e17ba158b96200000000dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), @@ -40,6 +40,14 @@ class TestMsgVerifymessage(common.TrezorTest): ) self.assertFalse(res) + # uncompressed pubkey - FAIL - wrong msg + res = self.client.verify_message( + '1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', + binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), + 'This is an example of a signed message!' + ) + self.assertFalse(res) + # compressed pubkey - OK res = self.client.verify_message( '1C7zdTfnkzmr13HfA2vNm5SJYRK6nEKyq8', @@ -47,7 +55,7 @@ class TestMsgVerifymessage(common.TrezorTest): 'This is an example of a signed message.') self.assertTrue(res) - # compressed pubkey - FAIL + # compressed pubkey - FAIL - wrong sig res = self.client.verify_message( '1C7zdTfnkzmr13HfA2vNm5SJYRK6nEKyq8', binascii.unhexlify('1f44e3e461f7ca9f57c472000000004df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), @@ -55,6 +63,13 @@ class TestMsgVerifymessage(common.TrezorTest): ) self.assertFalse(res) + # compressed pubkey - FAIL - wrong msg + res = self.client.verify_message( + '1C7zdTfnkzmr13HfA2vNm5SJYRK6nEKyq8', + binascii.unhexlify('1f44e3e461f7ca9f57c472ce1a28214df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), + 'This is an example of a signed message!') + self.assertFalse(res) + # trezor pubkey - OK res = self.client.verify_message( '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', @@ -63,7 +78,7 @@ class TestMsgVerifymessage(common.TrezorTest): ) self.assertTrue(res) - # trezor pubkey - FAIL + # trezor pubkey - FAIL - wrong sig res = self.client.verify_message( '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', binascii.unhexlify('209e23edf0e4e47ff1de000002cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), @@ -71,6 +86,87 @@ class TestMsgVerifymessage(common.TrezorTest): ) self.assertFalse(res) + # trezor pubkey - FAIL - wrong msg + res = self.client.verify_message( + '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', + binascii.unhexlify('209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), + 'This is an example of a signed message!' + ) + self.assertFalse(res) + + def test_message_verify_noaddress(self): + self.setup_mnemonic_nopin_nopassphrase() + + # uncompressed pubkey - OK + res = self.client.verify_message( + None, + binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), + 'This is an example of a signed message.' + ) + self.assertTrue(res) + + # uncompressed pubkey - FAIL - wrong sig + res = self.client.verify_message( + None, + binascii.unhexlify('1ba77e01a9e17ba158b96200000000dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), + 'This is an example of a signed message.' + ) + self.assertFalse(res) + + # uncompressed pubkey - FAIL - wrong msg + res = self.client.verify_message( + None, + binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), + 'This is an example of a signed message!' + ) + self.assertFalse(res) + + # compressed pubkey - OK + res = self.client.verify_message( + None, + binascii.unhexlify('1f44e3e461f7ca9f57c472ce1a28214df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), + 'This is an example of a signed message.') + self.assertTrue(res) + + # compressed pubkey - FAIL - wrong sig + res = self.client.verify_message( + None, + binascii.unhexlify('1f44e3e461f7ca9f57c472000000004df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), + 'This is an example of a signed message.' + ) + self.assertFalse(res) + + # compressed pubkey - FAIL - wrong msg + res = self.client.verify_message( + None, + binascii.unhexlify('1f44e3e461f7ca9f57c472ce1a28214df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), + 'This is an example of a signed message!') + self.assertFalse(res) + + # trezor pubkey - OK + res = self.client.verify_message( + None, + binascii.unhexlify('209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), + 'This is an example of a signed message.' + ) + self.assertTrue(res) + + # trezor pubkey - FAIL - wrong sig + res = self.client.verify_message( + None, + binascii.unhexlify('209e23edf0e4e47ff1de000002cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), + 'This is an example of a signed message.' + ) + self.assertFalse(res) + + # trezor pubkey - FAIL - wrong msg + res = self.client.verify_message( + None, + binascii.unhexlify('209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), + 'This is an example of a signed message!' + ) + self.assertFalse(res) + """ def test_verify_bitcoind(self): self.setup_mnemonic_nopin_nopassphrase() diff --git a/trezorlib/client.py b/trezorlib/client.py index f6e2511d7..eefbcbdbc 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -451,7 +451,10 @@ class ProtocolMixin(object): pass # it was not UTF8 string try: - resp = self.call(proto.VerifyMessage(address=address, signature=signature, message=message)) + if address: + resp = self.call(proto.VerifyMessage(address=address, signature=signature, message=message)) + else: + resp = self.call(proto.VerifyMessage(signature=signature, message=message)) except CallException as e: resp = e if isinstance(resp, proto.Success): From 69d2d2ded38d1cd9300b87bb0f4876933591705a Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 12 Nov 2014 18:37:34 +0100 Subject: [PATCH 0385/1535] verify test without address does not make sense --- tests/test_msg_verifymessage.py | 75 +-------------------------------- 1 file changed, 1 insertion(+), 74 deletions(-) diff --git a/tests/test_msg_verifymessage.py b/tests/test_msg_verifymessage.py index 7760dad7e..d974dec0a 100644 --- a/tests/test_msg_verifymessage.py +++ b/tests/test_msg_verifymessage.py @@ -21,7 +21,7 @@ class TestMsgVerifymessage(common.TrezorTest): ret = self.client.verify_message('moRDikgmxcpouFtqnKnVVzLYgkDD2gQ3sk', sig, 'Ahoj') self.assertTrue(ret) - def test_message_verify_address(self): + def test_message_verify(self): self.setup_mnemonic_nopin_nopassphrase() # uncompressed pubkey - OK @@ -94,79 +94,6 @@ class TestMsgVerifymessage(common.TrezorTest): ) self.assertFalse(res) - def test_message_verify_noaddress(self): - self.setup_mnemonic_nopin_nopassphrase() - - # uncompressed pubkey - OK - res = self.client.verify_message( - None, - binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), - 'This is an example of a signed message.' - ) - self.assertTrue(res) - - # uncompressed pubkey - FAIL - wrong sig - res = self.client.verify_message( - None, - binascii.unhexlify('1ba77e01a9e17ba158b96200000000dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), - 'This is an example of a signed message.' - ) - self.assertFalse(res) - - # uncompressed pubkey - FAIL - wrong msg - res = self.client.verify_message( - None, - binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), - 'This is an example of a signed message!' - ) - self.assertFalse(res) - - # compressed pubkey - OK - res = self.client.verify_message( - None, - binascii.unhexlify('1f44e3e461f7ca9f57c472ce1a28214df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), - 'This is an example of a signed message.') - self.assertTrue(res) - - # compressed pubkey - FAIL - wrong sig - res = self.client.verify_message( - None, - binascii.unhexlify('1f44e3e461f7ca9f57c472000000004df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), - 'This is an example of a signed message.' - ) - self.assertFalse(res) - - # compressed pubkey - FAIL - wrong msg - res = self.client.verify_message( - None, - binascii.unhexlify('1f44e3e461f7ca9f57c472ce1a28214df1de1dadefb6551a32d1907b80c74d5a1fbfd6daaba12dd8cb06699ce3f6941fbe0f3957b5802d13076181046e741eaaaf'), - 'This is an example of a signed message!') - self.assertFalse(res) - - # trezor pubkey - OK - res = self.client.verify_message( - None, - binascii.unhexlify('209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), - 'This is an example of a signed message.' - ) - self.assertTrue(res) - - # trezor pubkey - FAIL - wrong sig - res = self.client.verify_message( - None, - binascii.unhexlify('209e23edf0e4e47ff1de000002cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), - 'This is an example of a signed message.' - ) - self.assertFalse(res) - - # trezor pubkey - FAIL - wrong msg - res = self.client.verify_message( - None, - binascii.unhexlify('209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80'), - 'This is an example of a signed message!' - ) - self.assertFalse(res) - """ def test_verify_bitcoind(self): self.setup_mnemonic_nopin_nopassphrase() From 6a27ce2d5c3139ca472c1dfc62d1a18068c177c3 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 12 Nov 2014 20:26:04 +0100 Subject: [PATCH 0386/1535] rewrite sign/verify tests to test long messages --- tests/test_msg_signmessage.py | 8 ++++---- tests/test_msg_verifymessage.py | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/test_msg_signmessage.py b/tests/test_msg_signmessage.py index 24c83c621..de96d1d38 100644 --- a/tests/test_msg_signmessage.py +++ b/tests/test_msg_signmessage.py @@ -19,11 +19,11 @@ class TestMsgSignmessage(common.TrezorTest): self.assertEqual(sig.address, 'mirio8q3gtv7fhdnmb3TpZ4EuafdzSs7zL') self.assertEqual(binascii.hexlify(sig.signature), '209e23edf0e4e47ff1dec27f32cd78c50e74ef018ee8a6adf35ae17c7a9b0dd96f48b493fd7dbab03efb6f439c6383c9523b3bbc5f1a7d158a6af90ab154e9be80') - def test_too_long(self): + def test_sign_long(self): self.setup_mnemonic_nopin_nopassphrase() - - # Message cannot be longer than 255 bytes - self.assertRaises(CallException, self.client.sign_message, 'Bitcoin', [0], '1' * 256) + sig = self.client.sign_message('Bitcoin', [0], "VeryLongMessage!" * 64) + self.assertEqual(sig.address, '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e') + self.assertEqual(binascii.hexlify(sig.signature), '205ff795c29aef7538f8b3bdb2e8add0d0722ad630a140b6aefd504a5a895cbd867cbb00981afc50edd0398211e8d7c304bb8efa461181bc0afa67ea4a720a89ed') """ def test_sign_utf(self): diff --git a/tests/test_msg_verifymessage.py b/tests/test_msg_verifymessage.py index d974dec0a..7bb81e1c9 100644 --- a/tests/test_msg_verifymessage.py +++ b/tests/test_msg_verifymessage.py @@ -7,13 +7,13 @@ from trezorlib.client import CallException class TestMsgVerifymessage(common.TrezorTest): - def test_too_long(self): + def test_message_long(self): self.setup_mnemonic_nopin_nopassphrase() ret = self.client.verify_message('1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T', - binascii.unhexlify('1ba77e01a9e17ba158b962cfef5f13dfed676ffc2b4bada24e58f784458b52b97421470d001d53d5880cf5e10e76f02be3e80bf21e18398cbd41e8c3b4af74c8c2'), - '1' * 256 + binascii.unhexlify('1bddc0aed9cf4e10dc9f57770934f4fb72a27c4510a0f4a81e09c163552416f799cd3f211ffeed0f411e9af9b927407d67115fb6d0ab1897137048efe33417fcc1'), + "VeryLongMessage!" * 64 ) - self.assertFalse(ret) + self.assertTrue(ret) def test_message_testnet(self): self.setup_mnemonic_nopin_nopassphrase() From a939d3de1dff5a8a4b0b1f6bd45d2d49d8d47822 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 23 Nov 2014 13:28:09 +0100 Subject: [PATCH 0387/1535] fix getpass usage --- trezorlib/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index eefbcbdbc..8c56a2787 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -182,7 +182,7 @@ class TextUIMixin(object): log("Passphrase required: ") passphrase = getpass.getpass('') log("Confirm your Passphrase: ") - if passphrase == getpass(''): + if passphrase == getpass.getpass(''): passphrase = unicode(str(bytearray(passphrase, 'utf-8')), 'utf-8') return proto.PassphraseAck(passphrase=passphrase) else: From 608251bece6629b0fe6cf1ea36897e03d71e021b Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 26 Nov 2014 18:49:22 +0100 Subject: [PATCH 0388/1535] update encrypt/decrypt message commands --- cmdtr.py | 20 +++++++++++++++----- trezorlib/client.py | 7 +++++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/cmdtr.py b/cmdtr.py index fcf9ad1cd..f2e3aadaa 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -158,13 +158,21 @@ class Commands(object): def encrypt_message(self, args): pubkey = binascii.unhexlify(args.pubkey) - ret = self.client.encrypt_message(pubkey, args.message, args.display_only) - return binascii.hexlify(ret) + address_n = self.client.expand_path(args.n) + ret = self.client.encrypt_message(pubkey, args.message, args.display_only, args.coin, address_n) + output = { + 'nonce': binascii.hexlify(ret.nonce), + 'message': binascii.hexlify(ret.message), + 'hmac': binascii.hexlify(ret.hmac), + 'payload': base64.b64encode(ret.nonce + ret.message + ret.hmac), + } + return output def decrypt_message(self, args): address_n = self.client.expand_path(args.n) - message = binascii.unhexlify(args.message) - ret = self.client.decrypt_message(address_n, message) + payload = base64.b64decode(args.payload) + nonce, message, msg_hmac = payload[:33], payload[33:-8], payload[-8:] + ret = self.client.decrypt_message(address_n, nonce, message, msg_hmac) return ret def encrypt_keyvalue(self, args): @@ -273,11 +281,13 @@ class Commands(object): (('pubkey',), {'type': str}), (('message',), {'type': str}), (('-d', '--display-only'), {'action': 'store_true', 'default': False}), + (('-c', '--coin'), {'type': str, 'default': 'Bitcoin'}), + (('-n', '-address'), {'type': str}), ) decrypt_message.arguments = ( (('-n', '-address'), {'type': str}), - (('message',), {'type': str}), + (('payload',), {'type': str}), ) verify_message.arguments = ( diff --git a/trezorlib/client.py b/trezorlib/client.py index 8c56a2787..c7ad6afb2 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -463,8 +463,11 @@ class ProtocolMixin(object): @expect(proto.EncryptedMessage) def encrypt_message(self, pubkey, message, display_only, coin_name, n): - n = self._convert_prime(n) - return self.call(proto.EncryptMessage(pubkey=pubkey, message=message, display_only=display_only, coin_name=coin_name, address_n=n)) + if coin_name and n: + n = self._convert_prime(n) + return self.call(proto.EncryptMessage(pubkey=pubkey, message=message, display_only=display_only, coin_name=coin_name, address_n=n)) + else: + return self.call(proto.EncryptMessage(pubkey=pubkey, message=message, display_only=display_only)) @expect(proto.DecryptedMessage) def decrypt_message(self, n, nonce, message, msg_hmac): From 87d3688ed74c412190cedf5b1e93719de0881a23 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 2 Dec 2014 03:58:26 +0100 Subject: [PATCH 0389/1535] update bitcore to insight in tx_api.py --- trezorlib/tx_api.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index 12df49fe5..84389f09a 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -51,7 +51,7 @@ def opcode_serialize(opcode): except: raise Exception('Unknown script opcode: %s' % opcode) -def bitcore_tx(url): +def insight_tx(url): f = urllib2.urlopen(url) data = json.load(f) @@ -66,8 +66,8 @@ def bitcore_tx(url): i.prev_index = 0xffffffff # signed int -1 i.script_sig = binascii.unhexlify(vin['coinbase']) i.sequence = vin['sequence'] - - else: + + else: i.prev_hash = binascii.unhexlify(vin['txid']) i.prev_index = vin['vout'] asm = vin['scriptSig']['asm'].split(' ') @@ -88,12 +88,12 @@ class TXAPIBitcoin(object): @filecache(MONTH) def get_tx(self, txhash): - url = 'http://live.bitcore.io/api/tx/%s' % txhash - return bitcore_tx(url) + url = 'https://insight.bitpay.com/api/tx/%s' % txhash + return insight_tx(url) class TXAPITestnet(object): @filecache(MONTH) def get_tx(self, txhash): - url = 'http://test.bitcore.io/api/tx/%s' % txhash - return bitcore_tx(url) + url = 'https://insight.bitpay.com/api/tx/%s' % txhash + return insight_tx(url) From bc9a43986f6ccc35bdf30b994b6b18977bceaa52 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 4 Dec 2014 01:30:31 +0100 Subject: [PATCH 0390/1535] Compiled pb --- trezorlib/types_pb2.py | 59 +++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index c4bc4f13a..4ea360969 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"?\n\x18MultisigRedeemScriptType\x12\x0f\n\x07pubkeys\x18\x01 \x03(\x0c\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"j\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*9\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"J\n\x18MultisigRedeemScriptType\x12\x0f\n\x07pubkeys\x18\x01 \x03(\x0c\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\t\n\x01m\x18\x03 \x01(\r\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"j\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*9\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,8 +74,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1085, - serialized_end=1418, + serialized_start=1096, + serialized_end=1429, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -96,8 +96,8 @@ _OUTPUTSCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1420, - serialized_end=1477, + serialized_start=1431, + serialized_end=1488, ) OutputScriptType = enum_type_wrapper.EnumTypeWrapper(_OUTPUTSCRIPTTYPE) @@ -118,8 +118,8 @@ _INPUTSCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1479, - serialized_end=1533, + serialized_start=1490, + serialized_end=1544, ) InputScriptType = enum_type_wrapper.EnumTypeWrapper(_INPUTSCRIPTTYPE) @@ -148,8 +148,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1535, - serialized_end=1603, + serialized_start=1546, + serialized_end=1614, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -202,8 +202,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1606, - serialized_end=1928, + serialized_start=1617, + serialized_end=1939, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -228,8 +228,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1930, - serialized_end=2057, + serialized_start=1941, + serialized_end=2068, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -434,6 +434,13 @@ _MULTISIGREDEEMSCRIPTTYPE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='m', full_name='MultisigRedeemScriptType.m', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -444,7 +451,7 @@ _MULTISIGREDEEMSCRIPTTYPE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=275, - serialized_end=338, + serialized_end=349, ) @@ -513,8 +520,8 @@ _TXINPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=341, - serialized_end=560, + serialized_start=352, + serialized_end=571, ) @@ -562,8 +569,8 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=562, - serialized_end=668, + serialized_start=573, + serialized_end=679, ) @@ -597,8 +604,8 @@ _TXOUTPUTBINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=670, - serialized_end=726, + serialized_start=681, + serialized_end=737, ) @@ -667,8 +674,8 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=729, - serialized_end=924, + serialized_start=740, + serialized_end=935, ) @@ -702,8 +709,8 @@ _TXREQUESTDETAILSTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=926, - serialized_end=988, + serialized_start=937, + serialized_end=999, ) @@ -744,8 +751,8 @@ _TXREQUESTSERIALIZEDTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=990, - serialized_end=1082, + serialized_start=1001, + serialized_end=1093, ) _TXINPUTTYPE.fields_by_name['script_type'].enum_type = _INPUTSCRIPTTYPE From 5c03c72d919e89861608223452f95b89f00ce32b Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 4 Dec 2014 01:30:41 +0100 Subject: [PATCH 0391/1535] First multisig unit test --- tests/test_multisig.py | 114 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 tests/test_multisig.py diff --git a/tests/test_multisig.py b/tests/test_multisig.py new file mode 100644 index 000000000..d87322a2a --- /dev/null +++ b/tests/test_multisig.py @@ -0,0 +1,114 @@ +import unittest +import common +import binascii +import itertools + +import trezorlib.messages_pb2 as proto +import trezorlib.types_pb2 as proto_types +from trezorlib.client import CallException +from trezorlib.tx_api import TXAPITestnet, TXAPIBitcoin + +# Multisig howto: +# +# https://sx.dyne.org/multisig.html +# + +class TestMultisig(common.TrezorTest): + def test_first_sig(self): + self.setup_mnemonic_nopin_nopassphrase() + + #key1 = self.client.get_public_node([1]) + #key2 = self.client.get_public_node([2]) + #key3 = self.client.get_public_node([3]) + + # pubkeys: + # 0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6 + # 038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3 + # 03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902 + + # redeem script: + # 52210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a621038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e32103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a790253ae + + # multisig address: 3E7GDtuHqnqPmDgwH59pVC7AvySiSkbibz + + # tx: c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52 + # input 1: 0.001 BTC + + multisig = proto_types.MultisigRedeemScriptType( + pubkeys=[binascii.unhexlify('0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6'), + binascii.unhexlify('038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3'), + binascii.unhexlify('03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902')], + signatures=['', '', ''], + m=2, + ) + + # Let's go to sign with key 1 + inp1 = proto_types.TxInputType(address_n=[1], + prev_hash=binascii.unhexlify('c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52'), + prev_index=1, + script_type=proto_types.SPENDMULTISIG, + multisig=multisig, + ) + + out1 = proto_types.TxOutputType(address='12iyMbUb4R2K3gre4dHSrbu5azG5KaqVss', + amount=100000, + script_type=proto_types.PAYTOADDRESS) + + with self.client: + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) + + # Now we have first signature + (signatures1, _) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) + + # --------------------------------------- + # Let's do second signature using 3rd key + + multisig = proto_types.MultisigRedeemScriptType( + pubkeys=[binascii.unhexlify('0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6'), + binascii.unhexlify('038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3'), + binascii.unhexlify('03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902')], + signatures=[signatures1[0], '', ''], # Fill signature from previous signing process + m=2, + ) + + # Let's do a second signature with key 3 + inp3 = proto_types.TxInputType(address_n=[3], + prev_hash=binascii.unhexlify('c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52'), + prev_index=1, + script_type=proto_types.SPENDMULTISIG, + multisig=multisig, + ) + + with self.client: + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) + (signatures2, serialized_tx) = self.client.sign_tx('Bitcoin', [inp3, ], [out1, ]) + + # Accepted by network: tx + self.assertEqual(binascii.hexlify(serialized_tx), '010000000152ba4dfcde9c4bed88f55479cdea03e711ae586e9a89352a98230c4cdf1a09c601000000fdfe0000483045022100985cc1ba316d140eb4b2d4028d8cd1c451f87bff8ff679858732e516ad04cd3402207af6edda99972af0baa7702a3b7448517c8242e7bca669f6861771cdd16ee05801483045022100f5428fe0531b3095675b40d87cab607ee036fac823b22e8dcec35b65aff6e52b022032129b4577ff923d321a1c70db5a6cec5bcc142cb2c51901af8b989cced23e0d014c6952210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a621038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e32103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a790253aeffffffff01a0860100000000001976a91412e8391ad256dcdc023365978418d658dfecba1c88ac00000000') + +if __name__ == '__main__': + unittest.main() From 2ffdff98163c3f90a2382921f791a5c9f5f0ee22 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 7 Dec 2014 15:10:16 +0100 Subject: [PATCH 0392/1535] check partial sigs in multisig test --- tests/test_multisig.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/tests/test_multisig.py b/tests/test_multisig.py index d87322a2a..2e60de4b3 100644 --- a/tests/test_multisig.py +++ b/tests/test_multisig.py @@ -49,7 +49,7 @@ class TestMultisig(common.TrezorTest): script_type=proto_types.SPENDMULTISIG, multisig=multisig, ) - + out1 = proto_types.TxOutputType(address='12iyMbUb4R2K3gre4dHSrbu5azG5KaqVss', amount=100000, script_type=proto_types.PAYTOADDRESS) @@ -60,7 +60,7 @@ class TestMultisig(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), @@ -68,13 +68,15 @@ class TestMultisig(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXFINISHED), ]) - + # Now we have first signature (signatures1, _) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) + self.assertEqual(binascii.hexlify(signatures1[0]), '3045022100985cc1ba316d140eb4b2d4028d8cd1c451f87bff8ff679858732e516ad04cd3402207af6edda99972af0baa7702a3b7448517c8242e7bca669f6861771cdd16ee058') + # --------------------------------------- # Let's do second signature using 3rd key - + multisig = proto_types.MultisigRedeemScriptType( pubkeys=[binascii.unhexlify('0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6'), binascii.unhexlify('038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3'), @@ -82,7 +84,7 @@ class TestMultisig(common.TrezorTest): signatures=[signatures1[0], '', ''], # Fill signature from previous signing process m=2, ) - + # Let's do a second signature with key 3 inp3 = proto_types.TxInputType(address_n=[3], prev_hash=binascii.unhexlify('c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52'), @@ -97,7 +99,7 @@ class TestMultisig(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), @@ -107,7 +109,9 @@ class TestMultisig(common.TrezorTest): ]) (signatures2, serialized_tx) = self.client.sign_tx('Bitcoin', [inp3, ], [out1, ]) - # Accepted by network: tx + self.assertEqual(binascii.hexlify(signatures2[0]), '3045022100f5428fe0531b3095675b40d87cab607ee036fac823b22e8dcec35b65aff6e52b022032129b4577ff923d321a1c70db5a6cec5bcc142cb2c51901af8b989cced23e0d') + + # Accepted by network: tx self.assertEqual(binascii.hexlify(serialized_tx), '010000000152ba4dfcde9c4bed88f55479cdea03e711ae586e9a89352a98230c4cdf1a09c601000000fdfe0000483045022100985cc1ba316d140eb4b2d4028d8cd1c451f87bff8ff679858732e516ad04cd3402207af6edda99972af0baa7702a3b7448517c8242e7bca669f6861771cdd16ee05801483045022100f5428fe0531b3095675b40d87cab607ee036fac823b22e8dcec35b65aff6e52b022032129b4577ff923d321a1c70db5a6cec5bcc142cb2c51901af8b989cced23e0d014c6952210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a621038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e32103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a790253aeffffffff01a0860100000000001976a91412e8391ad256dcdc023365978418d658dfecba1c88ac00000000') if __name__ == '__main__': From 610547cf3211ec0d7910915d80a5189e58248506 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 10 Dec 2014 15:26:18 +0100 Subject: [PATCH 0393/1535] add button_wait feature for tests --- tests/common.py | 1 + trezorlib/client.py | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/tests/common.py b/tests/common.py index c2b2dd288..f1329b070 100644 --- a/tests/common.py +++ b/tests/common.py @@ -10,6 +10,7 @@ class TrezorTest(unittest.TestCase): self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS, **config.TRANSPORT_KWARGS) self.client = TrezorDebugClient(self.transport) self.client.set_debuglink(self.debug_transport) + # self.client.set_buttonwait(3) self.client.set_tx_api(TXAPIBitcoin()) # 1 2 3 4 5 6 7 8 9 10 11 12 diff --git a/trezorlib/client.py b/trezorlib/client.py index c7ad6afb2..c6b6e7fb4 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -209,6 +209,7 @@ class DebugLinkMixin(object): super(DebugLinkMixin, self).__init__(*args, **kwargs) self.debug = None self.in_with_statement = 0 + self.button_wait = 0 self.screenshot_id = 0 # Always press Yes and provide correct pin @@ -228,6 +229,9 @@ class DebugLinkMixin(object): def set_debuglink(self, debug_transport): self.debug = DebugLink(debug_transport) + def set_buttonwait(self, secs): + self.button_wait = secs + def __enter__(self): # For usage in with/expected_responses self.in_with_statement += 1 @@ -305,6 +309,9 @@ class DebugLinkMixin(object): log("ButtonRequest code: " + get_buttonrequest_value(msg.code)) log("Pressing button " + str(self.button)) + if self.button_wait: + log("Waiting %d seconds " % self.button_wait) + time.sleep(self.button_wait) self.debug.press_button(self.button) return proto.ButtonAck() From 705190e147cfda2a5dfb3295058059c2810718ce Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 10 Dec 2014 15:42:38 +0100 Subject: [PATCH 0394/1535] add test for GetAddress with show flag on --- tests/test_msg_getaddress_show.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 tests/test_msg_getaddress_show.py diff --git a/tests/test_msg_getaddress_show.py b/tests/test_msg_getaddress_show.py new file mode 100644 index 000000000..aea6c53a7 --- /dev/null +++ b/tests/test_msg_getaddress_show.py @@ -0,0 +1,14 @@ +import unittest +import common +import trezorlib.ckd_public as bip32 + +class TestMsgGetaddress(common.TrezorTest): + + def test_show(self): + self.setup_mnemonic_nopin_nopassphrase() + self.assertEqual(self.client.get_address('Bitcoin', [1], show_display=True), '1CK7SJdcb8z9HuvVft3D91HLpLC6KSsGb') + self.assertEqual(self.client.get_address('Bitcoin', [2], show_display=True), '15AeAhtNJNKyowK8qPHwgpXkhsokzLtUpG') + self.assertEqual(self.client.get_address('Bitcoin', [3], show_display=True), '1CmzyJp9w3NafXMSEFH4SLYUPAVCSUrrJ5') + +if __name__ == '__main__': + unittest.main() From 4f7bd1be0621e07eca265f3e38ddffc24868b2ad Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 10 Dec 2014 15:43:00 +0100 Subject: [PATCH 0395/1535] update pb --- trezorlib/messages_pb2.py | 140 ++++++++++++++++++++------------------ 1 file changed, 74 insertions(+), 66 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index c0ad08b89..2654903bb 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"Q\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"@\n\x10\x45ncryptedMessage\x12\r\n\x05nonce\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0c\n\x04hmac\x18\x03 \x01(\x0c\"Q\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\r\n\x05nonce\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0c\n\x04hmac\x18\x04 \x01(\x0c\"4\n\x10\x44\x65\x63ryptedMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"!\n\x10\x43ipheredKeyValue\x12\r\n\x05value\x18\x01 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x99\x0e\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_CipheredKeyValue\x10\x30\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_EncryptedMessage\x10\x32\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x33\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_DecryptedMessage\x10\x34\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"~\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\x12+\n\x08multisig\x18\x04 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"@\n\x10\x45ncryptedMessage\x12\r\n\x05nonce\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0c\n\x04hmac\x18\x03 \x01(\x0c\"Q\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\r\n\x05nonce\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0c\n\x04hmac\x18\x04 \x01(\x0c\"4\n\x10\x44\x65\x63ryptedMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"!\n\x10\x43ipheredKeyValue\x12\r\n\x05value\x18\x01 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x99\x0e\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_CipheredKeyValue\x10\x30\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_EncryptedMessage\x10\x32\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x33\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_DecryptedMessage\x10\x34\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -230,8 +230,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3395, - serialized_end=5212, + serialized_start=3440, + serialized_end=5257, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -961,6 +961,13 @@ _GETADDRESS = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='multisig', full_name='GetAddress.multisig', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -971,7 +978,7 @@ _GETADDRESS = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=1046, - serialized_end=1127, + serialized_end=1172, ) @@ -998,8 +1005,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1129, - serialized_end=1155, + serialized_start=1174, + serialized_end=1200, ) @@ -1019,8 +1026,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1157, - serialized_end=1169, + serialized_start=1202, + serialized_end=1214, ) @@ -1089,8 +1096,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1172, - serialized_end=1338, + serialized_start=1217, + serialized_end=1383, ) @@ -1152,8 +1159,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1341, - serialized_end=1498, + serialized_start=1386, + serialized_end=1543, ) @@ -1173,8 +1180,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1500, - serialized_end=1516, + serialized_start=1545, + serialized_end=1561, ) @@ -1201,8 +1208,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1518, - serialized_end=1547, + serialized_start=1563, + serialized_end=1592, ) @@ -1264,8 +1271,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1550, - serialized_end=1709, + serialized_start=1595, + serialized_end=1754, ) @@ -1285,8 +1292,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1711, - serialized_end=1724, + serialized_start=1756, + serialized_end=1769, ) @@ -1313,8 +1320,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1726, - serialized_end=1749, + serialized_start=1771, + serialized_end=1794, ) @@ -1355,8 +1362,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1751, - serialized_end=1828, + serialized_start=1796, + serialized_end=1873, ) @@ -1397,8 +1404,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1830, - serialized_end=1898, + serialized_start=1875, + serialized_end=1943, ) @@ -1432,8 +1439,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1900, - serialized_end=1954, + serialized_start=1945, + serialized_end=1999, ) @@ -1488,8 +1495,8 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1956, - serialized_end=2074, + serialized_start=2001, + serialized_end=2119, ) @@ -1530,8 +1537,8 @@ _ENCRYPTEDMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2076, - serialized_end=2140, + serialized_start=2121, + serialized_end=2185, ) @@ -1579,8 +1586,8 @@ _DECRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2142, - serialized_end=2223, + serialized_start=2187, + serialized_end=2268, ) @@ -1614,8 +1621,8 @@ _DECRYPTEDMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2225, - serialized_end=2277, + serialized_start=2270, + serialized_end=2322, ) @@ -1677,8 +1684,8 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2280, - serialized_end=2408, + serialized_start=2325, + serialized_end=2453, ) @@ -1705,8 +1712,8 @@ _CIPHEREDKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2410, - serialized_end=2443, + serialized_start=2455, + serialized_end=2488, ) @@ -1747,8 +1754,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2445, - serialized_end=2534, + serialized_start=2490, + serialized_end=2579, ) @@ -1775,8 +1782,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2536, - serialized_end=2561, + serialized_start=2581, + serialized_end=2606, ) @@ -1817,8 +1824,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2563, - serialized_end=2644, + serialized_start=2608, + serialized_end=2689, ) @@ -1866,8 +1873,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2647, - serialized_end=2791, + serialized_start=2692, + serialized_end=2836, ) @@ -1908,8 +1915,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2794, - serialized_end=2927, + serialized_start=2839, + serialized_end=2972, ) @@ -1936,8 +1943,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2929, - serialized_end=2966, + serialized_start=2974, + serialized_end=3011, ) @@ -1957,8 +1964,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2968, - serialized_end=2983, + serialized_start=3013, + serialized_end=3028, ) @@ -1985,8 +1992,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2985, - serialized_end=3018, + serialized_start=3030, + serialized_end=3063, ) @@ -2013,8 +2020,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3020, - serialized_end=3055, + serialized_start=3065, + serialized_end=3100, ) @@ -2034,8 +2041,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3057, - serialized_end=3076, + serialized_start=3102, + serialized_end=3121, ) @@ -2125,8 +2132,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3079, - serialized_end=3314, + serialized_start=3124, + serialized_end=3359, ) @@ -2146,8 +2153,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3316, - serialized_end=3331, + serialized_start=3361, + serialized_end=3376, ) @@ -2188,8 +2195,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3333, - serialized_end=3392, + serialized_start=3378, + serialized_end=3437, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -2197,6 +2204,7 @@ _FAILURE.fields_by_name['code'].enum_type = types_pb2._FAILURETYPE _BUTTONREQUEST.fields_by_name['code'].enum_type = types_pb2._BUTTONREQUESTTYPE _PINMATRIXREQUEST.fields_by_name['type'].enum_type = types_pb2._PINMATRIXREQUESTTYPE _PUBLICKEY.fields_by_name['node'].message_type = types_pb2._HDNODETYPE +_GETADDRESS.fields_by_name['multisig'].message_type = types_pb2._MULTISIGREDEEMSCRIPTTYPE _LOADDEVICE.fields_by_name['node'].message_type = types_pb2._HDNODETYPE _SIMPLESIGNTX.fields_by_name['inputs'].message_type = types_pb2._TXINPUTTYPE _SIMPLESIGNTX.fields_by_name['outputs'].message_type = types_pb2._TXOUTPUTTYPE From c7431750a24dce2f5b9e8273f13b949ecf9ecd8b Mon Sep 17 00:00:00 2001 From: slush0 Date: Wed, 10 Dec 2014 17:51:55 +0100 Subject: [PATCH 0396/1535] Added multisig tests for missing pubkey and for 15of15 --- tests/test_multisig.py | 98 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/tests/test_multisig.py b/tests/test_multisig.py index d87322a2a..c25d805ae 100644 --- a/tests/test_multisig.py +++ b/tests/test_multisig.py @@ -107,8 +107,104 @@ class TestMultisig(common.TrezorTest): ]) (signatures2, serialized_tx) = self.client.sign_tx('Bitcoin', [inp3, ], [out1, ]) - # Accepted by network: tx + # Accepted by network: tx 8382a2b2e3ec8788800c1d46d285dfa9dd4051edddd75982fad166b9273e5ac6 self.assertEqual(binascii.hexlify(serialized_tx), '010000000152ba4dfcde9c4bed88f55479cdea03e711ae586e9a89352a98230c4cdf1a09c601000000fdfe0000483045022100985cc1ba316d140eb4b2d4028d8cd1c451f87bff8ff679858732e516ad04cd3402207af6edda99972af0baa7702a3b7448517c8242e7bca669f6861771cdd16ee05801483045022100f5428fe0531b3095675b40d87cab607ee036fac823b22e8dcec35b65aff6e52b022032129b4577ff923d321a1c70db5a6cec5bcc142cb2c51901af8b989cced23e0d014c6952210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a621038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e32103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a790253aeffffffff01a0860100000000001976a91412e8391ad256dcdc023365978418d658dfecba1c88ac00000000') + def test_15_of_15(self): + self.setup_mnemonic_nopin_nopassphrase() + + ''' + pubs = [] + for x in range(15): + pubs.append(binascii.hexlify(self.client.get_public_node([x]).node.public_key)) + ''' + pubs = ['023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43d', + '0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6', + '038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3', + '03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902', + '03fe91eca10602d7dad4c9dab2b2a0858f71e25a219a6940749ce7a48118480dae', + '0234716c01c2dd03fa7ee302705e2b8fbd1311895d94b1dca15e62eedea9b0968f', + '0341fb2ead334952cf60f4481ba435c4693d0be649be01d2cfe9b02018e483e7bd', + '02dad8b2bce360a705c16e74a50a36459b4f8f4b78f9cd67def29d54ef6f7c7cf9', + '0222dbe3f5f197a34a1d50e2cbe2a1085cac2d605c9e176f9a240e0fd0c669330d', + '03fb41afab56c9cdb013fda63d777d4938ddc3cb2ad939712da688e3ed333f9598', + '02435f177646bdc717cb3211bf46656ca7e8d642726144778c9ce816b8b8c36ccf', + '02158d8e20095364031d923c7e9f7f08a14b1be1ddee21fe1a5431168e31345e55', + '026259794892428ca0818c8fb61d2d459ddfe20e57f50803c7295e6f4e2f558665', + '02815f910a8689151db627e6e262e0a2075ad5ec2993a6bc1b876a9d420923d681', + '0318f54647f645ff01bd49fedc0219343a6a22d3ea3180a3c3d3097e4b888a8db4'] + + # redeeemscript + # 5f21023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43d210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a621038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e32103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a79022103fe91eca10602d7dad4c9dab2b2a0858f71e25a219a6940749ce7a48118480dae210234716c01c2dd03fa7ee302705e2b8fbd1311895d94b1dca15e62eedea9b0968f210341fb2ead334952cf60f4481ba435c4693d0be649be01d2cfe9b02018e483e7bd2102dad8b2bce360a705c16e74a50a36459b4f8f4b78f9cd67def29d54ef6f7c7cf9210222dbe3f5f197a34a1d50e2cbe2a1085cac2d605c9e176f9a240e0fd0c669330d2103fb41afab56c9cdb013fda63d777d4938ddc3cb2ad939712da688e3ed333f95982102435f177646bdc717cb3211bf46656ca7e8d642726144778c9ce816b8b8c36ccf2102158d8e20095364031d923c7e9f7f08a14b1be1ddee21fe1a5431168e31345e5521026259794892428ca0818c8fb61d2d459ddfe20e57f50803c7295e6f4e2f5586652102815f910a8689151db627e6e262e0a2075ad5ec2993a6bc1b876a9d420923d681210318f54647f645ff01bd49fedc0219343a6a22d3ea3180a3c3d3097e4b888a8db45fae + + # multisig address + # 3QaKF8zobqcqY8aS6nxCD5ZYdiRfL3RCmU + + signatures = [''] * 15 + + out1 = proto_types.TxOutputType(address='17kTB7qSk3MupQxWdiv5ZU3zcrZc2Azes1', + amount=10000, + script_type=proto_types.PAYTOADDRESS) + + for x in range(15): + multisig = proto_types.MultisigRedeemScriptType( + pubkeys=[binascii.unhexlify(p) for p in pubs], + signatures=signatures, + m=15, + ) + + + inp1 = proto_types.TxInputType(address_n=[x], + prev_hash=binascii.unhexlify('6189e3febb5a21cee8b725aa1ef04ffce7e609448446d3a8d6f483c634ef5315'), + prev_index=1, + script_type=proto_types.SPENDMULTISIG, + multisig=multisig, + ) + + with self.client: + (sig, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) + signatures[x] = sig[0] + + # Accepted as tx id dd320786d1f58c095be0509dc56b277b6de8f2fb5517f519c6e6708414e3300b + self.assertEqual(binascii.hexlify(serialized_tx), '01000000011553ef34c683f4d6a8d346844409e6e7fc4ff01eaa25b7e8ce215abbfee3896101000000fd43060048304502210098e23085ad7282de988bf98afa1e9add9c9830009132f8902a9fa4624d5dc98b0220733216e70ab67791aa64be5c83d2050cb4ed9ff7eda2a1acc35da024d2ab2a670147304402201f8c11fb6e90fd616e484986e9451929797eba039882a9abcc203210948060b9022044da031530de7d9747d3c5a8e7cec04b04b7af495c9120b854ce7362af7fa05a01483045022100ea67c70186acef019bdf1551881bf38e6f88186501b64d3a756a2ce18e4ba18002201c35110325653e21e448b60053a4b5dda46b61096faf701a1faca61fcde91f00014730440220315598992f156d2f9d7b4275395fa067aa61ea95829fa17730885c86df4de70d02203eda9ade1656e2198c668603b17e197acb0969ed183ab0841303ea261205618901473044022060fdd6621edde9b8cf6776bc4eef26ace9b57514d725b7214ba11d333520a30e022044c30744f94484aec0f896233c5613a3256878ec0379f566226906b6d1b6061401483045022100b1d907e3574f60f7834c7e9f2e367998ce0461dad7d742d84ef8917d713f41f902203b3ac54f7bb2f7fb8685f582d2a94f7213a37cb508acffe29090cc06ae01588b01483045022100e3bf90ff3ad6395e42f46002f253f94ca0e8ffaa0620f2ceb4fa21493abdca4d02201d4c28b10b740bb2dc4b3695b4205c18f8c0dad2bb69540eb8a36576463cd5280147304402202cfaf9fab7dc1c9f0c3c23bd46bd6d5cea0664d914139fc9add80766ce998808022012db2802c07853e4cbe147afdf0b47e60bdcbcd31f9df19e04c177ed9aa66c6d0147304402207cbc2d83f351eee5ee91df26bb0c7e1cb07fe328cbbcdb0bb9656d37922c497302201b3435d4c71ffd1b34d45892f2a487bd79c8c7f57cc04373287642bb9610cb840147304402202dc3eab30ccb06553703e794212f43ee9a659f5e787a8374e9ea0bf6de0def7402201a70e970c21a807783313ed102bf4f0a3406ac7c84f94bc8194c5e209464d7230147304402206b04530c190c46a879d7771a6ad53acd33547e0d7fd320d5ad0b5b1fdeb5d4c202207b812be81c3419daadc942cca0c55aa32c7759fa7566c6dc35f030ca87a1c5be01483045022100ce523dddd6eef73d5ae7c44c870466e1ac5a7a77d43475e8def024af68977a1e022028be0276435bfa2ea887d6cf89fa829f96c1c7a55edc57bb3fd667d523fd3bf601473044022019410b20ebcd8eb3ee7ec1eff6bf0f9cbfaea82116811c61f3cf24af7e4434b1022009e5823f3349f695be09ae40754185300d8442a22715ddb5ffa17c4213140e7201483045022100964ef26a9074c3cdafffcfbe4bd445933f8c842ba11fd887922adcf7fabe0c82022023055d94c75ab223c767fbaa825c917e9beecbc7d5758cccf20d886c63d4b72a0147304402207aa3a98197697d258a8baae681f0b4c0ee682982f4205534e6c95a37dabaddd60220517a7ed5c03da2f242e17ccfdae0d81d6f454d7f9ea931fc62df6c0eab922186014d01025f21023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43d210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a621038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e32103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a79022103fe91eca10602d7dad4c9dab2b2a0858f71e25a219a6940749ce7a48118480dae210234716c01c2dd03fa7ee302705e2b8fbd1311895d94b1dca15e62eedea9b0968f210341fb2ead334952cf60f4481ba435c4693d0be649be01d2cfe9b02018e483e7bd2102dad8b2bce360a705c16e74a50a36459b4f8f4b78f9cd67def29d54ef6f7c7cf9210222dbe3f5f197a34a1d50e2cbe2a1085cac2d605c9e176f9a240e0fd0c669330d2103fb41afab56c9cdb013fda63d777d4938ddc3cb2ad939712da688e3ed333f95982102435f177646bdc717cb3211bf46656ca7e8d642726144778c9ce816b8b8c36ccf2102158d8e20095364031d923c7e9f7f08a14b1be1ddee21fe1a5431168e31345e5521026259794892428ca0818c8fb61d2d459ddfe20e57f50803c7295e6f4e2f5586652102815f910a8689151db627e6e262e0a2075ad5ec2993a6bc1b876a9d420923d681210318f54647f645ff01bd49fedc0219343a6a22d3ea3180a3c3d3097e4b888a8db45faeffffffff0110270000000000001976a9144a087d89f8ad16ca029c675b037c02fd1c5f9aec88ac00000000') + + def test_missing_pubkey(self): + self.setup_mnemonic_nopin_nopassphrase() + + #key1 = self.client.get_public_node([1]) + #key2 = self.client.get_public_node([2]) + #key3 = self.client.get_public_node([3]) + + # pubkeys: + # 0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6 + # 038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3 + # 03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902 + + # multisig address: 3E7GDtuHqnqPmDgwH59pVC7AvySiSkbibz + + multisig = proto_types.MultisigRedeemScriptType( + pubkeys=[binascii.unhexlify('0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6'), + binascii.unhexlify('038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3'), + binascii.unhexlify('03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902')], + signatures=['', '', ''], + m=2, + ) + + # Let's go to sign with key 10, which is NOT in pubkeys + inp1 = proto_types.TxInputType(address_n=[10], + prev_hash=binascii.unhexlify('c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52'), + prev_index=1, + script_type=proto_types.SPENDMULTISIG, + multisig=multisig, + ) + + out1 = proto_types.TxOutputType(address='12iyMbUb4R2K3gre4dHSrbu5azG5KaqVss', + amount=100000, + script_type=proto_types.PAYTOADDRESS) + + with self.client: + # It should throw Failure 'Pubkey not found in multisig script' + self.assertRaises(CallException, self.client.sign_tx, 'Bitcoin', [inp1, ], [out1, ]) + if __name__ == '__main__': unittest.main() From c0d0b191d68cb9f7125f3827ba456694af4b6d13 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 10 Dec 2014 18:03:54 +0100 Subject: [PATCH 0397/1535] test_msg_getaddress_show test now supports multisig --- tests/test_msg_getaddress_show.py | 17 +++++++++++++++++ trezorlib/client.py | 7 +++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/tests/test_msg_getaddress_show.py b/tests/test_msg_getaddress_show.py index aea6c53a7..6e160a4cd 100644 --- a/tests/test_msg_getaddress_show.py +++ b/tests/test_msg_getaddress_show.py @@ -1,6 +1,8 @@ import unittest import common import trezorlib.ckd_public as bip32 +import trezorlib.types_pb2 as proto_types +import binascii class TestMsgGetaddress(common.TrezorTest): @@ -10,5 +12,20 @@ class TestMsgGetaddress(common.TrezorTest): self.assertEqual(self.client.get_address('Bitcoin', [2], show_display=True), '15AeAhtNJNKyowK8qPHwgpXkhsokzLtUpG') self.assertEqual(self.client.get_address('Bitcoin', [3], show_display=True), '1CmzyJp9w3NafXMSEFH4SLYUPAVCSUrrJ5') + def test_show_multisig(self): + self.setup_mnemonic_nopin_nopassphrase() + + multisig = proto_types.MultisigRedeemScriptType( + pubkeys=[binascii.unhexlify('0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6'), + binascii.unhexlify('038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3'), + binascii.unhexlify('03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902')], + signatures=['', '', ''], + m=2, + ) + + self.assertEqual(self.client.get_address('Bitcoin', [1], show_display=True, multisig=multisig), '3E7GDtuHqnqPmDgwH59pVC7AvySiSkbibz') + self.assertEqual(self.client.get_address('Bitcoin', [2], show_display=True, multisig=multisig), '3E7GDtuHqnqPmDgwH59pVC7AvySiSkbibz') + self.assertEqual(self.client.get_address('Bitcoin', [3], show_display=True, multisig=multisig), '3E7GDtuHqnqPmDgwH59pVC7AvySiSkbibz') + if __name__ == '__main__': unittest.main() diff --git a/trezorlib/client.py b/trezorlib/client.py index c6b6e7fb4..37aa264aa 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -388,9 +388,12 @@ class ProtocolMixin(object): @field('address') @expect(proto.Address) - def get_address(self, coin_name, n, show_display=False): + def get_address(self, coin_name, n, show_display=False, multisig=None): n = self._convert_prime(n) - return self.call(proto.GetAddress(address_n=n, coin_name=coin_name, show_display=show_display)) + if multisig: + return self.call(proto.GetAddress(address_n=n, coin_name=coin_name, show_display=show_display, multisig=multisig)) + else: + return self.call(proto.GetAddress(address_n=n, coin_name=coin_name, show_display=show_display)) @field('entropy') @expect(proto.Entropy) From 1fde1ecc2274b596be9bb67469a7b00644bebe63 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 10 Dec 2014 19:53:24 +0100 Subject: [PATCH 0398/1535] add 15-15-multisig to show address test --- tests/test_msg_getaddress_show.py | 35 +++++++++++++++++++++++++++---- tests/test_multisig.py | 3 ++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/tests/test_msg_getaddress_show.py b/tests/test_msg_getaddress_show.py index 6e160a4cd..f419eb0ae 100644 --- a/tests/test_msg_getaddress_show.py +++ b/tests/test_msg_getaddress_show.py @@ -12,7 +12,7 @@ class TestMsgGetaddress(common.TrezorTest): self.assertEqual(self.client.get_address('Bitcoin', [2], show_display=True), '15AeAhtNJNKyowK8qPHwgpXkhsokzLtUpG') self.assertEqual(self.client.get_address('Bitcoin', [3], show_display=True), '1CmzyJp9w3NafXMSEFH4SLYUPAVCSUrrJ5') - def test_show_multisig(self): + def test_show_multisig_3(self): self.setup_mnemonic_nopin_nopassphrase() multisig = proto_types.MultisigRedeemScriptType( @@ -23,9 +23,36 @@ class TestMsgGetaddress(common.TrezorTest): m=2, ) - self.assertEqual(self.client.get_address('Bitcoin', [1], show_display=True, multisig=multisig), '3E7GDtuHqnqPmDgwH59pVC7AvySiSkbibz') - self.assertEqual(self.client.get_address('Bitcoin', [2], show_display=True, multisig=multisig), '3E7GDtuHqnqPmDgwH59pVC7AvySiSkbibz') - self.assertEqual(self.client.get_address('Bitcoin', [3], show_display=True, multisig=multisig), '3E7GDtuHqnqPmDgwH59pVC7AvySiSkbibz') + for i in [1, 2, 3]: + self.assertEqual(self.client.get_address('Bitcoin', [i], show_display=True, multisig=multisig), '3E7GDtuHqnqPmDgwH59pVC7AvySiSkbibz') + + def test_show_multisig_15(self): + self.setup_mnemonic_nopin_nopassphrase() + + pubs = ['023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43d', + '0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6', + '038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3', + '03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902', + '03fe91eca10602d7dad4c9dab2b2a0858f71e25a219a6940749ce7a48118480dae', + '0234716c01c2dd03fa7ee302705e2b8fbd1311895d94b1dca15e62eedea9b0968f', + '0341fb2ead334952cf60f4481ba435c4693d0be649be01d2cfe9b02018e483e7bd', + '02dad8b2bce360a705c16e74a50a36459b4f8f4b78f9cd67def29d54ef6f7c7cf9', + '0222dbe3f5f197a34a1d50e2cbe2a1085cac2d605c9e176f9a240e0fd0c669330d', + '03fb41afab56c9cdb013fda63d777d4938ddc3cb2ad939712da688e3ed333f9598', + '02435f177646bdc717cb3211bf46656ca7e8d642726144778c9ce816b8b8c36ccf', + '02158d8e20095364031d923c7e9f7f08a14b1be1ddee21fe1a5431168e31345e55', + '026259794892428ca0818c8fb61d2d459ddfe20e57f50803c7295e6f4e2f558665', + '02815f910a8689151db627e6e262e0a2075ad5ec2993a6bc1b876a9d420923d681', + '0318f54647f645ff01bd49fedc0219343a6a22d3ea3180a3c3d3097e4b888a8db4'] + + multisig = proto_types.MultisigRedeemScriptType( + pubkeys=[binascii.unhexlify(p) for p in pubs], + signatures=[''] * 15, + m=15, + ) + + for i in range(15): + self.assertEqual(self.client.get_address('Bitcoin', [i], show_display=True, multisig=multisig), '3QaKF8zobqcqY8aS6nxCD5ZYdiRfL3RCmU') if __name__ == '__main__': unittest.main() diff --git a/tests/test_multisig.py b/tests/test_multisig.py index 664b4c809..44129a62b 100644 --- a/tests/test_multisig.py +++ b/tests/test_multisig.py @@ -14,7 +14,8 @@ from trezorlib.tx_api import TXAPITestnet, TXAPIBitcoin # class TestMultisig(common.TrezorTest): - def test_first_sig(self): + + def test_2_of_3(self): self.setup_mnemonic_nopin_nopassphrase() #key1 = self.client.get_public_node([1]) From 92bb796fd7f4422e10bb208d52e150a115a48269 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 12 Dec 2014 22:19:00 +0100 Subject: [PATCH 0399/1535] Compiled pb --- trezorlib/types_pb2.py | 104 +++++++++++++++++++++++++++++------------ 1 file changed, 74 insertions(+), 30 deletions(-) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 4ea360969..ff59765aa 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"J\n\x18MultisigRedeemScriptType\x12\x0f\n\x07pubkeys\x18\x01 \x03(\x0c\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\t\n\x01m\x18\x03 \x01(\r\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"j\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*9\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"<\n\x0cHDPubkeyType\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x11\n\taddress_n\x18\x02 \x03(\r\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"Y\n\x18MultisigRedeemScriptType\x12\x1e\n\x07pubkeys\x18\x01 \x03(\x0b\x32\r.HDPubkeyType\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\t\n\x01m\x18\x03 \x01(\r\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"j\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*9\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,8 +74,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1096, - serialized_end=1429, + serialized_start=1173, + serialized_end=1506, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -96,8 +96,8 @@ _OUTPUTSCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1431, - serialized_end=1488, + serialized_start=1508, + serialized_end=1565, ) OutputScriptType = enum_type_wrapper.EnumTypeWrapper(_OUTPUTSCRIPTTYPE) @@ -118,8 +118,8 @@ _INPUTSCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1490, - serialized_end=1544, + serialized_start=1567, + serialized_end=1621, ) InputScriptType = enum_type_wrapper.EnumTypeWrapper(_INPUTSCRIPTTYPE) @@ -148,8 +148,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1546, - serialized_end=1614, + serialized_start=1623, + serialized_end=1691, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -202,8 +202,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1617, - serialized_end=1939, + serialized_start=1694, + serialized_end=2016, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -228,8 +228,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1941, - serialized_end=2068, + serialized_start=2018, + serialized_end=2145, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -364,6 +364,41 @@ _HDNODETYPE = _descriptor.Descriptor( ) +_HDPUBKEYTYPE = _descriptor.Descriptor( + name='HDPubkeyType', + full_name='HDPubkeyType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='node', full_name='HDPubkeyType.node', index=0, + number=1, type=11, cpp_type=10, label=2, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='address_n', full_name='HDPubkeyType.address_n', index=1, + number=2, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=180, + serialized_end=240, +) + + _COINTYPE = _descriptor.Descriptor( name='CoinType', full_name='CoinType', @@ -408,8 +443,8 @@ _COINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=180, - serialized_end=273, + serialized_start=242, + serialized_end=335, ) @@ -422,7 +457,7 @@ _MULTISIGREDEEMSCRIPTTYPE = _descriptor.Descriptor( fields=[ _descriptor.FieldDescriptor( name='pubkeys', full_name='MultisigRedeemScriptType.pubkeys', index=0, - number=1, type=12, cpp_type=9, label=3, + number=1, type=11, cpp_type=10, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -450,8 +485,8 @@ _MULTISIGREDEEMSCRIPTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=275, - serialized_end=349, + serialized_start=337, + serialized_end=426, ) @@ -520,8 +555,8 @@ _TXINPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=352, - serialized_end=571, + serialized_start=429, + serialized_end=648, ) @@ -569,8 +604,8 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=573, - serialized_end=679, + serialized_start=650, + serialized_end=756, ) @@ -604,8 +639,8 @@ _TXOUTPUTBINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=681, - serialized_end=737, + serialized_start=758, + serialized_end=814, ) @@ -674,8 +709,8 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=740, - serialized_end=935, + serialized_start=817, + serialized_end=1012, ) @@ -709,8 +744,8 @@ _TXREQUESTDETAILSTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=937, - serialized_end=999, + serialized_start=1014, + serialized_end=1076, ) @@ -751,10 +786,12 @@ _TXREQUESTSERIALIZEDTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1001, - serialized_end=1093, + serialized_start=1078, + serialized_end=1170, ) +_HDPUBKEYTYPE.fields_by_name['node'].message_type = _HDNODETYPE +_MULTISIGREDEEMSCRIPTTYPE.fields_by_name['pubkeys'].message_type = _HDPUBKEYTYPE _TXINPUTTYPE.fields_by_name['script_type'].enum_type = _INPUTSCRIPTTYPE _TXINPUTTYPE.fields_by_name['multisig'].message_type = _MULTISIGREDEEMSCRIPTTYPE _TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _OUTPUTSCRIPTTYPE @@ -762,6 +799,7 @@ _TRANSACTIONTYPE.fields_by_name['inputs'].message_type = _TXINPUTTYPE _TRANSACTIONTYPE.fields_by_name['bin_outputs'].message_type = _TXOUTPUTBINTYPE _TRANSACTIONTYPE.fields_by_name['outputs'].message_type = _TXOUTPUTTYPE DESCRIPTOR.message_types_by_name['HDNodeType'] = _HDNODETYPE +DESCRIPTOR.message_types_by_name['HDPubkeyType'] = _HDPUBKEYTYPE DESCRIPTOR.message_types_by_name['CoinType'] = _COINTYPE DESCRIPTOR.message_types_by_name['MultisigRedeemScriptType'] = _MULTISIGREDEEMSCRIPTTYPE DESCRIPTOR.message_types_by_name['TxInputType'] = _TXINPUTTYPE @@ -777,6 +815,12 @@ class HDNodeType(_message.Message): # @@protoc_insertion_point(class_scope:HDNodeType) +class HDPubkeyType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _HDPUBKEYTYPE + + # @@protoc_insertion_point(class_scope:HDPubkeyType) + class CoinType(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _COINTYPE From bb88abab1e363ccb7ca82b9462f9dcde92c98054 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 12 Dec 2014 22:19:30 +0100 Subject: [PATCH 0400/1535] Reflects changes in multisig API: Pass HDNodeType+address_n instead of pubkeys --- tests/test_multisig.py | 76 +++++++++++++++++++++++++---------------- trezorlib/ckd_public.py | 20 +++++++++++ 2 files changed, 66 insertions(+), 30 deletions(-) diff --git a/tests/test_multisig.py b/tests/test_multisig.py index 44129a62b..2f4e8dd5a 100644 --- a/tests/test_multisig.py +++ b/tests/test_multisig.py @@ -4,6 +4,7 @@ import binascii import itertools import trezorlib.messages_pb2 as proto +import trezorlib.ckd_public as ckd_public import trezorlib.types_pb2 as proto_types from trezorlib.client import CallException from trezorlib.tx_api import TXAPITestnet, TXAPIBitcoin @@ -22,10 +23,14 @@ class TestMultisig(common.TrezorTest): #key2 = self.client.get_public_node([2]) #key3 = self.client.get_public_node([3]) + # xpub: + # print ckd_public.serialize(self.client.get_public_node([]).node) + # xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy + # pubkeys: - # 0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6 - # 038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3 - # 03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902 + # xpub/1: 0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6 + # xpub/2: 038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3 + # xpub/3: 03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902 # redeem script: # 52210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a621038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e32103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a790253ae @@ -35,10 +40,12 @@ class TestMultisig(common.TrezorTest): # tx: c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52 # input 1: 0.001 BTC + node = ckd_public.deserialize('xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') + multisig = proto_types.MultisigRedeemScriptType( - pubkeys=[binascii.unhexlify('0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6'), - binascii.unhexlify('038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3'), - binascii.unhexlify('03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902')], + pubkeys=[proto_types.HDPubkeyType(node=node, address_n=[1]), + proto_types.HDPubkeyType(node=node, address_n=[2]), + proto_types.HDPubkeyType(node=node, address_n=[3])], signatures=['', '', ''], m=2, ) @@ -79,9 +86,9 @@ class TestMultisig(common.TrezorTest): # Let's do second signature using 3rd key multisig = proto_types.MultisigRedeemScriptType( - pubkeys=[binascii.unhexlify('0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6'), - binascii.unhexlify('038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3'), - binascii.unhexlify('03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902')], + pubkeys=[proto_types.HDPubkeyType(node=node, address_n=[1]), + proto_types.HDPubkeyType(node=node, address_n=[2]), + proto_types.HDPubkeyType(node=node, address_n=[3])], signatures=[signatures1[0], '', ''], # Fill signature from previous signing process m=2, ) @@ -118,26 +125,29 @@ class TestMultisig(common.TrezorTest): def test_15_of_15(self): self.setup_mnemonic_nopin_nopassphrase() - ''' + """ pubs = [] for x in range(15): pubs.append(binascii.hexlify(self.client.get_public_node([x]).node.public_key)) - ''' - pubs = ['023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43d', - '0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6', - '038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3', - '03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902', - '03fe91eca10602d7dad4c9dab2b2a0858f71e25a219a6940749ce7a48118480dae', - '0234716c01c2dd03fa7ee302705e2b8fbd1311895d94b1dca15e62eedea9b0968f', - '0341fb2ead334952cf60f4481ba435c4693d0be649be01d2cfe9b02018e483e7bd', - '02dad8b2bce360a705c16e74a50a36459b4f8f4b78f9cd67def29d54ef6f7c7cf9', - '0222dbe3f5f197a34a1d50e2cbe2a1085cac2d605c9e176f9a240e0fd0c669330d', - '03fb41afab56c9cdb013fda63d777d4938ddc3cb2ad939712da688e3ed333f9598', - '02435f177646bdc717cb3211bf46656ca7e8d642726144778c9ce816b8b8c36ccf', - '02158d8e20095364031d923c7e9f7f08a14b1be1ddee21fe1a5431168e31345e55', - '026259794892428ca0818c8fb61d2d459ddfe20e57f50803c7295e6f4e2f558665', - '02815f910a8689151db627e6e262e0a2075ad5ec2993a6bc1b876a9d420923d681', - '0318f54647f645ff01bd49fedc0219343a6a22d3ea3180a3c3d3097e4b888a8db4'] + """ + + # xpub: + # print ckd_public.serialize(self.client.get_public_node([]).node) + # xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy + node = ckd_public.deserialize('xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') + + multisig = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDPubkeyType(node=node, address_n=[1]), + proto_types.HDPubkeyType(node=node, address_n=[2]), + proto_types.HDPubkeyType(node=node, address_n=[3])], + signatures=['', '', ''], + m=2, + ) + + + pubs = [] + for x in range(15): + pubs.append(proto_types.HDPubkeyType(node=node, address_n=[x])) # redeeemscript # 5f21023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43d210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a621038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e32103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a79022103fe91eca10602d7dad4c9dab2b2a0858f71e25a219a6940749ce7a48118480dae210234716c01c2dd03fa7ee302705e2b8fbd1311895d94b1dca15e62eedea9b0968f210341fb2ead334952cf60f4481ba435c4693d0be649be01d2cfe9b02018e483e7bd2102dad8b2bce360a705c16e74a50a36459b4f8f4b78f9cd67def29d54ef6f7c7cf9210222dbe3f5f197a34a1d50e2cbe2a1085cac2d605c9e176f9a240e0fd0c669330d2103fb41afab56c9cdb013fda63d777d4938ddc3cb2ad939712da688e3ed333f95982102435f177646bdc717cb3211bf46656ca7e8d642726144778c9ce816b8b8c36ccf2102158d8e20095364031d923c7e9f7f08a14b1be1ddee21fe1a5431168e31345e5521026259794892428ca0818c8fb61d2d459ddfe20e57f50803c7295e6f4e2f5586652102815f910a8689151db627e6e262e0a2075ad5ec2993a6bc1b876a9d420923d681210318f54647f645ff01bd49fedc0219343a6a22d3ea3180a3c3d3097e4b888a8db45fae @@ -153,7 +163,7 @@ class TestMultisig(common.TrezorTest): for x in range(15): multisig = proto_types.MultisigRedeemScriptType( - pubkeys=[binascii.unhexlify(p) for p in pubs], + pubkeys=pubs, signatures=signatures, m=15, ) @@ -187,10 +197,15 @@ class TestMultisig(common.TrezorTest): # multisig address: 3E7GDtuHqnqPmDgwH59pVC7AvySiSkbibz + # xpub: + # print ckd_public.serialize(self.client.get_public_node([]).node) + # xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy + node = ckd_public.deserialize('xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') + multisig = proto_types.MultisigRedeemScriptType( - pubkeys=[binascii.unhexlify('0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6'), - binascii.unhexlify('038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3'), - binascii.unhexlify('03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902')], + pubkeys=[proto_types.HDPubkeyType(node=node, address_n=[1]), + proto_types.HDPubkeyType(node=node, address_n=[2]), + proto_types.HDPubkeyType(node=node, address_n=[3])], signatures=['', '', ''], m=2, ) @@ -211,5 +226,6 @@ class TestMultisig(common.TrezorTest): # It should throw Failure 'Pubkey not found in multisig script' self.assertRaises(CallException, self.client.sign_tx, 'Bitcoin', [inp1, ], [out1, ]) + if __name__ == '__main__': unittest.main() diff --git a/trezorlib/ckd_public.py b/trezorlib/ckd_public.py index d85f97f48..64787b7e7 100644 --- a/trezorlib/ckd_public.py +++ b/trezorlib/ckd_public.py @@ -103,3 +103,23 @@ def serialize(node, version=0x0488B21E): s += node.public_key s += tools.Hash(s)[:4] return tools.b58encode(s) + +def deserialize(xpub): + data = tools.b58decode(xpub, None) + + if tools.Hash(data[:-4])[:4] != data[-4:]: + raise Exception("Checksum failed") + + node = proto_types.HDNodeType() + node.depth = struct.unpack('>B', data[4:5])[0] + node.fingerprint = struct.unpack('>I', data[5:9])[0] + node.child_num = struct.unpack('>I', data[9:13])[0] + node.chain_code = data[13:45] + + key = data[45:-4] + if key[0] == '\x00': + node.private_key = key[1:] + else: + node.public_key = key + + return node From 74a1e18e4c444dc63903caf1f77f6122d3f54160 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 12 Dec 2014 22:31:40 +0100 Subject: [PATCH 0401/1535] Fix for new multisig API --- tests/test_msg_getaddress_show.py | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/tests/test_msg_getaddress_show.py b/tests/test_msg_getaddress_show.py index f419eb0ae..04279c23f 100644 --- a/tests/test_msg_getaddress_show.py +++ b/tests/test_msg_getaddress_show.py @@ -15,10 +15,11 @@ class TestMsgGetaddress(common.TrezorTest): def test_show_multisig_3(self): self.setup_mnemonic_nopin_nopassphrase() + node = bip32.deserialize('xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') multisig = proto_types.MultisigRedeemScriptType( - pubkeys=[binascii.unhexlify('0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6'), - binascii.unhexlify('038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3'), - binascii.unhexlify('03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902')], + pubkeys=[proto_types.HDPubkeyType(node=node, address_n=[1]), + proto_types.HDPubkeyType(node=node, address_n=[2]), + proto_types.HDPubkeyType(node=node, address_n=[3])], signatures=['', '', ''], m=2, ) @@ -29,24 +30,15 @@ class TestMsgGetaddress(common.TrezorTest): def test_show_multisig_15(self): self.setup_mnemonic_nopin_nopassphrase() - pubs = ['023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43d', - '0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6', - '038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3', - '03477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a7902', - '03fe91eca10602d7dad4c9dab2b2a0858f71e25a219a6940749ce7a48118480dae', - '0234716c01c2dd03fa7ee302705e2b8fbd1311895d94b1dca15e62eedea9b0968f', - '0341fb2ead334952cf60f4481ba435c4693d0be649be01d2cfe9b02018e483e7bd', - '02dad8b2bce360a705c16e74a50a36459b4f8f4b78f9cd67def29d54ef6f7c7cf9', - '0222dbe3f5f197a34a1d50e2cbe2a1085cac2d605c9e176f9a240e0fd0c669330d', - '03fb41afab56c9cdb013fda63d777d4938ddc3cb2ad939712da688e3ed333f9598', - '02435f177646bdc717cb3211bf46656ca7e8d642726144778c9ce816b8b8c36ccf', - '02158d8e20095364031d923c7e9f7f08a14b1be1ddee21fe1a5431168e31345e55', - '026259794892428ca0818c8fb61d2d459ddfe20e57f50803c7295e6f4e2f558665', - '02815f910a8689151db627e6e262e0a2075ad5ec2993a6bc1b876a9d420923d681', - '0318f54647f645ff01bd49fedc0219343a6a22d3ea3180a3c3d3097e4b888a8db4'] + node = bip32.deserialize('xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') + + pubs = [] + for x in range(15): + pubs.append(proto_types.HDPubkeyType(node=node, address_n=[x])) + multisig = proto_types.MultisigRedeemScriptType( - pubkeys=[binascii.unhexlify(p) for p in pubs], + pubkeys=pubs, signatures=[''] * 15, m=15, ) From 63ee12425463530320a70d4b96d632b14ccee62a Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 13 Dec 2014 19:07:30 +0100 Subject: [PATCH 0402/1535] test for ApplySettings.use_passphrase --- tests/common.py | 3 +++ tests/test_msg_applysettings.py | 33 +++++++++++++++++++++++++++++++++ trezorlib/client.py | 4 +++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/tests/common.py b/tests/common.py index f1329b070..8d908bf3b 100644 --- a/tests/common.py +++ b/tests/common.py @@ -30,6 +30,9 @@ class TrezorTest(unittest.TestCase): def setup_mnemonic_nopin_nopassphrase(self): self.client.load_device_by_mnemonic(mnemonic=self.mnemonic12, pin='', passphrase_protection=False, label='test', language='english') + def setup_mnemonic_pin_nopassphrase(self): + self.client.load_device_by_mnemonic(mnemonic=self.mnemonic12, pin=self.pin4, passphrase_protection=False, label='test', language='english') + def setup_mnemonic_pin_passphrase(self): self.client.load_device_by_mnemonic(mnemonic=self.mnemonic12, pin=self.pin4, passphrase_protection=True, label='test', language='english') diff --git a/tests/test_msg_applysettings.py b/tests/test_msg_applysettings.py index 6c0855b18..6bb9bc8c5 100644 --- a/tests/test_msg_applysettings.py +++ b/tests/test_msg_applysettings.py @@ -5,6 +5,7 @@ import common from trezorlib import messages_pb2 as proto class TestMsgApplysettings(common.TrezorTest): + def test_apply_settings(self): self.setup_mnemonic_pin_passphrase() self.assertEqual(self.client.features.label, 'test') @@ -31,5 +32,37 @@ class TestMsgApplysettings(common.TrezorTest): self.assertEqual(self.client.features.language, 'english') + def test_apply_settings_passphrase(self): + self.setup_mnemonic_pin_nopassphrase() + + self.assertEqual(self.client.features.passphrase_protection, False) + + with self.client: + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.Success(), + proto.Features()]) + self.client.apply_settings(use_passphrase=True) + + self.assertEqual(self.client.features.passphrase_protection, True) + + with self.client: + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.Success(), + proto.Features()]) + self.client.apply_settings(use_passphrase=False) + + self.assertEqual(self.client.features.passphrase_protection, False) + + with self.client: + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.Success(), + proto.Features()]) + self.client.apply_settings(use_passphrase=True) + + self.assertEqual(self.client.features.passphrase_protection, True) + if __name__ == '__main__': unittest.main() diff --git a/trezorlib/client.py b/trezorlib/client.py index 37aa264aa..2d62db6a1 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -414,12 +414,14 @@ class ProtocolMixin(object): @field('message') @expect(proto.Success) - def apply_settings(self, label=None, language=None): + def apply_settings(self, label=None, language=None, use_passphrase=None): settings = proto.ApplySettings() if label != None: settings.label = label if language: settings.language = language + if use_passphrase != None: + settings.use_passphrase = use_passphrase out = self.call(settings) self.init_device() # Reload Features From bc07b044b05baa5a4306a7dcb068cecd6c843eef Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 13 Dec 2014 19:07:56 +0100 Subject: [PATCH 0403/1535] update pb --- tests/test_msg_applysettings.py | 2 - trezorlib/messages_pb2.py | 203 +++++++++++++++++--------------- 2 files changed, 105 insertions(+), 100 deletions(-) diff --git a/tests/test_msg_applysettings.py b/tests/test_msg_applysettings.py index 6bb9bc8c5..42805ee45 100644 --- a/tests/test_msg_applysettings.py +++ b/tests/test_msg_applysettings.py @@ -48,7 +48,6 @@ class TestMsgApplysettings(common.TrezorTest): with self.client: self.client.set_expected_responses([proto.ButtonRequest(), - proto.PinMatrixRequest(), proto.Success(), proto.Features()]) self.client.apply_settings(use_passphrase=False) @@ -57,7 +56,6 @@ class TestMsgApplysettings(common.TrezorTest): with self.client: self.client.set_expected_responses([proto.ButtonRequest(), - proto.PinMatrixRequest(), proto.Success(), proto.Features()]) self.client.apply_settings(use_passphrase=True) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 2654903bb..5f47a6967 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"0\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"~\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\x12+\n\x08multisig\x18\x04 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"@\n\x10\x45ncryptedMessage\x12\r\n\x05nonce\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0c\n\x04hmac\x18\x03 \x01(\x0c\"Q\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\r\n\x05nonce\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0c\n\x04hmac\x18\x04 \x01(\x0c\"4\n\x10\x44\x65\x63ryptedMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"!\n\x10\x43ipheredKeyValue\x12\r\n\x05value\x18\x01 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x99\x0e\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_CipheredKeyValue\x10\x30\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_EncryptedMessage\x10\x32\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x33\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_DecryptedMessage\x10\x34\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"H\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x16\n\x0euse_passphrase\x18\x03 \x01(\x08\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"~\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\x12+\n\x08multisig\x18\x04 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"@\n\x10\x45ncryptedMessage\x12\r\n\x05nonce\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0c\n\x04hmac\x18\x03 \x01(\x0c\"Q\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\r\n\x05nonce\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0c\n\x04hmac\x18\x04 \x01(\x0c\"4\n\x10\x44\x65\x63ryptedMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"!\n\x10\x43ipheredKeyValue\x12\r\n\x05value\x18\x01 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x99\x0e\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_CipheredKeyValue\x10\x30\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_EncryptedMessage\x10\x32\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x33\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_DecryptedMessage\x10\x34\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -230,8 +230,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3440, - serialized_end=5257, + serialized_start=3464, + serialized_end=5281, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -478,6 +478,13 @@ _APPLYSETTINGS = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='use_passphrase', full_name='ApplySettings.use_passphrase', index=2, + number=3, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -488,7 +495,7 @@ _APPLYSETTINGS = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=399, - serialized_end=447, + serialized_end=471, ) @@ -515,8 +522,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=449, - serialized_end=476, + serialized_start=473, + serialized_end=500, ) @@ -564,8 +571,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=478, - serialized_end=583, + serialized_start=502, + serialized_end=607, ) @@ -592,8 +599,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=585, - serialized_end=611, + serialized_start=609, + serialized_end=635, ) @@ -627,8 +634,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=613, - serialized_end=667, + serialized_start=637, + serialized_end=691, ) @@ -662,8 +669,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=669, - serialized_end=732, + serialized_start=693, + serialized_end=756, ) @@ -683,8 +690,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=734, - serialized_end=745, + serialized_start=758, + serialized_end=769, ) @@ -711,8 +718,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=747, - serialized_end=802, + serialized_start=771, + serialized_end=826, ) @@ -739,8 +746,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=804, - serialized_end=831, + serialized_start=828, + serialized_end=855, ) @@ -760,8 +767,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=833, - serialized_end=841, + serialized_start=857, + serialized_end=865, ) @@ -781,8 +788,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=843, - serialized_end=862, + serialized_start=867, + serialized_end=886, ) @@ -809,8 +816,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=864, - serialized_end=899, + serialized_start=888, + serialized_end=923, ) @@ -837,8 +844,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=901, - serialized_end=927, + serialized_start=925, + serialized_end=951, ) @@ -865,8 +872,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=929, - serialized_end=955, + serialized_start=953, + serialized_end=979, ) @@ -893,8 +900,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=957, - serialized_end=990, + serialized_start=981, + serialized_end=1014, ) @@ -928,8 +935,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=992, - serialized_end=1044, + serialized_start=1016, + serialized_end=1068, ) @@ -977,8 +984,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1046, - serialized_end=1172, + serialized_start=1070, + serialized_end=1196, ) @@ -1005,8 +1012,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1174, - serialized_end=1200, + serialized_start=1198, + serialized_end=1224, ) @@ -1026,8 +1033,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1202, - serialized_end=1214, + serialized_start=1226, + serialized_end=1238, ) @@ -1096,8 +1103,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1217, - serialized_end=1383, + serialized_start=1241, + serialized_end=1407, ) @@ -1159,8 +1166,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1386, - serialized_end=1543, + serialized_start=1410, + serialized_end=1567, ) @@ -1180,8 +1187,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1545, - serialized_end=1561, + serialized_start=1569, + serialized_end=1585, ) @@ -1208,8 +1215,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1563, - serialized_end=1592, + serialized_start=1587, + serialized_end=1616, ) @@ -1271,8 +1278,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1595, - serialized_end=1754, + serialized_start=1619, + serialized_end=1778, ) @@ -1292,8 +1299,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1756, - serialized_end=1769, + serialized_start=1780, + serialized_end=1793, ) @@ -1320,8 +1327,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1771, - serialized_end=1794, + serialized_start=1795, + serialized_end=1818, ) @@ -1362,8 +1369,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1796, - serialized_end=1873, + serialized_start=1820, + serialized_end=1897, ) @@ -1404,8 +1411,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1875, - serialized_end=1943, + serialized_start=1899, + serialized_end=1967, ) @@ -1439,8 +1446,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1945, - serialized_end=1999, + serialized_start=1969, + serialized_end=2023, ) @@ -1495,8 +1502,8 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2001, - serialized_end=2119, + serialized_start=2025, + serialized_end=2143, ) @@ -1537,8 +1544,8 @@ _ENCRYPTEDMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2121, - serialized_end=2185, + serialized_start=2145, + serialized_end=2209, ) @@ -1586,8 +1593,8 @@ _DECRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2187, - serialized_end=2268, + serialized_start=2211, + serialized_end=2292, ) @@ -1621,8 +1628,8 @@ _DECRYPTEDMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2270, - serialized_end=2322, + serialized_start=2294, + serialized_end=2346, ) @@ -1684,8 +1691,8 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2325, - serialized_end=2453, + serialized_start=2349, + serialized_end=2477, ) @@ -1712,8 +1719,8 @@ _CIPHEREDKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2455, - serialized_end=2488, + serialized_start=2479, + serialized_end=2512, ) @@ -1754,8 +1761,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2490, - serialized_end=2579, + serialized_start=2514, + serialized_end=2603, ) @@ -1782,8 +1789,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2581, - serialized_end=2606, + serialized_start=2605, + serialized_end=2630, ) @@ -1824,8 +1831,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2608, - serialized_end=2689, + serialized_start=2632, + serialized_end=2713, ) @@ -1873,8 +1880,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2692, - serialized_end=2836, + serialized_start=2716, + serialized_end=2860, ) @@ -1915,8 +1922,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2839, - serialized_end=2972, + serialized_start=2863, + serialized_end=2996, ) @@ -1943,8 +1950,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2974, - serialized_end=3011, + serialized_start=2998, + serialized_end=3035, ) @@ -1964,8 +1971,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3013, - serialized_end=3028, + serialized_start=3037, + serialized_end=3052, ) @@ -1992,8 +1999,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3030, - serialized_end=3063, + serialized_start=3054, + serialized_end=3087, ) @@ -2020,8 +2027,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3065, - serialized_end=3100, + serialized_start=3089, + serialized_end=3124, ) @@ -2041,8 +2048,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3102, - serialized_end=3121, + serialized_start=3126, + serialized_end=3145, ) @@ -2132,8 +2139,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3124, - serialized_end=3359, + serialized_start=3148, + serialized_end=3383, ) @@ -2153,8 +2160,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3361, - serialized_end=3376, + serialized_start=3385, + serialized_end=3400, ) @@ -2195,8 +2202,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3378, - serialized_end=3437, + serialized_start=3402, + serialized_end=3461, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From eea4f8be5d07643982cc2d2b6fb36c541c4121ee Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 13 Dec 2014 19:28:33 +0100 Subject: [PATCH 0404/1535] fix ApplySettings test --- tests/test_msg_applysettings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_msg_applysettings.py b/tests/test_msg_applysettings.py index 42805ee45..ba63c82da 100644 --- a/tests/test_msg_applysettings.py +++ b/tests/test_msg_applysettings.py @@ -15,7 +15,7 @@ class TestMsgApplysettings(common.TrezorTest): proto.PinMatrixRequest(), proto.Success(), proto.Features()]) - self.client.apply_settings('new label', 'english') + self.client.apply_settings(label='new label') self.assertEqual(self.client.features.label, 'new label') @@ -28,7 +28,7 @@ class TestMsgApplysettings(common.TrezorTest): proto.PinMatrixRequest(), proto.Success(), proto.Features()]) - self.client.apply_settings('new label', 'nonexistent') + self.client.apply_settings(language='nonexistent') self.assertEqual(self.client.features.language, 'english') From 77b6b5873d06573b0a72a88ac093e478b6fe2a48 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 15 Dec 2014 14:37:14 +0100 Subject: [PATCH 0405/1535] Compiled pb --- trezorlib/types_pb2.py | 90 +++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 41 deletions(-) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index ff59765aa..2a6818139 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\"<\n\x0cHDPubkeyType\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x11\n\taddress_n\x18\x02 \x03(\r\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"Y\n\x18MultisigRedeemScriptType\x12\x1e\n\x07pubkeys\x18\x01 \x03(\x0b\x32\r.HDPubkeyType\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\t\n\x01m\x18\x03 \x01(\r\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"j\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*9\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\">\n\x0eHDNodePathType\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x11\n\taddress_n\x18\x02 \x03(\r\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"[\n\x18MultisigRedeemScriptType\x12 \n\x07pubkeys\x18\x01 \x03(\x0b\x32\x0f.HDNodePathType\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\t\n\x01m\x18\x03 \x01(\r\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x97\x01\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\x12+\n\x08multisig\x18\x05 \x03(\x0b\x32\x19.MultisigRedeemScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*9\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,8 +74,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1173, - serialized_end=1506, + serialized_start=1223, + serialized_end=1556, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -96,8 +96,8 @@ _OUTPUTSCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1508, - serialized_end=1565, + serialized_start=1558, + serialized_end=1615, ) OutputScriptType = enum_type_wrapper.EnumTypeWrapper(_OUTPUTSCRIPTTYPE) @@ -118,8 +118,8 @@ _INPUTSCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1567, - serialized_end=1621, + serialized_start=1617, + serialized_end=1671, ) InputScriptType = enum_type_wrapper.EnumTypeWrapper(_INPUTSCRIPTTYPE) @@ -148,8 +148,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1623, - serialized_end=1691, + serialized_start=1673, + serialized_end=1741, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -202,8 +202,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1694, - serialized_end=2016, + serialized_start=1744, + serialized_end=2066, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -228,8 +228,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2018, - serialized_end=2145, + serialized_start=2068, + serialized_end=2195, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -364,22 +364,22 @@ _HDNODETYPE = _descriptor.Descriptor( ) -_HDPUBKEYTYPE = _descriptor.Descriptor( - name='HDPubkeyType', - full_name='HDPubkeyType', +_HDNODEPATHTYPE = _descriptor.Descriptor( + name='HDNodePathType', + full_name='HDNodePathType', filename=None, file=DESCRIPTOR, containing_type=None, fields=[ _descriptor.FieldDescriptor( - name='node', full_name='HDPubkeyType.node', index=0, + name='node', full_name='HDNodePathType.node', index=0, number=1, type=11, cpp_type=10, label=2, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), _descriptor.FieldDescriptor( - name='address_n', full_name='HDPubkeyType.address_n', index=1, + name='address_n', full_name='HDNodePathType.address_n', index=1, number=2, type=13, cpp_type=3, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, @@ -395,7 +395,7 @@ _HDPUBKEYTYPE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=180, - serialized_end=240, + serialized_end=242, ) @@ -443,8 +443,8 @@ _COINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=242, - serialized_end=335, + serialized_start=244, + serialized_end=337, ) @@ -485,8 +485,8 @@ _MULTISIGREDEEMSCRIPTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=337, - serialized_end=426, + serialized_start=339, + serialized_end=430, ) @@ -555,8 +555,8 @@ _TXINPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=429, - serialized_end=648, + serialized_start=433, + serialized_end=652, ) @@ -595,6 +595,13 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='multisig', full_name='TxOutputType.multisig', index=4, + number=5, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -604,8 +611,8 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=650, - serialized_end=756, + serialized_start=655, + serialized_end=806, ) @@ -639,8 +646,8 @@ _TXOUTPUTBINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=758, - serialized_end=814, + serialized_start=808, + serialized_end=864, ) @@ -709,8 +716,8 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=817, - serialized_end=1012, + serialized_start=867, + serialized_end=1062, ) @@ -744,8 +751,8 @@ _TXREQUESTDETAILSTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1014, - serialized_end=1076, + serialized_start=1064, + serialized_end=1126, ) @@ -786,20 +793,21 @@ _TXREQUESTSERIALIZEDTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1078, - serialized_end=1170, + serialized_start=1128, + serialized_end=1220, ) -_HDPUBKEYTYPE.fields_by_name['node'].message_type = _HDNODETYPE -_MULTISIGREDEEMSCRIPTTYPE.fields_by_name['pubkeys'].message_type = _HDPUBKEYTYPE +_HDNODEPATHTYPE.fields_by_name['node'].message_type = _HDNODETYPE +_MULTISIGREDEEMSCRIPTTYPE.fields_by_name['pubkeys'].message_type = _HDNODEPATHTYPE _TXINPUTTYPE.fields_by_name['script_type'].enum_type = _INPUTSCRIPTTYPE _TXINPUTTYPE.fields_by_name['multisig'].message_type = _MULTISIGREDEEMSCRIPTTYPE _TXOUTPUTTYPE.fields_by_name['script_type'].enum_type = _OUTPUTSCRIPTTYPE +_TXOUTPUTTYPE.fields_by_name['multisig'].message_type = _MULTISIGREDEEMSCRIPTTYPE _TRANSACTIONTYPE.fields_by_name['inputs'].message_type = _TXINPUTTYPE _TRANSACTIONTYPE.fields_by_name['bin_outputs'].message_type = _TXOUTPUTBINTYPE _TRANSACTIONTYPE.fields_by_name['outputs'].message_type = _TXOUTPUTTYPE DESCRIPTOR.message_types_by_name['HDNodeType'] = _HDNODETYPE -DESCRIPTOR.message_types_by_name['HDPubkeyType'] = _HDPUBKEYTYPE +DESCRIPTOR.message_types_by_name['HDNodePathType'] = _HDNODEPATHTYPE DESCRIPTOR.message_types_by_name['CoinType'] = _COINTYPE DESCRIPTOR.message_types_by_name['MultisigRedeemScriptType'] = _MULTISIGREDEEMSCRIPTTYPE DESCRIPTOR.message_types_by_name['TxInputType'] = _TXINPUTTYPE @@ -815,11 +823,11 @@ class HDNodeType(_message.Message): # @@protoc_insertion_point(class_scope:HDNodeType) -class HDPubkeyType(_message.Message): +class HDNodePathType(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType - DESCRIPTOR = _HDPUBKEYTYPE + DESCRIPTOR = _HDNODEPATHTYPE - # @@protoc_insertion_point(class_scope:HDPubkeyType) + # @@protoc_insertion_point(class_scope:HDNodePathType) class CoinType(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType From 2b664a6b4d455b658b05d646ee04482e647978b8 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 15 Dec 2014 14:37:19 +0100 Subject: [PATCH 0406/1535] Renamed HDPubkeyType to HDNodePathType --- tests/test_msg_getaddress_show.py | 8 ++++---- tests/test_multisig.py | 26 +++++++++++++------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/tests/test_msg_getaddress_show.py b/tests/test_msg_getaddress_show.py index 04279c23f..7110a5981 100644 --- a/tests/test_msg_getaddress_show.py +++ b/tests/test_msg_getaddress_show.py @@ -17,9 +17,9 @@ class TestMsgGetaddress(common.TrezorTest): node = bip32.deserialize('xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') multisig = proto_types.MultisigRedeemScriptType( - pubkeys=[proto_types.HDPubkeyType(node=node, address_n=[1]), - proto_types.HDPubkeyType(node=node, address_n=[2]), - proto_types.HDPubkeyType(node=node, address_n=[3])], + pubkeys=[proto_types.HDNodePathType(node=node, address_n=[1]), + proto_types.HDNodePathType(node=node, address_n=[2]), + proto_types.HDNodePathType(node=node, address_n=[3])], signatures=['', '', ''], m=2, ) @@ -34,7 +34,7 @@ class TestMsgGetaddress(common.TrezorTest): pubs = [] for x in range(15): - pubs.append(proto_types.HDPubkeyType(node=node, address_n=[x])) + pubs.append(proto_types.HDNodePathType(node=node, address_n=[x])) multisig = proto_types.MultisigRedeemScriptType( diff --git a/tests/test_multisig.py b/tests/test_multisig.py index 2f4e8dd5a..56c8a5a18 100644 --- a/tests/test_multisig.py +++ b/tests/test_multisig.py @@ -43,9 +43,9 @@ class TestMultisig(common.TrezorTest): node = ckd_public.deserialize('xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') multisig = proto_types.MultisigRedeemScriptType( - pubkeys=[proto_types.HDPubkeyType(node=node, address_n=[1]), - proto_types.HDPubkeyType(node=node, address_n=[2]), - proto_types.HDPubkeyType(node=node, address_n=[3])], + pubkeys=[proto_types.HDNodePathType(node=node, address_n=[1]), + proto_types.HDNodePathType(node=node, address_n=[2]), + proto_types.HDNodePathType(node=node, address_n=[3])], signatures=['', '', ''], m=2, ) @@ -86,9 +86,9 @@ class TestMultisig(common.TrezorTest): # Let's do second signature using 3rd key multisig = proto_types.MultisigRedeemScriptType( - pubkeys=[proto_types.HDPubkeyType(node=node, address_n=[1]), - proto_types.HDPubkeyType(node=node, address_n=[2]), - proto_types.HDPubkeyType(node=node, address_n=[3])], + pubkeys=[proto_types.HDNodePathType(node=node, address_n=[1]), + proto_types.HDNodePathType(node=node, address_n=[2]), + proto_types.HDNodePathType(node=node, address_n=[3])], signatures=[signatures1[0], '', ''], # Fill signature from previous signing process m=2, ) @@ -137,9 +137,9 @@ class TestMultisig(common.TrezorTest): node = ckd_public.deserialize('xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') multisig = proto_types.MultisigRedeemScriptType( - pubkeys=[proto_types.HDPubkeyType(node=node, address_n=[1]), - proto_types.HDPubkeyType(node=node, address_n=[2]), - proto_types.HDPubkeyType(node=node, address_n=[3])], + pubkeys=[proto_types.HDNodePathType(node=node, address_n=[1]), + proto_types.HDNodePathType(node=node, address_n=[2]), + proto_types.HDNodePathType(node=node, address_n=[3])], signatures=['', '', ''], m=2, ) @@ -147,7 +147,7 @@ class TestMultisig(common.TrezorTest): pubs = [] for x in range(15): - pubs.append(proto_types.HDPubkeyType(node=node, address_n=[x])) + pubs.append(proto_types.HDNodePathType(node=node, address_n=[x])) # redeeemscript # 5f21023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43d210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a621038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e32103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a79022103fe91eca10602d7dad4c9dab2b2a0858f71e25a219a6940749ce7a48118480dae210234716c01c2dd03fa7ee302705e2b8fbd1311895d94b1dca15e62eedea9b0968f210341fb2ead334952cf60f4481ba435c4693d0be649be01d2cfe9b02018e483e7bd2102dad8b2bce360a705c16e74a50a36459b4f8f4b78f9cd67def29d54ef6f7c7cf9210222dbe3f5f197a34a1d50e2cbe2a1085cac2d605c9e176f9a240e0fd0c669330d2103fb41afab56c9cdb013fda63d777d4938ddc3cb2ad939712da688e3ed333f95982102435f177646bdc717cb3211bf46656ca7e8d642726144778c9ce816b8b8c36ccf2102158d8e20095364031d923c7e9f7f08a14b1be1ddee21fe1a5431168e31345e5521026259794892428ca0818c8fb61d2d459ddfe20e57f50803c7295e6f4e2f5586652102815f910a8689151db627e6e262e0a2075ad5ec2993a6bc1b876a9d420923d681210318f54647f645ff01bd49fedc0219343a6a22d3ea3180a3c3d3097e4b888a8db45fae @@ -203,9 +203,9 @@ class TestMultisig(common.TrezorTest): node = ckd_public.deserialize('xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') multisig = proto_types.MultisigRedeemScriptType( - pubkeys=[proto_types.HDPubkeyType(node=node, address_n=[1]), - proto_types.HDPubkeyType(node=node, address_n=[2]), - proto_types.HDPubkeyType(node=node, address_n=[3])], + pubkeys=[proto_types.HDNodePathType(node=node, address_n=[1]), + proto_types.HDNodePathType(node=node, address_n=[2]), + proto_types.HDNodePathType(node=node, address_n=[3])], signatures=['', '', ''], m=2, ) From fdba11adeb92a39ff4825ccfda848bf8e2b964f2 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 15 Dec 2014 14:58:16 +0100 Subject: [PATCH 0407/1535] update pb --- trezorlib/types_pb2.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 2a6818139..48f474541 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\">\n\x0eHDNodePathType\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x11\n\taddress_n\x18\x02 \x03(\r\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"[\n\x18MultisigRedeemScriptType\x12 \n\x07pubkeys\x18\x01 \x03(\x0b\x32\x0f.HDNodePathType\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\t\n\x01m\x18\x03 \x01(\r\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x97\x01\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\x12+\n\x08multisig\x18\x05 \x03(\x0b\x32\x19.MultisigRedeemScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*9\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\">\n\x0eHDNodePathType\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x11\n\taddress_n\x18\x02 \x03(\r\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"[\n\x18MultisigRedeemScriptType\x12 \n\x07pubkeys\x18\x01 \x03(\x0b\x32\x0f.HDNodePathType\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\t\n\x01m\x18\x03 \x01(\r\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x97\x01\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\x12+\n\x08multisig\x18\x05 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*L\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01\x12\x11\n\rPAYTOMULTISIG\x10\x02*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -93,11 +93,15 @@ _OUTPUTSCRIPTTYPE = _descriptor.EnumDescriptor( name='PAYTOSCRIPTHASH', index=1, number=1, options=None, type=None), + _descriptor.EnumValueDescriptor( + name='PAYTOMULTISIG', index=2, number=2, + options=None, + type=None), ], containing_type=None, options=None, serialized_start=1558, - serialized_end=1615, + serialized_end=1634, ) OutputScriptType = enum_type_wrapper.EnumTypeWrapper(_OUTPUTSCRIPTTYPE) @@ -118,8 +122,8 @@ _INPUTSCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1617, - serialized_end=1671, + serialized_start=1636, + serialized_end=1690, ) InputScriptType = enum_type_wrapper.EnumTypeWrapper(_INPUTSCRIPTTYPE) @@ -148,8 +152,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1673, - serialized_end=1741, + serialized_start=1692, + serialized_end=1760, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -202,8 +206,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1744, - serialized_end=2066, + serialized_start=1763, + serialized_end=2085, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -228,8 +232,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2068, - serialized_end=2195, + serialized_start=2087, + serialized_end=2214, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -247,6 +251,7 @@ Failure_NotInitialized = 11 Failure_FirmwareError = 99 PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 +PAYTOMULTISIG = 2 SPENDADDRESS = 0 SPENDMULTISIG = 1 TXINPUT = 0 @@ -597,8 +602,8 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( options=None), _descriptor.FieldDescriptor( name='multisig', full_name='TxOutputType.multisig', index=4, - number=5, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), From a51a530dbc9f77865e26e25d6f27e683ecf19ccf Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 20 Dec 2014 01:18:28 +0100 Subject: [PATCH 0408/1535] cleanup multisig test --- tests/test_msg_getaddress_show.py | 1 - tests/test_multisig.py | 14 ++------------ 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/tests/test_msg_getaddress_show.py b/tests/test_msg_getaddress_show.py index 7110a5981..c3ac1c974 100644 --- a/tests/test_msg_getaddress_show.py +++ b/tests/test_msg_getaddress_show.py @@ -36,7 +36,6 @@ class TestMsgGetaddress(common.TrezorTest): for x in range(15): pubs.append(proto_types.HDNodePathType(node=node, address_n=[x])) - multisig = proto_types.MultisigRedeemScriptType( pubkeys=pubs, signatures=[''] * 15, diff --git a/tests/test_multisig.py b/tests/test_multisig.py index 56c8a5a18..3f68880b0 100644 --- a/tests/test_multisig.py +++ b/tests/test_multisig.py @@ -119,7 +119,7 @@ class TestMultisig(common.TrezorTest): self.assertEqual(binascii.hexlify(signatures2[0]), '3045022100f5428fe0531b3095675b40d87cab607ee036fac823b22e8dcec35b65aff6e52b022032129b4577ff923d321a1c70db5a6cec5bcc142cb2c51901af8b989cced23e0d') - # Accepted by network: tx 8382a2b2e3ec8788800c1d46d285dfa9dd4051edddd75982fad166b9273e5ac6 + # Accepted by network: tx 8382a2b2e3ec8788800c1d46d285dfa9dd4051edddd75982fad166b9273e5ac6 self.assertEqual(binascii.hexlify(serialized_tx), '010000000152ba4dfcde9c4bed88f55479cdea03e711ae586e9a89352a98230c4cdf1a09c601000000fdfe0000483045022100985cc1ba316d140eb4b2d4028d8cd1c451f87bff8ff679858732e516ad04cd3402207af6edda99972af0baa7702a3b7448517c8242e7bca669f6861771cdd16ee05801483045022100f5428fe0531b3095675b40d87cab607ee036fac823b22e8dcec35b65aff6e52b022032129b4577ff923d321a1c70db5a6cec5bcc142cb2c51901af8b989cced23e0d014c6952210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a621038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e32103477b9f0f34ae85434ce795f0c5e1e90c9420e5b5fad084d7cce9a487b94a790253aeffffffff01a0860100000000001976a91412e8391ad256dcdc023365978418d658dfecba1c88ac00000000') def test_15_of_15(self): @@ -136,15 +136,6 @@ class TestMultisig(common.TrezorTest): # xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy node = ckd_public.deserialize('xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') - multisig = proto_types.MultisigRedeemScriptType( - pubkeys=[proto_types.HDNodePathType(node=node, address_n=[1]), - proto_types.HDNodePathType(node=node, address_n=[2]), - proto_types.HDNodePathType(node=node, address_n=[3])], - signatures=['', '', ''], - m=2, - ) - - pubs = [] for x in range(15): pubs.append(proto_types.HDNodePathType(node=node, address_n=[x])) @@ -168,7 +159,6 @@ class TestMultisig(common.TrezorTest): m=15, ) - inp1 = proto_types.TxInputType(address_n=[x], prev_hash=binascii.unhexlify('6189e3febb5a21cee8b725aa1ef04ffce7e609448446d3a8d6f483c634ef5315'), prev_index=1, @@ -217,7 +207,7 @@ class TestMultisig(common.TrezorTest): script_type=proto_types.SPENDMULTISIG, multisig=multisig, ) - + out1 = proto_types.TxOutputType(address='12iyMbUb4R2K3gre4dHSrbu5azG5KaqVss', amount=100000, script_type=proto_types.PAYTOADDRESS) From 399deeee677416a74238631cef8146170f4ac65a Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 20 Dec 2014 18:23:03 +0100 Subject: [PATCH 0409/1535] add tests for multisig tx change confirmation --- tests/test_multisig.py | 1 - tests/test_multisig_change.py | 353 ++++++++++++++++++++++++++++++++++ trezorlib/tx_api.py | 5 +- 3 files changed, 357 insertions(+), 2 deletions(-) create mode 100644 tests/test_multisig_change.py diff --git a/tests/test_multisig.py b/tests/test_multisig.py index 3f68880b0..04f646f22 100644 --- a/tests/test_multisig.py +++ b/tests/test_multisig.py @@ -7,7 +7,6 @@ import trezorlib.messages_pb2 as proto import trezorlib.ckd_public as ckd_public import trezorlib.types_pb2 as proto_types from trezorlib.client import CallException -from trezorlib.tx_api import TXAPITestnet, TXAPIBitcoin # Multisig howto: # diff --git a/tests/test_multisig_change.py b/tests/test_multisig_change.py new file mode 100644 index 000000000..6e4b2de7a --- /dev/null +++ b/tests/test_multisig_change.py @@ -0,0 +1,353 @@ +import unittest +import common +import binascii +import itertools + +import trezorlib.messages_pb2 as proto +import trezorlib.ckd_public as ckd_public +import trezorlib.types_pb2 as proto_types +from trezorlib.client import CallException + +class TestMultisigChange(common.TrezorTest): + + node_ext1 = ckd_public.deserialize('xpub6E2LkiC2h7icfcjXPFDmwufDRaaTjTRYcS2nD7eGQeFx1WwZxxvCya5GefiJND6ddJnAjzzMusLcCnu6WyhZPrF6e5G71MWjNJVfs6u9csg') + # m/1 => 02c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e + + node_ext2 = ckd_public.deserialize('xpub6FKKCwdfD85eHmKn7d3mmbhqsHnGkB2n7Hmre29gbnR1cR4U1wrtf2akh1VVqjcTdfkxmwPjQyYPhLLgwBijfFPAYqTZzcjj4awB1BMUxq2') + # m/1 => 0388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1 + + node_ext3 = ckd_public.deserialize('xpub69rsKg2fef3GzETrukhsR3U9i4nL3dXKy3cjSpm44Cg8waqrnyupanaLQt4bYjn2HTmH1NusFt9DAh6absMQqE4E66q7EYTyEsorZKXdWWx') + # m/1 => 02e0c21e2a7cf00b94c5421725acff97f9826598b91f2340c5ddda730caca7d648 + + node_int = ckd_public.deserialize('xpub661MyMwAqRbcF1zGijBb2K6x9YiJPh58xpcCeLvTxMX6spkY3PcpJ4ABcCyWfskq5DDxM3e6Ez5ePCqG5bnPUXR4wL8TZWyoDaUdiWW7bKy') + # m/1 => 0338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6 + + # ext1 + ext2 + int + # redeemscript (2 of 3): 522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653ae + # multisig address: 3Gj7y1FdTppx2JEDqYqAEZFnKCA4GRysKF + # tx: d1d08ea63255af4ad16b098e9885a252632086fa6be53301521d05253ce8a73d + # input 0: 0.001 BTC + + # ext1 + int + ext2 + # redeemscript (2 of 3): 522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153ae + # multisig address: 3QsvfB6d1LzYcpm8xyhS1N1HBRrzHTgLHB + # tx: a6e2829d089cee47e481b1a753a53081b40738cc87e38f1d9b23ab57d9ad4396 + # input 0: 0.001 BTC + + # ext1 + ext3 + int + # redeemscript (2 of 3): 522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e2102e0c21e2a7cf00b94c5421725acff97f9826598b91f2340c5ddda730caca7d648210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653ae + # multisig address: 37LvC1Q5CyKbMbKMncEJdXxqGhHxrBEgPE + # tx: e4bc1ae5e5007a08f2b3926fe11c66612e8f73c6b00c69c7027213b84d259be3 + # input 1: 0.001 BTC + + multisig_in1 = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDNodePathType(node=node_ext1, address_n=[1]), + proto_types.HDNodePathType(node=node_ext2, address_n=[1]), + proto_types.HDNodePathType(node=node_int, address_n=[1])], + signatures=['', '', ''], + m=2, + ) + + multisig_in2 = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDNodePathType(node=node_ext1, address_n=[1]), + proto_types.HDNodePathType(node=node_int, address_n=[1]), + proto_types.HDNodePathType(node=node_ext2, address_n=[1])], + signatures=['', '', ''], + m=2, + ) + + multisig_in3 = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDNodePathType(node=node_ext1, address_n=[1]), + proto_types.HDNodePathType(node=node_ext3, address_n=[1]), + proto_types.HDNodePathType(node=node_int, address_n=[1])], + signatures=['', '', ''], + m=2, + ) + + + inp1 = proto_types.TxInputType(address_n=[1], + prev_hash=binascii.unhexlify('d1d08ea63255af4ad16b098e9885a252632086fa6be53301521d05253ce8a73d'), + prev_index=0, + script_type=proto_types.SPENDMULTISIG, + multisig=multisig_in1, + ) + + inp2 = proto_types.TxInputType(address_n=[1], + prev_hash=binascii.unhexlify('a6e2829d089cee47e481b1a753a53081b40738cc87e38f1d9b23ab57d9ad4396'), + prev_index=0, + script_type=proto_types.SPENDMULTISIG, + multisig=multisig_in2, + ) + + inp3 = proto_types.TxInputType(address_n=[1], + prev_hash=binascii.unhexlify('e4bc1ae5e5007a08f2b3926fe11c66612e8f73c6b00c69c7027213b84d259be3'), + prev_index=1, + script_type=proto_types.SPENDMULTISIG, + multisig=multisig_in3, + ) + + def _responses(self, inp1, inp2, change=0): + resp = [ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=inp1.prev_hash)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + ] + if change != 1: + resp.append( + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput) + ) + resp.append( + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)) + ) + if change != 2: + resp.append( + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput) + ) + resp += [ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=inp2.prev_hash)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=inp2.prev_hash)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=inp2.prev_hash)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=inp2.prev_hash)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ] + return resp + + # both outputs are external + def test_external_external(self): + self.setup_mnemonic_nopin_nopassphrase() + + out1 = proto_types.TxOutputType(address='12iyMbUb4R2K3gre4dHSrbu5azG5KaqVss', + amount=100000, + script_type=proto_types.PAYTOADDRESS) + + out2 = proto_types.TxOutputType(address='17kTB7qSk3MupQxWdiv5ZU3zcrZc2Azes1', + amount=100000, + script_type=proto_types.PAYTOADDRESS) + + with self.client: + self.client.set_expected_responses(self._responses(self.inp1, self.inp2)) + (_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ]) + + self.assertEqual(binascii.hexlify(serialized_tx), '01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b500483045022100c4116c9a584083021dacb690d4d4938027cc3f2085dc15157162b589f2a0b52f02200bdec59f76376255afc7b76f759106f6f00edf0134db2a0ae5d28000ea517fd2014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b400473044022044e77c67a5a78c8eb4f304cf23972a7763cce6f7dc3587d6e77e2aa05212ea6402200be874d39c32ad2475d03342cb0b164ec618297231c519186e3d0efde7a3374d014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a0860100000000001976a91412e8391ad256dcdc023365978418d658dfecba1c88aca0860100000000001976a9144a087d89f8ad16ca029c675b037c02fd1c5f9aec88ac00000000') + + # first external, second internal + def test_external_internal(self): + self.setup_mnemonic_nopin_nopassphrase() + + out1 = proto_types.TxOutputType(address='12iyMbUb4R2K3gre4dHSrbu5azG5KaqVss', + amount=100000, + script_type=proto_types.PAYTOADDRESS) + + out2 = proto_types.TxOutputType(address_n=[4], + amount=100000, + script_type=proto_types.PAYTOADDRESS) + + with self.client: + self.client.set_expected_responses(self._responses(self.inp1, self.inp2, change=2)) + (_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ]) + + self.assertEqual(binascii.hexlify(serialized_tx), '01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b5004830450221008f48ee3c6e69f8d2aeea9c482e3e80233fc83d78eb1ac7416362b25ae57d3eee02207f6b568f8f611efb17bd6bf8d0b32d334aa4110a2cc97a06f48aba4d045b7cd4014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b40047304402206c5f93cbedc06ac1bae846d850a27c56b0e6f75ef247d3d67a10bbe8ea9da90302203d64f4803c0cbe5703268d58a80d54a3ad72cb1b856f19a6c6c999aad011a5b9014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a0860100000000001976a91412e8391ad256dcdc023365978418d658dfecba1c88aca0860100000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088ac00000000') + + # first internal, second external + def test_internal_external(self): + self.setup_mnemonic_nopin_nopassphrase() + + out1 = proto_types.TxOutputType(address_n=[4], + amount=100000, + script_type=proto_types.PAYTOADDRESS) + + out2 = proto_types.TxOutputType(address='17kTB7qSk3MupQxWdiv5ZU3zcrZc2Azes1', + amount=100000, + script_type=proto_types.PAYTOADDRESS) + + with self.client: + self.client.set_expected_responses(self._responses(self.inp1, self.inp2, change=1)) + (_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ]) + + self.assertEqual(binascii.hexlify(serialized_tx), '01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b4004730440220740f305af9cd10f290b0d5dd27968d3c08f313d58e70feb260e076bd57d427bd02202c0296b38e82993983b971196589a2c74cdc4931a2da88aa2c2bd89e58a3fdb2014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b400473044022042f53a8cd53762fb95113d11f56f050dab9dead9a2026807c728d5c42ed62e9902202e708162a50ca16f5fac082c1a2a5350fcb74cbfce39968e76300a36457f45a7014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a0860100000000001976a914f0a2b64e56ee2ff57126232f84af6e3a41d4055088aca0860100000000001976a9144a087d89f8ad16ca029c675b037c02fd1c5f9aec88ac00000000') + + # both outputs are external + def test_multisig_external_external(self): + self.setup_mnemonic_nopin_nopassphrase() + + multisig_out1 = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDNodePathType(node=self.node_ext1, address_n=[1]), + proto_types.HDNodePathType(node=self.node_ext2, address_n=[1]), + proto_types.HDNodePathType(node=self.node_ext3, address_n=[1])], + signatures=['', '', ''], + m=2, + ) + + multisig_out2 = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDNodePathType(node=self.node_ext1, address_n=[2]), + proto_types.HDNodePathType(node=self.node_ext2, address_n=[2]), + proto_types.HDNodePathType(node=self.node_ext3, address_n=[2])], + signatures=['', '', ''], + m=2, + ) + + out1 = proto_types.TxOutputType(multisig=multisig_out1, + amount=100000, + script_type=proto_types.PAYTOMULTISIG) + + out2 = proto_types.TxOutputType(multisig=multisig_out2, + amount=100000, + script_type=proto_types.PAYTOMULTISIG) + + with self.client: + self.client.set_expected_responses(self._responses(self.inp1, self.inp2)) + (_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ]) + + self.assertEqual(binascii.hexlify(serialized_tx), '01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b500483045022100915e3761efb41895d40fa3bf8d3a68be7eb949e2411ec5655e231bbb334925ea02205814166b786a912f8f47315c9ede4955d2dfc70bb0b51230fccaaacf5a39a0ae014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b400473044022018ca5516ee127eeeb8c70f10c267dd803b599688eade659e3b210bbf1712fffe02206c1adb35e672e67ee102dc232456ac5edc86f58f83d698995981e68d2a2a4294014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a08601000000000017a9143bc72e27ec21644ace15b367ef7ba491f2507eb587a08601000000000017a9147615527d78854293edadf83682ea26937f8a51bb8700000000') + + # inputs match, change matches (first is change) + def test_multisig_change_match_first(self): + self.setup_mnemonic_nopin_nopassphrase() + + multisig_out1 = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDNodePathType(node=self.node_int, address_n=[1]), + proto_types.HDNodePathType(node=self.node_ext1, address_n=[1]), + proto_types.HDNodePathType(node=self.node_ext2, address_n=[1])], + signatures=['', '', ''], + m=2, + ) + + multisig_out2 = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDNodePathType(node=self.node_ext1, address_n=[2]), + proto_types.HDNodePathType(node=self.node_ext2, address_n=[2]), + proto_types.HDNodePathType(node=self.node_ext3, address_n=[2])], + signatures=['', '', ''], + m=2, + ) + + out1 = proto_types.TxOutputType(multisig=multisig_out1, + amount=100000, + script_type=proto_types.PAYTOMULTISIG) + + out2 = proto_types.TxOutputType(multisig=multisig_out2, + amount=100000, + script_type=proto_types.PAYTOMULTISIG) + + with self.client: + self.client.set_expected_responses(self._responses(self.inp1, self.inp2, change=1)) + (_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ]) + + self.assertEqual(binascii.hexlify(serialized_tx), '01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b40047304402203cb26eac850f590951b12b513a5369c0b301c6d3ae1cd251aa837ce35427bdec0220289834c8c5cb837351ae06498d77fa6707611c09d628864a1f0a7e1d381bddd8014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b40047304402207c2e39254d1e9cff42b523bcc0bf5ab66ae0c584deb2413759d9b269b1fe9e6f02205bc93a1884625b2359247c15a57e4e80b184b21a5f95e7f5ce846323236e30ac014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a08601000000000017a914b69a5c6a63c01a09a90eb690031963f737cf96ed87a08601000000000017a9147615527d78854293edadf83682ea26937f8a51bb8700000000') + + # inputs match, change matches (second is change) + def test_multisig_change_match_second(self): + self.setup_mnemonic_nopin_nopassphrase() + + multisig_out1 = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDNodePathType(node=self.node_ext1, address_n=[1]), + proto_types.HDNodePathType(node=self.node_ext1, address_n=[1]), + proto_types.HDNodePathType(node=self.node_ext2, address_n=[1])], + signatures=['', '', ''], + m=2, + ) + + multisig_out2 = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDNodePathType(node=self.node_int, address_n=[2]), + proto_types.HDNodePathType(node=self.node_ext1, address_n=[2]), + proto_types.HDNodePathType(node=self.node_ext2, address_n=[2])], + signatures=['', '', ''], + m=2, + ) + + out1 = proto_types.TxOutputType(multisig=multisig_out1, + amount=100000, + script_type=proto_types.PAYTOMULTISIG) + + out2 = proto_types.TxOutputType(multisig=multisig_out2, + amount=100000, + script_type=proto_types.PAYTOMULTISIG) + + with self.client: + self.client.set_expected_responses(self._responses(self.inp1, self.inp2, change=2)) + (_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ]) + + self.assertEqual(binascii.hexlify(serialized_tx), '01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b5004830450221008d5710ba7df3c32358a723c69458acc81a296646cad262217975ba00b24fdc6402201623a3e3778e6abad9025343cef6fad361a054463f928509324ee862a2e84e6a014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b400473044022014d07e6a67c14a81d1042be2990d4c4ac29d9a46ba051168a9ccc09e987d97e202203cfe6714cff04421a90d5a4507f875515a1357fc2df306a44617ae7f88c7fcd1014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a08601000000000017a9143fdb3ed6e85c87d77f263be3b0d0abc508fe4e3787a08601000000000017a914021809d0cb4a6fcf436e6b8cc743511b09d183218700000000') + + # inputs match, change mismatches (second is change) + def test_multisig_mismatch_change(self): + self.setup_mnemonic_nopin_nopassphrase() + + multisig_out1 = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDNodePathType(node=self.node_ext1, address_n=[1]), + proto_types.HDNodePathType(node=self.node_ext2, address_n=[1]), + proto_types.HDNodePathType(node=self.node_ext3, address_n=[1])], + signatures=['', '', ''], + m=2, + ) + + multisig_out2 = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDNodePathType(node=self.node_int, address_n=[2]), + proto_types.HDNodePathType(node=self.node_ext1, address_n=[2]), + proto_types.HDNodePathType(node=self.node_ext3, address_n=[2])], + signatures=['', '', ''], + m=2, + ) + + out1 = proto_types.TxOutputType(multisig=multisig_out1, + amount=100000, + script_type=proto_types.PAYTOMULTISIG) + + out2 = proto_types.TxOutputType(multisig=multisig_out2, + amount=100000, + script_type=proto_types.PAYTOMULTISIG) + + with self.client: + self.client.set_expected_responses(self._responses(self.inp1, self.inp2)) + (_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp2, ], [out1, out2, ]) + + self.assertEqual(binascii.hexlify(serialized_tx), '01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b40047304402202a6238e8c9955a3d01609cbdaafcf47b0a53b2eabe2e28cf942fe9e253457eba02207f67afb4c35a8d28603e71a0696d0c123c0ca2370d78076c692ca3036c0a2c35014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff9643add957ab239b1d8fe387cc3807b48130a553a7b181e447ee9c089d82e2a600000000b40047304402200e87ee683b27f3995a2f8c9e9b4b17e24399d43a4c69ce5402105b6b93ac63cf0220201ba91db1f4ca2768f9277c115e95c2297bbe40969dcf9d10d0836a75c8ac9c014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c153aeffffffff02a08601000000000017a9143bc72e27ec21644ace15b367ef7ba491f2507eb587a08601000000000017a9143f22da0a6d4a4341be319e48e7b51b5a113fda208700000000') + + # inputs mismatch, change matches with first input + def test_multisig_mismatch_inputs(self): + self.setup_mnemonic_nopin_nopassphrase() + + multisig_out1 = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDNodePathType(node=self.node_ext1, address_n=[1]), + proto_types.HDNodePathType(node=self.node_ext2, address_n=[1]), + proto_types.HDNodePathType(node=self.node_int, address_n=[1])], + signatures=['', '', ''], + m=2, + ) + + multisig_out2 = proto_types.MultisigRedeemScriptType( + pubkeys=[proto_types.HDNodePathType(node=self.node_ext1, address_n=[2]), + proto_types.HDNodePathType(node=self.node_ext2, address_n=[2]), + proto_types.HDNodePathType(node=self.node_ext3, address_n=[2])], + signatures=['', '', ''], + m=2, + ) + + out1 = proto_types.TxOutputType(multisig=multisig_out1, + amount=100000, + script_type=proto_types.PAYTOMULTISIG) + + out2 = proto_types.TxOutputType(multisig=multisig_out2, + amount=100000, + script_type=proto_types.PAYTOMULTISIG) + + with self.client: + self.client.set_expected_responses(self._responses(self.inp1, self.inp3)) + (_, serialized_tx) = self.client.sign_tx('Bitcoin', [self.inp1, self.inp3, ], [out1, out2, ]) + + self.assertEqual(binascii.hexlify(serialized_tx), '01000000023da7e83c25051d520133e56bfa86206352a285988e096bd14aaf5532a68ed0d100000000b40047304402204b7d6c7e9feef91209cbdf4deaf855696dc22a40e57bd3eafd5e00b0ee41d9de0220262c5a05d0b46ef98fddfef3831b3ebb6841ffbeb10666f8fb6f8d2e3023e30d014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e210388460dc439f4c8f5bcfc268c36e11b4375cad5c3535c336cfdf8c32c3afad5c1210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffffe39b254db8137202c7690cb0c6738f2e61661ce16f92b3f2087a00e5e51abce401000000b500483045022100bb2118da21c8a84f115b655f640f269a40be77ae2c0af9c5ffd8260a85dbfc7702202e7b5b6c05b8f50bd879dbee88828e80e85448d686b63a1a50e99d921923f6f5014c69522102c0d0c5fee952620757c6128dbf327c996cd72ed3358d15d6518a1186099bc15e2102e0c21e2a7cf00b94c5421725acff97f9826598b91f2340c5ddda730caca7d648210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a653aeffffffff02a08601000000000017a914a4efc33d43d7a8a0040182c76ab624ff862f50d287a08601000000000017a9147615527d78854293edadf83682ea26937f8a51bb8700000000') + +if __name__ == '__main__': + unittest.main() diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index 84389f09a..a35a08b19 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -52,7 +52,10 @@ def opcode_serialize(opcode): raise Exception('Unknown script opcode: %s' % opcode) def insight_tx(url): - f = urllib2.urlopen(url) + try: + f = urllib2.urlopen(url) + except: + raise Exception('URL error: %s' % url) data = json.load(f) t = proto_types.TransactionType() From 7f222e3c1eb72719b663dbc7def43eda25236bb8 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 23 Dec 2014 01:39:05 +0100 Subject: [PATCH 0410/1535] update pb --- trezorlib/types_pb2.py | 65 +++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 48f474541..ef9b0a34e 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\">\n\x0eHDNodePathType\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x11\n\taddress_n\x18\x02 \x03(\r\"]\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x14\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\"[\n\x18MultisigRedeemScriptType\x12 \n\x07pubkeys\x18\x01 \x03(\x0b\x32\x0f.HDNodePathType\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\t\n\x01m\x18\x03 \x01(\r\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x97\x01\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\x12+\n\x08multisig\x18\x05 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*L\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01\x12\x11\n\rPAYTOMULTISIG\x10\x02*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\">\n\x0eHDNodePathType\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x11\n\taddress_n\x18\x02 \x03(\r\"~\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x17\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r:\x01\x30\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x1c\n\x11\x61\x64\x64ress_type_p2sh\x18\x05 \x01(\r:\x01\x35\"[\n\x18MultisigRedeemScriptType\x12 \n\x07pubkeys\x18\x01 \x03(\x0b\x32\x0f.HDNodePathType\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\t\n\x01m\x18\x03 \x01(\r\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x97\x01\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\x12+\n\x08multisig\x18\x05 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*L\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01\x12\x11\n\rPAYTOMULTISIG\x10\x02*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,8 +74,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1223, - serialized_end=1556, + serialized_start=1256, + serialized_end=1589, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -100,8 +100,8 @@ _OUTPUTSCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1558, - serialized_end=1634, + serialized_start=1591, + serialized_end=1667, ) OutputScriptType = enum_type_wrapper.EnumTypeWrapper(_OUTPUTSCRIPTTYPE) @@ -122,8 +122,8 @@ _INPUTSCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1636, - serialized_end=1690, + serialized_start=1669, + serialized_end=1723, ) InputScriptType = enum_type_wrapper.EnumTypeWrapper(_INPUTSCRIPTTYPE) @@ -152,8 +152,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1692, - serialized_end=1760, + serialized_start=1725, + serialized_end=1793, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -206,8 +206,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1763, - serialized_end=2085, + serialized_start=1796, + serialized_end=2118, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -232,8 +232,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2087, - serialized_end=2214, + serialized_start=2120, + serialized_end=2247, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -428,7 +428,7 @@ _COINTYPE = _descriptor.Descriptor( _descriptor.FieldDescriptor( name='address_type', full_name='CoinType.address_type', index=2, number=3, type=13, cpp_type=3, label=1, - has_default_value=False, default_value=0, + has_default_value=True, default_value=0, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), @@ -439,6 +439,13 @@ _COINTYPE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='address_type_p2sh', full_name='CoinType.address_type_p2sh', index=4, + number=5, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=5, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -449,7 +456,7 @@ _COINTYPE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=244, - serialized_end=337, + serialized_end=370, ) @@ -490,8 +497,8 @@ _MULTISIGREDEEMSCRIPTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=339, - serialized_end=430, + serialized_start=372, + serialized_end=463, ) @@ -560,8 +567,8 @@ _TXINPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=433, - serialized_end=652, + serialized_start=466, + serialized_end=685, ) @@ -616,8 +623,8 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=655, - serialized_end=806, + serialized_start=688, + serialized_end=839, ) @@ -651,8 +658,8 @@ _TXOUTPUTBINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=808, - serialized_end=864, + serialized_start=841, + serialized_end=897, ) @@ -721,8 +728,8 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=867, - serialized_end=1062, + serialized_start=900, + serialized_end=1095, ) @@ -756,8 +763,8 @@ _TXREQUESTDETAILSTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1064, - serialized_end=1126, + serialized_start=1097, + serialized_end=1159, ) @@ -798,8 +805,8 @@ _TXREQUESTSERIALIZEDTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1128, - serialized_end=1220, + serialized_start=1161, + serialized_end=1253, ) _HDNODEPATHTYPE.fields_by_name['node'].message_type = _HDNODETYPE From bd7c575be3aa1bbbd1ef361797c16d24948cc75a Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 23 Jan 2015 21:24:15 +0100 Subject: [PATCH 0411/1535] Fixed testnet URL --- trezorlib/tx_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index a35a08b19..553265163 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -98,5 +98,5 @@ class TXAPITestnet(object): @filecache(MONTH) def get_tx(self, txhash): - url = 'https://insight.bitpay.com/api/tx/%s' % txhash + url = 'https://test-insight.bitpay.com/api/tx/%s' % txhash return insight_tx(url) From 018a347aca2c969cbee102cb30626c352a5413a9 Mon Sep 17 00:00:00 2001 From: slush0 Date: Mon, 26 Jan 2015 13:08:29 +0100 Subject: [PATCH 0412/1535] Added test of DerivationCache --- tests/test_bip32_speed.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/test_bip32_speed.py b/tests/test_bip32_speed.py index 9d38b6107..f64889c5d 100644 --- a/tests/test_bip32_speed.py +++ b/tests/test_bip32_speed.py @@ -30,5 +30,24 @@ class TestBip32Speed(common.TrezorTest): print "DEPTH", depth, "EXPECTED DELAY", expected, "REAL DELAY", delay self.assertLessEqual(delay, expected) + def test_cache(self): + self.setup_mnemonic_nopin_nopassphrase() + + start = time.time() + for x in range(2): + self.client.get_address('Bitcoin', [x, 2, 3, 4, 5, 6, 7, 8]) + nocache_time = time.time() - start + + start = time.time() + for x in range(2): + self.client.get_address('Bitcoin', [1, 2, 3, 4, 5, 6, 7, x]) + cache_time = time.time() - start + + print "NOCACHE TIME", nocache_time + print "CACHED TIME", cache_time + + # Cached time expected to be at least 2x faster + self.assertLessEqual(cache_time, nocache_time / 2.) + if __name__ == '__main__': unittest.main() From 1daf60313591007ef6446206a1cd6a1debce1277 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 26 Jan 2015 19:24:31 +0100 Subject: [PATCH 0413/1535] increase range for bip32 caching test --- tests/test_bip32_speed.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_bip32_speed.py b/tests/test_bip32_speed.py index f64889c5d..e98d20430 100644 --- a/tests/test_bip32_speed.py +++ b/tests/test_bip32_speed.py @@ -4,6 +4,7 @@ import time from trezorlib import tools class TestBip32Speed(common.TrezorTest): + def test_public_ckd(self): self.setup_mnemonic_nopin_nopassphrase() @@ -34,12 +35,12 @@ class TestBip32Speed(common.TrezorTest): self.setup_mnemonic_nopin_nopassphrase() start = time.time() - for x in range(2): + for x in range(10): self.client.get_address('Bitcoin', [x, 2, 3, 4, 5, 6, 7, 8]) nocache_time = time.time() - start start = time.time() - for x in range(2): + for x in range(10): self.client.get_address('Bitcoin', [1, 2, 3, 4, 5, 6, 7, x]) cache_time = time.time() - start From 7f4f15fb323aa8d3de5640a2b32c647c6c0edbac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20B=C3=ADlek?= Date: Tue, 27 Jan 2015 17:41:06 +0100 Subject: [PATCH 0414/1535] Update README.rst --- README.rst | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/README.rst b/README.rst index 51026575d..32e5f301b 100644 --- a/README.rst +++ b/README.rst @@ -57,14 +57,7 @@ How to install (Windows) How to install (Debian-Ubuntu) ------------------------------ -* sudo apt-get install python-dev python-setuptools cython +* sudo apt-get install python-dev python-setuptools cython libusb-1.0-0-dev libudev-dev * git clone https://github.com/trezor/python-trezor.git * cd python-trezor * python setup.py install (or develop) - -Internal note: --------------- -* Clone cython-hidapi from github.com/trezor/cython-hidapi -* Go to cython-hidapi directory -* Run "git submodule init" in Git Bash (TortoiseGit) -* Run "git submodule update" in Git Bash (TortoiseGit) From bb4d21ba65baa5a75bae020a18b486a0927b276e Mon Sep 17 00:00:00 2001 From: slush0 Date: Wed, 28 Jan 2015 05:31:30 +0100 Subject: [PATCH 0415/1535] Added feature check --- trezorlib/client.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/trezorlib/client.py b/trezorlib/client.py index 2d62db6a1..dbb4c5424 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -337,6 +337,7 @@ class DebugLinkMixin(object): class ProtocolMixin(object): PRIME_DERIVATION_FLAG = 0x80000000 + VENDORS = ('bitcointrezor.com',) def __init__(self, *args, **kwargs): super(ProtocolMixin, self).__init__(*args, **kwargs) @@ -348,6 +349,8 @@ class ProtocolMixin(object): def init_device(self): self.features = expect(proto.Features)(self.call)(proto.Initialize()) + if str(self.features.vendor) not in self.VENDORS: + raise Exception("Unsupported device") def _get_local_entropy(self): return os.urandom(32) From 2533a52df5cb0c95324373d06315cb1d24c79ec5 Mon Sep 17 00:00:00 2001 From: slush0 Date: Fri, 30 Jan 2015 18:50:50 +0100 Subject: [PATCH 0416/1535] version 0.6.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index d430d5dd0..d8f388c29 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name='trezor', - version='0.5.4', + version='0.6.0', author='Bitcoin TREZOR', author_email='info@bitcointrezor.com', description='Python library for communicating with TREZOR Bitcoin Hardware Wallet', From 657a008e0c36f1d17e0b06b038be51ab8e217180 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 30 Jan 2015 23:52:14 +0100 Subject: [PATCH 0417/1535] python-trezor is LGPLv3 --- COPYING | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 4 +- 2 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 COPYING diff --git a/COPYING b/COPYING new file mode 100644 index 000000000..65c5ca88a --- /dev/null +++ b/COPYING @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/setup.py b/setup.py index d8f388c29..121d82482 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name='trezor', - version='0.6.0', + version='0.6.1', author='Bitcoin TREZOR', author_email='info@bitcointrezor.com', description='Python library for communicating with TREZOR Bitcoin Hardware Wallet', @@ -31,7 +31,7 @@ setup( include_package_data=True, zip_safe=False, classifiers=[ - 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', + 'License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)', 'Operating System :: POSIX :: Linux', 'Operating System :: Microsoft :: Windows', 'Operating System :: MacOS :: MacOS X', From 85d8fa90c8d68200a86728f270accc3fceb6a0b2 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 4 Feb 2015 15:47:44 +0100 Subject: [PATCH 0418/1535] update protobuf, enable OP_RETURN --- tests/test_op_return.py | 57 +++++++++++++++++++++++++++++++++++++++++ trezorlib/types_pb2.py | 56 ++++++++++++++++++++++++---------------- 2 files changed, 91 insertions(+), 22 deletions(-) create mode 100644 tests/test_op_return.py diff --git a/tests/test_op_return.py b/tests/test_op_return.py new file mode 100644 index 000000000..661ee31d7 --- /dev/null +++ b/tests/test_op_return.py @@ -0,0 +1,57 @@ +import unittest +import common +import binascii +import itertools + +import trezorlib.messages_pb2 as proto +import trezorlib.types_pb2 as proto_types +from trezorlib.client import CallException +from trezorlib.tx_api import TXAPITestnet, TXAPIBitcoin + +class TestOpReturn(common.TrezorTest): + + def test_one_two_fee(self): + self.setup_mnemonic_nopin_nopassphrase() + + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=390000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + out2 = proto_types.TxOutputType(op_return_data='test of the op_return data', + amount=0, + script_type=proto_types.PAYTOOPRETURN, + ) + + with self.client: + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXFINISHED), + ]) + (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, out2]) + + self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220187b7b9c340a32fc8445418ad11fb3827d2e8bac7d730e1c9ad800353e7ba62f02206c0c5820ba8882c82923a39aee8d36d6d32e13daed73f7a3d6199de5f8e7ddfd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0260cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000000000001c6a1a74657374206f6620746865206f705f72657475726e206461746100000000') + + +if __name__ == '__main__': + unittest.main() diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index ef9b0a34e..1f8601f38 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\">\n\x0eHDNodePathType\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x11\n\taddress_n\x18\x02 \x03(\r\"~\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x17\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r:\x01\x30\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x1c\n\x11\x61\x64\x64ress_type_p2sh\x18\x05 \x01(\r:\x01\x35\"[\n\x18MultisigRedeemScriptType\x12 \n\x07pubkeys\x18\x01 \x03(\x0b\x32\x0f.HDNodePathType\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\t\n\x01m\x18\x03 \x01(\r\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x97\x01\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\x12+\n\x08multisig\x18\x05 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*L\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01\x12\x11\n\rPAYTOMULTISIG\x10\x02*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\">\n\x0eHDNodePathType\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x11\n\taddress_n\x18\x02 \x03(\r\"~\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x17\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r:\x01\x30\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x1c\n\x11\x61\x64\x64ress_type_p2sh\x18\x05 \x01(\r:\x01\x35\"[\n\x18MultisigRedeemScriptType\x12 \n\x07pubkeys\x18\x01 \x03(\x0b\x32\x0f.HDNodePathType\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\t\n\x01m\x18\x03 \x01(\r\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\xaf\x01\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\x12+\n\x08multisig\x18\x05 \x01(\x0b\x32\x19.MultisigRedeemScriptType\x12\x16\n\x0eop_return_data\x18\x06 \x01(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*_\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01\x12\x11\n\rPAYTOMULTISIG\x10\x02\x12\x11\n\rPAYTOOPRETURN\x10\x03*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,8 +74,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1256, - serialized_end=1589, + serialized_start=1280, + serialized_end=1613, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -97,11 +97,15 @@ _OUTPUTSCRIPTTYPE = _descriptor.EnumDescriptor( name='PAYTOMULTISIG', index=2, number=2, options=None, type=None), + _descriptor.EnumValueDescriptor( + name='PAYTOOPRETURN', index=3, number=3, + options=None, + type=None), ], containing_type=None, options=None, - serialized_start=1591, - serialized_end=1667, + serialized_start=1615, + serialized_end=1710, ) OutputScriptType = enum_type_wrapper.EnumTypeWrapper(_OUTPUTSCRIPTTYPE) @@ -122,8 +126,8 @@ _INPUTSCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1669, - serialized_end=1723, + serialized_start=1712, + serialized_end=1766, ) InputScriptType = enum_type_wrapper.EnumTypeWrapper(_INPUTSCRIPTTYPE) @@ -152,8 +156,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1725, - serialized_end=1793, + serialized_start=1768, + serialized_end=1836, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -206,8 +210,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1796, - serialized_end=2118, + serialized_start=1839, + serialized_end=2161, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -232,8 +236,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2120, - serialized_end=2247, + serialized_start=2163, + serialized_end=2290, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -252,6 +256,7 @@ Failure_FirmwareError = 99 PAYTOADDRESS = 0 PAYTOSCRIPTHASH = 1 PAYTOMULTISIG = 2 +PAYTOOPRETURN = 3 SPENDADDRESS = 0 SPENDMULTISIG = 1 TXINPUT = 0 @@ -614,6 +619,13 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='op_return_data', full_name='TxOutputType.op_return_data', index=5, + number=6, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -624,7 +636,7 @@ _TXOUTPUTTYPE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=688, - serialized_end=839, + serialized_end=863, ) @@ -658,8 +670,8 @@ _TXOUTPUTBINTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=841, - serialized_end=897, + serialized_start=865, + serialized_end=921, ) @@ -728,8 +740,8 @@ _TRANSACTIONTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=900, - serialized_end=1095, + serialized_start=924, + serialized_end=1119, ) @@ -763,8 +775,8 @@ _TXREQUESTDETAILSTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1097, - serialized_end=1159, + serialized_start=1121, + serialized_end=1183, ) @@ -805,8 +817,8 @@ _TXREQUESTSERIALIZEDTYPE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1161, - serialized_end=1253, + serialized_start=1185, + serialized_end=1277, ) _HDNODEPATHTYPE.fields_by_name['node'].message_type = _HDNODETYPE From d83926fb135b29e6c38965e7644954b03846677c Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 4 Feb 2015 20:00:04 +0100 Subject: [PATCH 0419/1535] add failing test to test_op_return --- tests/test_op_return.py | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/tests/test_op_return.py b/tests/test_op_return.py index 661ee31d7..175d384dc 100644 --- a/tests/test_op_return.py +++ b/tests/test_op_return.py @@ -10,7 +10,7 @@ from trezorlib.tx_api import TXAPITestnet, TXAPIBitcoin class TestOpReturn(common.TrezorTest): - def test_one_two_fee(self): + def test_opreturn(self): self.setup_mnemonic_nopin_nopassphrase() # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 @@ -52,6 +52,40 @@ class TestOpReturn(common.TrezorTest): self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220187b7b9c340a32fc8445418ad11fb3827d2e8bac7d730e1c9ad800353e7ba62f02206c0c5820ba8882c82923a39aee8d36d6d32e13daed73f7a3d6199de5f8e7ddfd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0260cc0500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000000000001c6a1a74657374206f6620746865206f705f72657475726e206461746100000000') + def test_nonzero_opreturn(self): + self.setup_mnemonic_nopin_nopassphrase() + + # tx: d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882 + # input 0: 0.0039 BTC + + inp1 = proto_types.TxInputType(address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e + # amount=390000, + prev_hash=binascii.unhexlify('d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882'), + prev_index=0, + ) + + out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', + amount=390000 - 10000 - 10000, + script_type=proto_types.PAYTOADDRESS, + ) + + out1 = proto_types.TxOutputType(op_return_data='test of the op_return data', + amount=10000, + script_type=proto_types.PAYTOOPRETURN, + ) + + with self.client: + self.client.set_expected_responses([ + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.Failure() + ]) + self.assertRaises(CallException, self.client.sign_tx, 'Bitcoin', [inp1, ], [out1, ]) if __name__ == '__main__': unittest.main() From 686b8cc4b8c82b5888775e2ad031d9d02598f392 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 4 Feb 2015 20:53:22 +0100 Subject: [PATCH 0420/1535] update protobuf, introduce homescreen --- tests/test_msg_applysettings.py | 10 ++ trezorlib/client.py | 4 +- trezorlib/messages_pb2.py | 203 +++++++++++++++++--------------- 3 files changed, 118 insertions(+), 99 deletions(-) diff --git a/tests/test_msg_applysettings.py b/tests/test_msg_applysettings.py index ba63c82da..e61ffd3fa 100644 --- a/tests/test_msg_applysettings.py +++ b/tests/test_msg_applysettings.py @@ -62,5 +62,15 @@ class TestMsgApplysettings(common.TrezorTest): self.assertEqual(self.client.features.passphrase_protection, True) + def test_apply_homescreen(self): + self.setup_mnemonic_pin_passphrase() + + with self.client: + self.client.set_expected_responses([proto.ButtonRequest(), + proto.PinMatrixRequest(), + proto.Success(), + proto.Features()]) + self.client.apply_settings(homescreen=1024*'\xf0') + if __name__ == '__main__': unittest.main() diff --git a/trezorlib/client.py b/trezorlib/client.py index dbb4c5424..77f2e0efe 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -417,7 +417,7 @@ class ProtocolMixin(object): @field('message') @expect(proto.Success) - def apply_settings(self, label=None, language=None, use_passphrase=None): + def apply_settings(self, label=None, language=None, use_passphrase=None, homescreen=None): settings = proto.ApplySettings() if label != None: settings.label = label @@ -425,6 +425,8 @@ class ProtocolMixin(object): settings.language = language if use_passphrase != None: settings.use_passphrase = use_passphrase + if homescreen != None: + settings.homescreen = homescreen out = self.call(settings) self.init_device() # Reload Features diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 5f47a6967..8a058ee7f 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"H\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x16\n\x0euse_passphrase\x18\x03 \x01(\x08\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"~\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\x12+\n\x08multisig\x18\x04 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"@\n\x10\x45ncryptedMessage\x12\r\n\x05nonce\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0c\n\x04hmac\x18\x03 \x01(\x0c\"Q\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\r\n\x05nonce\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0c\n\x04hmac\x18\x04 \x01(\x0c\"4\n\x10\x44\x65\x63ryptedMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"!\n\x10\x43ipheredKeyValue\x12\r\n\x05value\x18\x01 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x99\x0e\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_CipheredKeyValue\x10\x30\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_EncryptedMessage\x10\x32\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x33\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_DecryptedMessage\x10\x34\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"\\\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x16\n\x0euse_passphrase\x18\x03 \x01(\x08\x12\x12\n\nhomescreen\x18\x04 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"~\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\x12+\n\x08multisig\x18\x04 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"@\n\x10\x45ncryptedMessage\x12\r\n\x05nonce\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0c\n\x04hmac\x18\x03 \x01(\x0c\"Q\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\r\n\x05nonce\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0c\n\x04hmac\x18\x04 \x01(\x0c\"4\n\x10\x44\x65\x63ryptedMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"!\n\x10\x43ipheredKeyValue\x12\r\n\x05value\x18\x01 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x99\x0e\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_CipheredKeyValue\x10\x30\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_EncryptedMessage\x10\x32\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x33\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_DecryptedMessage\x10\x34\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -230,8 +230,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3464, - serialized_end=5281, + serialized_start=3484, + serialized_end=5301, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -485,6 +485,13 @@ _APPLYSETTINGS = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='homescreen', full_name='ApplySettings.homescreen', index=3, + number=4, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -495,7 +502,7 @@ _APPLYSETTINGS = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=399, - serialized_end=471, + serialized_end=491, ) @@ -522,8 +529,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=473, - serialized_end=500, + serialized_start=493, + serialized_end=520, ) @@ -571,8 +578,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=502, - serialized_end=607, + serialized_start=522, + serialized_end=627, ) @@ -599,8 +606,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=609, - serialized_end=635, + serialized_start=629, + serialized_end=655, ) @@ -634,8 +641,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=637, - serialized_end=691, + serialized_start=657, + serialized_end=711, ) @@ -669,8 +676,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=693, - serialized_end=756, + serialized_start=713, + serialized_end=776, ) @@ -690,8 +697,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=758, - serialized_end=769, + serialized_start=778, + serialized_end=789, ) @@ -718,8 +725,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=771, - serialized_end=826, + serialized_start=791, + serialized_end=846, ) @@ -746,8 +753,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=828, - serialized_end=855, + serialized_start=848, + serialized_end=875, ) @@ -767,8 +774,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=857, - serialized_end=865, + serialized_start=877, + serialized_end=885, ) @@ -788,8 +795,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=867, - serialized_end=886, + serialized_start=887, + serialized_end=906, ) @@ -816,8 +823,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=888, - serialized_end=923, + serialized_start=908, + serialized_end=943, ) @@ -844,8 +851,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=925, - serialized_end=951, + serialized_start=945, + serialized_end=971, ) @@ -872,8 +879,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=953, - serialized_end=979, + serialized_start=973, + serialized_end=999, ) @@ -900,8 +907,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=981, - serialized_end=1014, + serialized_start=1001, + serialized_end=1034, ) @@ -935,8 +942,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1016, - serialized_end=1068, + serialized_start=1036, + serialized_end=1088, ) @@ -984,8 +991,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1070, - serialized_end=1196, + serialized_start=1090, + serialized_end=1216, ) @@ -1012,8 +1019,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1198, - serialized_end=1224, + serialized_start=1218, + serialized_end=1244, ) @@ -1033,8 +1040,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1226, - serialized_end=1238, + serialized_start=1246, + serialized_end=1258, ) @@ -1103,8 +1110,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1241, - serialized_end=1407, + serialized_start=1261, + serialized_end=1427, ) @@ -1166,8 +1173,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1410, - serialized_end=1567, + serialized_start=1430, + serialized_end=1587, ) @@ -1187,8 +1194,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1569, - serialized_end=1585, + serialized_start=1589, + serialized_end=1605, ) @@ -1215,8 +1222,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1587, - serialized_end=1616, + serialized_start=1607, + serialized_end=1636, ) @@ -1278,8 +1285,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1619, - serialized_end=1778, + serialized_start=1639, + serialized_end=1798, ) @@ -1299,8 +1306,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1780, - serialized_end=1793, + serialized_start=1800, + serialized_end=1813, ) @@ -1327,8 +1334,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1795, - serialized_end=1818, + serialized_start=1815, + serialized_end=1838, ) @@ -1369,8 +1376,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1820, - serialized_end=1897, + serialized_start=1840, + serialized_end=1917, ) @@ -1411,8 +1418,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1899, - serialized_end=1967, + serialized_start=1919, + serialized_end=1987, ) @@ -1446,8 +1453,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1969, - serialized_end=2023, + serialized_start=1989, + serialized_end=2043, ) @@ -1502,8 +1509,8 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2025, - serialized_end=2143, + serialized_start=2045, + serialized_end=2163, ) @@ -1544,8 +1551,8 @@ _ENCRYPTEDMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2145, - serialized_end=2209, + serialized_start=2165, + serialized_end=2229, ) @@ -1593,8 +1600,8 @@ _DECRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2211, - serialized_end=2292, + serialized_start=2231, + serialized_end=2312, ) @@ -1628,8 +1635,8 @@ _DECRYPTEDMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2294, - serialized_end=2346, + serialized_start=2314, + serialized_end=2366, ) @@ -1691,8 +1698,8 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2349, - serialized_end=2477, + serialized_start=2369, + serialized_end=2497, ) @@ -1719,8 +1726,8 @@ _CIPHEREDKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2479, - serialized_end=2512, + serialized_start=2499, + serialized_end=2532, ) @@ -1761,8 +1768,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2514, - serialized_end=2603, + serialized_start=2534, + serialized_end=2623, ) @@ -1789,8 +1796,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2605, - serialized_end=2630, + serialized_start=2625, + serialized_end=2650, ) @@ -1831,8 +1838,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2632, - serialized_end=2713, + serialized_start=2652, + serialized_end=2733, ) @@ -1880,8 +1887,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2716, - serialized_end=2860, + serialized_start=2736, + serialized_end=2880, ) @@ -1922,8 +1929,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2863, - serialized_end=2996, + serialized_start=2883, + serialized_end=3016, ) @@ -1950,8 +1957,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2998, - serialized_end=3035, + serialized_start=3018, + serialized_end=3055, ) @@ -1971,8 +1978,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3037, - serialized_end=3052, + serialized_start=3057, + serialized_end=3072, ) @@ -1999,8 +2006,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3054, - serialized_end=3087, + serialized_start=3074, + serialized_end=3107, ) @@ -2027,8 +2034,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3089, - serialized_end=3124, + serialized_start=3109, + serialized_end=3144, ) @@ -2048,8 +2055,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3126, - serialized_end=3145, + serialized_start=3146, + serialized_end=3165, ) @@ -2139,8 +2146,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3148, - serialized_end=3383, + serialized_start=3168, + serialized_end=3403, ) @@ -2160,8 +2167,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3385, - serialized_end=3400, + serialized_start=3405, + serialized_end=3420, ) @@ -2202,8 +2209,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3402, - serialized_end=3461, + serialized_start=3422, + serialized_end=3481, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From e42cfe365f23c193936dc84838a53ee5bf668cca Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 4 Feb 2015 21:26:17 +0100 Subject: [PATCH 0421/1535] use better image for test --- tests/test_msg_applysettings.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_msg_applysettings.py b/tests/test_msg_applysettings.py index e61ffd3fa..db5e924cb 100644 --- a/tests/test_msg_applysettings.py +++ b/tests/test_msg_applysettings.py @@ -65,12 +65,14 @@ class TestMsgApplysettings(common.TrezorTest): def test_apply_homescreen(self): self.setup_mnemonic_pin_passphrase() + img = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x1f\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x1f\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x01\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x01\xe7\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x01\xe7\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x01\xe3\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x03\xc7\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x07\x87\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x07\x07\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\xf9\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f?\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + with self.client: self.client.set_expected_responses([proto.ButtonRequest(), proto.PinMatrixRequest(), proto.Success(), proto.Features()]) - self.client.apply_settings(homescreen=1024*'\xf0') + self.client.apply_settings(homescreen=img) if __name__ == '__main__': unittest.main() From 11e7f21ac3b3c40d978a2afa0a59b360083ef261 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 5 Feb 2015 14:43:27 +0100 Subject: [PATCH 0422/1535] nicer image in homescreen test --- tests/test_msg_applysettings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_msg_applysettings.py b/tests/test_msg_applysettings.py index db5e924cb..0ef5da27c 100644 --- a/tests/test_msg_applysettings.py +++ b/tests/test_msg_applysettings.py @@ -65,7 +65,7 @@ class TestMsgApplysettings(common.TrezorTest): def test_apply_homescreen(self): self.setup_mnemonic_pin_passphrase() - img = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00?\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x1f\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x1f\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x01\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x01\xe7\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x01\xe7\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x01\xe3\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x03\xc7\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x07\x87\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1e\x07\x07\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x00\x0f\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1f\xff\xf9\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f?\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + img = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\x04\x80\x00\x00\x00\x00\x00\x00\x00\x00\x04\x88\x02\x00\x00\x00\x02\x91\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x90@\x00\x11@\x00\x00\x00\x00\x00\x00\x08\x00\x10\x92\x12\x04\x00\x00\x05\x12D\x00\x00\x00\x00\x00 \x00\x00\x08\x00Q\x00\x00\x02\xc0\x00\x00\x00\x00\x00\x00\x00\x10\x02 \x01\x04J\x00)$\x00\x00\x00\x00\x80\x00\x00\x00\x00\x08\x10\xa1\x00\x00\x02\x81 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\tP\x00\x00\x00\x00\x00\x00 \x00\x00\xa0\x00\xa0R \x12\x84\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x08\x00\tP\x00\x00\x00\x00 \x00\x04 \x00\x80\x02\x00@\x02T\xc2 \x00\x00\x00\x00\x00\x00\x00\x10@\x00)\t@\n\xa0\x80\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x80@\x14\xa9H\x04\x00\x00\x88@\x00\x00\x00\x00\x00\x02\x02$\x00\x15B@\x00\nP\x00\x00\x00\x00\x00\x80\x00\x00\x91\x01UP\x00\x00 \x02\x00\x00\x00\x00\x00\x00\x02\x08@ Z\xa5 \x00\x00\x80\x00\x00\x00\x00\x00\x00\x08\xa1%\x14*\xa0\x00\x00\x02\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00@\xaa\x91 \x00\x05E\x80\x00\x00\x00\x00\x00\x02*T\x05-D\x00\x00\x05 @\x00\x00\x00\x00\x00%@\x80\x11V\xa0\x88\x00\x05@\xb0\x00\x00\x00\x00\x00\x818$\x04\xabD \x00\x06\xa1T\x00\x00\x00\x00\x02\x03\xb8\x01R\xd5\x01\x00\x00\x05AP\x00\x00\x00\x00\x08\xadT\x00\x05j\xa4@\x00\x87ah\x00\x00\x00\x00\x02\x8d\xb8\x08\x00.\x01\x00\x00\x02\xa5\xa8\x10\x00\x00\x00*\xc1\xec \n\xaa\x88 \x02@\xf6\xd0\x02\x00\x00\x00\x0bB\xb6\x14@U"\x80\x00\x01{`\x00\x00\x00\x00M\xa3\xf8 \x15*\x00\x00\x00\x10n\xc0\x04\x00\x00\x02\x06\xc2\xa8)\x00\x96\x84\x80\x00\x00\x1b\x00\x00\x80@\x10\x87\xa7\xf0\x84\x10\xaa\x10\x00\x00D\x00\x00\x02 \x00\x8a\x06\xfa\xe0P\n-\x02@\x00\x12\x00\x00\x00\x00\x10@\x83\xdf\xa0\x00\x08\xaa@\x00\x00\x01H\x00\x05H\x04\x12\x01\xf7\x81P\x02T\t\x00\x00\x00 \x00\x00\x84\x10\x00\x00z\x00@)* \x00\x00\x01\n\xa0\x02 \x05\n\x00\x00\x05\x10\x84\xa8\x84\x80\x00\x00@\x14\x00\x92\x10\x80\x00\x04\x11@\tT\x00\x00\x00\x00\n@\x00\x08\x84@$\x00H\x00\x12Q\x02\x00\x00\x00\x00\x90\x02A\x12\xa8\n\xaa\x92\x10\x04\xa8\x10@\x00\x00\x04\x04\x00\x04I\x00\x04\x14H\x80"R\x01\x00\x00\x00!@\x00\x00$\xa0EB\x80\x08\x95hH\x00\x00\x00\x84\x10 \x05Z\x00\x00(\x00\x02\x00\xa1\x01\x00\x00\x04\x00@\x82\x00\xadH*\x92P\x00\xaaP\x00\x00\x00\x00\x11\x02\x01*\xad\x01\x00\x01\x01"\x11D\x08\x00\x00\x10\x80 \x00\x81W\x80J\x94\x04\x08\xa5 !\x00\x00\x00\x02\x00B*\xae\xa1\x00\x80\x10\x01\x08\xa4\x00\x00\x00\x00\x00\x84\x00\t[@"HA\x04E\x00\x84\x00\x00\x00\x10\x00\x01J\xd5\x82\x90\x02\x00!\x02\xa2\x00\x00\x00\x00\x00\x00\x00\x05~\xa0\x00 \x10\n)\x00\x11\x00\x00\x00\x00\x00\x00!U\x80\xa8\x88\x82\x80\x01\x00\x00\x00\x00\x00\x00H@\x11\xaa\xc0\x82\x00 *\n\x00\x00\x00\x00\x00\x00\x00\x00\n\xabb@ \x04\x00! \x84\x00\x00\x00\x00\x02@\xa5\x15A$\x04\x81(\n\x00\x00\x00\x00\x00\x00 \x01\x10\x02\xe0\x91\x02\x00\x00\x04\x00\x00\x00\x00\x00\x00\x01 \xa9\tQH@\x91 P\x00\x00\x00\x00\x00\x00\x08\x00\x00\xa0T\xa5\x00@\x80\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"\x00\x00\x00\x00\xa2\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00 T\xa0\t\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00@\x02\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00*\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x10\x00\x00\x10\x02\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00@\x04\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x08@\x10\x00\x00\x00\x00' with self.client: self.client.set_expected_responses([proto.ButtonRequest(), From c77dd236e74d0681bcd73766db5397f59b28e104 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 5 Feb 2015 15:05:24 +0100 Subject: [PATCH 0423/1535] add homescreen call to cmdtr.py --- cmdtr.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/cmdtr.py b/cmdtr.py index f2e3aadaa..e884d2da9 100755 --- a/cmdtr.py +++ b/cmdtr.py @@ -112,6 +112,23 @@ class Commands(object): def set_label(self, args): return self.client.apply_settings(label=args.label) + def set_homescreen(self,args): + if args.filename: + from PIL import Image + im = Image.open(args.filename) + if im.size != (128,64): + raise Exception('Wrong size of the image') + im = im.convert('1') + pix = im.load() + img = '' + for j in range(64): + for i in range(128): + img += '1' if pix[i, j] else '0' + img = ''.join(chr(int(img[i:i + 8], 2)) for i in range(0, len(img), 8)) + else: + img = '\x00' + return self.client.apply_settings(homescreen=img) + def clear_session(self, args): return self.client.clear_session() @@ -202,6 +219,7 @@ class Commands(object): get_features.help = 'Retrieve device features and settings' get_public_node.help = 'Get public node of given path' set_label.help = 'Set new wallet label' + set_homescreen.help = 'Set new homescreen' clear_session.help = 'Clear session (remove cached PIN, passphrase, etc.)' change_pin.help = 'Change new PIN or remove existing' list_coins.help = 'List all supported coin types by the device' @@ -243,6 +261,9 @@ class Commands(object): # (('-c', '--clear'), {'action': 'store_true', 'default': False}) ) + set_homescreen.arguments = ( + (('-f', '--filename',), {'type': str, 'default': ''}), + ) change_pin.arguments = ( (('-r', '--remove'), {'action': 'store_true', 'default': False}), ) From 62aff7a22ab9a0b03b831c41f6d9221050d41a05 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 11 Feb 2015 19:02:35 +0100 Subject: [PATCH 0424/1535] adapt tests to reflect reorder change --- tests/test_msg_signtx.py | 63 +++++++++++++++++++++------------ tests/test_multisig.py | 6 ++-- tests/test_multisig_change.py | 14 ++++---- tests/test_op_return.py | 5 +-- tests/test_protection_levels.py | 3 +- 5 files changed, 58 insertions(+), 33 deletions(-) diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py index 778377ff4..58d3f409b 100644 --- a/tests/test_msg_signtx.py +++ b/tests/test_msg_signtx.py @@ -33,10 +33,11 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXFINISHED), ]) @@ -76,11 +77,13 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXFINISHED), @@ -119,12 +122,14 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("6f90f3c7cbec2258b0971056ef3fe34128dbde30daa9c0639a898f9977299d54"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXFINISHED), @@ -162,11 +167,13 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXFINISHED), @@ -209,13 +216,16 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=2)), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=2)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=2)), @@ -262,21 +272,24 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c6be22d34946593bcad1d2b013e12f74159e69574ffea21581dad115572e031c"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), - proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("58497a7757224d1ff1941488d23087071103e5bf855f4c1c44e5c8d9d82ca46e"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), - proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXFINISHED), @@ -286,6 +299,7 @@ class TestMsgSigntx(common.TrezorTest): # Accepted by network: tx c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb self.assertEqual(binascii.hexlify(serialized_tx), '01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000') + """ def test_lots_of_inputs(self): self.setup_mnemonic_nopin_nopassphrase() # Tests if device implements serialization of len(inputs) correctly @@ -302,6 +316,7 @@ class TestMsgSigntx(common.TrezorTest): (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', inputs, [out]) # Accepted by network: tx 23d9d8eecf3abf6c0f0f3f8b0976a04792d7f1c9a4ea9b0a8931734949e27c92 # too big put in unit test + """ def test_lots_of_outputs(self): self.setup_mnemonic_nopin_nopassphrase() @@ -342,25 +357,27 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c63e24ed820c5851b60c54613fbc4bcb37df6cd49b4c96143e99580a472f79fb"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), ] + [ item for items in itertools.izip( [proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=I)) for I in range(cnt)], [proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput)] * cnt ) for item in items ] + [ - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), - proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("39a29e954977662ab3879c66fb251ef753e0912223a83d1dcb009111d28265e5"))), + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), ] + [ proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=I)) for I in range(cnt) ] + [ - proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + ] + [ + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=I)) for I in range(cnt) ] + [ proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=I)) for I in range(cnt) ] + [ @@ -395,11 +412,12 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_FeeOverThreshold), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXFINISHED), ]) @@ -431,7 +449,6 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.Failure(code=proto_types.Failure_NotEnoughFunds) @@ -466,10 +483,11 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("54aa5680dea781f45ebb536e53dffc526d68c0eb5c00547e323b2c32382dfba3"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("54aa5680dea781f45ebb536e53dffc526d68c0eb5c00547e323b2c32382dfba3"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("54aa5680dea781f45ebb536e53dffc526d68c0eb5c00547e323b2c32382dfba3"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXFINISHED), ]) @@ -564,10 +582,11 @@ class TestMsgSigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("d6da21677d7cca5f42fbc7631d062c9ae918a0254f7c6c22de8e8cb7fd5b8236"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d6da21677d7cca5f42fbc7631d062c9ae918a0254f7c6c22de8e8cb7fd5b8236"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d6da21677d7cca5f42fbc7631d062c9ae918a0254f7c6c22de8e8cb7fd5b8236"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXFINISHED), ]) diff --git a/tests/test_multisig.py b/tests/test_multisig.py index 04f646f22..fa4c05e3b 100644 --- a/tests/test_multisig.py +++ b/tests/test_multisig.py @@ -68,10 +68,11 @@ class TestMultisig(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXFINISHED), ]) @@ -107,10 +108,11 @@ class TestMultisig(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("c6091adf4c0c23982a35899a6e58ae11e703eacd7954f588ed4b9cdefc4dba52"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXFINISHED), ]) diff --git a/tests/test_multisig_change.py b/tests/test_multisig_change.py index 6e4b2de7a..ba916833e 100644 --- a/tests/test_multisig_change.py +++ b/tests/test_multisig_change.py @@ -93,8 +93,11 @@ class TestMultisigChange(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=inp1.prev_hash)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=inp1.prev_hash)), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), + proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=inp2.prev_hash)), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=inp2.prev_hash)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=inp2.prev_hash)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=inp2.prev_hash)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), ] if change != 1: @@ -109,16 +112,15 @@ class TestMultisigChange(common.TrezorTest): proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput) ) resp += [ + proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), - proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=inp2.prev_hash)), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=inp2.prev_hash)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=inp2.prev_hash)), - proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=inp2.prev_hash)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), - proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXFINISHED), diff --git a/tests/test_op_return.py b/tests/test_op_return.py index 175d384dc..c36d7bdff 100644 --- a/tests/test_op_return.py +++ b/tests/test_op_return.py @@ -39,11 +39,13 @@ class TestOpReturn(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXFINISHED), @@ -81,7 +83,6 @@ class TestOpReturn(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.Failure() ]) diff --git a/tests/test_protection_levels.py b/tests/test_protection_levels.py index 7c5e15071..480051f16 100644 --- a/tests/test_protection_levels.py +++ b/tests/test_protection_levels.py @@ -174,10 +174,11 @@ class TestProtectionLevels(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=1, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0, tx_hash=binascii.unhexlify("d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"))), - proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), + proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), + proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXFINISHED), ]) From 870da7aa173720fea1256706e37da7ed5fcbcdf0 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 15 Feb 2015 21:19:07 +0100 Subject: [PATCH 0425/1535] don't try to change 2 things using apply_settings in unit test --- tests/test_protection_levels.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_protection_levels.py b/tests/test_protection_levels.py index 480051f16..2fcd35328 100644 --- a/tests/test_protection_levels.py +++ b/tests/test_protection_levels.py @@ -20,7 +20,7 @@ class TestProtectionLevels(common.TrezorTest): proto.PinMatrixRequest(), proto.Success(), proto.Features()]) # TrezorClient reinitializes device - self.client.apply_settings('nazdar', 'english') + self.client.apply_settings(label='nazdar') def test_change_pin(self): with self.client: From 812184ecec47c84b5919f3e5c203f573a618c66c Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 17 Feb 2015 00:06:49 +0100 Subject: [PATCH 0426/1535] add kocicka.png --- kocicka.png | Bin 0 -> 3314 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 kocicka.png diff --git a/kocicka.png b/kocicka.png new file mode 100644 index 0000000000000000000000000000000000000000..669b894025cd64fc95cf0bf5d30cde2560b4938f GIT binary patch literal 3314 zcmX|EZD?EP6;|UoYORl~UpQ8|F(Zr=46Z?l{*aY)T{<@jOKVTE)2)hiF~uM#f&Q=) zgltP~WI9;Yl?Ai?ut&Ufw&cdwgtR||V=0&6lF}LiDz^s5lzu^Z?Ua_@LRDFPo^$O$ z5?i|WJ?A;kdCqg*y!qmp9$!nK#pQDOPCkF44?idH_n8L|;NLr+j*sKVzLO_@AHDE^ z3XI)xxx7Vw+NwN|eEG90uT-?Rf0+3`dB(hS`ki;~ysutc{`ukjt6PmW-+K_8z@9_shiUdq?qG4rkDp^>O*tVPY8ht7u7wZO=HF8%e=%F7`Y)?1Z7<;LT; zlGgR4wOGh$XG05t+=f1QQ9U)efvA6!Bl1Q(q~>xsGM9@R_a?Ne;c-s(`bv1dy7Rk& zZmr##)>{!FVs=_r1N}Zm9yJSk)$c7Okge2hKb1*e4cPepY9O~<4CFMcS6=J&75N!w z3VIJyEq}4Jxe&0AChpzZHf96%sgTOX@Q{F!J8^tp7+>T4PDBV7^tHpakB#w1)e$SG z%7~vye?T6JxftGPPJOjB{wBci<5-kcM)<4Xu>X}rh@wD2p!SPua9>R`nrdxU26fH? zz22pAOb}9 zv+!2+Qb=7;t*EnVl# zDnw<%=K;vR3<~2$zT18m5<>IJh`yrPK`<@3Arlm)*+k(`iC}ZNNJ{<5>ZlsSR^y6j z4M_K;Nc|EoBGCp>8%9>^joWfUpaVLkI`FU-ePOo%!_Zpb1gj z_W3?aOJfVcB2l1GUIqaaqB)In2=yoH1(I3NM+xQz7=OB$(-)&)da%N_@eHs#zW~05 zV19LZb?gx)U-s1giszJaQQAa-ksd$TL|DluRbu=gugj}9U-YH=w;;QJu=ewpIExsM zg>`8i8ky0~-Z*^&P3N>y&mJo%ZNl)AvBCLVT?mC*G7)Aa_%0P>0U_lt0wB8G1V%u8 zhR{p+0>gqDh&jCLdfw zE5O8{fwd#~x=TH-=A_o+E%^S}pM5oW3az4}%Be%cG}agoVPZs;m?3G(6h2js{a`&I zvm8{}`rkxm=PJkg009JeYY+Cnx8A!&eRn!!o98O{&_#|g(V!E;xIJ{9l7TzNjj)2w z!g!XTqrnuaoe+=2Nbe6DqeSf&g@;u({pC{oM0{5T$WD#m)HyhX)eNCQnW^UD$UMrM z=6sU2VPtgFiusqu!?Qee8GWS%sIBHAO;BG%Ti`QWeQfN3l8Kt|ZMDl8Z1|JaT)REA z@*g0j_lRa`+z?2LxoJ93jRxO6g1nqRa83mvN016cTOrL4hgMv8-OYlgO4y)X4z9pfZsXCw^^{$X*N(Me_6&>I0Ds+-S)>u zlW?Vg9na`7Vogp8LcKq1La!jhLfP|kD3cb_=YyCx$p_~PlqEPksFR$bI=fANkSIrn zY-QPzifkmL52Lsox(b(Z)>tXAvaf_<9o?Ge=A8xQECu)wOcJ7{0tA}4D%kNWcqol_ zJ|~+I=TJ6Nb4=i)?Uij*EgB6Q?Qp{`m378bWASm?7-s7Yp_qNUj#C3ZbXIa`Kf?EvF)wx9;6k~YgN zAD2nTb)&pZaM`r;HYG!+p~1GGa_*BoD(L1}mc|ZpB-nozBA1=^i3s_`GINxbq;{tJiM~$YsP5A{=0GS4G<|i zC`Pw3l1PJgHe+S0EYdE61;CcO7e{Rp-(iAhaHY8dX|6fIn;m206Vxev;mqR(LZ=

joDQ`pXVRL;)(hoQ;@wf3(`MNo2o> z@vsm;*y1t9qYQ_|rbhrj2)19ipbl0*J)&tcF8ocLgYB3?gT+MdCj?7)fmee=_WyAA zqY)rCMoDZLHy7xh^vWVK^0X${x87a>5ILc5J{0En;=pd=&_Ku<9S#N6HV)T5ikf3j z!(Pa>T$hjzYHyQ!hJCc#o~n$w>56nvC{`@RBi8_wSU;Js_c)gjxs-Zqz1+mdKVMpj z;odC+Q9~J1w{AYcn_jOk)oORD@(yCGVmIQ>Ga5DT#yFvkf3EI83~qY^ v{sB`TzcbXB literal 0 HcmV?d00001 From a996573c814cd301aa03f28f804a92cc786d5710 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 20 Feb 2015 16:47:23 +0100 Subject: [PATCH 0427/1535] update pb --- trezorlib/messages_pb2.py | 243 ++++++++++++++++++++++++++++---------- trezorlib/types_pb2.py | 96 +++++++++++++-- 2 files changed, 261 insertions(+), 78 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 8a058ee7f..805f74e48 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"\\\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x16\n\x0euse_passphrase\x18\x03 \x01(\x08\x12\x12\n\nhomescreen\x18\x04 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"~\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\x12+\n\x08multisig\x18\x04 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"@\n\x10\x45ncryptedMessage\x12\r\n\x05nonce\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0c\n\x04hmac\x18\x03 \x01(\x0c\"Q\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\r\n\x05nonce\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0c\n\x04hmac\x18\x04 \x01(\x0c\"4\n\x10\x44\x65\x63ryptedMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"!\n\x10\x43ipheredKeyValue\x12\r\n\x05value\x18\x01 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x99\x0e\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_CipheredKeyValue\x10\x30\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_EncryptedMessage\x10\x32\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x33\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_DecryptedMessage\x10\x34\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"\\\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x16\n\x0euse_passphrase\x18\x03 \x01(\x08\x12\x12\n\nhomescreen\x18\x04 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"~\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\x12+\n\x08multisig\x18\x04 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"@\n\x10\x45ncryptedMessage\x12\r\n\x05nonce\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0c\n\x04hmac\x18\x03 \x01(\x0c\"Q\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\r\n\x05nonce\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0c\n\x04hmac\x18\x04 \x01(\x0c\"4\n\x10\x44\x65\x63ryptedMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"!\n\x10\x43ipheredKeyValue\x12\r\n\x05value\x18\x01 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"c\n\x0cSignIdentity\x12\x1f\n\x08identity\x18\x01 \x01(\x0b\x32\r.IdentityType\x12\x18\n\x10\x63hallenge_hidden\x18\x02 \x01(\x0c\x12\x18\n\x10\x63hallenge_visual\x18\x03 \x01(\t\"H\n\x0eSignedIdentity\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x12\n\npublic_key\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xe3\x0e\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_CipheredKeyValue\x10\x30\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_EncryptedMessage\x10\x32\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x33\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_DecryptedMessage\x10\x34\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_SignIdentity\x10\x35\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_SignedIdentity\x10\x36\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -116,122 +116,130 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_CipheredKeyValue', index=23, number=48, - options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), - type=None), - _descriptor.EnumValueDescriptor( - name='MessageType_ClearSession', index=24, number=24, + name='MessageType_ClearSession', index=23, number=24, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ApplySettings', index=25, number=25, + name='MessageType_ApplySettings', index=24, number=25, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonRequest', index=26, number=26, + name='MessageType_ButtonRequest', index=25, number=26, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_ButtonAck', index=27, number=27, + name='MessageType_ButtonAck', index=26, number=27, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_GetAddress', index=28, number=29, + name='MessageType_GetAddress', index=27, number=29, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_Address', index=29, number=30, + name='MessageType_Address', index=28, number=30, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyRequest', index=30, number=35, + name='MessageType_EntropyRequest', index=29, number=35, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EntropyAck', index=31, number=36, + name='MessageType_EntropyAck', index=30, number=36, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_SignMessage', index=32, number=38, + name='MessageType_SignMessage', index=31, number=38, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_VerifyMessage', index=33, number=39, + name='MessageType_VerifyMessage', index=32, number=39, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_MessageSignature', index=34, number=40, + name='MessageType_MessageSignature', index=33, number=40, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EncryptMessage', index=35, number=49, - options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), + name='MessageType_PassphraseRequest', index=34, number=41, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EncryptedMessage', index=36, number=50, - options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), + name='MessageType_PassphraseAck', index=35, number=42, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DecryptMessage', index=37, number=51, + name='MessageType_EstimateTxSize', index=36, number=43, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DecryptedMessage', index=38, number=52, + name='MessageType_TxSize', index=37, number=44, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PassphraseRequest', index=39, number=41, + name='MessageType_RecoveryDevice', index=38, number=45, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_WordRequest', index=39, number=46, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_PassphraseAck', index=40, number=42, + name='MessageType_WordAck', index=40, number=47, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_EstimateTxSize', index=41, number=43, + name='MessageType_CipheredKeyValue', index=41, number=48, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_EncryptMessage', index=42, number=49, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_TxSize', index=42, number=44, + name='MessageType_EncryptedMessage', index=43, number=50, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_RecoveryDevice', index=43, number=45, + name='MessageType_DecryptMessage', index=44, number=51, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_WordRequest', index=44, number=46, + name='MessageType_DecryptedMessage', index=45, number=52, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_WordAck', index=45, number=47, + name='MessageType_SignIdentity', index=46, number=53, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkDecision', index=46, number=100, + name='MessageType_SignedIdentity', index=47, number=54, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_DebugLinkDecision', index=48, number=100, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkGetState', index=47, number=101, + name='MessageType_DebugLinkGetState', index=49, number=101, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkState', index=48, number=102, + name='MessageType_DebugLinkState', index=50, number=102, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkStop', index=49, number=103, + name='MessageType_DebugLinkStop', index=51, number=103, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkLog', index=50, number=104, + name='MessageType_DebugLinkLog', index=52, number=104, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), ], containing_type=None, options=None, - serialized_start=3484, - serialized_end=5301, + serialized_start=3659, + serialized_end=5550, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -258,7 +266,6 @@ MessageType_Cancel = 20 MessageType_TxRequest = 21 MessageType_TxAck = 22 MessageType_CipherKeyValue = 23 -MessageType_CipheredKeyValue = 48 MessageType_ClearSession = 24 MessageType_ApplySettings = 25 MessageType_ButtonRequest = 26 @@ -270,10 +277,6 @@ MessageType_EntropyAck = 36 MessageType_SignMessage = 38 MessageType_VerifyMessage = 39 MessageType_MessageSignature = 40 -MessageType_EncryptMessage = 49 -MessageType_EncryptedMessage = 50 -MessageType_DecryptMessage = 51 -MessageType_DecryptedMessage = 52 MessageType_PassphraseRequest = 41 MessageType_PassphraseAck = 42 MessageType_EstimateTxSize = 43 @@ -281,6 +284,13 @@ MessageType_TxSize = 44 MessageType_RecoveryDevice = 45 MessageType_WordRequest = 46 MessageType_WordAck = 47 +MessageType_CipheredKeyValue = 48 +MessageType_EncryptMessage = 49 +MessageType_EncryptedMessage = 50 +MessageType_DecryptMessage = 51 +MessageType_DecryptedMessage = 52 +MessageType_SignIdentity = 53 +MessageType_SignedIdentity = 54 MessageType_DebugLinkDecision = 100 MessageType_DebugLinkGetState = 101 MessageType_DebugLinkState = 102 @@ -1962,6 +1972,90 @@ _TXACK = _descriptor.Descriptor( ) +_SIGNIDENTITY = _descriptor.Descriptor( + name='SignIdentity', + full_name='SignIdentity', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='identity', full_name='SignIdentity.identity', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='challenge_hidden', full_name='SignIdentity.challenge_hidden', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='challenge_visual', full_name='SignIdentity.challenge_visual', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=3057, + serialized_end=3156, +) + + +_SIGNEDIDENTITY = _descriptor.Descriptor( + name='SignedIdentity', + full_name='SignedIdentity', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='address', full_name='SignedIdentity.address', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='public_key', full_name='SignedIdentity.public_key', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='signature', full_name='SignedIdentity.signature', index=2, + number=3, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=3158, + serialized_end=3230, +) + + _FIRMWAREERASE = _descriptor.Descriptor( name='FirmwareErase', full_name='FirmwareErase', @@ -1978,8 +2072,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3057, - serialized_end=3072, + serialized_start=3232, + serialized_end=3247, ) @@ -2006,8 +2100,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3074, - serialized_end=3107, + serialized_start=3249, + serialized_end=3282, ) @@ -2034,8 +2128,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3109, - serialized_end=3144, + serialized_start=3284, + serialized_end=3319, ) @@ -2055,8 +2149,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3146, - serialized_end=3165, + serialized_start=3321, + serialized_end=3340, ) @@ -2146,8 +2240,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3168, - serialized_end=3403, + serialized_start=3343, + serialized_end=3578, ) @@ -2167,8 +2261,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3405, - serialized_end=3420, + serialized_start=3580, + serialized_end=3595, ) @@ -2209,8 +2303,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3422, - serialized_end=3481, + serialized_start=3597, + serialized_end=3656, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -2227,6 +2321,7 @@ _TXREQUEST.fields_by_name['request_type'].enum_type = types_pb2._REQUESTTYPE _TXREQUEST.fields_by_name['details'].message_type = types_pb2._TXREQUESTDETAILSTYPE _TXREQUEST.fields_by_name['serialized'].message_type = types_pb2._TXREQUESTSERIALIZEDTYPE _TXACK.fields_by_name['tx'].message_type = types_pb2._TRANSACTIONTYPE +_SIGNIDENTITY.fields_by_name['identity'].message_type = types_pb2._IDENTITYTYPE _DEBUGLINKSTATE.fields_by_name['node'].message_type = types_pb2._HDNODETYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE DESCRIPTOR.message_types_by_name['Features'] = _FEATURES @@ -2272,6 +2367,8 @@ DESCRIPTOR.message_types_by_name['SignTx'] = _SIGNTX DESCRIPTOR.message_types_by_name['SimpleSignTx'] = _SIMPLESIGNTX DESCRIPTOR.message_types_by_name['TxRequest'] = _TXREQUEST DESCRIPTOR.message_types_by_name['TxAck'] = _TXACK +DESCRIPTOR.message_types_by_name['SignIdentity'] = _SIGNIDENTITY +DESCRIPTOR.message_types_by_name['SignedIdentity'] = _SIGNEDIDENTITY DESCRIPTOR.message_types_by_name['FirmwareErase'] = _FIRMWAREERASE DESCRIPTOR.message_types_by_name['FirmwareUpload'] = _FIRMWAREUPLOAD DESCRIPTOR.message_types_by_name['DebugLinkDecision'] = _DEBUGLINKDECISION @@ -2544,6 +2641,18 @@ class TxAck(_message.Message): # @@protoc_insertion_point(class_scope:TxAck) +class SignIdentity(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SIGNIDENTITY + + # @@protoc_insertion_point(class_scope:SignIdentity) + +class SignedIdentity(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _SIGNEDIDENTITY + + # @@protoc_insertion_point(class_scope:SignedIdentity) + class FirmwareErase(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _FIRMWAREERASE @@ -2635,8 +2744,6 @@ _MESSAGETYPE.values_by_name["MessageType_TxAck"].has_options = True _MESSAGETYPE.values_by_name["MessageType_TxAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_CipherKeyValue"].has_options = True _MESSAGETYPE.values_by_name["MessageType_CipherKeyValue"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') -_MESSAGETYPE.values_by_name["MessageType_CipheredKeyValue"].has_options = True -_MESSAGETYPE.values_by_name["MessageType_CipheredKeyValue"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_ClearSession"].has_options = True _MESSAGETYPE.values_by_name["MessageType_ClearSession"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_ApplySettings"].has_options = True @@ -2659,14 +2766,6 @@ _MESSAGETYPE.values_by_name["MessageType_VerifyMessage"].has_options = True _MESSAGETYPE.values_by_name["MessageType_VerifyMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_MessageSignature"].has_options = True _MESSAGETYPE.values_by_name["MessageType_MessageSignature"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') -_MESSAGETYPE.values_by_name["MessageType_EncryptMessage"].has_options = True -_MESSAGETYPE.values_by_name["MessageType_EncryptMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') -_MESSAGETYPE.values_by_name["MessageType_EncryptedMessage"].has_options = True -_MESSAGETYPE.values_by_name["MessageType_EncryptedMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') -_MESSAGETYPE.values_by_name["MessageType_DecryptMessage"].has_options = True -_MESSAGETYPE.values_by_name["MessageType_DecryptMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') -_MESSAGETYPE.values_by_name["MessageType_DecryptedMessage"].has_options = True -_MESSAGETYPE.values_by_name["MessageType_DecryptedMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_PassphraseRequest"].has_options = True _MESSAGETYPE.values_by_name["MessageType_PassphraseRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_PassphraseAck"].has_options = True @@ -2681,6 +2780,20 @@ _MESSAGETYPE.values_by_name["MessageType_WordRequest"].has_options = True _MESSAGETYPE.values_by_name["MessageType_WordRequest"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_WordAck"].has_options = True _MESSAGETYPE.values_by_name["MessageType_WordAck"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_CipheredKeyValue"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_CipheredKeyValue"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_EncryptMessage"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_EncryptMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_EncryptedMessage"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_EncryptedMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_DecryptMessage"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_DecryptMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_DecryptedMessage"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_DecryptedMessage"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_SignIdentity"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_SignIdentity"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_SignedIdentity"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_SignedIdentity"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkDecision"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkDecision"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkGetState"].has_options = True diff --git a/trezorlib/types_pb2.py b/trezorlib/types_pb2.py index 1f8601f38..1c87f6392 100644 --- a/trezorlib/types_pb2.py +++ b/trezorlib/types_pb2.py @@ -15,7 +15,7 @@ import google.protobuf.descriptor_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='types.proto', package='', - serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\">\n\x0eHDNodePathType\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x11\n\taddress_n\x18\x02 \x03(\r\"~\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x17\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r:\x01\x30\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x1c\n\x11\x61\x64\x64ress_type_p2sh\x18\x05 \x01(\r:\x01\x35\"[\n\x18MultisigRedeemScriptType\x12 \n\x07pubkeys\x18\x01 \x03(\x0b\x32\x0f.HDNodePathType\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\t\n\x01m\x18\x03 \x01(\r\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\xaf\x01\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\x12+\n\x08multisig\x18\x05 \x01(\x0b\x32\x19.MultisigRedeemScriptType\x12\x16\n\x0eop_return_data\x18\x06 \x01(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*_\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01\x12\x11\n\rPAYTOMULTISIG\x10\x02\x12\x11\n\rPAYTOOPRETURN\x10\x03*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') + serialized_pb='\n\x0btypes.proto\x1a google/protobuf/descriptor.proto\"\x80\x01\n\nHDNodeType\x12\r\n\x05\x64\x65pth\x18\x01 \x02(\r\x12\x13\n\x0b\x66ingerprint\x18\x02 \x02(\r\x12\x11\n\tchild_num\x18\x03 \x02(\r\x12\x12\n\nchain_code\x18\x04 \x02(\x0c\x12\x13\n\x0bprivate_key\x18\x05 \x01(\x0c\x12\x12\n\npublic_key\x18\x06 \x01(\x0c\">\n\x0eHDNodePathType\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x11\n\taddress_n\x18\x02 \x03(\r\"~\n\x08\x43oinType\x12\x11\n\tcoin_name\x18\x01 \x01(\t\x12\x15\n\rcoin_shortcut\x18\x02 \x01(\t\x12\x17\n\x0c\x61\x64\x64ress_type\x18\x03 \x01(\r:\x01\x30\x12\x11\n\tmaxfee_kb\x18\x04 \x01(\x04\x12\x1c\n\x11\x61\x64\x64ress_type_p2sh\x18\x05 \x01(\r:\x01\x35\"[\n\x18MultisigRedeemScriptType\x12 \n\x07pubkeys\x18\x01 \x03(\x0b\x32\x0f.HDNodePathType\x12\x12\n\nsignatures\x18\x02 \x03(\x0c\x12\t\n\x01m\x18\x03 \x01(\r\"\xdb\x01\n\x0bTxInputType\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x11\n\tprev_hash\x18\x02 \x02(\x0c\x12\x12\n\nprev_index\x18\x03 \x02(\r\x12\x12\n\nscript_sig\x18\x04 \x01(\x0c\x12\x1c\n\x08sequence\x18\x05 \x01(\r:\n4294967295\x12\x33\n\x0bscript_type\x18\x06 \x01(\x0e\x32\x10.InputScriptType:\x0cSPENDADDRESS\x12+\n\x08multisig\x18\x07 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\xaf\x01\n\x0cTxOutputType\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\taddress_n\x18\x02 \x03(\r\x12\x0e\n\x06\x61mount\x18\x03 \x02(\x04\x12&\n\x0bscript_type\x18\x04 \x02(\x0e\x32\x11.OutputScriptType\x12+\n\x08multisig\x18\x05 \x01(\x0b\x32\x19.MultisigRedeemScriptType\x12\x16\n\x0eop_return_data\x18\x06 \x01(\x0c\"8\n\x0fTxOutputBinType\x12\x0e\n\x06\x61mount\x18\x01 \x02(\x04\x12\x15\n\rscript_pubkey\x18\x02 \x02(\x0c\"\xc3\x01\n\x0fTransactionType\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x1c\n\x06inputs\x18\x02 \x03(\x0b\x32\x0c.TxInputType\x12%\n\x0b\x62in_outputs\x18\x03 \x03(\x0b\x32\x10.TxOutputBinType\x12\x1e\n\x07outputs\x18\x05 \x03(\x0b\x32\r.TxOutputType\x12\x11\n\tlock_time\x18\x04 \x01(\r\x12\x12\n\ninputs_cnt\x18\x06 \x01(\r\x12\x13\n\x0boutputs_cnt\x18\x07 \x01(\r\">\n\x14TxRequestDetailsType\x12\x15\n\rrequest_index\x18\x01 \x01(\r\x12\x0f\n\x07tx_hash\x18\x02 \x01(\x0c\"\\\n\x17TxRequestSerializedType\x12\x17\n\x0fsignature_index\x18\x01 \x01(\r\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x15\n\rserialized_tx\x18\x03 \x01(\x0c\"g\n\x0cIdentityType\x12\r\n\x05proto\x18\x01 \x01(\t\x12\x0c\n\x04user\x18\x02 \x01(\t\x12\x0c\n\x04host\x18\x03 \x01(\t\x12\x0c\n\x04port\x18\x04 \x01(\t\x12\x0c\n\x04path\x18\x05 \x01(\t\x12\x10\n\x05index\x18\x06 \x01(\r:\x01\x30*\xcd\x02\n\x0b\x46\x61ilureType\x12\x1d\n\x19\x46\x61ilure_UnexpectedMessage\x10\x01\x12\x1a\n\x16\x46\x61ilure_ButtonExpected\x10\x02\x12\x17\n\x13\x46\x61ilure_SyntaxError\x10\x03\x12\x1b\n\x17\x46\x61ilure_ActionCancelled\x10\x04\x12\x17\n\x13\x46\x61ilure_PinExpected\x10\x05\x12\x18\n\x14\x46\x61ilure_PinCancelled\x10\x06\x12\x16\n\x12\x46\x61ilure_PinInvalid\x10\x07\x12\x1c\n\x18\x46\x61ilure_InvalidSignature\x10\x08\x12\x11\n\rFailure_Other\x10\t\x12\x1a\n\x16\x46\x61ilure_NotEnoughFunds\x10\n\x12\x1a\n\x16\x46\x61ilure_NotInitialized\x10\x0b\x12\x19\n\x15\x46\x61ilure_FirmwareError\x10\x63*_\n\x10OutputScriptType\x12\x10\n\x0cPAYTOADDRESS\x10\x00\x12\x13\n\x0fPAYTOSCRIPTHASH\x10\x01\x12\x11\n\rPAYTOMULTISIG\x10\x02\x12\x11\n\rPAYTOOPRETURN\x10\x03*6\n\x0fInputScriptType\x12\x10\n\x0cSPENDADDRESS\x10\x00\x12\x11\n\rSPENDMULTISIG\x10\x01*D\n\x0bRequestType\x12\x0b\n\x07TXINPUT\x10\x00\x12\x0c\n\x08TXOUTPUT\x10\x01\x12\n\n\x06TXMETA\x10\x02\x12\x0e\n\nTXFINISHED\x10\x03*\xc2\x02\n\x11\x42uttonRequestType\x12\x17\n\x13\x42uttonRequest_Other\x10\x01\x12\"\n\x1e\x42uttonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1b\x42uttonRequest_ConfirmOutput\x10\x03\x12\x1d\n\x19\x42uttonRequest_ResetDevice\x10\x04\x12\x1d\n\x19\x42uttonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18\x42uttonRequest_WipeDevice\x10\x06\x12\x1d\n\x19\x42uttonRequest_ProtectCall\x10\x07\x12\x18\n\x14\x42uttonRequest_SignTx\x10\x08\x12\x1f\n\x1b\x42uttonRequest_FirmwareCheck\x10\t\x12\x19\n\x15\x42uttonRequest_Address\x10\n*\x7f\n\x14PinMatrixRequestType\x12 \n\x1cPinMatrixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03:4\n\x07wire_in\x12!.google.protobuf.EnumValueOptions\x18\xd2\x86\x03 \x01(\x08:5\n\x08wire_out\x12!.google.protobuf.EnumValueOptions\x18\xd3\x86\x03 \x01(\x08::\n\rwire_debug_in\x12!.google.protobuf.EnumValueOptions\x18\xd4\x86\x03 \x01(\x08:;\n\x0ewire_debug_out\x12!.google.protobuf.EnumValueOptions\x18\xd5\x86\x03 \x01(\x08\x42-\n\x1f\x63om.satoshilabs.trezor.protobufB\nTrezorType') _FAILURETYPE = _descriptor.EnumDescriptor( name='FailureType', @@ -74,8 +74,8 @@ _FAILURETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1280, - serialized_end=1613, + serialized_start=1385, + serialized_end=1718, ) FailureType = enum_type_wrapper.EnumTypeWrapper(_FAILURETYPE) @@ -104,8 +104,8 @@ _OUTPUTSCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1615, - serialized_end=1710, + serialized_start=1720, + serialized_end=1815, ) OutputScriptType = enum_type_wrapper.EnumTypeWrapper(_OUTPUTSCRIPTTYPE) @@ -126,8 +126,8 @@ _INPUTSCRIPTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1712, - serialized_end=1766, + serialized_start=1817, + serialized_end=1871, ) InputScriptType = enum_type_wrapper.EnumTypeWrapper(_INPUTSCRIPTTYPE) @@ -156,8 +156,8 @@ _REQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1768, - serialized_end=1836, + serialized_start=1873, + serialized_end=1941, ) RequestType = enum_type_wrapper.EnumTypeWrapper(_REQUESTTYPE) @@ -210,8 +210,8 @@ _BUTTONREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=1839, - serialized_end=2161, + serialized_start=1944, + serialized_end=2266, ) ButtonRequestType = enum_type_wrapper.EnumTypeWrapper(_BUTTONREQUESTTYPE) @@ -236,8 +236,8 @@ _PINMATRIXREQUESTTYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=2163, - serialized_end=2290, + serialized_start=2268, + serialized_end=2395, ) PinMatrixRequestType = enum_type_wrapper.EnumTypeWrapper(_PINMATRIXREQUESTTYPE) @@ -821,6 +821,69 @@ _TXREQUESTSERIALIZEDTYPE = _descriptor.Descriptor( serialized_end=1277, ) + +_IDENTITYTYPE = _descriptor.Descriptor( + name='IdentityType', + full_name='IdentityType', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='proto', full_name='IdentityType.proto', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='user', full_name='IdentityType.user', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='host', full_name='IdentityType.host', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='port', full_name='IdentityType.port', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='path', full_name='IdentityType.path', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='index', full_name='IdentityType.index', index=5, + number=6, type=13, cpp_type=3, label=1, + has_default_value=True, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=1279, + serialized_end=1382, +) + _HDNODEPATHTYPE.fields_by_name['node'].message_type = _HDNODETYPE _MULTISIGREDEEMSCRIPTTYPE.fields_by_name['pubkeys'].message_type = _HDNODEPATHTYPE _TXINPUTTYPE.fields_by_name['script_type'].enum_type = _INPUTSCRIPTTYPE @@ -840,6 +903,7 @@ DESCRIPTOR.message_types_by_name['TxOutputBinType'] = _TXOUTPUTBINTYPE DESCRIPTOR.message_types_by_name['TransactionType'] = _TRANSACTIONTYPE DESCRIPTOR.message_types_by_name['TxRequestDetailsType'] = _TXREQUESTDETAILSTYPE DESCRIPTOR.message_types_by_name['TxRequestSerializedType'] = _TXREQUESTSERIALIZEDTYPE +DESCRIPTOR.message_types_by_name['IdentityType'] = _IDENTITYTYPE class HDNodeType(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType @@ -901,6 +965,12 @@ class TxRequestSerializedType(_message.Message): # @@protoc_insertion_point(class_scope:TxRequestSerializedType) +class IdentityType(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _IDENTITYTYPE + + # @@protoc_insertion_point(class_scope:IdentityType) + google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_in) google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_out) google.protobuf.descriptor_pb2.EnumValueOptions.RegisterExtension(wire_debug_in) From 68ef2d22623fe9738fadc4fdd706ffa333234b8c Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 20 Feb 2015 18:50:53 +0100 Subject: [PATCH 0428/1535] implement SignIdentity/SignedIdentity --- tests/test_msg_signidentity.py | 32 ++++++++++++++++++++++++++++++++ trezorlib/client.py | 4 ++++ 2 files changed, 36 insertions(+) create mode 100644 tests/test_msg_signidentity.py diff --git a/tests/test_msg_signidentity.py b/tests/test_msg_signidentity.py new file mode 100644 index 000000000..741c2dd74 --- /dev/null +++ b/tests/test_msg_signidentity.py @@ -0,0 +1,32 @@ +import unittest +import common +import binascii + +from trezorlib.client import CallException +import trezorlib.types_pb2 as proto_types + +class TestMsgSignidentity(common.TrezorTest): + + def test_sign(self): + self.setup_mnemonic_nopin_nopassphrase() + + identity = proto_types.IdentityType(proto='https', user='satoshi', host='bitcoin.org', port='', path='/login', index=0) + sig = self.client.sign_identity(identity, binascii.unhexlify('531c4dd0a92caff62817eaec3065b65d'), '2015/02/20 16:50') + self.assertEqual(sig.address, '1G24md2ep5kjFGNT8Fe4RtZG2JE9GR1Xqe') + self.assertEqual(binascii.hexlify(sig.public_key), '0284efcc0a291c6ce86d016456a3c87f832f63c3266fd202a0785d3c10b02ef245') + self.assertEqual(binascii.hexlify(sig.signature), '1f66f1c8ef5ec104ea29b8270e4c5a622eb75fc51d40c81ce08176a0d3a1e197d9952b002b4bc278e7affabad3ff238e68c589f5b1a23990e019c20ac1d4269596') + + identity = proto_types.IdentityType(proto='ftp', user='satoshi', host='bitcoin.org', port='2323', path='/pub', index=3) + sig = self.client.sign_identity(identity, binascii.unhexlify('531c4dd0a92caff62817eaec3065b65d'), '2015/02/20 16:50') + self.assertEqual(sig.address, '14p4LLCkw5HcqM55hA3ueZvZGYkePNeZaU') + self.assertEqual(binascii.hexlify(sig.public_key), '0333ea41759da347f4f4f487be0c396a0f88d36218598697fba9560fdb235e1442') + self.assertEqual(binascii.hexlify(sig.signature), '1fd6e658e3e806f3a28af1b665cf1a6ada8bb2e892e8bb2770cf1a32b81552bbbb68f5f12b7d18a94fac054d30984b7e08700091f89020a78184f039d28ace2da0') + + identity = proto_types.IdentityType(proto='ssh', user='satoshi', host='bitcoin.org', port='', path='', index=47) + sig = self.client.sign_identity(identity, binascii.unhexlify('531c4dd0a92caff62817eaec3065b65d'), '2015/02/20 16:50') + self.assertEqual(sig.address, '1P3qCVo8nw8kBGp7DrYros22mKeWUkcdXw') + self.assertEqual(binascii.hexlify(sig.public_key), '02c7a59992fa91b380da753b9f725a7803d86c4ec97123b3b5158d8fb395d552d7') + self.assertEqual(binascii.hexlify(sig.signature), '1fb2ff582d156c830da4dabd5ec6bf65c65198ebf871b8cafd461b7c4aca823f0bee0a46e7f7059774b0f2a3066a705612303ae485c5e8330cc46ad6b3c85886c9') + +if __name__ == '__main__': + unittest.main() diff --git a/trezorlib/client.py b/trezorlib/client.py index 77f2e0efe..16e52d6ad 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -458,6 +458,10 @@ class ProtocolMixin(object): return self.call(proto.SignMessage(coin_name=coin_name, address_n=n, message=message)) + @expect(proto.SignedIdentity) + def sign_identity(self, identity, challenge_hidden, challenge_visual): + return self.call(proto.SignIdentity(identity=identity, challenge_hidden=challenge_hidden, challenge_visual=challenge_visual)) + def verify_message(self, address, signature, message): try: # Convert message to UTF8 NFC (seems to be a bitcoin-qt standard) From 109cca5ab3c0d46654192587f9163e405009375c Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 21 Feb 2015 12:52:01 +0100 Subject: [PATCH 0429/1535] fix _customPrintFieldValue --- trezorlib/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/tools.py b/trezorlib/tools.py index 176fefaea..e01a88771 100644 --- a/trezorlib/tools.py +++ b/trezorlib/tools.py @@ -88,7 +88,7 @@ def monkeypatch_google_protobuf_text_format(): _oldPrintFieldValue = google.protobuf.text_format.PrintFieldValue - def _customPrintFieldValue(field, value, out, indent=0, as_utf8=False, as_one_line=False): + def _customPrintFieldValue(field, value, out, indent=0, as_utf8=False, as_one_line=False, pointy_brackets=False, float_format=None): if field.type == google.protobuf.descriptor.FieldDescriptor.TYPE_BYTES: _oldPrintFieldValue(field, 'hex(%s)' % binascii.hexlify(value), out, indent, as_utf8, as_one_line) else: From 06ed6a27a7e1e37993f795f8c32cc534ab1eae25 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 22 Feb 2015 14:23:39 +0100 Subject: [PATCH 0430/1535] rename cmdtr.py to trezorctl (but keep symlink for now) --- cmdtr-emu.sh | 2 - cmdtr.py | 432 +---------------------------------------------- trezorctl | 431 ++++++++++++++++++++++++++++++++++++++++++++++ trezorctl-emu.sh | 2 + 4 files changed, 434 insertions(+), 433 deletions(-) delete mode 100755 cmdtr-emu.sh mode change 100755 => 120000 cmdtr.py create mode 100755 trezorctl create mode 100755 trezorctl-emu.sh diff --git a/cmdtr-emu.sh b/cmdtr-emu.sh deleted file mode 100755 index 6caefed6e..000000000 --- a/cmdtr-emu.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -./cmdtr.py -t pipe -p /tmp/pipe.trezor $* diff --git a/cmdtr.py b/cmdtr.py deleted file mode 100755 index e884d2da9..000000000 --- a/cmdtr.py +++ /dev/null @@ -1,431 +0,0 @@ -#!/usr/bin/python -import os -import binascii -import argparse -import json -import base64 - -from trezorlib.client import TrezorClient, TrezorClientDebug -from trezorlib.tx_api import TXAPIBitcoin -from trezorlib.protobuf_json import pb2json - -def parse_args(commands): - parser = argparse.ArgumentParser(description='Commandline tool for Trezor devices.') - parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', help='Prints communication to device') - parser.add_argument('-t', '--transport', dest='transport', choices=['usb', 'serial', 'pipe', 'socket', 'bridge'], default='usb', help="Transport used for talking with the device") - parser.add_argument('-p', '--path', dest='path', default='', help="Path used by the transport (usually serial port)") -# parser.add_argument('-dt', '--debuglink-transport', dest='debuglink_transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Debuglink transport") -# parser.add_argument('-dp', '--debuglink-path', dest='debuglink_path', default='', help="Path used by the transport (usually serial port)") - parser.add_argument('-j', '--json', dest='json', action='store_true', help="Prints result as json object") -# parser.add_argument('-d', '--debug', dest='debug', action='store_true', help='Enable low-level debugging') - - cmdparser = parser.add_subparsers(title='Available commands') - - for cmd in commands._list_commands(): - func = object.__getattribute__(commands, cmd) - - try: - arguments = func.arguments - except AttributeError: - arguments = ((('params',), {'nargs': '*'}),) - - item = cmdparser.add_parser(cmd, help=func.help) - for arg in arguments: - item.add_argument(*arg[0], **arg[1]) - - item.set_defaults(func=func) - item.set_defaults(cmd=cmd) - - return parser.parse_args() - -def get_transport(transport_string, path, **kwargs): - if transport_string == 'usb': - from trezorlib.transport_hid import HidTransport - - if path == '': - try: - path = list_usb()[0][0] - except IndexError: - raise Exception("No Trezor found on USB") - - for d in HidTransport.enumerate(): - # Two-tuple of (normal_interface, debug_interface) - if path in d: - return HidTransport(d, **kwargs) - - raise Exception("Device not found") - - if transport_string == 'serial': - from trezorlib.transport_serial import SerialTransport - return SerialTransport(path, **kwargs) - - if transport_string == 'pipe': - from trezorlib.transport_pipe import PipeTransport - return PipeTransport(path, is_device=False, **kwargs) - - if transport_string == 'socket': - from trezorlib.transport_socket import SocketTransportClient - return SocketTransportClient(path, **kwargs) - - if transport_string == 'bridge': - from trezorlib.transport_bridge import BridgeTransport - return BridgeTransport(path, **kwargs) - - if transport_string == 'fake': - from trezorlib.transport_fake import FakeTransport - return FakeTransport(path, **kwargs) - - raise NotImplemented("Unknown transport") - -class Commands(object): - def __init__(self, client): - self.client = client - - @classmethod - def _list_commands(cls): - return [ x for x in dir(cls) if not x.startswith('_') ] - - def list(self, args): - # Fake method for advertising 'list' command - pass - - def get_address(self, args): - address_n = self.client.expand_path(args.n) - return self.client.get_address(args.coin, address_n, args.show_display) - - def get_entropy(self, args): - return binascii.hexlify(self.client.get_entropy(args.size)) - - def get_features(self, args): - return self.client.features - - def list_coins(self, args): - return [ coin.coin_name for coin in self.client.features.coins ] - - def ping(self, args): - return self.client.ping(args.msg, button_protection=args.button_protection, pin_protection=args.pin_protection, passphrase_protection=args.passphrase_protection) - - def get_public_node(self, args): - address_n = self.client.expand_path(args.n) - return self.client.get_public_node(address_n) - - def set_label(self, args): - return self.client.apply_settings(label=args.label) - - def set_homescreen(self,args): - if args.filename: - from PIL import Image - im = Image.open(args.filename) - if im.size != (128,64): - raise Exception('Wrong size of the image') - im = im.convert('1') - pix = im.load() - img = '' - for j in range(64): - for i in range(128): - img += '1' if pix[i, j] else '0' - img = ''.join(chr(int(img[i:i + 8], 2)) for i in range(0, len(img), 8)) - else: - img = '\x00' - return self.client.apply_settings(homescreen=img) - - def clear_session(self, args): - return self.client.clear_session() - - def change_pin(self, args): - return self.client.change_pin(args.remove) - - def wipe_device(self, args): - return self.client.wipe_device() - - def recovery_device(self, args): - return self.client.recovery_device(args.words, args.passphrase_protection, - args.pin_protection, args.label, 'english') - - def load_device(self, args): - if not args.mnemonic and not args.xprv: - raise Exception("Please provide mnemonic or xprv") - - if args.mnemonic: - mnemonic = ' '.join(args.mnemonic) - return self.client.load_device_by_mnemonic(mnemonic, args.pin, - args.passphrase_protection, args.label, 'english') - - else: - return self.client.load_device_by_xprv(args.xprv, args.pin, - args.passphrase_protection, args.label, 'english') - - def reset_device(self, args): - return self.client.reset_device(True, args.strength, args.passphrase_protection, - args.pin_protection, args.label, 'english') - - def sign_message(self, args): - address_n = self.client.expand_path(args.n) - ret = self.client.sign_message(args.coin, address_n, args.message) - output = { - 'message': args.message, - 'address': ret.address, - 'signature': base64.b64encode(ret.signature) - } - return output - - def verify_message(self, args): - signature = base64.b64decode(args.signature) - return self.client.verify_message(args.address, signature, args.message) - - def encrypt_message(self, args): - pubkey = binascii.unhexlify(args.pubkey) - address_n = self.client.expand_path(args.n) - ret = self.client.encrypt_message(pubkey, args.message, args.display_only, args.coin, address_n) - output = { - 'nonce': binascii.hexlify(ret.nonce), - 'message': binascii.hexlify(ret.message), - 'hmac': binascii.hexlify(ret.hmac), - 'payload': base64.b64encode(ret.nonce + ret.message + ret.hmac), - } - return output - - def decrypt_message(self, args): - address_n = self.client.expand_path(args.n) - payload = base64.b64decode(args.payload) - nonce, message, msg_hmac = payload[:33], payload[33:-8], payload[-8:] - ret = self.client.decrypt_message(address_n, nonce, message, msg_hmac) - return ret - - def encrypt_keyvalue(self, args): - address_n = self.client.expand_path(args.n) - ret = self.client.encrypt_keyvalue(address_n, args.key, args.value) - return binascii.hexlify(ret) - - def decrypt_keyvalue(self, args): - address_n = self.client.expand_path(args.n) - ret = self.client.decrypt_keyvalue(address_n, args.key, args.value.decode("hex")) - return ret - - def firmware_update(self, args): - if not args.file: - raise Exception("Must provide firmware filename") - fp = open(args.file, 'r') - if fp.read(4) != 'TRZR': - raise Exception("Trezor firmware header expected") - - fp.seek(0) - return self.client.firmware_update(fp=open(args.file, 'r')) - - list.help = 'List connected Trezor USB devices' - ping.help = 'Send ping message' - get_address.help = 'Get bitcoin address in base58 encoding' - get_entropy.help = 'Get example entropy' - get_features.help = 'Retrieve device features and settings' - get_public_node.help = 'Get public node of given path' - set_label.help = 'Set new wallet label' - set_homescreen.help = 'Set new homescreen' - clear_session.help = 'Clear session (remove cached PIN, passphrase, etc.)' - change_pin.help = 'Change new PIN or remove existing' - list_coins.help = 'List all supported coin types by the device' - wipe_device.help = 'Reset device to factory defaults and remove all private data.' - recovery_device.help = 'Start safe recovery workflow' - load_device.help = 'Load custom configuration to the device' - reset_device.help = 'Perform device setup and generate new seed' - sign_message.help = 'Sign message using address of given path' - verify_message.help = 'Verify message' - encrypt_message.help = 'Encrypt message' - decrypt_message.help = 'Decrypt message' - encrypt_keyvalue.help = 'Encrypt value by given key and path' - decrypt_keyvalue.help = 'Decrypt value by given key and path' - firmware_update.help = 'Upload new firmware to device (must be in bootloader mode)' - - get_address.arguments = ( - (('-c', '--coin'), {'type': str, 'default': 'Bitcoin'}), - (('-n', '-address'), {'type': str}), - (('-d', '--show-display'), {'action': 'store_true', 'default': False}), - ) - - get_entropy.arguments = ( - (('size',), {'type': int}), - ) - - get_features.arguments = () - - list_coins.arguments = () - - ping.arguments = ( - (('msg',), {'type': str}), - (('-b', '--button-protection'), {'action': 'store_true', 'default': False}), - (('-p', '--pin-protection'), {'action': 'store_true', 'default': False}), - (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), - ) - - set_label.arguments = ( - (('-l', '--label',), {'type': str, 'default': ''}), -# (('-c', '--clear'), {'action': 'store_true', 'default': False}) - ) - - set_homescreen.arguments = ( - (('-f', '--filename',), {'type': str, 'default': ''}), - ) - change_pin.arguments = ( - (('-r', '--remove'), {'action': 'store_true', 'default': False}), - ) - - wipe_device.arguments = () - - recovery_device.arguments = ( - (('-w', '--words'), {'type': int}), - (('-p', '--pin-protection'), {'action': 'store_true', 'default': False}), - (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), - (('-l', '--label'), {'type': str, 'default': ''}), - ) - - load_device.arguments = ( - (('-m', '--mnemonic'), {'type': str, 'nargs': '+'}), - (('-x', '--xprv'), {'type': str}), - (('-p', '--pin'), {'type': str, 'default': ''}), - (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), - (('-l', '--label'), {'type': str, 'default': ''}), - ) - - reset_device.arguments = ( - (('-t', '--strength'), {'type': int, 'choices': [128, 192, 256], 'default': 256}), - (('-p', '--pin-protection'), {'action': 'store_true', 'default': False}), - (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), - (('-l', '--label'), {'type': str, 'default': ''}), - ) - - sign_message.arguments = ( - (('-c', '--coin'), {'type': str, 'default': 'Bitcoin'}), - (('-n', '-address'), {'type': str}), - (('message',), {'type': str}), - ) - - encrypt_message.arguments = ( - (('pubkey',), {'type': str}), - (('message',), {'type': str}), - (('-d', '--display-only'), {'action': 'store_true', 'default': False}), - (('-c', '--coin'), {'type': str, 'default': 'Bitcoin'}), - (('-n', '-address'), {'type': str}), - ) - - decrypt_message.arguments = ( - (('-n', '-address'), {'type': str}), - (('payload',), {'type': str}), - ) - - verify_message.arguments = ( - (('address',), {'type': str}), - (('signature',), {'type': str}), - (('message',), {'type': str}), - ) - - encrypt_keyvalue.arguments = ( - (('-n', '-address'), {'type': str}), - (('key',), {'type': str}), - (('value',), {'type': str}), - ) - - decrypt_keyvalue.arguments = ( - (('-n', '-address'), {'type': str}), - (('key',), {'type': str}), - (('value',), {'type': str}), - ) - - get_public_node.arguments = ( - (('-n', '-address'), {'type': str}), - ) - - firmware_update.arguments = ( - (('-f', '--file'), {'type': str}), - ) - -def list_usb(): - from trezorlib.transport_hid import HidTransport - return HidTransport.enumerate() - -''' -class PinMatrixThread(threading.Thread): - # Hacked PinMatrixWidget into command line tool :-). - def __init__(self, input_text, message): - super(PinMatrixThread, self).__init__() - self.input_text = input_text - self.message = message - self.pin_value = '' - - def run(self): - from trezorlib.pinmatrix import PinMatrixWidget - - import sys - from PyQt4.Qt import QApplication, QWidget, QVBoxLayout - from PyQt4.QtGui import QPushButton, QLabel - from PyQt4.QtCore import QObject, SIGNAL - - a = QApplication(sys.argv) -pass - matrix = PinMatrixWidget() - - def clicked(): - self.pin_value = str(matrix.get_value()) - a.closeAllWindows() - - ok = QPushButton('OK') - QObject.connect(ok, SIGNAL('clicked()'), clicked) - - vbox = QVBoxLayout() - vbox.addWidget(QLabel(self.input_text + self.message)) - vbox.addWidget(matrix) - vbox.addWidget(ok) - - w = QWidget() - w.setLayout(vbox) - w.move(100, 100) - w.show() - - a.exec_() - -def qt_pin_func(input_text, message=None): - # This is a hack to display Qt window in non-qt application. - # Qt window just asks for PIN and closes itself, which trigger join(). - if False: # os.getenv('DISPLAY'): - # Let's hope that system is configured properly and this won't crash - t = PinMatrixThread(input_text, message) - t.start() - t.join() - return t.pin_value - else: - # Most likely no X is running, - # let's fallback to default pin_func implementation - return pin_func(input_text, message) -''' - -def main(): - args = parse_args(Commands) - - if args.cmd == 'list': - devices = list_usb() - if args.json: - print json.dumps(devices) - else: - for dev in devices: - if dev[1] != None: - print "%s - debuglink enabled" % dev[0] - else: - print dev[0] - return - - transport = get_transport(args.transport, args.path) - if args.verbose: - client = TrezorClientDebug(transport) - else: - client = TrezorClient(transport) - - client.set_tx_api(TXAPIBitcoin()) - cmds = Commands(client) - - res = args.func(cmds, args) - - if args.json: - print json.dumps(res, sort_keys=True, indent=4) - else: - print res - -if __name__ == '__main__': - main() diff --git a/cmdtr.py b/cmdtr.py new file mode 120000 index 000000000..d1e9d2464 --- /dev/null +++ b/cmdtr.py @@ -0,0 +1 @@ +trezorctl \ No newline at end of file diff --git a/trezorctl b/trezorctl new file mode 100755 index 000000000..e884d2da9 --- /dev/null +++ b/trezorctl @@ -0,0 +1,431 @@ +#!/usr/bin/python +import os +import binascii +import argparse +import json +import base64 + +from trezorlib.client import TrezorClient, TrezorClientDebug +from trezorlib.tx_api import TXAPIBitcoin +from trezorlib.protobuf_json import pb2json + +def parse_args(commands): + parser = argparse.ArgumentParser(description='Commandline tool for Trezor devices.') + parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', help='Prints communication to device') + parser.add_argument('-t', '--transport', dest='transport', choices=['usb', 'serial', 'pipe', 'socket', 'bridge'], default='usb', help="Transport used for talking with the device") + parser.add_argument('-p', '--path', dest='path', default='', help="Path used by the transport (usually serial port)") +# parser.add_argument('-dt', '--debuglink-transport', dest='debuglink_transport', choices=['usb', 'serial', 'pipe', 'socket'], default='usb', help="Debuglink transport") +# parser.add_argument('-dp', '--debuglink-path', dest='debuglink_path', default='', help="Path used by the transport (usually serial port)") + parser.add_argument('-j', '--json', dest='json', action='store_true', help="Prints result as json object") +# parser.add_argument('-d', '--debug', dest='debug', action='store_true', help='Enable low-level debugging') + + cmdparser = parser.add_subparsers(title='Available commands') + + for cmd in commands._list_commands(): + func = object.__getattribute__(commands, cmd) + + try: + arguments = func.arguments + except AttributeError: + arguments = ((('params',), {'nargs': '*'}),) + + item = cmdparser.add_parser(cmd, help=func.help) + for arg in arguments: + item.add_argument(*arg[0], **arg[1]) + + item.set_defaults(func=func) + item.set_defaults(cmd=cmd) + + return parser.parse_args() + +def get_transport(transport_string, path, **kwargs): + if transport_string == 'usb': + from trezorlib.transport_hid import HidTransport + + if path == '': + try: + path = list_usb()[0][0] + except IndexError: + raise Exception("No Trezor found on USB") + + for d in HidTransport.enumerate(): + # Two-tuple of (normal_interface, debug_interface) + if path in d: + return HidTransport(d, **kwargs) + + raise Exception("Device not found") + + if transport_string == 'serial': + from trezorlib.transport_serial import SerialTransport + return SerialTransport(path, **kwargs) + + if transport_string == 'pipe': + from trezorlib.transport_pipe import PipeTransport + return PipeTransport(path, is_device=False, **kwargs) + + if transport_string == 'socket': + from trezorlib.transport_socket import SocketTransportClient + return SocketTransportClient(path, **kwargs) + + if transport_string == 'bridge': + from trezorlib.transport_bridge import BridgeTransport + return BridgeTransport(path, **kwargs) + + if transport_string == 'fake': + from trezorlib.transport_fake import FakeTransport + return FakeTransport(path, **kwargs) + + raise NotImplemented("Unknown transport") + +class Commands(object): + def __init__(self, client): + self.client = client + + @classmethod + def _list_commands(cls): + return [ x for x in dir(cls) if not x.startswith('_') ] + + def list(self, args): + # Fake method for advertising 'list' command + pass + + def get_address(self, args): + address_n = self.client.expand_path(args.n) + return self.client.get_address(args.coin, address_n, args.show_display) + + def get_entropy(self, args): + return binascii.hexlify(self.client.get_entropy(args.size)) + + def get_features(self, args): + return self.client.features + + def list_coins(self, args): + return [ coin.coin_name for coin in self.client.features.coins ] + + def ping(self, args): + return self.client.ping(args.msg, button_protection=args.button_protection, pin_protection=args.pin_protection, passphrase_protection=args.passphrase_protection) + + def get_public_node(self, args): + address_n = self.client.expand_path(args.n) + return self.client.get_public_node(address_n) + + def set_label(self, args): + return self.client.apply_settings(label=args.label) + + def set_homescreen(self,args): + if args.filename: + from PIL import Image + im = Image.open(args.filename) + if im.size != (128,64): + raise Exception('Wrong size of the image') + im = im.convert('1') + pix = im.load() + img = '' + for j in range(64): + for i in range(128): + img += '1' if pix[i, j] else '0' + img = ''.join(chr(int(img[i:i + 8], 2)) for i in range(0, len(img), 8)) + else: + img = '\x00' + return self.client.apply_settings(homescreen=img) + + def clear_session(self, args): + return self.client.clear_session() + + def change_pin(self, args): + return self.client.change_pin(args.remove) + + def wipe_device(self, args): + return self.client.wipe_device() + + def recovery_device(self, args): + return self.client.recovery_device(args.words, args.passphrase_protection, + args.pin_protection, args.label, 'english') + + def load_device(self, args): + if not args.mnemonic and not args.xprv: + raise Exception("Please provide mnemonic or xprv") + + if args.mnemonic: + mnemonic = ' '.join(args.mnemonic) + return self.client.load_device_by_mnemonic(mnemonic, args.pin, + args.passphrase_protection, args.label, 'english') + + else: + return self.client.load_device_by_xprv(args.xprv, args.pin, + args.passphrase_protection, args.label, 'english') + + def reset_device(self, args): + return self.client.reset_device(True, args.strength, args.passphrase_protection, + args.pin_protection, args.label, 'english') + + def sign_message(self, args): + address_n = self.client.expand_path(args.n) + ret = self.client.sign_message(args.coin, address_n, args.message) + output = { + 'message': args.message, + 'address': ret.address, + 'signature': base64.b64encode(ret.signature) + } + return output + + def verify_message(self, args): + signature = base64.b64decode(args.signature) + return self.client.verify_message(args.address, signature, args.message) + + def encrypt_message(self, args): + pubkey = binascii.unhexlify(args.pubkey) + address_n = self.client.expand_path(args.n) + ret = self.client.encrypt_message(pubkey, args.message, args.display_only, args.coin, address_n) + output = { + 'nonce': binascii.hexlify(ret.nonce), + 'message': binascii.hexlify(ret.message), + 'hmac': binascii.hexlify(ret.hmac), + 'payload': base64.b64encode(ret.nonce + ret.message + ret.hmac), + } + return output + + def decrypt_message(self, args): + address_n = self.client.expand_path(args.n) + payload = base64.b64decode(args.payload) + nonce, message, msg_hmac = payload[:33], payload[33:-8], payload[-8:] + ret = self.client.decrypt_message(address_n, nonce, message, msg_hmac) + return ret + + def encrypt_keyvalue(self, args): + address_n = self.client.expand_path(args.n) + ret = self.client.encrypt_keyvalue(address_n, args.key, args.value) + return binascii.hexlify(ret) + + def decrypt_keyvalue(self, args): + address_n = self.client.expand_path(args.n) + ret = self.client.decrypt_keyvalue(address_n, args.key, args.value.decode("hex")) + return ret + + def firmware_update(self, args): + if not args.file: + raise Exception("Must provide firmware filename") + fp = open(args.file, 'r') + if fp.read(4) != 'TRZR': + raise Exception("Trezor firmware header expected") + + fp.seek(0) + return self.client.firmware_update(fp=open(args.file, 'r')) + + list.help = 'List connected Trezor USB devices' + ping.help = 'Send ping message' + get_address.help = 'Get bitcoin address in base58 encoding' + get_entropy.help = 'Get example entropy' + get_features.help = 'Retrieve device features and settings' + get_public_node.help = 'Get public node of given path' + set_label.help = 'Set new wallet label' + set_homescreen.help = 'Set new homescreen' + clear_session.help = 'Clear session (remove cached PIN, passphrase, etc.)' + change_pin.help = 'Change new PIN or remove existing' + list_coins.help = 'List all supported coin types by the device' + wipe_device.help = 'Reset device to factory defaults and remove all private data.' + recovery_device.help = 'Start safe recovery workflow' + load_device.help = 'Load custom configuration to the device' + reset_device.help = 'Perform device setup and generate new seed' + sign_message.help = 'Sign message using address of given path' + verify_message.help = 'Verify message' + encrypt_message.help = 'Encrypt message' + decrypt_message.help = 'Decrypt message' + encrypt_keyvalue.help = 'Encrypt value by given key and path' + decrypt_keyvalue.help = 'Decrypt value by given key and path' + firmware_update.help = 'Upload new firmware to device (must be in bootloader mode)' + + get_address.arguments = ( + (('-c', '--coin'), {'type': str, 'default': 'Bitcoin'}), + (('-n', '-address'), {'type': str}), + (('-d', '--show-display'), {'action': 'store_true', 'default': False}), + ) + + get_entropy.arguments = ( + (('size',), {'type': int}), + ) + + get_features.arguments = () + + list_coins.arguments = () + + ping.arguments = ( + (('msg',), {'type': str}), + (('-b', '--button-protection'), {'action': 'store_true', 'default': False}), + (('-p', '--pin-protection'), {'action': 'store_true', 'default': False}), + (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), + ) + + set_label.arguments = ( + (('-l', '--label',), {'type': str, 'default': ''}), +# (('-c', '--clear'), {'action': 'store_true', 'default': False}) + ) + + set_homescreen.arguments = ( + (('-f', '--filename',), {'type': str, 'default': ''}), + ) + change_pin.arguments = ( + (('-r', '--remove'), {'action': 'store_true', 'default': False}), + ) + + wipe_device.arguments = () + + recovery_device.arguments = ( + (('-w', '--words'), {'type': int}), + (('-p', '--pin-protection'), {'action': 'store_true', 'default': False}), + (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), + (('-l', '--label'), {'type': str, 'default': ''}), + ) + + load_device.arguments = ( + (('-m', '--mnemonic'), {'type': str, 'nargs': '+'}), + (('-x', '--xprv'), {'type': str}), + (('-p', '--pin'), {'type': str, 'default': ''}), + (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), + (('-l', '--label'), {'type': str, 'default': ''}), + ) + + reset_device.arguments = ( + (('-t', '--strength'), {'type': int, 'choices': [128, 192, 256], 'default': 256}), + (('-p', '--pin-protection'), {'action': 'store_true', 'default': False}), + (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), + (('-l', '--label'), {'type': str, 'default': ''}), + ) + + sign_message.arguments = ( + (('-c', '--coin'), {'type': str, 'default': 'Bitcoin'}), + (('-n', '-address'), {'type': str}), + (('message',), {'type': str}), + ) + + encrypt_message.arguments = ( + (('pubkey',), {'type': str}), + (('message',), {'type': str}), + (('-d', '--display-only'), {'action': 'store_true', 'default': False}), + (('-c', '--coin'), {'type': str, 'default': 'Bitcoin'}), + (('-n', '-address'), {'type': str}), + ) + + decrypt_message.arguments = ( + (('-n', '-address'), {'type': str}), + (('payload',), {'type': str}), + ) + + verify_message.arguments = ( + (('address',), {'type': str}), + (('signature',), {'type': str}), + (('message',), {'type': str}), + ) + + encrypt_keyvalue.arguments = ( + (('-n', '-address'), {'type': str}), + (('key',), {'type': str}), + (('value',), {'type': str}), + ) + + decrypt_keyvalue.arguments = ( + (('-n', '-address'), {'type': str}), + (('key',), {'type': str}), + (('value',), {'type': str}), + ) + + get_public_node.arguments = ( + (('-n', '-address'), {'type': str}), + ) + + firmware_update.arguments = ( + (('-f', '--file'), {'type': str}), + ) + +def list_usb(): + from trezorlib.transport_hid import HidTransport + return HidTransport.enumerate() + +''' +class PinMatrixThread(threading.Thread): + # Hacked PinMatrixWidget into command line tool :-). + def __init__(self, input_text, message): + super(PinMatrixThread, self).__init__() + self.input_text = input_text + self.message = message + self.pin_value = '' + + def run(self): + from trezorlib.pinmatrix import PinMatrixWidget + + import sys + from PyQt4.Qt import QApplication, QWidget, QVBoxLayout + from PyQt4.QtGui import QPushButton, QLabel + from PyQt4.QtCore import QObject, SIGNAL + + a = QApplication(sys.argv) +pass + matrix = PinMatrixWidget() + + def clicked(): + self.pin_value = str(matrix.get_value()) + a.closeAllWindows() + + ok = QPushButton('OK') + QObject.connect(ok, SIGNAL('clicked()'), clicked) + + vbox = QVBoxLayout() + vbox.addWidget(QLabel(self.input_text + self.message)) + vbox.addWidget(matrix) + vbox.addWidget(ok) + + w = QWidget() + w.setLayout(vbox) + w.move(100, 100) + w.show() + + a.exec_() + +def qt_pin_func(input_text, message=None): + # This is a hack to display Qt window in non-qt application. + # Qt window just asks for PIN and closes itself, which trigger join(). + if False: # os.getenv('DISPLAY'): + # Let's hope that system is configured properly and this won't crash + t = PinMatrixThread(input_text, message) + t.start() + t.join() + return t.pin_value + else: + # Most likely no X is running, + # let's fallback to default pin_func implementation + return pin_func(input_text, message) +''' + +def main(): + args = parse_args(Commands) + + if args.cmd == 'list': + devices = list_usb() + if args.json: + print json.dumps(devices) + else: + for dev in devices: + if dev[1] != None: + print "%s - debuglink enabled" % dev[0] + else: + print dev[0] + return + + transport = get_transport(args.transport, args.path) + if args.verbose: + client = TrezorClientDebug(transport) + else: + client = TrezorClient(transport) + + client.set_tx_api(TXAPIBitcoin()) + cmds = Commands(client) + + res = args.func(cmds, args) + + if args.json: + print json.dumps(res, sort_keys=True, indent=4) + else: + print res + +if __name__ == '__main__': + main() diff --git a/trezorctl-emu.sh b/trezorctl-emu.sh new file mode 100755 index 000000000..1ff954678 --- /dev/null +++ b/trezorctl-emu.sh @@ -0,0 +1,2 @@ +#!/bin/sh +./trezorctl -t pipe -p /tmp/pipe.trezor $* From 3358906c65d1b32bd0faf1a5d1029b6be482ded2 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 22 Feb 2015 14:28:47 +0100 Subject: [PATCH 0431/1535] add trezorctl to package and bump version --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 121d82482..a34688349 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name='trezor', - version='0.6.1', + version='0.6.2', author='Bitcoin TREZOR', author_email='info@bitcointrezor.com', description='Python library for communicating with TREZOR Bitcoin Hardware Wallet', @@ -26,6 +26,7 @@ setup( 'trezorlib.tx_api', 'trezorlib.types_pb2', ], + scripts = ['trezorctl'], test_suite='tests', install_requires=['ecdsa>=0.9', 'protobuf==2.5.0', 'mnemonic>=0.8', 'hidapi>=0.7.99'], include_package_data=True, From 049166d6c95184f726f9b310520d7440b721d392 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 22 Feb 2015 14:38:33 +0100 Subject: [PATCH 0432/1535] disable filecache by default --- setup.py | 2 +- trezorlib/tx_api.py | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/setup.py b/setup.py index a34688349..f10eb57f7 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name='trezor', - version='0.6.2', + version='0.6.3', author='Bitcoin TREZOR', author_email='info@bitcointrezor.com', description='Python library for communicating with TREZOR Bitcoin Hardware Wallet', diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index 553265163..581641135 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -3,13 +3,14 @@ import urllib2 import json from decimal import Decimal try: - from filecache import filecache, MONTH + raise Exception() # remove this line to enable caching + from filecache import filecache, DAY except: def filecache(x): def _inner(y): return y return _inner - MONTH = None + DAY = None import types_pb2 as proto_types @@ -89,14 +90,14 @@ def insight_tx(url): class TXAPIBitcoin(object): - @filecache(MONTH) + @filecache(DAY) def get_tx(self, txhash): url = 'https://insight.bitpay.com/api/tx/%s' % txhash return insight_tx(url) class TXAPITestnet(object): - @filecache(MONTH) + @filecache(DAY) def get_tx(self, txhash): url = 'https://test-insight.bitpay.com/api/tx/%s' % txhash return insight_tx(url) From 45d9955bc27320a6c2cdac96d6c1a7783a2ffa22 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 25 Feb 2015 17:54:27 +0100 Subject: [PATCH 0433/1535] speed up communication --- trezorlib/transport_hid.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/transport_hid.py b/trezorlib/transport_hid.py index 114679cbf..e1df82dc1 100644 --- a/trezorlib/transport_hid.py +++ b/trezorlib/transport_hid.py @@ -122,7 +122,7 @@ class HidTransport(Transport): # device is still alive raise ConnectionError("Connection failed") - time.sleep(0.05) + time.sleep(0.001) continue report_id = data[0] From f74d31788c9ea2524c27fd216a8e5ce0649bca35 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sat, 28 Feb 2015 14:06:23 +0100 Subject: [PATCH 0434/1535] old PIN -> current PIN --- trezorlib/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 16e52d6ad..8b60dd533 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -166,7 +166,7 @@ class TextUIMixin(object): def callback_PinMatrixRequest(self, msg): if msg.type == 1: - desc = 'old PIN' + desc = 'current PIN' elif msg.type == 2: desc = 'new PIN' elif msg.type == 3: From e4429242aacb9c7e6de68e3fe8d9e18854d21c42 Mon Sep 17 00:00:00 2001 From: nelisky Date: Tue, 3 Mar 2015 23:36:51 +0000 Subject: [PATCH 0435/1535] Allow insight_tx to be passed a dict object instead of an url --- trezorlib/tx_api.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index 581641135..62a7867fe 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -52,12 +52,15 @@ def opcode_serialize(opcode): except: raise Exception('Unknown script opcode: %s' % opcode) -def insight_tx(url): - try: - f = urllib2.urlopen(url) - except: - raise Exception('URL error: %s' % url) - data = json.load(f) +def insight_tx(url, rawdata=False): + if not rawdata: + try: + f = urllib2.urlopen(url) + data = json.load(f) + except: + raise Exception('URL error: %s' % url) + else: + data = url t = proto_types.TransactionType() t.version = data['version'] From f3b7629a4fad2ed96ae0cb434d54d3cc087d42bd Mon Sep 17 00:00:00 2001 From: nelisky Date: Tue, 3 Mar 2015 23:37:32 +0000 Subject: [PATCH 0436/1535] Prevent floating point issues when pushing output amount --- trezorlib/tx_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index 62a7867fe..94214f0d6 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -84,7 +84,7 @@ def insight_tx(url, rawdata=False): for vout in data['vout']: o = t.bin_outputs.add() - o.amount = int(Decimal(vout['value']) * 100000000) + o.amount = int(Decimal(str(vout['value'])) * 100000000) asm = vout['scriptPubKey']['asm'].split(' ') asm = [ opcode_serialize(x) for x in asm ] o.script_pubkey = ''.join(asm) From 9107aab76a2fc9b439a99a753097d34c4bfe6385 Mon Sep 17 00:00:00 2001 From: Jochen Hoenicke Date: Thu, 5 Mar 2015 11:00:18 +0100 Subject: [PATCH 0437/1535] Use right URL for bridge and keep-alive connection The bridge is using https with a certificate signed for localback.net. Use a session object (self.conn) to keep connection alive and prevent costly ssl handshakes for every call. --- trezorlib/transport_bridge.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/trezorlib/transport_bridge.py b/trezorlib/transport_bridge.py index 3991dcc50..c150e6656 100644 --- a/trezorlib/transport_bridge.py +++ b/trezorlib/transport_bridge.py @@ -7,7 +7,7 @@ import mapping from transport import Transport import messages_pb2 as proto -TREZORD_HOST = 'http://localhost:21324' +TREZORD_HOST = 'https://localback.net:21324' CONFIG_URL = 'https://mytrezor.com/data/plugin/config_signed.bin' def get_error(resp): @@ -22,11 +22,13 @@ class BridgeTransport(Transport): config = r.text - r = requests.post(TREZORD_HOST + '/configure', data=config) + self.conn = requests.Session(); + + r = self.conn.post(TREZORD_HOST + '/configure', data=config, verify=None) if r.status_code != 200: raise Exception('trezord: Could not configure' + get_error(r)) - r = requests.get(TREZORD_HOST + '/enumerate') + r = self.conn.get(TREZORD_HOST + '/enumerate', verify=None) if r.status_code != 200: raise Exception('trezord: Could not enumerate devices' + get_error(r)) enum = r.json() @@ -41,14 +43,14 @@ class BridgeTransport(Transport): super(BridgeTransport, self).__init__(device, *args, **kwargs) def _open(self): - r = requests.post(TREZORD_HOST + '/acquire/%s' % self.path) + r = self.conn.post(TREZORD_HOST + '/acquire/%s' % self.path, verify=None) if r.status_code != 200: raise Exception('trezord: Could not acquire session' + get_error(r)) resp = r.json() self.session = resp['session'] def _close(self): - r = requests.post(TREZORD_HOST + '/release/%s' % self.session) + r = self.conn.post(TREZORD_HOST + '/release/%s' % self.session, verify=None) if r.status_code != 200: raise Exception('trezord: Could not release session' + get_error(r)) else: @@ -61,7 +63,7 @@ class BridgeTransport(Transport): cls = protobuf_msg.__class__.__name__ msg = protobuf_json.pb2json(protobuf_msg) payload = '{"type": "%s", "message": %s}' % (cls, json.dumps(msg)) - r = requests.post(TREZORD_HOST + '/call/%s' % self.session, data=payload) + r = self.conn.post(TREZORD_HOST + '/call/%s' % self.session, data=payload, verify=None) if r.status_code != 200: raise Exception('trezord: Could not write message' + get_error(r)) else: From 6f59de799a2d928e2f81cb0083a9bafc2c72b2d7 Mon Sep 17 00:00:00 2001 From: Jochen Hoenicke Date: Thu, 5 Mar 2015 11:15:53 +0100 Subject: [PATCH 0438/1535] Verify the localback.net certificate --- trezorlib/transport_bridge.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/trezorlib/transport_bridge.py b/trezorlib/transport_bridge.py index c150e6656..56ded7dfa 100644 --- a/trezorlib/transport_bridge.py +++ b/trezorlib/transport_bridge.py @@ -24,11 +24,11 @@ class BridgeTransport(Transport): self.conn = requests.Session(); - r = self.conn.post(TREZORD_HOST + '/configure', data=config, verify=None) + r = self.conn.post(TREZORD_HOST + '/configure', data=config) if r.status_code != 200: raise Exception('trezord: Could not configure' + get_error(r)) - r = self.conn.get(TREZORD_HOST + '/enumerate', verify=None) + r = self.conn.get(TREZORD_HOST + '/enumerate') if r.status_code != 200: raise Exception('trezord: Could not enumerate devices' + get_error(r)) enum = r.json() @@ -43,14 +43,14 @@ class BridgeTransport(Transport): super(BridgeTransport, self).__init__(device, *args, **kwargs) def _open(self): - r = self.conn.post(TREZORD_HOST + '/acquire/%s' % self.path, verify=None) + r = self.conn.post(TREZORD_HOST + '/acquire/%s' % self.path) if r.status_code != 200: raise Exception('trezord: Could not acquire session' + get_error(r)) resp = r.json() self.session = resp['session'] def _close(self): - r = self.conn.post(TREZORD_HOST + '/release/%s' % self.session, verify=None) + r = self.conn.post(TREZORD_HOST + '/release/%s' % self.session) if r.status_code != 200: raise Exception('trezord: Could not release session' + get_error(r)) else: @@ -63,7 +63,7 @@ class BridgeTransport(Transport): cls = protobuf_msg.__class__.__name__ msg = protobuf_json.pb2json(protobuf_msg) payload = '{"type": "%s", "message": %s}' % (cls, json.dumps(msg)) - r = self.conn.post(TREZORD_HOST + '/call/%s' % self.session, data=payload, verify=None) + r = self.conn.post(TREZORD_HOST + '/call/%s' % self.session, data=payload) if r.status_code != 200: raise Exception('trezord: Could not write message' + get_error(r)) else: From 33a913d951878116680d8c8b44f9c17e4ab76389 Mon Sep 17 00:00:00 2001 From: ywecur Date: Mon, 9 Mar 2015 13:12:11 +0100 Subject: [PATCH 0439/1535] =?UTF-8?q?Add=20=E2=80=99git=E2=80=98=20to=20li?= =?UTF-8?q?st=20of=20programs=20to=20install=20under=20Debian-Ubuntu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 32e5f301b..2522f03ce 100644 --- a/README.rst +++ b/README.rst @@ -57,7 +57,7 @@ How to install (Windows) How to install (Debian-Ubuntu) ------------------------------ -* sudo apt-get install python-dev python-setuptools cython libusb-1.0-0-dev libudev-dev +* sudo apt-get install python-dev python-setuptools cython libusb-1.0-0-dev libudev-dev git * git clone https://github.com/trezor/python-trezor.git * cd python-trezor * python setup.py install (or develop) From 95817eb5d39bad33aa15f7da7c5efc765746de61 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 17 Mar 2015 15:11:28 +0100 Subject: [PATCH 0440/1535] adapt to SLIP-0013 --- tests/test_msg_signidentity.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/test_msg_signidentity.py b/tests/test_msg_signidentity.py index 741c2dd74..4d347c0f5 100644 --- a/tests/test_msg_signidentity.py +++ b/tests/test_msg_signidentity.py @@ -12,21 +12,21 @@ class TestMsgSignidentity(common.TrezorTest): identity = proto_types.IdentityType(proto='https', user='satoshi', host='bitcoin.org', port='', path='/login', index=0) sig = self.client.sign_identity(identity, binascii.unhexlify('531c4dd0a92caff62817eaec3065b65d'), '2015/02/20 16:50') - self.assertEqual(sig.address, '1G24md2ep5kjFGNT8Fe4RtZG2JE9GR1Xqe') - self.assertEqual(binascii.hexlify(sig.public_key), '0284efcc0a291c6ce86d016456a3c87f832f63c3266fd202a0785d3c10b02ef245') - self.assertEqual(binascii.hexlify(sig.signature), '1f66f1c8ef5ec104ea29b8270e4c5a622eb75fc51d40c81ce08176a0d3a1e197d9952b002b4bc278e7affabad3ff238e68c589f5b1a23990e019c20ac1d4269596') + self.assertEqual(sig.address, '17F17smBTX9VTZA9Mj8LM5QGYNZnmziCjL') + self.assertEqual(binascii.hexlify(sig.public_key), '023a472219ad3327b07c18273717bb3a40b39b743756bf287fbd5fa9d263237f45') + self.assertEqual(binascii.hexlify(sig.signature), '1fe5abeb9ed3926229a4c7d6936cf58c7357180c90a0e9565133b8578e118c5b2c7c4b6902afe81ce46f3b77e8f91a7cdae30e433ce2706166bf27ff111fc9734a') identity = proto_types.IdentityType(proto='ftp', user='satoshi', host='bitcoin.org', port='2323', path='/pub', index=3) sig = self.client.sign_identity(identity, binascii.unhexlify('531c4dd0a92caff62817eaec3065b65d'), '2015/02/20 16:50') - self.assertEqual(sig.address, '14p4LLCkw5HcqM55hA3ueZvZGYkePNeZaU') - self.assertEqual(binascii.hexlify(sig.public_key), '0333ea41759da347f4f4f487be0c396a0f88d36218598697fba9560fdb235e1442') - self.assertEqual(binascii.hexlify(sig.signature), '1fd6e658e3e806f3a28af1b665cf1a6ada8bb2e892e8bb2770cf1a32b81552bbbb68f5f12b7d18a94fac054d30984b7e08700091f89020a78184f039d28ace2da0') + self.assertEqual(sig.address, '1KAr6r5qF2kADL8bAaRQBjGKYEGxn9WrbS') + self.assertEqual(binascii.hexlify(sig.public_key), '0266cf12d2ba381c5fd797da0d64f59c07a6f1b034ad276cca6bf2729e92b20d9c') + self.assertEqual(binascii.hexlify(sig.signature), '1fda9910ed2c8cb5a79558c4f50d5030454cc4115931eac8e6307eb4f6ef87490b484beeff76369fa2f46e0677eb535bd78f35d0f987043ce14f25f9c610cb9c3a') identity = proto_types.IdentityType(proto='ssh', user='satoshi', host='bitcoin.org', port='', path='', index=47) sig = self.client.sign_identity(identity, binascii.unhexlify('531c4dd0a92caff62817eaec3065b65d'), '2015/02/20 16:50') - self.assertEqual(sig.address, '1P3qCVo8nw8kBGp7DrYros22mKeWUkcdXw') - self.assertEqual(binascii.hexlify(sig.public_key), '02c7a59992fa91b380da753b9f725a7803d86c4ec97123b3b5158d8fb395d552d7') - self.assertEqual(binascii.hexlify(sig.signature), '1fb2ff582d156c830da4dabd5ec6bf65c65198ebf871b8cafd461b7c4aca823f0bee0a46e7f7059774b0f2a3066a705612303ae485c5e8330cc46ad6b3c85886c9') + self.assertEqual(sig.address, '16MMzfyr5LPBNZ359NhjCthi2scrMufTAM') + self.assertEqual(binascii.hexlify(sig.public_key), '03cebfae5359d6c48b8dcf9da22b2113096548407ce21da8ab28a886f750f217f4') + self.assertEqual(binascii.hexlify(sig.signature), '20a645c1bfa9629d92c9ec5e21350264b806c44042597d77b635e89e3c8ea1a0230662df667b3d427a2c232d41b173b86a5492caf22d317820d7e5112186e0a933') if __name__ == '__main__': unittest.main() From 4ffadc22169b5dad95e5ee758b172f4fafa8c593 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 2 Apr 2015 19:05:51 +0200 Subject: [PATCH 0441/1535] trezorctl firmware_update: allow updating from URL, detects hex and converts to binary --- trezorctl | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/trezorctl b/trezorctl index e884d2da9..1347725c6 100755 --- a/trezorctl +++ b/trezorctl @@ -4,6 +4,8 @@ import binascii import argparse import json import base64 +import urllib +import tempfile from trezorlib.client import TrezorClient, TrezorClientDebug from trezorlib.tx_api import TXAPIBitcoin @@ -203,14 +205,34 @@ class Commands(object): return ret def firmware_update(self, args): - if not args.file: - raise Exception("Must provide firmware filename") - fp = open(args.file, 'r') + if not args.file and not args.url: + raise Exception("Must provide firmware filename or URL") + + if args.file: + fp = open(args.file, 'r') + elif args.url: + print "Downloading from", args.url + resp = urllib.urlretrieve(args.url) + fp = open(resp[0], 'r') + urllib.urlcleanup() # We still keep file pointer open + + if fp.read(8) == '54525a52': + print "Converting firmware to binary" + + fp.seek(0) + fp_old = fp + + fp = tempfile.TemporaryFile() + fp.write(binascii.unhexlify(fp_old.read())) + + fp_old.close() + fp.seek(0) + if fp.read(4) != 'TRZR': raise Exception("Trezor firmware header expected") fp.seek(0) - return self.client.firmware_update(fp=open(args.file, 'r')) + return self.client.firmware_update(fp=fp) list.help = 'List connected Trezor USB devices' ping.help = 'Send ping message' @@ -335,6 +357,7 @@ class Commands(object): firmware_update.arguments = ( (('-f', '--file'), {'type': str}), + (('-u', '--url'), {'type': str}), ) def list_usb(): From 2f2ffd5239b5f3826a93338400b5bbbad6c869d0 Mon Sep 17 00:00:00 2001 From: slush0 Date: Thu, 9 Apr 2015 21:13:35 +0200 Subject: [PATCH 0442/1535] Minor fixes of firmware_update --- trezorctl | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/trezorctl b/trezorctl index 1347725c6..77628ddfb 100755 --- a/trezorctl +++ b/trezorctl @@ -226,11 +226,13 @@ class Commands(object): fp.write(binascii.unhexlify(fp_old.read())) fp_old.close() - fp.seek(0) - + + fp.seek(0) if fp.read(4) != 'TRZR': raise Exception("Trezor firmware header expected") + print "Please confirm action on device..." + fp.seek(0) return self.client.firmware_update(fp=fp) From 6cedf149d28acae9f1961479a6977bf0e0ed2021 Mon Sep 17 00:00:00 2001 From: Jochen Hoenicke Date: Wed, 29 Apr 2015 19:31:48 +0200 Subject: [PATCH 0443/1535] Don't spam the usb. The connected logic was flawed. After 10 s it would continuously check if the device is still connected. Now, we reset the timer after every check. --- trezorlib/transport_hid.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/trezorlib/transport_hid.py b/trezorlib/transport_hid.py index e1df82dc1..63a679c96 100644 --- a/trezorlib/transport_hid.py +++ b/trezorlib/transport_hid.py @@ -117,10 +117,14 @@ class HidTransport(Transport): while len(self.buffer) < length: data = self.hid.read(64) if not len(data): - if time.time() - start > 10 and not self.is_connected(): - # Over 10 of no response, let's check if + if time.time() - start > 10: + # Over 10 s of no response, let's check if # device is still alive - raise ConnectionError("Connection failed") + if not self.is_connected(): + raise ConnectionError("Connection failed") + else: + # Restart timer + start = time.time() time.sleep(0.001) continue From 17f3942f770afca732e2d6385abbd811ba293ebf Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 13 Apr 2015 15:00:35 +0200 Subject: [PATCH 0444/1535] remove images --- .gitignore | 1 + kocicka.png | Bin 3314 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 kocicka.png diff --git a/.gitignore b/.gitignore index 2bfa335eb..68fb54467 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ python_trezor.egg-info/ trezor.egg-info/ *.pyc *.bin +*.png *.py.cache distribute-*.egg distribute-*.tar.gz diff --git a/kocicka.png b/kocicka.png deleted file mode 100644 index 669b894025cd64fc95cf0bf5d30cde2560b4938f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3314 zcmX|EZD?EP6;|UoYORl~UpQ8|F(Zr=46Z?l{*aY)T{<@jOKVTE)2)hiF~uM#f&Q=) zgltP~WI9;Yl?Ai?ut&Ufw&cdwgtR||V=0&6lF}LiDz^s5lzu^Z?Ua_@LRDFPo^$O$ z5?i|WJ?A;kdCqg*y!qmp9$!nK#pQDOPCkF44?idH_n8L|;NLr+j*sKVzLO_@AHDE^ z3XI)xxx7Vw+NwN|eEG90uT-?Rf0+3`dB(hS`ki;~ysutc{`ukjt6PmW-+K_8z@9_shiUdq?qG4rkDp^>O*tVPY8ht7u7wZO=HF8%e=%F7`Y)?1Z7<;LT; zlGgR4wOGh$XG05t+=f1QQ9U)efvA6!Bl1Q(q~>xsGM9@R_a?Ne;c-s(`bv1dy7Rk& zZmr##)>{!FVs=_r1N}Zm9yJSk)$c7Okge2hKb1*e4cPepY9O~<4CFMcS6=J&75N!w z3VIJyEq}4Jxe&0AChpzZHf96%sgTOX@Q{F!J8^tp7+>T4PDBV7^tHpakB#w1)e$SG z%7~vye?T6JxftGPPJOjB{wBci<5-kcM)<4Xu>X}rh@wD2p!SPua9>R`nrdxU26fH? zz22pAOb}9 zv+!2+Qb=7;t*EnVl# zDnw<%=K;vR3<~2$zT18m5<>IJh`yrPK`<@3Arlm)*+k(`iC}ZNNJ{<5>ZlsSR^y6j z4M_K;Nc|EoBGCp>8%9>^joWfUpaVLkI`FU-ePOo%!_Zpb1gj z_W3?aOJfVcB2l1GUIqaaqB)In2=yoH1(I3NM+xQz7=OB$(-)&)da%N_@eHs#zW~05 zV19LZb?gx)U-s1giszJaQQAa-ksd$TL|DluRbu=gugj}9U-YH=w;;QJu=ewpIExsM zg>`8i8ky0~-Z*^&P3N>y&mJo%ZNl)AvBCLVT?mC*G7)Aa_%0P>0U_lt0wB8G1V%u8 zhR{p+0>gqDh&jCLdfw zE5O8{fwd#~x=TH-=A_o+E%^S}pM5oW3az4}%Be%cG}agoVPZs;m?3G(6h2js{a`&I zvm8{}`rkxm=PJkg009JeYY+Cnx8A!&eRn!!o98O{&_#|g(V!E;xIJ{9l7TzNjj)2w z!g!XTqrnuaoe+=2Nbe6DqeSf&g@;u({pC{oM0{5T$WD#m)HyhX)eNCQnW^UD$UMrM z=6sU2VPtgFiusqu!?Qee8GWS%sIBHAO;BG%Ti`QWeQfN3l8Kt|ZMDl8Z1|JaT)REA z@*g0j_lRa`+z?2LxoJ93jRxO6g1nqRa83mvN016cTOrL4hgMv8-OYlgO4y)X4z9pfZsXCw^^{$X*N(Me_6&>I0Ds+-S)>u zlW?Vg9na`7Vogp8LcKq1La!jhLfP|kD3cb_=YyCx$p_~PlqEPksFR$bI=fANkSIrn zY-QPzifkmL52Lsox(b(Z)>tXAvaf_<9o?Ge=A8xQECu)wOcJ7{0tA}4D%kNWcqol_ zJ|~+I=TJ6Nb4=i)?Uij*EgB6Q?Qp{`m378bWASm?7-s7Yp_qNUj#C3ZbXIa`Kf?EvF)wx9;6k~YgN zAD2nTb)&pZaM`r;HYG!+p~1GGa_*BoD(L1}mc|ZpB-nozBA1=^i3s_`GINxbq;{tJiM~$YsP5A{=0GS4G<|i zC`Pw3l1PJgHe+S0EYdE61;CcO7e{Rp-(iAhaHY8dX|6fIn;m206Vxev;mqR(LZ=

joDQ`pXVRL;)(hoQ;@wf3(`MNo2o> z@vsm;*y1t9qYQ_|rbhrj2)19ipbl0*J)&tcF8ocLgYB3?gT+MdCj?7)fmee=_WyAA zqY)rCMoDZLHy7xh^vWVK^0X${x87a>5ILc5J{0En;=pd=&_Ku<9S#N6HV)T5ikf3j z!(Pa>T$hjzYHyQ!hJCc#o~n$w>56nvC{`@RBi8_wSU;Js_c)gjxs-Zqz1+mdKVMpj z;odC+Q9~J1w{AYcn_jOk)oORD@(yCGVmIQ>Ga5DT#yFvkf3EI83~qY^ v{sB`TzcbXB From e2a8f085814e9220c33131ede5b686609b478de6 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 13 Apr 2015 15:39:23 +0200 Subject: [PATCH 0445/1535] add local version of filecache (used just for unittests), cache globally (to tmpdir) --- trezorlib/filecache.py | 184 +++++++++++++++++++++++++++++++++++++++++ trezorlib/tx_api.py | 11 +-- 2 files changed, 185 insertions(+), 10 deletions(-) create mode 100644 trezorlib/filecache.py diff --git a/trezorlib/filecache.py b/trezorlib/filecache.py new file mode 100644 index 000000000..b1132e73b --- /dev/null +++ b/trezorlib/filecache.py @@ -0,0 +1,184 @@ +''' +filecache + +filecache is a decorator which saves the return value of functions even +after the interpreter dies. For example this is useful on functions that download +and parse webpages. All you need to do is specify how long +the return values should be cached (use seconds, like time.sleep). + +USAGE: + + from filecache import filecache + + @filecache(24 * 60 * 60) + def time_consuming_function(args): + # etc + + @filecache(filecache.YEAR) + def another_function(args): + # etc + + +NOTE: All arguments of the decorated function and the return value need to be + picklable for this to work. + +NOTE: The cache isn't automatically cleaned, it is only overwritten. If your + function can receive many different arguments that rarely repeat, your + cache may forever grow. One day I might add a feature that once in every + 100 calls scans the db for outdated stuff and erases. + +NOTE: This is less useful on methods of a class because the instance (self) + is cached, and if the instance isn't the same, the cache isn't used. This + makes sense because class methods are affected by changes in whatever + is attached to self. + +Tested on python 2.7 and 3.1 + +License: BSD, do what you wish with this. Could be awesome to hear if you found +it useful and/or you have suggestions. ubershmekel at gmail + + +A trick to invalidate a single value: + + @filecache.filecache + def somefunc(x, y, z): + return x * y * z + + del somefunc._db[filecache._args_key(somefunc, (1,2,3), {})] + # or just iterate of somefunc._db (it's a shelve, like a dict) to find the right key. + + +''' + + +import collections as _collections +import datetime as _datetime +import functools as _functools +import inspect as _inspect +import os as _os +import pickle as _pickle +import shelve as _shelve +import sys as _sys +import time as _time +import traceback as _traceback +import types + +_retval = _collections.namedtuple('_retval', 'timesig data') +_SRC_DIR = _os.path.dirname(_os.path.abspath(__file__)) + +SECOND = 1 +MINUTE = 60 * SECOND +HOUR = 60 * MINUTE +DAY = 24 * HOUR +WEEK = 7 * DAY +MONTH = 30 * DAY +YEAR = 365 * DAY +FOREVER = None + +OPEN_DBS = dict() + +def _get_cache_name(function): + """ + returns a name for the module's cache db. + """ + module_name = _inspect.getfile(function) + module_name = _os.path.abspath(module_name) + cache_name = module_name + + # fix for '' or '' in exec or interpreter usage. + cache_name = cache_name.replace('<', '_lt_') + cache_name = cache_name.replace('>', '_gt_') + + tmpdir = _os.getenv('TMPDIR') or _os.getenv('TEMP') or _os.getenv('TMP') + if tmpdir: + cache_name = tmpdir + '/filecache_' + cache_name.replace(_os.sep, '@') + + cache_name += '.cache' + return cache_name + + +def _log_error(error_str): + try: + error_log_fname = _os.path.join(_SRC_DIR, 'filecache.err.log') + if _os.path.isfile(error_log_fname): + fhand = open(error_log_fname, 'a') + else: + fhand = open(error_log_fname, 'w') + fhand.write('[%s] %s\r\n' % (_datetime.datetime.now().isoformat(), error_str)) + fhand.close() + except Exception: + pass + +def _args_key(function, args, kwargs): + arguments = (args, kwargs) + # Check if you have a valid, cached answer, and return it. + # Sadly this is python version dependant + if _sys.version_info[0] == 2: + arguments_pickle = _pickle.dumps(arguments) + else: + # NOTE: protocol=0 so it's ascii, this is crucial for py3k + # because shelve only works with proper strings. + # Otherwise, we'd get an exception because + # function.__name__ is str but dumps returns bytes. + arguments_pickle = _pickle.dumps(arguments, protocol=0).decode('ascii') + + key = function.__name__ + arguments_pickle + return key + +def filecache(seconds_of_validity=None, fail_silently=False): + ''' + filecache is called and the decorator should be returned. + ''' + def filecache_decorator(function): + @_functools.wraps(function) + def function_with_cache(*args, **kwargs): + try: + key = _args_key(function, args, kwargs) + + if key in function._db: + rv = function._db[key] + if seconds_of_validity is None or _time.time() - rv.timesig < seconds_of_validity: + return rv.data + except Exception: + # in any case of failure, don't let filecache break the program + error_str = _traceback.format_exc() + _log_error(error_str) + if not fail_silently: + raise + + retval = function(*args, **kwargs) + + # store in cache + # NOTE: no need to _db.sync() because there was no mutation + # NOTE: it's importatnt to do _db.sync() because otherwise the cache doesn't survive Ctrl-Break! + try: + function._db[key] = _retval(_time.time(), retval) + function._db.sync() + except Exception: + # in any case of failure, don't let filecache break the program + error_str = _traceback.format_exc() + _log_error(error_str) + if not fail_silently: + raise + + return retval + + # make sure cache is loaded + if not hasattr(function, '_db'): + cache_name = _get_cache_name(function) + if cache_name in OPEN_DBS: + function._db = OPEN_DBS[cache_name] + else: + function._db = _shelve.open(cache_name) + OPEN_DBS[cache_name] = function._db + + function_with_cache._db = function._db + + return function_with_cache + + if type(seconds_of_validity) == types.FunctionType: + # support for when people use '@filecache.filecache' instead of '@filecache.filecache()' + func = seconds_of_validity + return filecache_decorator(func) + + return filecache_decorator diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index 94214f0d6..55d39c189 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -2,16 +2,7 @@ import binascii import urllib2 import json from decimal import Decimal -try: - raise Exception() # remove this line to enable caching - from filecache import filecache, DAY -except: - def filecache(x): - def _inner(y): - return y - return _inner - DAY = None - +from filecache import filecache, DAY import types_pb2 as proto_types def op_push_data(data): From fdbdb527dc42a8619287a1f09b1b3ebe101fb344 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 7 May 2015 18:29:18 +0200 Subject: [PATCH 0446/1535] add test for encrypted xprv --- tests/test_msg_loaddevice.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/test_msg_loaddevice.py b/tests/test_msg_loaddevice.py index c7f27ff2c..849cb0622 100644 --- a/tests/test_msg_loaddevice.py +++ b/tests/test_msg_loaddevice.py @@ -29,6 +29,18 @@ class TestDeviceLoad(common.TrezorTest): passphrase_protection = self.client.debug.read_passphrase_protection() self.assertEqual(passphrase_protection, True) + def test_load_device_3(self): + self.client.wipe_device() + self.client.load_device_by_xprv(xprv='xprv9s21ZrQH143K2JF8RafpqtKiTbsbaxEeUaMnNHsm5o6wCW3z8ySyH4UxFVSfZ8n7ESu7fgir8imbZKLYVBxFPND1pniTZ81vKfd45EHKX73', pin='', passphrase_protection=False, label='test', language='english') + address = self.client.get_address('Bitcoin', []) + self.assertEqual(address, '128RdrAkJDmqasgvfRf6MC5VcX4HKqH4mR') + + self.client.wipe_device() + self.client.load_device_by_xprv(xprv='xprv9s21ZrQH143K2JF8RafpqtKiTbsbaxEeUaMnNHsm5o6wCW3z8ySyH4UxFVSfZ8n7ESu7fgir8imbZKLYVBxFPND1pniTZ81vKfd45EHKX73', pin='', passphrase_protection=True, label='test', language='english') + self.client.set_passphrase('passphrase') + address = self.client.get_address('Bitcoin', []) + self.assertEqual(address, '1CHUbFa4wTTPYgkYaw2LHSd5D4qJjMU8ri') + def test_load_device_utf(self): words_nfkd = u'Pr\u030ci\u0301s\u030cerne\u030c z\u030clut\u030couc\u030cky\u0301 ku\u030an\u030c u\u0301pe\u030cl d\u030ca\u0301belske\u0301 o\u0301dy za\u0301ker\u030cny\u0301 uc\u030cen\u030c be\u030cz\u030ci\u0301 pode\u0301l zo\u0301ny u\u0301lu\u030a' words_nfc = u'P\u0159\xed\u0161ern\u011b \u017elu\u0165ou\u010dk\xfd k\u016f\u0148 \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy z\xe1ke\u0159n\xfd u\u010de\u0148 b\u011b\u017e\xed pod\xe9l z\xf3ny \xfal\u016f' From bf539f0b47fb8c3e955943bb130296d9d1be566f Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 7 May 2015 21:16:43 +0200 Subject: [PATCH 0447/1535] split xprv unit test into two --- tests/test_msg_loaddevice.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/test_msg_loaddevice.py b/tests/test_msg_loaddevice.py index 849cb0622..96b78a22f 100644 --- a/tests/test_msg_loaddevice.py +++ b/tests/test_msg_loaddevice.py @@ -30,14 +30,22 @@ class TestDeviceLoad(common.TrezorTest): self.assertEqual(passphrase_protection, True) def test_load_device_3(self): - self.client.wipe_device() self.client.load_device_by_xprv(xprv='xprv9s21ZrQH143K2JF8RafpqtKiTbsbaxEeUaMnNHsm5o6wCW3z8ySyH4UxFVSfZ8n7ESu7fgir8imbZKLYVBxFPND1pniTZ81vKfd45EHKX73', pin='', passphrase_protection=False, label='test', language='english') + + passphrase_protection = self.client.debug.read_passphrase_protection() + self.assertEqual(passphrase_protection, False) + address = self.client.get_address('Bitcoin', []) self.assertEqual(address, '128RdrAkJDmqasgvfRf6MC5VcX4HKqH4mR') - self.client.wipe_device() + def test_load_device_4(self): self.client.load_device_by_xprv(xprv='xprv9s21ZrQH143K2JF8RafpqtKiTbsbaxEeUaMnNHsm5o6wCW3z8ySyH4UxFVSfZ8n7ESu7fgir8imbZKLYVBxFPND1pniTZ81vKfd45EHKX73', pin='', passphrase_protection=True, label='test', language='english') + self.client.set_passphrase('passphrase') + + passphrase_protection = self.client.debug.read_passphrase_protection() + self.assertEqual(passphrase_protection, True) + address = self.client.get_address('Bitcoin', []) self.assertEqual(address, '1CHUbFa4wTTPYgkYaw2LHSd5D4qJjMU8ri') From 337fe029fde55751139bf53bcf099851f05777d6 Mon Sep 17 00:00:00 2001 From: Jochen Hoenicke Date: Sun, 10 May 2015 16:05:31 +0200 Subject: [PATCH 0448/1535] insight api: use hex code The insight api transaction parser used to look at the assembly to reconstruct the input and output scripts. This patch changes it to use the hex input directly. This fixes parsing some instructions with unknown opcodes (e.g. multisig inputs with "0" opcode). --- trezorlib/tx_api.py | 46 ++------------------------------------------- 1 file changed, 2 insertions(+), 44 deletions(-) diff --git a/trezorlib/tx_api.py b/trezorlib/tx_api.py index 55d39c189..6d07fd90e 100644 --- a/trezorlib/tx_api.py +++ b/trezorlib/tx_api.py @@ -5,44 +5,6 @@ from decimal import Decimal from filecache import filecache, DAY import types_pb2 as proto_types -def op_push_data(data): - l = len(data) - if l < 0x4C: - return chr(l) + data - elif i < 0xFF: - return '\x4C' + chr(l) + data - elif i < 0xFFFF: - return '\x4D' + struct.pack(" Date: Wed, 13 May 2015 02:35:48 +1200 Subject: [PATCH 0449/1535] Update hashbang to use /usr/bin/env python Please use the /usr/bin/env python hashbang in order to properly detect alternative python installations (like those installed through homebrew on a mac). --- tools/encfs_aes_getpass.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/encfs_aes_getpass.py b/tools/encfs_aes_getpass.py index 6f0aa7c9c..22ebaecf1 100755 --- a/tools/encfs_aes_getpass.py +++ b/tools/encfs_aes_getpass.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python ''' Use Trezor as a hardware key for opening EncFS filesystem! From c28bf687400abdcac89636190015e2e094866b6c Mon Sep 17 00:00:00 2001 From: Michael Dance Date: Wed, 13 May 2015 02:36:56 +1200 Subject: [PATCH 0450/1535] Update hashbang to use /usr/bin/env python Please use the /usr/bin/env python hashbang in order to properly detect alternative python installations (like those installed through homebrew on a mac). --- helloworld.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helloworld.py b/helloworld.py index a0c437666..9f7b6e2ca 100755 --- a/helloworld.py +++ b/helloworld.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python from trezorlib.client import TrezorClient from trezorlib.transport_hid import HidTransport From d995059656c097a459b6ac9c7bf0590662719098 Mon Sep 17 00:00:00 2001 From: Michael Dance Date: Wed, 13 May 2015 11:55:39 +1200 Subject: [PATCH 0451/1535] Update hashbang to use /usr/bin/env python --- trezorctl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trezorctl b/trezorctl index 77628ddfb..74725464f 100755 --- a/trezorctl +++ b/trezorctl @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python import os import binascii import argparse From 83b1b86f95f4fa037912a1732b6be3f3eacc35b2 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 13 May 2015 10:23:02 +0200 Subject: [PATCH 0452/1535] Update hashbang to use /usr/bin/env python --- README.rst | 2 +- mnemonic_check.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 2522f03ce..b716db4b1 100644 --- a/README.rst +++ b/README.rst @@ -12,7 +12,7 @@ also found in ``helloworld.py`` .. code:: python - #!/usr/bin/python + #!/usr/bin/env python from trezorlib.client import TrezorClient from trezorlib.transport_hid import HidTransport diff --git a/mnemonic_check.py b/mnemonic_check.py index 858b6067f..e9d270406 100755 --- a/mnemonic_check.py +++ b/mnemonic_check.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python __doc__ = ''' Use this script to cross-check that TREZOR generated valid mnemonic sentence for given internal (TREZOR-generated) From 16c07561b56fec894765fa8940615d8b46ef6e40 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 3 Jun 2015 14:53:53 +0200 Subject: [PATCH 0453/1535] don't assign tx_api when not needed --- tests/common.py | 1 - trezorctl | 1 - trezorlib/client.py | 10 ++++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tests/common.py b/tests/common.py index 8d908bf3b..bd2fe1472 100644 --- a/tests/common.py +++ b/tests/common.py @@ -11,7 +11,6 @@ class TrezorTest(unittest.TestCase): self.client = TrezorDebugClient(self.transport) self.client.set_debuglink(self.debug_transport) # self.client.set_buttonwait(3) - self.client.set_tx_api(TXAPIBitcoin()) # 1 2 3 4 5 6 7 8 9 10 11 12 self.mnemonic12 = 'alcohol woman abuse must during monitor noble actual mixed trade anger aisle' diff --git a/trezorctl b/trezorctl index 74725464f..995752fed 100755 --- a/trezorctl +++ b/trezorctl @@ -442,7 +442,6 @@ def main(): else: client = TrezorClient(transport) - client.set_tx_api(TXAPIBitcoin()) cmds = Commands(client) res = args.func(cmds, args) diff --git a/trezorlib/client.py b/trezorlib/client.py index 8b60dd533..5cb5916d4 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -538,7 +538,10 @@ class ProtocolMixin(object): continue tx = msg.transactions.add() - tx.CopyFrom(self.tx_api.get_tx(binascii.hexlify(inp.prev_hash))) + if self.tx_api: + tx.CopyFrom(self.tx_api.get_tx(binascii.hexlify(inp.prev_hash))) + else: + raise Exception('TX_API not defined') known_hashes.append(inp.prev_hash) return msg @@ -560,7 +563,10 @@ class ProtocolMixin(object): if inp.prev_hash in known_hashes: continue - txes[inp.prev_hash] = self.tx_api.get_tx(binascii.hexlify(inp.prev_hash)) + if self.tx_api: + txes[inp.prev_hash] = self.tx_api.get_tx(binascii.hexlify(inp.prev_hash)) + else: + raise Exception('TX_API not defined') known_hashes.append(inp.prev_hash) return txes From 05bdc56a8be58b48d7171c4f87d3dad6bd3fa845 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 3 Jun 2015 14:54:13 +0200 Subject: [PATCH 0454/1535] release 0.6.4 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f10eb57f7..437e9d6bc 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name='trezor', - version='0.6.3', + version='0.6.4', author='Bitcoin TREZOR', author_email='info@bitcointrezor.com', description='Python library for communicating with TREZOR Bitcoin Hardware Wallet', From d8f3a47eaf6263e4d77a6f8d7b148206aa1fc7b6 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 3 Jun 2015 16:47:01 +0200 Subject: [PATCH 0455/1535] cleanup and release 0.6.5 --- setup.py | 2 +- trezorctl | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 437e9d6bc..8743755cc 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name='trezor', - version='0.6.4', + version='0.6.5', author='Bitcoin TREZOR', author_email='info@bitcointrezor.com', description='Python library for communicating with TREZOR Bitcoin Hardware Wallet', diff --git a/trezorctl b/trezorctl index 995752fed..55b389efa 100755 --- a/trezorctl +++ b/trezorctl @@ -8,8 +8,6 @@ import urllib import tempfile from trezorlib.client import TrezorClient, TrezorClientDebug -from trezorlib.tx_api import TXAPIBitcoin -from trezorlib.protobuf_json import pb2json def parse_args(commands): parser = argparse.ArgumentParser(description='Commandline tool for Trezor devices.') From b155b83ca536b993c7e07f5310030a8b3cc2eef4 Mon Sep 17 00:00:00 2001 From: Roman Zeyde Date: Tue, 23 Jun 2015 17:26:31 +0300 Subject: [PATCH 0456/1535] update protobuf with ECDSA curve selection --- trezorlib/client.py | 10 +- trezorlib/messages_pb2.py | 287 +++++++++++++++++++++++--------------- 2 files changed, 181 insertions(+), 116 deletions(-) diff --git a/trezorlib/client.py b/trezorlib/client.py index 5cb5916d4..79a8ed709 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -24,6 +24,8 @@ from mnemonic import Mnemonic SCREENSHOT = False +DEFAULT_CURVE = 'secp256k1' + # monkeypatching: text formatting of protobuf messages tools.monkeypatch_google_protobuf_text_format() @@ -385,9 +387,9 @@ class ProtocolMixin(object): return path @expect(proto.PublicKey) - def get_public_node(self, n): + def get_public_node(self, n, ecdsa_curve_name=DEFAULT_CURVE): n = self._convert_prime(n) - return self.call(proto.GetPublicKey(address_n=n)) + return self.call(proto.GetPublicKey(address_n=n, ecdsa_curve_name=ecdsa_curve_name)) @field('address') @expect(proto.Address) @@ -459,8 +461,8 @@ class ProtocolMixin(object): return self.call(proto.SignMessage(coin_name=coin_name, address_n=n, message=message)) @expect(proto.SignedIdentity) - def sign_identity(self, identity, challenge_hidden, challenge_visual): - return self.call(proto.SignIdentity(identity=identity, challenge_hidden=challenge_hidden, challenge_visual=challenge_visual)) + def sign_identity(self, identity, challenge_hidden, challenge_visual, ecdsa_curve_name=DEFAULT_CURVE): + return self.call(proto.SignIdentity(identity=identity, challenge_hidden=challenge_hidden, challenge_visual=challenge_visual, ecdsa_curve_name=ecdsa_curve_name)) def verify_message(self, address, signature, message): try: diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 805f74e48..8cdf6170f 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\xcf\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\"\x0e\n\x0c\x43learSession\"\\\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x16\n\x0euse_passphrase\x18\x03 \x01(\x08\x12\x12\n\nhomescreen\x18\x04 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\"!\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"~\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\x12+\n\x08multisig\x18\x04 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"@\n\x10\x45ncryptedMessage\x12\r\n\x05nonce\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0c\n\x04hmac\x18\x03 \x01(\x0c\"Q\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\r\n\x05nonce\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0c\n\x04hmac\x18\x04 \x01(\x0c\"4\n\x10\x44\x65\x63ryptedMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"!\n\x10\x43ipheredKeyValue\x12\r\n\x05value\x18\x01 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"c\n\x0cSignIdentity\x12\x1f\n\x08identity\x18\x01 \x01(\x0b\x32\r.IdentityType\x12\x18\n\x10\x63hallenge_hidden\x18\x02 \x01(\x0c\x12\x18\n\x10\x63hallenge_visual\x18\x03 \x01(\t\"H\n\x0eSignedIdentity\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x12\n\npublic_key\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\xe3\x0e\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_CipheredKeyValue\x10\x30\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_EncryptedMessage\x10\x32\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x33\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_DecryptedMessage\x10\x34\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_SignIdentity\x10\x35\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_SignedIdentity\x10\x36\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\r\n\x0bGetFeatures\"\xfe\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\x12\x12\n\npin_cached\x18\x10 \x01(\x08\x12\x19\n\x11passphrase_cached\x18\x11 \x01(\x08\"\x0e\n\x0c\x43learSession\"\\\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x16\n\x0euse_passphrase\x18\x03 \x01(\x08\x12\x12\n\nhomescreen\x18\x04 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\";\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x18\n\x10\x65\x63\x64sa_curve_name\x18\x02 \x01(\t\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"~\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\x12+\n\x08multisig\x18\x04 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"@\n\x10\x45ncryptedMessage\x12\r\n\x05nonce\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0c\n\x04hmac\x18\x03 \x01(\x0c\"Q\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\r\n\x05nonce\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0c\n\x04hmac\x18\x04 \x01(\x0c\"4\n\x10\x44\x65\x63ryptedMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"!\n\x10\x43ipheredKeyValue\x12\r\n\x05value\x18\x01 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"}\n\x0cSignIdentity\x12\x1f\n\x08identity\x18\x01 \x01(\x0b\x32\r.IdentityType\x12\x18\n\x10\x63hallenge_hidden\x18\x02 \x01(\x0c\x12\x18\n\x10\x63hallenge_visual\x18\x03 \x01(\t\x12\x18\n\x10\x65\x63\x64sa_curve_name\x18\x04 \x01(\t\"H\n\x0eSignedIdentity\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x12\n\npublic_key\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x86\x0f\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_CipheredKeyValue\x10\x30\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_EncryptedMessage\x10\x32\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x33\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_DecryptedMessage\x10\x34\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_SignIdentity\x10\x35\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_SignedIdentity\x10\x36\x1a\x04\x98\xb5\x18\x01\x12!\n\x17MessageType_GetFeatures\x10\x37\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -216,30 +216,34 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkDecision', index=48, number=100, + name='MessageType_GetFeatures', index=48, number=55, + options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001'), + type=None), + _descriptor.EnumValueDescriptor( + name='MessageType_DebugLinkDecision', index=49, number=100, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkGetState', index=49, number=101, + name='MessageType_DebugLinkGetState', index=50, number=101, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkState', index=50, number=102, + name='MessageType_DebugLinkState', index=51, number=102, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkStop', index=51, number=103, + name='MessageType_DebugLinkStop', index=52, number=103, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001'), type=None), _descriptor.EnumValueDescriptor( - name='MessageType_DebugLinkLog', index=52, number=104, + name='MessageType_DebugLinkLog', index=53, number=104, options=_descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\250\265\030\001'), type=None), ], containing_type=None, options=None, - serialized_start=3659, - serialized_end=5550, + serialized_start=3773, + serialized_end=5699, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -291,6 +295,7 @@ MessageType_DecryptMessage = 51 MessageType_DecryptedMessage = 52 MessageType_SignIdentity = 53 MessageType_SignedIdentity = 54 +MessageType_GetFeatures = 55 MessageType_DebugLinkDecision = 100 MessageType_DebugLinkGetState = 101 MessageType_DebugLinkState = 102 @@ -320,6 +325,27 @@ _INITIALIZE = _descriptor.Descriptor( ) +_GETFEATURES = _descriptor.Descriptor( + name='GetFeatures', + full_name='GetFeatures', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + extension_ranges=[], + serialized_start=45, + serialized_end=58, +) + + _FEATURES = _descriptor.Descriptor( name='Features', full_name='Features', @@ -432,6 +458,20 @@ _FEATURES = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='pin_cached', full_name='Features.pin_cached', index=15, + number=16, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='passphrase_cached', full_name='Features.passphrase_cached', index=16, + number=17, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -441,8 +481,8 @@ _FEATURES = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=46, - serialized_end=381, + serialized_start=61, + serialized_end=443, ) @@ -462,8 +502,8 @@ _CLEARSESSION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=383, - serialized_end=397, + serialized_start=445, + serialized_end=459, ) @@ -511,8 +551,8 @@ _APPLYSETTINGS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=399, - serialized_end=491, + serialized_start=461, + serialized_end=553, ) @@ -539,8 +579,8 @@ _CHANGEPIN = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=493, - serialized_end=520, + serialized_start=555, + serialized_end=582, ) @@ -588,8 +628,8 @@ _PING = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=522, - serialized_end=627, + serialized_start=584, + serialized_end=689, ) @@ -616,8 +656,8 @@ _SUCCESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=629, - serialized_end=655, + serialized_start=691, + serialized_end=717, ) @@ -651,8 +691,8 @@ _FAILURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=657, - serialized_end=711, + serialized_start=719, + serialized_end=773, ) @@ -686,8 +726,8 @@ _BUTTONREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=713, - serialized_end=776, + serialized_start=775, + serialized_end=838, ) @@ -707,8 +747,8 @@ _BUTTONACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=778, - serialized_end=789, + serialized_start=840, + serialized_end=851, ) @@ -735,8 +775,8 @@ _PINMATRIXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=791, - serialized_end=846, + serialized_start=853, + serialized_end=908, ) @@ -763,8 +803,8 @@ _PINMATRIXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=848, - serialized_end=875, + serialized_start=910, + serialized_end=937, ) @@ -784,8 +824,8 @@ _CANCEL = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=877, - serialized_end=885, + serialized_start=939, + serialized_end=947, ) @@ -805,8 +845,8 @@ _PASSPHRASEREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=887, - serialized_end=906, + serialized_start=949, + serialized_end=968, ) @@ -833,8 +873,8 @@ _PASSPHRASEACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=908, - serialized_end=943, + serialized_start=970, + serialized_end=1005, ) @@ -861,8 +901,8 @@ _GETENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=945, - serialized_end=971, + serialized_start=1007, + serialized_end=1033, ) @@ -889,8 +929,8 @@ _ENTROPY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=973, - serialized_end=999, + serialized_start=1035, + serialized_end=1061, ) @@ -908,6 +948,13 @@ _GETPUBLICKEY = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='ecdsa_curve_name', full_name='GetPublicKey.ecdsa_curve_name', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -917,8 +964,8 @@ _GETPUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1001, - serialized_end=1034, + serialized_start=1063, + serialized_end=1122, ) @@ -952,8 +999,8 @@ _PUBLICKEY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1036, - serialized_end=1088, + serialized_start=1124, + serialized_end=1176, ) @@ -1001,8 +1048,8 @@ _GETADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1090, - serialized_end=1216, + serialized_start=1178, + serialized_end=1304, ) @@ -1029,8 +1076,8 @@ _ADDRESS = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1218, - serialized_end=1244, + serialized_start=1306, + serialized_end=1332, ) @@ -1050,8 +1097,8 @@ _WIPEDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1246, - serialized_end=1258, + serialized_start=1334, + serialized_end=1346, ) @@ -1120,8 +1167,8 @@ _LOADDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1261, - serialized_end=1427, + serialized_start=1349, + serialized_end=1515, ) @@ -1183,8 +1230,8 @@ _RESETDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1430, - serialized_end=1587, + serialized_start=1518, + serialized_end=1675, ) @@ -1204,8 +1251,8 @@ _ENTROPYREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1589, - serialized_end=1605, + serialized_start=1677, + serialized_end=1693, ) @@ -1232,8 +1279,8 @@ _ENTROPYACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1607, - serialized_end=1636, + serialized_start=1695, + serialized_end=1724, ) @@ -1295,8 +1342,8 @@ _RECOVERYDEVICE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1639, - serialized_end=1798, + serialized_start=1727, + serialized_end=1886, ) @@ -1316,8 +1363,8 @@ _WORDREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1800, - serialized_end=1813, + serialized_start=1888, + serialized_end=1901, ) @@ -1344,8 +1391,8 @@ _WORDACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1815, - serialized_end=1838, + serialized_start=1903, + serialized_end=1926, ) @@ -1386,8 +1433,8 @@ _SIGNMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1840, - serialized_end=1917, + serialized_start=1928, + serialized_end=2005, ) @@ -1428,8 +1475,8 @@ _VERIFYMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1919, - serialized_end=1987, + serialized_start=2007, + serialized_end=2075, ) @@ -1463,8 +1510,8 @@ _MESSAGESIGNATURE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=1989, - serialized_end=2043, + serialized_start=2077, + serialized_end=2131, ) @@ -1519,8 +1566,8 @@ _ENCRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2045, - serialized_end=2163, + serialized_start=2133, + serialized_end=2251, ) @@ -1561,8 +1608,8 @@ _ENCRYPTEDMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2165, - serialized_end=2229, + serialized_start=2253, + serialized_end=2317, ) @@ -1610,8 +1657,8 @@ _DECRYPTMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2231, - serialized_end=2312, + serialized_start=2319, + serialized_end=2400, ) @@ -1645,8 +1692,8 @@ _DECRYPTEDMESSAGE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2314, - serialized_end=2366, + serialized_start=2402, + serialized_end=2454, ) @@ -1708,8 +1755,8 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2369, - serialized_end=2497, + serialized_start=2457, + serialized_end=2585, ) @@ -1736,8 +1783,8 @@ _CIPHEREDKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2499, - serialized_end=2532, + serialized_start=2587, + serialized_end=2620, ) @@ -1778,8 +1825,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2534, - serialized_end=2623, + serialized_start=2622, + serialized_end=2711, ) @@ -1806,8 +1853,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2625, - serialized_end=2650, + serialized_start=2713, + serialized_end=2738, ) @@ -1848,8 +1895,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2652, - serialized_end=2733, + serialized_start=2740, + serialized_end=2821, ) @@ -1897,8 +1944,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2736, - serialized_end=2880, + serialized_start=2824, + serialized_end=2968, ) @@ -1939,8 +1986,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2883, - serialized_end=3016, + serialized_start=2971, + serialized_end=3104, ) @@ -1967,8 +2014,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3018, - serialized_end=3055, + serialized_start=3106, + serialized_end=3143, ) @@ -2000,6 +2047,13 @@ _SIGNIDENTITY = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='ecdsa_curve_name', full_name='SignIdentity.ecdsa_curve_name', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -2009,8 +2063,8 @@ _SIGNIDENTITY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3057, - serialized_end=3156, + serialized_start=3145, + serialized_end=3270, ) @@ -2051,8 +2105,8 @@ _SIGNEDIDENTITY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3158, - serialized_end=3230, + serialized_start=3272, + serialized_end=3344, ) @@ -2072,8 +2126,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3232, - serialized_end=3247, + serialized_start=3346, + serialized_end=3361, ) @@ -2100,8 +2154,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3249, - serialized_end=3282, + serialized_start=3363, + serialized_end=3396, ) @@ -2128,8 +2182,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3284, - serialized_end=3319, + serialized_start=3398, + serialized_end=3433, ) @@ -2149,8 +2203,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3321, - serialized_end=3340, + serialized_start=3435, + serialized_end=3454, ) @@ -2240,8 +2294,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3343, - serialized_end=3578, + serialized_start=3457, + serialized_end=3692, ) @@ -2261,8 +2315,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3580, - serialized_end=3595, + serialized_start=3694, + serialized_end=3709, ) @@ -2303,8 +2357,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3597, - serialized_end=3656, + serialized_start=3711, + serialized_end=3770, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE @@ -2324,6 +2378,7 @@ _TXACK.fields_by_name['tx'].message_type = types_pb2._TRANSACTIONTYPE _SIGNIDENTITY.fields_by_name['identity'].message_type = types_pb2._IDENTITYTYPE _DEBUGLINKSTATE.fields_by_name['node'].message_type = types_pb2._HDNODETYPE DESCRIPTOR.message_types_by_name['Initialize'] = _INITIALIZE +DESCRIPTOR.message_types_by_name['GetFeatures'] = _GETFEATURES DESCRIPTOR.message_types_by_name['Features'] = _FEATURES DESCRIPTOR.message_types_by_name['ClearSession'] = _CLEARSESSION DESCRIPTOR.message_types_by_name['ApplySettings'] = _APPLYSETTINGS @@ -2383,6 +2438,12 @@ class Initialize(_message.Message): # @@protoc_insertion_point(class_scope:Initialize) +class GetFeatures(_message.Message): + __metaclass__ = _reflection.GeneratedProtocolMessageType + DESCRIPTOR = _GETFEATURES + + # @@protoc_insertion_point(class_scope:GetFeatures) + class Features(_message.Message): __metaclass__ = _reflection.GeneratedProtocolMessageType DESCRIPTOR = _FEATURES @@ -2794,6 +2855,8 @@ _MESSAGETYPE.values_by_name["MessageType_SignIdentity"].has_options = True _MESSAGETYPE.values_by_name["MessageType_SignIdentity"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_SignedIdentity"].has_options = True _MESSAGETYPE.values_by_name["MessageType_SignedIdentity"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\230\265\030\001') +_MESSAGETYPE.values_by_name["MessageType_GetFeatures"].has_options = True +_MESSAGETYPE.values_by_name["MessageType_GetFeatures"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\220\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkDecision"].has_options = True _MESSAGETYPE.values_by_name["MessageType_DebugLinkDecision"]._options = _descriptor._ParseOptions(descriptor_pb2.EnumValueOptions(), '\240\265\030\001') _MESSAGETYPE.values_by_name["MessageType_DebugLinkGetState"].has_options = True From c9aecdb15cd3e16211635783a52fc7c69d0e2d5e Mon Sep 17 00:00:00 2001 From: Federico Reiven Date: Wed, 8 Jul 2015 14:52:09 -0300 Subject: [PATCH 0457/1535] Add information to README on how to enter scrambled pin --- README.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.rst b/README.rst index b716db4b1..eb208c23b 100644 --- a/README.rst +++ b/README.rst @@ -46,6 +46,20 @@ also found in ``helloworld.py`` if __name__ == '__main__': main() +When you got asked for PIN, you have to enter scrambled pin shown in Trezor display using the numeric keyboard mapping. + + 7 8 9 + 4 5 6 + 1 2 3 + +Example: your pin is 1234 and your Trezor is displaying + + 2 8 3 + 5 4 6 + 7 9 1 + +You have to enter: 3795 + How to install (Windows) ------------------------ * Install Python 2.7 (http://python.org) From 60c608276e92751c27d66ffd3f798478c8a6571f Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 8 Jul 2015 22:36:10 +0200 Subject: [PATCH 0458/1535] make pin section better --- README.rst | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/README.rst b/README.rst index eb208c23b..c8cd01034 100644 --- a/README.rst +++ b/README.rst @@ -46,19 +46,26 @@ also found in ``helloworld.py`` if __name__ == '__main__': main() -When you got asked for PIN, you have to enter scrambled pin shown in Trezor display using the numeric keyboard mapping. +PIN Entering +------------ - 7 8 9 - 4 5 6 - 1 2 3 +When you are asked for PIN, you have to enter scrambled PIN. Follow the numbers shown on TREZOR display and enter the their positions using the numeric keyboard mapping: -Example: your pin is 1234 and your Trezor is displaying +=== === === + 7 8 9 + 4 5 6 + 1 2 3 +=== === === - 2 8 3 - 5 4 6 - 7 9 1 +Example: your PIN is **1234** and TREZOR is displaying the following: -You have to enter: 3795 +=== === === + 2 8 3 + 5 4 6 + 7 9 1 +=== === === + +You have to enter: **3795** How to install (Windows) ------------------------ From e272ce4d143da72591aa757e6f7bb32c2817be89 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 22 Jul 2015 17:32:28 +0200 Subject: [PATCH 0459/1535] set TX API in tests/common.py --- tests/common.py | 1 + tests/test_msg_signtx.py | 3 +-- tests/test_msg_simplesigntx.py | 3 +-- tests/test_op_return.py | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/common.py b/tests/common.py index bd2fe1472..e31886562 100644 --- a/tests/common.py +++ b/tests/common.py @@ -10,6 +10,7 @@ class TrezorTest(unittest.TestCase): self.transport = config.TRANSPORT(*config.TRANSPORT_ARGS, **config.TRANSPORT_KWARGS) self.client = TrezorDebugClient(self.transport) self.client.set_debuglink(self.debug_transport) + self.client.set_tx_api(TXAPIBitcoin()) # self.client.set_buttonwait(3) # 1 2 3 4 5 6 7 8 9 10 11 12 diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py index 58d3f409b..6b9a859d2 100644 --- a/tests/test_msg_signtx.py +++ b/tests/test_msg_signtx.py @@ -6,7 +6,7 @@ import itertools import trezorlib.messages_pb2 as proto import trezorlib.types_pb2 as proto_types from trezorlib.client import CallException -from trezorlib.tx_api import TXAPITestnet, TXAPIBitcoin +from trezorlib.tx_api import TXAPITestnet class TestMsgSigntx(common.TrezorTest): def test_one_one_fee(self): @@ -476,7 +476,6 @@ class TestMsgSigntx(common.TrezorTest): ) with self.client: - self.client.set_tx_api(TXAPIBitcoin()) self.client.set_expected_responses([ proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=binascii.unhexlify("54aa5680dea781f45ebb536e53dffc526d68c0eb5c00547e323b2c32382dfba3"))), diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index c94a357dd..82efd57b4 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -8,7 +8,7 @@ import binascii import trezorlib.messages_pb2 as proto import trezorlib.types_pb2 as proto_types from trezorlib.client import CallException -from trezorlib.tx_api import TXAPITestnet, TXAPIBitcoin +from trezorlib.tx_api import TXAPITestnet class TestMsgSimplesigntx(common.TrezorTest): @@ -320,7 +320,6 @@ class TestMsgSimplesigntx(common.TrezorTest): ) with self.client: - self.client.set_tx_api(TXAPIBitcoin()) self.client.set_expected_responses([proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXFINISHED)]) diff --git a/tests/test_op_return.py b/tests/test_op_return.py index c36d7bdff..886a3f7c4 100644 --- a/tests/test_op_return.py +++ b/tests/test_op_return.py @@ -6,7 +6,7 @@ import itertools import trezorlib.messages_pb2 as proto import trezorlib.types_pb2 as proto_types from trezorlib.client import CallException -from trezorlib.tx_api import TXAPITestnet, TXAPIBitcoin +from trezorlib.tx_api import TXAPITestnet class TestOpReturn(common.TrezorTest): From 80c45d9678bcf6c3ab979e43db260795d094c7b5 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Thu, 30 Jul 2015 01:13:53 +0200 Subject: [PATCH 0460/1535] fix signidentity test after slip-0013 change raise fees in high_fees tests --- tests/test_msg_signidentity.py | 6 +++--- tests/test_msg_signtx.py | 8 ++++---- tests/test_msg_simplesigntx.py | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/test_msg_signidentity.py b/tests/test_msg_signidentity.py index 4d347c0f5..710070dc2 100644 --- a/tests/test_msg_signidentity.py +++ b/tests/test_msg_signidentity.py @@ -14,19 +14,19 @@ class TestMsgSignidentity(common.TrezorTest): sig = self.client.sign_identity(identity, binascii.unhexlify('531c4dd0a92caff62817eaec3065b65d'), '2015/02/20 16:50') self.assertEqual(sig.address, '17F17smBTX9VTZA9Mj8LM5QGYNZnmziCjL') self.assertEqual(binascii.hexlify(sig.public_key), '023a472219ad3327b07c18273717bb3a40b39b743756bf287fbd5fa9d263237f45') - self.assertEqual(binascii.hexlify(sig.signature), '1fe5abeb9ed3926229a4c7d6936cf58c7357180c90a0e9565133b8578e118c5b2c7c4b6902afe81ce46f3b77e8f91a7cdae30e433ce2706166bf27ff111fc9734a') + self.assertEqual(binascii.hexlify(sig.signature), '208e131a2ee1b9b5108b899f21f167a9e17d2daaba4e33724838ab692e28a512047ee322fe86d3e9b8624b28741de8e2595ea2d6af4487729711b72cb05f766fc0') identity = proto_types.IdentityType(proto='ftp', user='satoshi', host='bitcoin.org', port='2323', path='/pub', index=3) sig = self.client.sign_identity(identity, binascii.unhexlify('531c4dd0a92caff62817eaec3065b65d'), '2015/02/20 16:50') self.assertEqual(sig.address, '1KAr6r5qF2kADL8bAaRQBjGKYEGxn9WrbS') self.assertEqual(binascii.hexlify(sig.public_key), '0266cf12d2ba381c5fd797da0d64f59c07a6f1b034ad276cca6bf2729e92b20d9c') - self.assertEqual(binascii.hexlify(sig.signature), '1fda9910ed2c8cb5a79558c4f50d5030454cc4115931eac8e6307eb4f6ef87490b484beeff76369fa2f46e0677eb535bd78f35d0f987043ce14f25f9c610cb9c3a') + self.assertEqual(binascii.hexlify(sig.signature), '20d24fff632767928a997af046ca22bf56662559a9619af38d972e45fa806c55a403c26157d27aa21d2380bb39792278b063df082793c99b450501aa40a7c31d53') identity = proto_types.IdentityType(proto='ssh', user='satoshi', host='bitcoin.org', port='', path='', index=47) sig = self.client.sign_identity(identity, binascii.unhexlify('531c4dd0a92caff62817eaec3065b65d'), '2015/02/20 16:50') self.assertEqual(sig.address, '16MMzfyr5LPBNZ359NhjCthi2scrMufTAM') self.assertEqual(binascii.hexlify(sig.public_key), '03cebfae5359d6c48b8dcf9da22b2113096548407ce21da8ab28a886f750f217f4') - self.assertEqual(binascii.hexlify(sig.signature), '20a645c1bfa9629d92c9ec5e21350264b806c44042597d77b635e89e3c8ea1a0230662df667b3d427a2c232d41b173b86a5492caf22d317820d7e5112186e0a933') + self.assertEqual(binascii.hexlify(sig.signature), '1f888a4b2b719d06b951799527eb753ec79a850b85c81b36b66caa2f3779a5e73827a2db77b8a1d2e51bb57d681b16ee12dc4af781aba80dfb956ede94b985e393') if __name__ == '__main__': unittest.main() diff --git a/tests/test_msg_signtx.py b/tests/test_msg_signtx.py index 6b9a859d2..4fee5cc09 100644 --- a/tests/test_msg_signtx.py +++ b/tests/test_msg_signtx.py @@ -104,7 +104,7 @@ class TestMsgSigntx(common.TrezorTest): ) out1 = proto_types.TxOutputType(address='mfiGQVPcRcaEvQPYDErR34DcCovtxYvUUV', - amount=1000000000 - 500000000 - 20000000, + amount=1000000000 - 500000000 - 100000000, script_type=proto_types.PAYTOADDRESS, ) @@ -136,7 +136,7 @@ class TestMsgSigntx(common.TrezorTest): ]) (signatures, serialized_tx) = self.client.sign_tx('Testnet', [inp1, ], [out1, out2]) - self.assertEqual(binascii.hexlify(serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006a47304402205ea68e9d52d4be14420ccecf7f2e11489d49b86bedb79ee99b5e9b7188884150022056219cb3384a5df8048cca286a9533403dbda1571afd84b51379cdaee6a6dea80121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff020084d717000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') def test_one_two_fee(self): self.setup_mnemonic_nopin_nopassphrase() @@ -401,7 +401,7 @@ class TestMsgSigntx(common.TrezorTest): ) out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', - amount=390000 - 50000, + amount=390000 - 250000, script_type=proto_types.PAYTOADDRESS, ) @@ -423,7 +423,7 @@ class TestMsgSigntx(common.TrezorTest): ]) (signatures, serialized_tx) = self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) - self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100a3b17b37de3bfecca47f0d49f7bb0d0f68d45df7defe45713d57e83731f5e3d902205404b14630cea6a88b23a5f7c3a1b88494757a8ca5e1c0b0b93cf3c38231c3bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff01e0220200000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') def test_not_enough_funds(self): self.setup_mnemonic_nopin_nopassphrase() diff --git a/tests/test_msg_simplesigntx.py b/tests/test_msg_simplesigntx.py index 82efd57b4..b93fe61a7 100644 --- a/tests/test_msg_simplesigntx.py +++ b/tests/test_msg_simplesigntx.py @@ -81,7 +81,7 @@ class TestMsgSimplesigntx(common.TrezorTest): ) out1 = proto_types.TxOutputType(address='mfiGQVPcRcaEvQPYDErR34DcCovtxYvUUV', - amount=1000000000 - 500000000 - 20000000, + amount=1000000000 - 500000000 - 100000000, script_type=proto_types.PAYTOADDRESS, ) @@ -99,7 +99,7 @@ class TestMsgSimplesigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXFINISHED)]) serialized_tx = self.client.simple_sign_tx('Testnet', [inp1, ], [out1, out2]) - self.assertEqual(binascii.hexlify(serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006b483045022100d74e9fa5c7ff5966d52bce8d1d772c1e3ef1376395fb85a0bbf910e723bd606d02204cb8df6debd7c4c076632011bb1e180495bcf3630d2471c354bed56c2e45a2180121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0200389c1c000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '0100000001549d2977998f899a63c0a9da30dedb2841e33fef561097b05822eccbc7f3906f010000006a47304402205ea68e9d52d4be14420ccecf7f2e11489d49b86bedb79ee99b5e9b7188884150022056219cb3384a5df8048cca286a9533403dbda1571afd84b51379cdaee6a6dea80121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff020084d717000000001976a9140223b1a09138753c9cb0baf95a0a62c82711567a88ac0065cd1d000000001976a9142db345c36563122e2fd0f5485fb7ea9bbf7cb5a288ac00000000') def test_one_two_fee(self): self.setup_mnemonic_nopin_nopassphrase() @@ -264,7 +264,7 @@ class TestMsgSimplesigntx(common.TrezorTest): ) out1 = proto_types.TxOutputType(address='1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1', - amount=390000 - 50000, + amount=390000 - 250000, script_type=proto_types.PAYTOADDRESS, ) @@ -275,7 +275,7 @@ class TestMsgSimplesigntx(common.TrezorTest): proto.TxRequest(request_type=proto_types.TXFINISHED)]) serialized_tx = self.client.simple_sign_tx('Bitcoin', [inp1, ], [out1, ]) - self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006a4730440220361b8268718533055682f4532d30c553ce778f70b217457a9aa1956e457c5aac0220538ae285bb340484bb09a67635d29192a14e61d8a8385b8b090a92e3e97e1c010121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff0120300500000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') + self.assertEqual(binascii.hexlify(serialized_tx), '010000000182488650ef25a58fef6788bd71b8212038d7f2bbe4750bc7bcb44701e85ef6d5000000006b483045022100a3b17b37de3bfecca47f0d49f7bb0d0f68d45df7defe45713d57e83731f5e3d902205404b14630cea6a88b23a5f7c3a1b88494757a8ca5e1c0b0b93cf3c38231c3bd0121023230848585885f63803a0a8aecdd6538792d5c539215c91698e315bf0253b43dffffffff01e0220200000000001976a914de9b2a8da088824e8fe51debea566617d851537888ac00000000') def test_not_enough_funds(self): self.setup_mnemonic_nopin_nopassphrase() From a22dbca8fe8a9085d77a389d96c4bff9009c2f93 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 3 Aug 2015 21:58:04 +0200 Subject: [PATCH 0461/1535] adapt signidentity test to new ssh signatures --- tests/test_msg_signidentity.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_msg_signidentity.py b/tests/test_msg_signidentity.py index 710070dc2..2654bd5e5 100644 --- a/tests/test_msg_signidentity.py +++ b/tests/test_msg_signidentity.py @@ -24,9 +24,9 @@ class TestMsgSignidentity(common.TrezorTest): identity = proto_types.IdentityType(proto='ssh', user='satoshi', host='bitcoin.org', port='', path='', index=47) sig = self.client.sign_identity(identity, binascii.unhexlify('531c4dd0a92caff62817eaec3065b65d'), '2015/02/20 16:50') - self.assertEqual(sig.address, '16MMzfyr5LPBNZ359NhjCthi2scrMufTAM') + self.assertEqual(sig.address, '') self.assertEqual(binascii.hexlify(sig.public_key), '03cebfae5359d6c48b8dcf9da22b2113096548407ce21da8ab28a886f750f217f4') - self.assertEqual(binascii.hexlify(sig.signature), '1f888a4b2b719d06b951799527eb753ec79a850b85c81b36b66caa2f3779a5e73827a2db77b8a1d2e51bb57d681b16ee12dc4af781aba80dfb956ede94b985e393') + self.assertEqual(binascii.hexlify(sig.signature), '00591d42831787e344ac9b6c1b5c0ed41af6eb20e08414ed312d20c991126f944e74bbabf5e9a98c28501386bab7cbd9b632953df549ac21096fd7bc7899017698') if __name__ == '__main__': unittest.main() From b2bc5092189c174735f70e1cad0b68e461b40e42 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 21 Aug 2015 15:16:27 +0200 Subject: [PATCH 0462/1535] added description for pin entering --- tests/test_msg_signidentity.py | 15 +++++++++------ trezorlib/client.py | 4 ++++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/tests/test_msg_signidentity.py b/tests/test_msg_signidentity.py index 2654bd5e5..10fafbabe 100644 --- a/tests/test_msg_signidentity.py +++ b/tests/test_msg_signidentity.py @@ -10,23 +10,26 @@ class TestMsgSignidentity(common.TrezorTest): def test_sign(self): self.setup_mnemonic_nopin_nopassphrase() + hidden = binascii.unhexlify('cd8552569d6e4509266ef137584d1e62c7579b5b8ed69bbafa4b864c6521e7c2') + visual = '2015-03-23 17:39:22' + identity = proto_types.IdentityType(proto='https', user='satoshi', host='bitcoin.org', port='', path='/login', index=0) - sig = self.client.sign_identity(identity, binascii.unhexlify('531c4dd0a92caff62817eaec3065b65d'), '2015/02/20 16:50') + sig = self.client.sign_identity(identity, hidden, visual) self.assertEqual(sig.address, '17F17smBTX9VTZA9Mj8LM5QGYNZnmziCjL') self.assertEqual(binascii.hexlify(sig.public_key), '023a472219ad3327b07c18273717bb3a40b39b743756bf287fbd5fa9d263237f45') - self.assertEqual(binascii.hexlify(sig.signature), '208e131a2ee1b9b5108b899f21f167a9e17d2daaba4e33724838ab692e28a512047ee322fe86d3e9b8624b28741de8e2595ea2d6af4487729711b72cb05f766fc0') + self.assertEqual(binascii.hexlify(sig.signature), '20f2d1a42d08c3a362be49275c3ffeeaa415fc040971985548b9f910812237bb41770bf2c8d488428799fbb7e52c11f1a3404011375e4080e077e0e42ab7a5ba02') identity = proto_types.IdentityType(proto='ftp', user='satoshi', host='bitcoin.org', port='2323', path='/pub', index=3) - sig = self.client.sign_identity(identity, binascii.unhexlify('531c4dd0a92caff62817eaec3065b65d'), '2015/02/20 16:50') + sig = self.client.sign_identity(identity, hidden, visual) self.assertEqual(sig.address, '1KAr6r5qF2kADL8bAaRQBjGKYEGxn9WrbS') self.assertEqual(binascii.hexlify(sig.public_key), '0266cf12d2ba381c5fd797da0d64f59c07a6f1b034ad276cca6bf2729e92b20d9c') - self.assertEqual(binascii.hexlify(sig.signature), '20d24fff632767928a997af046ca22bf56662559a9619af38d972e45fa806c55a403c26157d27aa21d2380bb39792278b063df082793c99b450501aa40a7c31d53') + self.assertEqual(binascii.hexlify(sig.signature), '20bbd12dc657d534fc0f7e40186e22c447e0866a016f654f380adffa9a84e9faf412a1bb0ae908296537838cf91145e77da08681c63d07b7dca40728b9e6cb17cf') identity = proto_types.IdentityType(proto='ssh', user='satoshi', host='bitcoin.org', port='', path='', index=47) - sig = self.client.sign_identity(identity, binascii.unhexlify('531c4dd0a92caff62817eaec3065b65d'), '2015/02/20 16:50') + sig = self.client.sign_identity(identity, hidden, visual) self.assertEqual(sig.address, '') self.assertEqual(binascii.hexlify(sig.public_key), '03cebfae5359d6c48b8dcf9da22b2113096548407ce21da8ab28a886f750f217f4') - self.assertEqual(binascii.hexlify(sig.signature), '00591d42831787e344ac9b6c1b5c0ed41af6eb20e08414ed312d20c991126f944e74bbabf5e9a98c28501386bab7cbd9b632953df549ac21096fd7bc7899017698') + self.assertEqual(binascii.hexlify(sig.signature), '00122463a8430b74b5d8c41d7c9bacc65f0eb51ceda71b9fec112e76bf2e56d8a64a66b8e019678315dc08e3be96905ea7718ec3b731e8e57e1613671ee91d1706') if __name__ == '__main__': unittest.main() diff --git a/trezorlib/client.py b/trezorlib/client.py index 79a8ed709..8b244578c 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -176,6 +176,10 @@ class TextUIMixin(object): else: desc = 'PIN' + log("Use the numeric keypad to describe number positions. The layout is:") + log(" 7 8 9") + log(" 4 5 6") + log(" 1 2 3") log("Please enter %s: " % desc) pin = getpass.getpass('') return proto.PinMatrixAck(pin=pin) From ef00dfa403ff6ee953ffb4ac5118dd636881be9e Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 21 Aug 2015 20:30:31 +0200 Subject: [PATCH 0463/1535] update protobuf --- trezorlib/messages_pb2.py | 79 +++++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/trezorlib/messages_pb2.py b/trezorlib/messages_pb2.py index 8cdf6170f..6fab6a86e 100644 --- a/trezorlib/messages_pb2.py +++ b/trezorlib/messages_pb2.py @@ -15,7 +15,7 @@ import types_pb2 DESCRIPTOR = _descriptor.FileDescriptor( name='messages.proto', package='', - serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\r\n\x0bGetFeatures\"\xfe\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\x12\x12\n\npin_cached\x18\x10 \x01(\x08\x12\x19\n\x11passphrase_cached\x18\x11 \x01(\x08\"\x0e\n\x0c\x43learSession\"\\\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x16\n\x0euse_passphrase\x18\x03 \x01(\x08\x12\x12\n\nhomescreen\x18\x04 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\";\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x18\n\x10\x65\x63\x64sa_curve_name\x18\x02 \x01(\t\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"~\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\x12+\n\x08multisig\x18\x04 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"@\n\x10\x45ncryptedMessage\x12\r\n\x05nonce\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0c\n\x04hmac\x18\x03 \x01(\x0c\"Q\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\r\n\x05nonce\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0c\n\x04hmac\x18\x04 \x01(\x0c\"4\n\x10\x44\x65\x63ryptedMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x80\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\"!\n\x10\x43ipheredKeyValue\x12\r\n\x05value\x18\x01 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"}\n\x0cSignIdentity\x12\x1f\n\x08identity\x18\x01 \x01(\x0b\x32\r.IdentityType\x12\x18\n\x10\x63hallenge_hidden\x18\x02 \x01(\x0c\x12\x18\n\x10\x63hallenge_visual\x18\x03 \x01(\t\x12\x18\n\x10\x65\x63\x64sa_curve_name\x18\x04 \x01(\t\"H\n\x0eSignedIdentity\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x12\n\npublic_key\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x86\x0f\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_CipheredKeyValue\x10\x30\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_EncryptedMessage\x10\x32\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x33\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_DecryptedMessage\x10\x34\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_SignIdentity\x10\x35\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_SignedIdentity\x10\x36\x1a\x04\x98\xb5\x18\x01\x12!\n\x17MessageType_GetFeatures\x10\x37\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') + serialized_pb='\n\x0emessages.proto\x1a\x0btypes.proto\"\x0c\n\nInitialize\"\r\n\x0bGetFeatures\"\xfe\x02\n\x08\x46\x65\x61tures\x12\x0e\n\x06vendor\x18\x01 \x01(\t\x12\x15\n\rmajor_version\x18\x02 \x01(\r\x12\x15\n\rminor_version\x18\x03 \x01(\r\x12\x15\n\rpatch_version\x18\x04 \x01(\r\x12\x17\n\x0f\x62ootloader_mode\x18\x05 \x01(\x08\x12\x11\n\tdevice_id\x18\x06 \x01(\t\x12\x16\n\x0epin_protection\x18\x07 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x08 \x01(\x08\x12\x10\n\x08language\x18\t \x01(\t\x12\r\n\x05label\x18\n \x01(\t\x12\x18\n\x05\x63oins\x18\x0b \x03(\x0b\x32\t.CoinType\x12\x13\n\x0binitialized\x18\x0c \x01(\x08\x12\x10\n\x08revision\x18\r \x01(\x0c\x12\x17\n\x0f\x62ootloader_hash\x18\x0e \x01(\x0c\x12\x10\n\x08imported\x18\x0f \x01(\x08\x12\x12\n\npin_cached\x18\x10 \x01(\x08\x12\x19\n\x11passphrase_cached\x18\x11 \x01(\x08\"\x0e\n\x0c\x43learSession\"\\\n\rApplySettings\x12\x10\n\x08language\x18\x01 \x01(\t\x12\r\n\x05label\x18\x02 \x01(\t\x12\x16\n\x0euse_passphrase\x18\x03 \x01(\x08\x12\x12\n\nhomescreen\x18\x04 \x01(\x0c\"\x1b\n\tChangePin\x12\x0e\n\x06remove\x18\x01 \x01(\x08\"i\n\x04Ping\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x19\n\x11\x62utton_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\"\x1a\n\x07Success\x12\x0f\n\x07message\x18\x01 \x01(\t\"6\n\x07\x46\x61ilure\x12\x1a\n\x04\x63ode\x18\x01 \x01(\x0e\x32\x0c.FailureType\x12\x0f\n\x07message\x18\x02 \x01(\t\"?\n\rButtonRequest\x12 \n\x04\x63ode\x18\x01 \x01(\x0e\x32\x12.ButtonRequestType\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\t\"\x0b\n\tButtonAck\"7\n\x10PinMatrixRequest\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.PinMatrixRequestType\"\x1b\n\x0cPinMatrixAck\x12\x0b\n\x03pin\x18\x01 \x02(\t\"\x08\n\x06\x43\x61ncel\"\x13\n\x11PassphraseRequest\"#\n\rPassphraseAck\x12\x12\n\npassphrase\x18\x01 \x02(\t\"\x1a\n\nGetEntropy\x12\x0c\n\x04size\x18\x01 \x02(\r\"\x1a\n\x07\x45ntropy\x12\x0f\n\x07\x65ntropy\x18\x01 \x02(\x0c\";\n\x0cGetPublicKey\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x18\n\x10\x65\x63\x64sa_curve_name\x18\x02 \x01(\t\"4\n\tPublicKey\x12\x19\n\x04node\x18\x01 \x02(\x0b\x32\x0b.HDNodeType\x12\x0c\n\x04xpub\x18\x02 \x01(\t\"~\n\nGetAddress\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x1a\n\tcoin_name\x18\x02 \x01(\t:\x07\x42itcoin\x12\x14\n\x0cshow_display\x18\x03 \x01(\x08\x12+\n\x08multisig\x18\x04 \x01(\x0b\x32\x19.MultisigRedeemScriptType\"\x1a\n\x07\x41\x64\x64ress\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x02(\t\"\x0c\n\nWipeDevice\"\xa6\x01\n\nLoadDevice\x12\x10\n\x08mnemonic\x18\x01 \x01(\t\x12\x19\n\x04node\x18\x02 \x01(\x0b\x32\x0b.HDNodeType\x12\x0b\n\x03pin\x18\x03 \x01(\t\x12\x1d\n\x15passphrase_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\x12\x15\n\rskip_checksum\x18\x07 \x01(\x08\"\x9d\x01\n\x0bResetDevice\x12\x16\n\x0e\x64isplay_random\x18\x01 \x01(\x08\x12\x15\n\x08strength\x18\x02 \x01(\r:\x03\x31\x32\x38\x12\x1d\n\x15passphrase_protection\x18\x03 \x01(\x08\x12\x16\n\x0epin_protection\x18\x04 \x01(\x08\x12\x19\n\x08language\x18\x05 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x06 \x01(\t\"\x10\n\x0e\x45ntropyRequest\"\x1d\n\nEntropyAck\x12\x0f\n\x07\x65ntropy\x18\x01 \x01(\x0c\"\x9f\x01\n\x0eRecoveryDevice\x12\x12\n\nword_count\x18\x01 \x01(\r\x12\x1d\n\x15passphrase_protection\x18\x02 \x01(\x08\x12\x16\n\x0epin_protection\x18\x03 \x01(\x08\x12\x19\n\x08language\x18\x04 \x01(\t:\x07\x65nglish\x12\r\n\x05label\x18\x05 \x01(\t\x12\x18\n\x10\x65nforce_wordlist\x18\x06 \x01(\x08\"\r\n\x0bWordRequest\"\x17\n\x07WordAck\x12\x0c\n\x04word\x18\x01 \x02(\t\"M\n\x0bSignMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0f\n\x07message\x18\x02 \x02(\x0c\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"D\n\rVerifyMessage\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\"6\n\x10MessageSignature\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x11\n\tsignature\x18\x02 \x01(\x0c\"v\n\x0e\x45ncryptMessage\x12\x0e\n\x06pubkey\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x14\n\x0c\x64isplay_only\x18\x03 \x01(\x08\x12\x11\n\taddress_n\x18\x04 \x03(\r\x12\x1a\n\tcoin_name\x18\x05 \x01(\t:\x07\x42itcoin\"@\n\x10\x45ncryptedMessage\x12\r\n\x05nonce\x18\x01 \x01(\x0c\x12\x0f\n\x07message\x18\x02 \x01(\x0c\x12\x0c\n\x04hmac\x18\x03 \x01(\x0c\"Q\n\x0e\x44\x65\x63ryptMessage\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\r\n\x05nonce\x18\x02 \x01(\x0c\x12\x0f\n\x07message\x18\x03 \x01(\x0c\x12\x0c\n\x04hmac\x18\x04 \x01(\x0c\"4\n\x10\x44\x65\x63ryptedMessage\x12\x0f\n\x07message\x18\x01 \x01(\x0c\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\"\x8c\x01\n\x0e\x43ipherKeyValue\x12\x11\n\taddress_n\x18\x01 \x03(\r\x12\x0b\n\x03key\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\x0c\x12\x0f\n\x07\x65ncrypt\x18\x04 \x01(\x08\x12\x16\n\x0e\x61sk_on_encrypt\x18\x05 \x01(\x08\x12\x16\n\x0e\x61sk_on_decrypt\x18\x06 \x01(\x08\x12\n\n\x02iv\x18\x07 \x01(\x0c\"!\n\x10\x43ipheredKeyValue\x12\r\n\x05value\x18\x01 \x01(\x0c\"Y\n\x0e\x45stimateTxSize\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x19\n\x06TxSize\x12\x0f\n\x07tx_size\x18\x01 \x01(\r\"Q\n\x06SignTx\x12\x15\n\routputs_count\x18\x01 \x02(\r\x12\x14\n\x0cinputs_count\x18\x02 \x02(\r\x12\x1a\n\tcoin_name\x18\x03 \x01(\t:\x07\x42itcoin\"\x90\x01\n\x0cSimpleSignTx\x12\x1c\n\x06inputs\x18\x01 \x03(\x0b\x32\x0c.TxInputType\x12\x1e\n\x07outputs\x18\x02 \x03(\x0b\x32\r.TxOutputType\x12&\n\x0ctransactions\x18\x03 \x03(\x0b\x32\x10.TransactionType\x12\x1a\n\tcoin_name\x18\x04 \x01(\t:\x07\x42itcoin\"\x85\x01\n\tTxRequest\x12\"\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x0c.RequestType\x12&\n\x07\x64\x65tails\x18\x02 \x01(\x0b\x32\x15.TxRequestDetailsType\x12,\n\nserialized\x18\x03 \x01(\x0b\x32\x18.TxRequestSerializedType\"%\n\x05TxAck\x12\x1c\n\x02tx\x18\x01 \x01(\x0b\x32\x10.TransactionType\"}\n\x0cSignIdentity\x12\x1f\n\x08identity\x18\x01 \x01(\x0b\x32\r.IdentityType\x12\x18\n\x10\x63hallenge_hidden\x18\x02 \x01(\x0c\x12\x18\n\x10\x63hallenge_visual\x18\x03 \x01(\t\x12\x18\n\x10\x65\x63\x64sa_curve_name\x18\x04 \x01(\t\"H\n\x0eSignedIdentity\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\t\x12\x12\n\npublic_key\x18\x02 \x01(\x0c\x12\x11\n\tsignature\x18\x03 \x01(\x0c\"\x0f\n\rFirmwareErase\"!\n\x0e\x46irmwareUpload\x12\x0f\n\x07payload\x18\x01 \x02(\x0c\"#\n\x11\x44\x65\x62ugLinkDecision\x12\x0e\n\x06yes_no\x18\x01 \x02(\x08\"\x13\n\x11\x44\x65\x62ugLinkGetState\"\xeb\x01\n\x0e\x44\x65\x62ugLinkState\x12\x0e\n\x06layout\x18\x01 \x01(\x0c\x12\x0b\n\x03pin\x18\x02 \x01(\t\x12\x0e\n\x06matrix\x18\x03 \x01(\t\x12\x10\n\x08mnemonic\x18\x04 \x01(\t\x12\x19\n\x04node\x18\x05 \x01(\x0b\x32\x0b.HDNodeType\x12\x1d\n\x15passphrase_protection\x18\x06 \x01(\x08\x12\x12\n\nreset_word\x18\x07 \x01(\t\x12\x15\n\rreset_entropy\x18\x08 \x01(\x0c\x12\x1a\n\x12recovery_fake_word\x18\t \x01(\t\x12\x19\n\x11recovery_word_pos\x18\n \x01(\r\"\x0f\n\rDebugLinkStop\";\n\x0c\x44\x65\x62ugLinkLog\x12\r\n\x05level\x18\x01 \x01(\r\x12\x0e\n\x06\x62ucket\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t*\x86\x0f\n\x0bMessageType\x12 \n\x16MessageType_Initialize\x10\x00\x1a\x04\x90\xb5\x18\x01\x12\x1a\n\x10MessageType_Ping\x10\x01\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Success\x10\x02\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_Failure\x10\x03\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ChangePin\x10\x04\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_WipeDevice\x10\x05\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_FirmwareErase\x10\x06\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_FirmwareUpload\x10\x07\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetEntropy\x10\t\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Entropy\x10\n\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_GetPublicKey\x10\x0b\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_PublicKey\x10\x0c\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_LoadDevice\x10\r\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_ResetDevice\x10\x0e\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_SignTx\x10\x0f\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_SimpleSignTx\x10\x10\x1a\x04\x90\xb5\x18\x01\x12\x1e\n\x14MessageType_Features\x10\x11\x1a\x04\x98\xb5\x18\x01\x12&\n\x1cMessageType_PinMatrixRequest\x10\x12\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_PinMatrixAck\x10\x13\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_Cancel\x10\x14\x1a\x04\x90\xb5\x18\x01\x12\x1f\n\x15MessageType_TxRequest\x10\x15\x1a\x04\x98\xb5\x18\x01\x12\x1b\n\x11MessageType_TxAck\x10\x16\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_CipherKeyValue\x10\x17\x1a\x04\x90\xb5\x18\x01\x12\"\n\x18MessageType_ClearSession\x10\x18\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ApplySettings\x10\x19\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_ButtonRequest\x10\x1a\x1a\x04\x98\xb5\x18\x01\x12\x1f\n\x15MessageType_ButtonAck\x10\x1b\x1a\x04\x90\xb5\x18\x01\x12 \n\x16MessageType_GetAddress\x10\x1d\x1a\x04\x90\xb5\x18\x01\x12\x1d\n\x13MessageType_Address\x10\x1e\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EntropyRequest\x10#\x1a\x04\x98\xb5\x18\x01\x12 \n\x16MessageType_EntropyAck\x10$\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_SignMessage\x10&\x1a\x04\x90\xb5\x18\x01\x12#\n\x19MessageType_VerifyMessage\x10\'\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_MessageSignature\x10(\x1a\x04\x98\xb5\x18\x01\x12\'\n\x1dMessageType_PassphraseRequest\x10)\x1a\x04\x98\xb5\x18\x01\x12#\n\x19MessageType_PassphraseAck\x10*\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_EstimateTxSize\x10+\x1a\x04\x90\xb5\x18\x01\x12\x1c\n\x12MessageType_TxSize\x10,\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_RecoveryDevice\x10-\x1a\x04\x90\xb5\x18\x01\x12!\n\x17MessageType_WordRequest\x10.\x1a\x04\x98\xb5\x18\x01\x12\x1d\n\x13MessageType_WordAck\x10/\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_CipheredKeyValue\x10\x30\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_EncryptMessage\x10\x31\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_EncryptedMessage\x10\x32\x1a\x04\x98\xb5\x18\x01\x12$\n\x1aMessageType_DecryptMessage\x10\x33\x1a\x04\x90\xb5\x18\x01\x12&\n\x1cMessageType_DecryptedMessage\x10\x34\x1a\x04\x98\xb5\x18\x01\x12\"\n\x18MessageType_SignIdentity\x10\x35\x1a\x04\x90\xb5\x18\x01\x12$\n\x1aMessageType_SignedIdentity\x10\x36\x1a\x04\x98\xb5\x18\x01\x12!\n\x17MessageType_GetFeatures\x10\x37\x1a\x04\x90\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkDecision\x10\x64\x1a\x04\xa0\xb5\x18\x01\x12\'\n\x1dMessageType_DebugLinkGetState\x10\x65\x1a\x04\xa0\xb5\x18\x01\x12$\n\x1aMessageType_DebugLinkState\x10\x66\x1a\x04\xa8\xb5\x18\x01\x12#\n\x19MessageType_DebugLinkStop\x10g\x1a\x04\xa0\xb5\x18\x01\x12\"\n\x18MessageType_DebugLinkLog\x10h\x1a\x04\xa8\xb5\x18\x01\x42\x30\n\x1f\x63om.satoshilabs.trezor.protobufB\rTrezorMessage') _MESSAGETYPE = _descriptor.EnumDescriptor( name='MessageType', @@ -242,8 +242,8 @@ _MESSAGETYPE = _descriptor.EnumDescriptor( ], containing_type=None, options=None, - serialized_start=3773, - serialized_end=5699, + serialized_start=3785, + serialized_end=5711, ) MessageType = enum_type_wrapper.EnumTypeWrapper(_MESSAGETYPE) @@ -1746,6 +1746,13 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + _descriptor.FieldDescriptor( + name='iv', full_name='CipherKeyValue.iv', index=6, + number=7, type=12, cpp_type=9, label=1, + has_default_value=False, default_value="", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], @@ -1756,7 +1763,7 @@ _CIPHERKEYVALUE = _descriptor.Descriptor( is_extendable=False, extension_ranges=[], serialized_start=2457, - serialized_end=2585, + serialized_end=2597, ) @@ -1783,8 +1790,8 @@ _CIPHEREDKEYVALUE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2587, - serialized_end=2620, + serialized_start=2599, + serialized_end=2632, ) @@ -1825,8 +1832,8 @@ _ESTIMATETXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2622, - serialized_end=2711, + serialized_start=2634, + serialized_end=2723, ) @@ -1853,8 +1860,8 @@ _TXSIZE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2713, - serialized_end=2738, + serialized_start=2725, + serialized_end=2750, ) @@ -1895,8 +1902,8 @@ _SIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2740, - serialized_end=2821, + serialized_start=2752, + serialized_end=2833, ) @@ -1944,8 +1951,8 @@ _SIMPLESIGNTX = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2824, - serialized_end=2968, + serialized_start=2836, + serialized_end=2980, ) @@ -1986,8 +1993,8 @@ _TXREQUEST = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=2971, - serialized_end=3104, + serialized_start=2983, + serialized_end=3116, ) @@ -2014,8 +2021,8 @@ _TXACK = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3106, - serialized_end=3143, + serialized_start=3118, + serialized_end=3155, ) @@ -2063,8 +2070,8 @@ _SIGNIDENTITY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3145, - serialized_end=3270, + serialized_start=3157, + serialized_end=3282, ) @@ -2105,8 +2112,8 @@ _SIGNEDIDENTITY = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3272, - serialized_end=3344, + serialized_start=3284, + serialized_end=3356, ) @@ -2126,8 +2133,8 @@ _FIRMWAREERASE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3346, - serialized_end=3361, + serialized_start=3358, + serialized_end=3373, ) @@ -2154,8 +2161,8 @@ _FIRMWAREUPLOAD = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3363, - serialized_end=3396, + serialized_start=3375, + serialized_end=3408, ) @@ -2182,8 +2189,8 @@ _DEBUGLINKDECISION = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3398, - serialized_end=3433, + serialized_start=3410, + serialized_end=3445, ) @@ -2203,8 +2210,8 @@ _DEBUGLINKGETSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3435, - serialized_end=3454, + serialized_start=3447, + serialized_end=3466, ) @@ -2294,8 +2301,8 @@ _DEBUGLINKSTATE = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3457, - serialized_end=3692, + serialized_start=3469, + serialized_end=3704, ) @@ -2315,8 +2322,8 @@ _DEBUGLINKSTOP = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3694, - serialized_end=3709, + serialized_start=3706, + serialized_end=3721, ) @@ -2357,8 +2364,8 @@ _DEBUGLINKLOG = _descriptor.Descriptor( options=None, is_extendable=False, extension_ranges=[], - serialized_start=3711, - serialized_end=3770, + serialized_start=3723, + serialized_end=3782, ) _FEATURES.fields_by_name['coins'].message_type = types_pb2._COINTYPE From a20f97672193fb8ed19d623fa7928e561e290260 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Fri, 21 Aug 2015 20:30:46 +0200 Subject: [PATCH 0464/1535] 0.6.6 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8743755cc..432b67ecb 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name='trezor', - version='0.6.5', + version='0.6.6', author='Bitcoin TREZOR', author_email='info@bitcointrezor.com', description='Python library for communicating with TREZOR Bitcoin Hardware Wallet', From 6475f98b1ec8d2f1bd9740d516014d9c4dbf5a6b Mon Sep 17 00:00:00 2001 From: Chris Rico Date: Fri, 4 Sep 2015 13:41:54 -0500 Subject: [PATCH 0465/1535] Allow firmware update by version or latest from releases.json --- trezorctl | 65 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/trezorctl b/trezorctl index 55b389efa..dae0c2012 100755 --- a/trezorctl +++ b/trezorctl @@ -20,22 +20,22 @@ def parse_args(commands): # parser.add_argument('-d', '--debug', dest='debug', action='store_true', help='Enable low-level debugging') cmdparser = parser.add_subparsers(title='Available commands') - + for cmd in commands._list_commands(): func = object.__getattribute__(commands, cmd) - + try: arguments = func.arguments except AttributeError: arguments = ((('params',), {'nargs': '*'}),) - + item = cmdparser.add_parser(cmd, help=func.help) for arg in arguments: item.add_argument(*arg[0], **arg[1]) - + item.set_defaults(func=func) item.set_defaults(cmd=cmd) - + return parser.parse_args() def get_transport(transport_string, path, **kwargs): @@ -54,7 +54,7 @@ def get_transport(transport_string, path, **kwargs): return HidTransport(d, **kwargs) raise Exception("Device not found") - + if transport_string == 'serial': from trezorlib.transport_serial import SerialTransport return SerialTransport(path, **kwargs) @@ -62,7 +62,7 @@ def get_transport(transport_string, path, **kwargs): if transport_string == 'pipe': from trezorlib.transport_pipe import PipeTransport return PipeTransport(path, is_device=False, **kwargs) - + if transport_string == 'socket': from trezorlib.transport_socket import SocketTransportClient return SocketTransportClient(path, **kwargs) @@ -70,29 +70,29 @@ def get_transport(transport_string, path, **kwargs): if transport_string == 'bridge': from trezorlib.transport_bridge import BridgeTransport return BridgeTransport(path, **kwargs) - + if transport_string == 'fake': from trezorlib.transport_fake import FakeTransport return FakeTransport(path, **kwargs) - + raise NotImplemented("Unknown transport") class Commands(object): def __init__(self, client): self.client = client - + @classmethod def _list_commands(cls): return [ x for x in dir(cls) if not x.startswith('_') ] - + def list(self, args): # Fake method for advertising 'list' command pass - + def get_address(self, args): address_n = self.client.expand_path(args.n) return self.client.get_address(args.coin, address_n, args.show_display) - + def get_entropy(self, args): return binascii.hexlify(self.client.get_entropy(args.size)) @@ -108,7 +108,7 @@ class Commands(object): def get_public_node(self, args): address_n = self.client.expand_path(args.n) return self.client.get_public_node(address_n) - + def set_label(self, args): return self.client.apply_settings(label=args.label) @@ -203,9 +203,6 @@ class Commands(object): return ret def firmware_update(self, args): - if not args.file and not args.url: - raise Exception("Must provide firmware filename or URL") - if args.file: fp = open(args.file, 'r') elif args.url: @@ -213,18 +210,31 @@ class Commands(object): resp = urllib.urlretrieve(args.url) fp = open(resp[0], 'r') urllib.urlcleanup() # We still keep file pointer open - + else: + resp = urllib.urlopen("https://mytrezor.com/data/firmware/releases.json") + releases = json.load(resp) + version = lambda r: r['version'] + version_string = lambda r: ".".join(map(str, version(r))) + if args.version: + release = next((r for r in releases if version_string(r) == args.version)) + else: + release = max(releases, key=version) + print "No file, url, or version given. Fetching latest version: %s" % version_string(release) + print "Firmware fingerprint: %s" % release['fingerprint'] + args.url = release['url'] + return self.firmware_update(args) + if fp.read(8) == '54525a52': print "Converting firmware to binary" fp.seek(0) fp_old = fp - + fp = tempfile.TemporaryFile() fp.write(binascii.unhexlify(fp_old.read())) fp_old.close() - + fp.seek(0) if fp.read(4) != 'TRZR': raise Exception("Trezor firmware header expected") @@ -262,7 +272,7 @@ class Commands(object): (('-n', '-address'), {'type': str}), (('-d', '--show-display'), {'action': 'store_true', 'default': False}), ) - + get_entropy.arguments = ( (('size',), {'type': int}), ) @@ -277,7 +287,7 @@ class Commands(object): (('-p', '--pin-protection'), {'action': 'store_true', 'default': False}), (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), ) - + set_label.arguments = ( (('-l', '--label',), {'type': str, 'default': ''}), # (('-c', '--clear'), {'action': 'store_true', 'default': False}) @@ -289,7 +299,7 @@ class Commands(object): change_pin.arguments = ( (('-r', '--remove'), {'action': 'store_true', 'default': False}), ) - + wipe_device.arguments = () recovery_device.arguments = ( @@ -358,6 +368,7 @@ class Commands(object): firmware_update.arguments = ( (('-f', '--file'), {'type': str}), (('-u', '--url'), {'type': str}), + (('-n', '--version'), {'type': str}), ) def list_usb(): @@ -418,7 +429,7 @@ def qt_pin_func(input_text, message=None): # let's fallback to default pin_func implementation return pin_func(input_text, message) ''' - + def main(): args = parse_args(Commands) @@ -441,13 +452,13 @@ def main(): client = TrezorClient(transport) cmds = Commands(client) - + res = args.func(cmds, args) - + if args.json: print json.dumps(res, sort_keys=True, indent=4) else: print res - + if __name__ == '__main__': main() From 8b0610c16abc202078dfab9c922f7c07de580169 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 19 Oct 2015 19:48:14 +0200 Subject: [PATCH 0466/1535] add skip checksum option to load device --- trezorctl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/trezorctl b/trezorctl index dae0c2012..5cfb3c2fa 100755 --- a/trezorctl +++ b/trezorctl @@ -149,7 +149,7 @@ class Commands(object): if args.mnemonic: mnemonic = ' '.join(args.mnemonic) return self.client.load_device_by_mnemonic(mnemonic, args.pin, - args.passphrase_protection, args.label, 'english') + args.passphrase_protection, args.label, 'english', args.skip_checksum) else: return self.client.load_device_by_xprv(args.xprv, args.pin, @@ -315,6 +315,7 @@ class Commands(object): (('-p', '--pin'), {'type': str, 'default': ''}), (('-r', '--passphrase-protection'), {'action': 'store_true', 'default': False}), (('-l', '--label'), {'type': str, 'default': ''}), + (('-s', '--skip-checksum'), {'action': 'store_true', 'default': False}), ) reset_device.arguments = ( From 3b167f7bc3ced8b6c3a92d2ae46a450aa9e1ce42 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Mon, 19 Oct 2015 19:50:59 +0200 Subject: [PATCH 0467/1535] 0.6.7 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 432b67ecb..a9db211f5 100755 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup setup( name='trezor', - version='0.6.6', + version='0.6.7', author='Bitcoin TREZOR', author_email='info@bitcointrezor.com', description='Python library for communicating with TREZOR Bitcoin Hardware Wallet', From ca45019918bc4c54f1ace899a9acf397c8f4d92f Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Tue, 20 Oct 2015 18:12:39 +0200 Subject: [PATCH 0468/1535] add slip-13 paths to the test --- tests/test_msg_signidentity.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/test_msg_signidentity.py b/tests/test_msg_signidentity.py index 10fafbabe..ff7ac5307 100644 --- a/tests/test_msg_signidentity.py +++ b/tests/test_msg_signidentity.py @@ -1,10 +1,27 @@ import unittest import common import binascii +import hashlib +import struct from trezorlib.client import CallException import trezorlib.types_pb2 as proto_types +def check_path(identity): + m = hashlib.sha256() + m.update(struct.pack("