From ceb4dfe9a6733922168fa3d67b211efe50ee81b2 Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 18 Oct 2020 14:37:58 +0300 Subject: [PATCH 01/16] update publicKey tools update signTransaction tools (in progress...) --- test/eosBase.py | 12 +++++++----- test/getPublicKey.py | 21 +++++++++++++-------- test/signTransaction.py | 18 +++++++++++------- test/testDerivationPathGeneration.py | 24 ++++++++++++++---------- 4 files changed, 45 insertions(+), 30 deletions(-) diff --git a/test/eosBase.py b/test/eosBase.py index 374bdfb..bcf4820 100644 --- a/test/eosBase.py +++ b/test/eosBase.py @@ -17,6 +17,7 @@ * limitations under the License. ********************************************************************************/ """ +from __future__ import print_function from asn1 import Encoder, Numbers from datetime import datetime @@ -115,19 +116,20 @@ def parse_transfer(data): memo = data['memo'] parameters += Transaction.pack_fc_uint(len(memo)) if len(memo) > 0: - parameters += struct.pack(str(len(memo)) + 's', str(data['memo'])) + length = '{}s'.format(len(memo)) + parameters += struct.pack(length, data['memo'].encode()) return parameters @staticmethod def pack_fc_uint(value): - out = '' + out = b'' val = value while True: b = val & 0x7f val >>= 7 b |= ((val > 0) << 7) - out += chr(b) + out += chr(b).encode() if val == 0: break @@ -339,7 +341,7 @@ def parse(json): sha = hashlib.sha256() sha.update(action.data_size) sha.update(action.data) - print 'Argument checksum ' + sha.hexdigest() + print('Argument checksum ' + sha.hexdigest()) return tx @@ -370,7 +372,7 @@ def encode(self): sha.update(self.tx_ext) sha.update(self.cfd) - print 'Signing digest ' + sha.hexdigest() + print('Signing digest ' + sha.hexdigest()) encoder.start() encoder.write(self.chain_id, Numbers.OctetString) diff --git a/test/getPublicKey.py b/test/getPublicKey.py index 522f7fb..bf10454 100644 --- a/test/getPublicKey.py +++ b/test/getPublicKey.py @@ -17,17 +17,20 @@ * limitations under the License. ********************************************************************************/ """ +from __future__ import print_function + from ledgerblue.comm import getDongle import argparse import struct from base58 import b58encode import hashlib +import binascii def parse_bip32_path(path): if len(path) == 0: - return "" - result = "" + return b"" + result = b"" elements = path.split('/') for pathElement in elements: element = pathElement.split('\'') @@ -46,7 +49,8 @@ def parse_bip32_path(path): args.path = "44'/194'/0'/0/0" donglePath = parse_bip32_path(args.path) -apdu = "D4020001".decode('hex') + chr(len(donglePath) + 1) + chr(len(donglePath) / 4) + donglePath +apdu = bytearray.fromhex("D4020001") + chr(len(donglePath) + 1).encode() + \ + chr(len(donglePath) // 4).encode() + donglePath dongle = getDongle(True) result = dongle.exchange(bytes(apdu)) @@ -57,16 +61,17 @@ def parse_bip32_path(path): head = 0x03 if (public_key[64] & 0x01) == 1 else 0x02 public_key_compressed = bytearray([head]) + public_key[1:33] -print " Public key " + str(public_key).encode('hex') -print "Public key compressed " + str(public_key_compressed).encode('hex') +print(" Public key", binascii.hexlify(public_key)) +print("Public key compressed", binascii.hexlify(public_key_compressed)) ripemd = hashlib.new('ripemd160') ripemd.update(public_key_compressed) check = ripemd.digest()[:4] buff = public_key_compressed + check -print "Calculated from public key: Address EOS" + b58encode(str(buff)) -print " Received from ledger: Address " + str(address) +print("Calculated from public key: Address EOS" + b58encode(buff).decode()) +print(" Received from ledger: Address", address.decode()) -apdu = "D4020101".decode('hex') + chr(len(donglePath) + 1) + chr(len(donglePath) / 4) + donglePath +apdu = bytearray.fromhex("D4020101") + chr(len(donglePath) + 1).encode() + \ + chr(len(donglePath) // 4).encode() + donglePath result = dongle.exchange(bytes(apdu)) \ No newline at end of file diff --git a/test/signTransaction.py b/test/signTransaction.py index 2a08087..c958e70 100644 --- a/test/signTransaction.py +++ b/test/signTransaction.py @@ -28,8 +28,8 @@ def parse_bip32_path(path): if len(path) == 0: - return "" - result = "" + return b"" + result = b"" elements = path.split('/') for pathElement in elements: element = pathElement.split('\'') @@ -52,14 +52,14 @@ def parse_bip32_path(path): args.file = 'transaction.json' donglePath = parse_bip32_path(args.path) -pathSize = len(donglePath) / 4 +pathSize = len(donglePath) // 4 -with file(args.file) as f: +with open(args.file) as f: obj = json.load(f) tx = Transaction.parse(obj) tx_raw = tx.encode() signData = tx_raw - print binascii.hexlify(tx_raw) + print("Raw Tx", binascii.hexlify(tx_raw)) dongle = getDongle(True) offset = 0 @@ -73,7 +73,11 @@ def parse_bip32_path(path): if first: totalSize = len(donglePath) + 1 + len(chunk) - apdu = "D4040000".decode('hex') + chr(totalSize) + chr(pathSize) + donglePath + chunk + print("TOTAL", totalSize) + print("PATH", pathSize) + print("DONGLE", donglePath) + print("CHunk", chunk) + apdu = bytearray.fromhex("D4040000") + chr(totalSize) + chr(pathSize) + donglePath + chunk first = False else: totalSize = len(chunk) @@ -81,4 +85,4 @@ def parse_bip32_path(path): offset += len(chunk) result = dongle.exchange(bytes(apdu)) - print binascii.hexlify(result) \ No newline at end of file + print(binascii.hexlify(result)) \ No newline at end of file diff --git a/test/testDerivationPathGeneration.py b/test/testDerivationPathGeneration.py index eba6091..3e0aaf8 100644 --- a/test/testDerivationPathGeneration.py +++ b/test/testDerivationPathGeneration.py @@ -17,16 +17,19 @@ * limitations under the License. ********************************************************************************/ """ +from __future__ import print_function + from ledgerblue.comm import getDongle import struct from base58 import b58encode import hashlib +import binascii def parse_bip32_path(path): if len(path) == 0: - return "" - result = "" + return b"" + result = b"" elements = path.split('/') for pathElement in elements: element = pathElement.split('\'') @@ -41,10 +44,11 @@ def parse_bip32_path(path): path = "44'/194'/0'/0/" for i in range(0, 20): derPath = path + str(i) - print "------------- {} -------------".format(derPath) + print("------------- {} -------------".format(derPath)) donglePath = parse_bip32_path(derPath) - apdu = "D4020001".decode('hex') + chr(len(donglePath) + 1) + chr(len(donglePath) / 4) + donglePath + apdu = bytearray.fromhex("D4020001") + chr(len(donglePath) + 1).encode() + \ + chr(len(donglePath) // 4).encode() + donglePath result = dongle.exchange(bytes(apdu)) offset = 1 + result[0] @@ -54,15 +58,15 @@ def parse_bip32_path(path): head = 0x03 if (public_key[64] & 0x01) == 1 else 0x02 public_key_compressed = bytearray([head]) + public_key[1:33] - print " Public key: " + str(public_key).encode('hex') - print "Public key compressed: " + str(public_key_compressed).encode('hex') + print(" Public key:", binascii.hexlify(public_key)) + print("Public key compressed:", binascii.hexlify(public_key_compressed)) ripemd = hashlib.new('ripemd160') ripemd.update(public_key_compressed) check = ripemd.digest()[:4] buff = public_key_compressed + check - wif_public_key = "EOS" + b58encode(str(buff)) - print "Calculated from public key: Address " + wif_public_key - print " Received from ledger: Address " + str(address) - assert wif_public_key == str(address) + wif_public_key = "EOS" + b58encode(buff).decode() + print("Calculated from public key: Address " + wif_public_key) + print(" Received from ledger: Address " + address.decode()) + assert wif_public_key == address.decode() From 3a9171ddf6a0274f804ad10ae571f00111a4b1e3 Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 18 Oct 2020 19:13:33 +0300 Subject: [PATCH 02/16] python tools: fix apdu encoding --- test/getPublicKey.py | 5 +++-- test/signTransaction.py | 8 ++------ test/testDerivationPathGeneration.py | 3 +-- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/test/getPublicKey.py b/test/getPublicKey.py index bf10454..0298c49 100644 --- a/test/getPublicKey.py +++ b/test/getPublicKey.py @@ -49,8 +49,7 @@ def parse_bip32_path(path): args.path = "44'/194'/0'/0/0" donglePath = parse_bip32_path(args.path) -apdu = bytearray.fromhex("D4020001") + chr(len(donglePath) + 1).encode() + \ - chr(len(donglePath) // 4).encode() + donglePath +apdu = bytearray.fromhex("D4020001") + bytes([len(donglePath) + 1, len(donglePath) // 4]) + donglePath dongle = getDongle(True) result = dongle.exchange(bytes(apdu)) @@ -74,4 +73,6 @@ def parse_bip32_path(path): apdu = bytearray.fromhex("D4020101") + chr(len(donglePath) + 1).encode() + \ chr(len(donglePath) // 4).encode() + donglePath + +apdu = bytearray.fromhex("D4020101") + bytes([len(donglePath) + 1, len(donglePath) // 4]) + donglePath result = dongle.exchange(bytes(apdu)) \ No newline at end of file diff --git a/test/signTransaction.py b/test/signTransaction.py index c958e70..14617b0 100644 --- a/test/signTransaction.py +++ b/test/signTransaction.py @@ -73,15 +73,11 @@ def parse_bip32_path(path): if first: totalSize = len(donglePath) + 1 + len(chunk) - print("TOTAL", totalSize) - print("PATH", pathSize) - print("DONGLE", donglePath) - print("CHunk", chunk) - apdu = bytearray.fromhex("D4040000") + chr(totalSize) + chr(pathSize) + donglePath + chunk + apdu = bytearray.fromhex("D4040000") + bytes([totalSize, pathSize]) + donglePath + chunk first = False else: totalSize = len(chunk) - apdu = "D4048000".decode('hex') + chr(totalSize) + chunk + apdu = "D4048000".decode('hex') + bytes([totalSize]) + chunk offset += len(chunk) result = dongle.exchange(bytes(apdu)) diff --git a/test/testDerivationPathGeneration.py b/test/testDerivationPathGeneration.py index 3e0aaf8..b26be73 100644 --- a/test/testDerivationPathGeneration.py +++ b/test/testDerivationPathGeneration.py @@ -47,8 +47,7 @@ def parse_bip32_path(path): print("------------- {} -------------".format(derPath)) donglePath = parse_bip32_path(derPath) - apdu = bytearray.fromhex("D4020001") + chr(len(donglePath) + 1).encode() + \ - chr(len(donglePath) // 4).encode() + donglePath + apdu = bytearray.fromhex("D4020001") + bytes([len(donglePath) + 1, len(donglePath) // 4]) + donglePath result = dongle.exchange(bytes(apdu)) offset = 1 + result[0] From 78ddf0e6c6d053dab5bf03c211eba55ea278e010 Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 18 Oct 2020 19:30:59 +0300 Subject: [PATCH 03/16] python tools: fixing encoding for transactions (transaction_unknown in progress...) --- test/eosBase.py | 5 +++-- test/getPublicKey.py | 3 --- test/signTransaction.py | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/test/eosBase.py b/test/eosBase.py index bcf4820..1b21cf4 100644 --- a/test/eosBase.py +++ b/test/eosBase.py @@ -261,13 +261,14 @@ def parse_delegate(data): parameters += Transaction.name_to_number(data['to']) parameters += Transaction.asset_to_number(data['stake_net_quantity']) parameters += Transaction.asset_to_number(data['stake_cpu_quantity']) - parameters += chr(0x01) if data['transfer'] else chr(0x00) + parameters += bytes([0x01]) if data['transfer'] else bytes([0x00]) return parameters @staticmethod def parse_unknown(data): data = data * 1000 - parameters = struct.pack(str(len(data)) + 's', str(data)) + length = '{}s'.format(len(data)) + parameters = struct.pack(length, data.encode()) return parameters @staticmethod diff --git a/test/getPublicKey.py b/test/getPublicKey.py index 0298c49..c9eaa30 100644 --- a/test/getPublicKey.py +++ b/test/getPublicKey.py @@ -71,8 +71,5 @@ def parse_bip32_path(path): print("Calculated from public key: Address EOS" + b58encode(buff).decode()) print(" Received from ledger: Address", address.decode()) -apdu = bytearray.fromhex("D4020101") + chr(len(donglePath) + 1).encode() + \ - chr(len(donglePath) // 4).encode() + donglePath - apdu = bytearray.fromhex("D4020101") + bytes([len(donglePath) + 1, len(donglePath) // 4]) + donglePath result = dongle.exchange(bytes(apdu)) \ No newline at end of file diff --git a/test/signTransaction.py b/test/signTransaction.py index 14617b0..264d97b 100644 --- a/test/signTransaction.py +++ b/test/signTransaction.py @@ -77,7 +77,7 @@ def parse_bip32_path(path): first = False else: totalSize = len(chunk) - apdu = "D4048000".decode('hex') + bytes([totalSize]) + chunk + apdu = bytearray.fromhex("D4048000") + bytes([totalSize]) + chunk offset += len(chunk) result = dongle.exchange(bytes(apdu)) From 3b340745a5683c0f9e2d01d63afdcc0390bd6d72 Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 25 Oct 2020 17:47:10 +0200 Subject: [PATCH 04/16] comment out old legacy code --- .gitignore | 3 +- Makefile | 3 +- src/main.c | 1107 +++++++++++++++++++++++----------------------- test/eosBase.pyc | Bin 13269 -> 0 bytes 4 files changed, 566 insertions(+), 547 deletions(-) delete mode 100644 test/eosBase.pyc diff --git a/.gitignore b/.gitignore index e90f453..a742550 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ obj src/glyphs.c src/glyphs.h .vscode -.idea \ No newline at end of file +.idea +*.pyc diff --git a/Makefile b/Makefile index 02069bc..97e1705 100755 --- a/Makefile +++ b/Makefile @@ -62,6 +62,7 @@ DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=0 WEBUSB_URL="" DEFINES += UNUSED\(x\)=\(void\)x DEFINES += APPVERSION=\"$(APPVERSION)\" +DEFINES += HAVE_UX_FLOW ifeq ($(TARGET_NAME),TARGET_NANOX) @@ -130,10 +131,10 @@ include $(BOLOS_SDK)/Makefile.glyphs ### computed variables APP_SOURCE_PATH += src SDK_SOURCE_PATH += lib_stusb lib_stusb_impl lib_u2f +SDK_SOURCE_PATH += lib_ux ifeq ($(TARGET_NAME),TARGET_NANOX) SDK_SOURCE_PATH += lib_blewbxx lib_blewbxx_impl -SDK_SOURCE_PATH += lib_ux endif diff --git a/src/main.c b/src/main.c index a440fbd..9d02900 100644 --- a/src/main.c +++ b/src/main.c @@ -41,9 +41,9 @@ uint32_t get_public_key_and_set_result(void); uint32_t sign_hash_and_set_result(void); #if defined(TARGET_NANOS) -unsigned int ui_address_nanos_button(unsigned int button_mask, unsigned int button_mask_counter); -unsigned int ui_single_action_tx_approval_nanos_button(unsigned int button_mask, unsigned int button_mask_counter); -unsigned int ui_multiple_action_tx_approval_nanos_button(unsigned int button_mask, unsigned int button_mask_counter); +// unsigned int ui_address_nanos_button(unsigned int button_mask, unsigned int button_mask_counter); +// unsigned int ui_single_action_tx_approval_nanos_button(unsigned int button_mask, unsigned int button_mask_counter); +// unsigned int ui_multiple_action_tx_approval_nanos_button(unsigned int button_mask, unsigned int button_mask_counter); #endif // #if defined(TARGET_NANOS) #define MAX_BIP32_PATH 10 @@ -100,17 +100,17 @@ txProcessingContent_t txContent; volatile char actionCounter[32]; volatile char confirmLabel[32]; -#ifdef TARGET_NANOX +// #ifdef TARGET_NANOX #include "ux.h" ux_state_t G_ux; bolos_ux_params_t G_ux_params; -#else // TARGET_NANOX +// #else // TARGET_NANOX -ux_state_t ux; +// ux_state_t ux; -#endif // TARGET_NANOX +// #endif // TARGET_NANOX // display stepped screens unsigned int ux_step; unsigned int ux_step_count; @@ -130,422 +130,422 @@ const bagl_element_t *ui_menu_item_out_over(const bagl_element_t *e) return e; } -#if defined(TARGET_NANOS) - -const ux_menu_entry_t menu_main[]; -const ux_menu_entry_t menu_settings[]; -const ux_menu_entry_t menu_settings_data[]; - -#ifdef HAVE_U2F - -// change the setting -void menu_settings_data_change(unsigned int enabled) -{ - uint8_t dataAllowed = enabled; - nvm_write(&N_storage.dataAllowed, (void *)&dataAllowed, sizeof(uint8_t)); - // go back to the menu entry - UX_MENU_DISPLAY(0, menu_settings, NULL); -} - -// show the currently activated entry -void menu_settings_data_init(unsigned int ignored) { - UNUSED(ignored); - UX_MENU_DISPLAY(N_storage.dataAllowed?1:0, menu_settings_data, NULL); -} - -const ux_menu_entry_t menu_settings_data[] = { - {NULL, menu_settings_data_change, 0, NULL, "No", NULL, 0, 0}, - {NULL, menu_settings_data_change, 1, NULL, "Yes", NULL, 0, 0}, - UX_MENU_END}; - -const ux_menu_entry_t menu_settings[] = { - {NULL, menu_settings_data_init, 0, NULL, "Arbitrary data", NULL, 0, 0}, - {menu_main, NULL, 1, &C_icon_back, "Back", NULL, 61, 40}, - UX_MENU_END}; -#endif // HAVE_U2F - -const ux_menu_entry_t menu_about[] = { - {NULL, NULL, 0, NULL, "Version", APPVERSION, 0, 0}, - {menu_main, NULL, 2, &C_icon_back, "Back", NULL, 61, 40}, - UX_MENU_END}; - -const ux_menu_entry_t menu_main[] = { - {NULL, NULL, 0, &C_nanos_badge_eos, "Use wallet to", - "view accounts", 33, 12}, - {menu_settings, NULL, 0, NULL, "Settings", NULL, 0, 0}, - {menu_about, NULL, 0, NULL, "About", NULL, 0, 0}, - {NULL, os_sched_exit, 0, &C_icon_dashboard, "Quit app", NULL, 50, 29}, - UX_MENU_END}; - -#endif // #if defined(TARGET_NANOS) - -#if defined(TARGET_NANOS) -const bagl_element_t ui_address_nanos[] = { - // type userid x y w h str rad - // fill fg bg fid iid txt touchparams... ] - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CROSS}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CHECK}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - //{{BAGL_ICON , 0x01, 31, 9, 14, 14, 0, 0, 0 - //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_EYE_BADGE }, NULL, 0, 0, 0, - //NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x01, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Confirm", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 0, 26, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Public Key", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABELINE, 0x02, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Public Key", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, - (char *)tmpCtx.publicKeyContext.address, - 0, - 0, - 0, - NULL, - NULL, - NULL}, -}; - -unsigned int ui_address_prepro(const bagl_element_t *element) -{ - if (element->component.userid > 0) - { - unsigned int display = (ux_step == element->component.userid - 1); - if (display) - { - switch (element->component.userid) - { - case 1: - UX_CALLBACK_SET_INTERVAL(2000); - break; - case 2: - UX_CALLBACK_SET_INTERVAL(MAX( - 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); - break; - } - } - return display; - } - return 1; -} -#endif // #if defined(TARGET_NANOS) - - -#if defined(TARGET_NANOS) -const bagl_element_t ui_single_action_tx_approval_nanos[] = { - // type userid x y w h str rad - // fill fg bg fid iid txt touchparams... ] - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CROSS}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CHECK}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - //{{BAGL_ICON , 0x01, 21, 9, 14, 14, 0, 0, 0 - //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_TRANSACTION_BADGE }, NULL, 0, 0, - //0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x01, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Confirm", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (char *)confirmLabel, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABELINE, 0x02, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Contract", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, - (char *)txContent.contract, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABELINE, 0x03, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Action", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x03, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 50}, - (char *)txContent.action, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABELINE, 0x04, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - (char *)txContent.arg.label, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x04, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, - (char *)txContent.arg.data, - 0, - 0, - 0, - NULL, - NULL, - NULL}, -}; - -unsigned int ui_single_action_tx_approval_prepro(const bagl_element_t *element) -{ - unsigned int display = 1; - if (element->component.userid > 0) - { - if (ux_step > 3 && element->component.userid == 4) { - display = 1; - } else { - display = (ux_step == element->component.userid - 1); - } - if (display) - { - switch (element->component.userid) - { - case 1: - UX_CALLBACK_SET_INTERVAL(2000); - break; - - case 2: - case 3: - UX_CALLBACK_SET_INTERVAL(MAX( - 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); - break; - - case 4: - UX_CALLBACK_SET_INTERVAL(MAX( - 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); - printArgument(ux_step - 3, &txProcessingCtx); - break; - } - } - } - return display; -} - -#endif // #if defined(TARGET_NANOS) - -#if defined(TARGET_NANOS) -const bagl_element_t ui_multiple_action_tx_approval_nanos[] = { - // type userid x y w h str rad - // fill fg bg fid iid txt touchparams... ] - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, - 0, 0}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CROSS}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, - BAGL_GLYPH_ICON_CHECK}, - NULL, - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - //{{BAGL_ICON , 0x01, 21, 9, 14, 14, 0, 0, 0 - //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_TRANSACTION_BADGE }, NULL, 0, 0, - //0, NULL, NULL, NULL }, - {{BAGL_LABELINE, 0x01, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Confirm", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x01, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Transaction", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - - {{BAGL_LABELINE, 0x02, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "With", - 0, - 0, - 0, - NULL, - NULL, - NULL}, - {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, - (char *)actionCounter, - 0, - 0, - 0, - NULL, - NULL, - NULL}, -}; - -unsigned int ui_multiple_action_tx_approval_prepro(const bagl_element_t *element) -{ - unsigned int display = 1; - if (element->component.userid > 0) - { - display = (ux_step == element->component.userid - 1); - if (display) - { - switch (element->component.userid) - { - case 1: - case 2: - UX_CALLBACK_SET_INTERVAL(2000); - break; - } - } - } - return display; -} -#endif // #if defined(TARGET_NANOS) - -#if defined(TARGET_NANOX) +// #if defined(TARGET_NANOS) + +// // const ux_menu_entry_t menu_main[]; +// // const ux_menu_entry_t menu_settings[]; +// // const ux_menu_entry_t menu_settings_data[]; + +// // #ifdef HAVE_U2F + +// // change the setting +// // void menu_settings_data_change(unsigned int enabled) +// // { +// // uint8_t dataAllowed = enabled; +// // nvm_write(&N_storage.dataAllowed, (void *)&dataAllowed, sizeof(uint8_t)); +// // // go back to the menu entry +// // UX_MENU_DISPLAY(0, menu_settings, NULL); +// // } + +// // show the currently activated entry +// // void menu_settings_data_init(unsigned int ignored) { +// // UNUSED(ignored); +// // UX_MENU_DISPLAY(N_storage.dataAllowed?1:0, menu_settings_data, NULL); +// // } + +// // const ux_menu_entry_t menu_settings_data[] = { +// // {NULL, menu_settings_data_change, 0, NULL, "No", NULL, 0, 0}, +// // {NULL, menu_settings_data_change, 1, NULL, "Yes", NULL, 0, 0}, +// // UX_MENU_END}; + +// // const ux_menu_entry_t menu_settings[] = { +// // {NULL, menu_settings_data_init, 0, NULL, "Arbitrary data", NULL, 0, 0}, +// // {menu_main, NULL, 1, &C_icon_back, "Back", NULL, 61, 40}, +// // UX_MENU_END}; +// // #endif // HAVE_U2F + +// // const ux_menu_entry_t menu_about[] = { +// // {NULL, NULL, 0, NULL, "Version", APPVERSION, 0, 0}, +// // {menu_main, NULL, 2, &C_icon_back, "Back", NULL, 61, 40}, +// // UX_MENU_END}; + +// // const ux_menu_entry_t menu_main[] = { +// // {NULL, NULL, 0, &C_nanos_badge_eos, "Use wallet to", +// // "view accounts", 33, 12}, +// // {menu_settings, NULL, 0, NULL, "Settings", NULL, 0, 0}, +// // {menu_about, NULL, 0, NULL, "About", NULL, 0, 0}, +// // {NULL, os_sched_exit, 0, &C_icon_dashboard, "Quit app", NULL, 50, 29}, +// // UX_MENU_END}; + +// #endif // #if defined(TARGET_NANOS) + +// #if defined(TARGET_NANOS) +// const bagl_element_t ui_address_nanos[] = { +// // type userid x y w h str rad +// // fill fg bg fid iid txt touchparams... ] +// {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, +// 0, 0}, +// NULL, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, + +// {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, +// BAGL_GLYPH_ICON_CROSS}, +// NULL, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, +// BAGL_GLYPH_ICON_CHECK}, +// NULL, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, + +// //{{BAGL_ICON , 0x01, 31, 9, 14, 14, 0, 0, 0 +// //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_EYE_BADGE }, NULL, 0, 0, 0, +// //NULL, NULL, NULL }, +// {{BAGL_LABELINE, 0x01, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, +// "Confirm", +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// {{BAGL_LABELINE, 0x01, 0, 26, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, +// "Public Key", +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, + +// {{BAGL_LABELINE, 0x02, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, +// "Public Key", +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, +// (char *)tmpCtx.publicKeyContext.address, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// }; + +// unsigned int ui_address_prepro(const bagl_element_t *element) +// { +// if (element->component.userid > 0) +// { +// unsigned int display = (ux_step == element->component.userid - 1); +// if (display) +// { +// switch (element->component.userid) +// { +// case 1: +// UX_CALLBACK_SET_INTERVAL(2000); +// break; +// case 2: +// UX_CALLBACK_SET_INTERVAL(MAX( +// 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); +// break; +// } +// } +// return display; +// } +// return 1; +// } +// #endif // #if defined(TARGET_NANOS) + + +// #if defined(TARGET_NANOS) +// const bagl_element_t ui_single_action_tx_approval_nanos[] = { +// // type userid x y w h str rad +// // fill fg bg fid iid txt touchparams... ] +// {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, +// 0, 0}, +// NULL, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, + +// {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, +// BAGL_GLYPH_ICON_CROSS}, +// NULL, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, +// BAGL_GLYPH_ICON_CHECK}, +// NULL, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, + +// //{{BAGL_ICON , 0x01, 21, 9, 14, 14, 0, 0, 0 +// //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_TRANSACTION_BADGE }, NULL, 0, 0, +// //0, NULL, NULL, NULL }, +// {{BAGL_LABELINE, 0x01, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, +// "Confirm", +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// {{BAGL_LABELINE, 0x01, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, +// (char *)confirmLabel, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, + +// {{BAGL_LABELINE, 0x02, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, +// "Contract", +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, +// (char *)txContent.contract, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, + +// {{BAGL_LABELINE, 0x03, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, +// "Action", +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// {{BAGL_LABELINE, 0x03, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 50}, +// (char *)txContent.action, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, + +// {{BAGL_LABELINE, 0x04, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, +// (char *)txContent.arg.label, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// {{BAGL_LABELINE, 0x04, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, +// (char *)txContent.arg.data, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// }; + +// unsigned int ui_single_action_tx_approval_prepro(const bagl_element_t *element) +// { +// unsigned int display = 1; +// if (element->component.userid > 0) +// { +// if (ux_step > 3 && element->component.userid == 4) { +// display = 1; +// } else { +// display = (ux_step == element->component.userid - 1); +// } +// if (display) +// { +// switch (element->component.userid) +// { +// case 1: +// UX_CALLBACK_SET_INTERVAL(2000); +// break; + +// case 2: +// case 3: +// UX_CALLBACK_SET_INTERVAL(MAX( +// 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); +// break; + +// case 4: +// UX_CALLBACK_SET_INTERVAL(MAX( +// 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); +// printArgument(ux_step - 3, &txProcessingCtx); +// break; +// } +// } +// } +// return display; +// } + +// #endif // #if defined(TARGET_NANOS) + +// #if defined(TARGET_NANOS) +// const bagl_element_t ui_multiple_action_tx_approval_nanos[] = { +// // type userid x y w h str rad +// // fill fg bg fid iid txt touchparams... ] +// {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, +// 0, 0}, +// NULL, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, + +// {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, +// BAGL_GLYPH_ICON_CROSS}, +// NULL, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, +// BAGL_GLYPH_ICON_CHECK}, +// NULL, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, + +// //{{BAGL_ICON , 0x01, 21, 9, 14, 14, 0, 0, 0 +// //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_TRANSACTION_BADGE }, NULL, 0, 0, +// //0, NULL, NULL, NULL }, +// {{BAGL_LABELINE, 0x01, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, +// "Confirm", +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// {{BAGL_LABELINE, 0x01, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, +// "Transaction", +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, + +// {{BAGL_LABELINE, 0x02, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, +// "With", +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, +// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, +// (char *)actionCounter, +// 0, +// 0, +// 0, +// NULL, +// NULL, +// NULL}, +// }; + +// unsigned int ui_multiple_action_tx_approval_prepro(const bagl_element_t *element) +// { +// unsigned int display = 1; +// if (element->component.userid > 0) +// { +// display = (ux_step == element->component.userid - 1); +// if (display) +// { +// switch (element->component.userid) +// { +// case 1: +// case 2: +// UX_CALLBACK_SET_INTERVAL(2000); +// break; +// } +// } +// } +// return display; +// } +// #endif // #if defined(TARGET_NANOS) + +// #if defined(TARGET_NANOX) void display_settings(void); void switch_settings_contract_data(void); -UX_FLOW_DEF_NOCB( +UX_STEP_NOCB( ux_idle_flow_1_step, - bnn, //pnn, + nn, //pnn, { "", //&C_icon_dashboard, "Application", "is ready", }); -UX_FLOW_DEF_NOCB( +UX_STEP_NOCB( ux_idle_flow_2_step, bn, { "Version", APPVERSION, }); -UX_FLOW_DEF_VALID( +UX_STEP_CB( ux_idle_flow_3_step, pb, display_settings(), @@ -553,7 +553,7 @@ UX_FLOW_DEF_VALID( &C_icon_coggle, "Settings", }); -UX_FLOW_DEF_VALID( +UX_STEP_CB( ux_idle_flow_4_step, pb, os_sched_exit(-1), @@ -570,7 +570,20 @@ UX_FLOW( &ux_idle_flow_4_step ); -UX_FLOW_DEF_VALID( +#if defined(TARGET_NANOS) + +UX_STEP_CB( + ux_settings_flow_1_step, + bnnn_paging, + switch_settings_contract_data(), + { + .title = "Contract data", + .text = confirmLabel, + }); + +#else + +UX_STEP_CB( ux_settings_flow_1_step, bnnn, switch_settings_contract_data(), @@ -581,7 +594,9 @@ UX_FLOW_DEF_VALID( confirmLabel, }); -UX_FLOW_DEF_VALID( +#endif + +UX_STEP_CB( ux_settings_flow_2_step, pb, ui_idle(), @@ -889,19 +904,19 @@ void ux_multiple_action_sign_flow_ok_pressed() } } -#endif // #if defined(TARGET_NANOX) +// #endif // #if defined(TARGET_NANOX)/ void ui_idle(void) { -#if defined(TARGET_NANOS) - UX_MENU_DISPLAY(0, menu_main, NULL); -#elif defined(TARGET_NANOX) +// #if defined(TARGET_NANOS) +// UX_MENU_DISPLAY(0, menu_main, NULL); +// #elif defined(TARGET_NANOX) // reserve a display stack slot if none yet if(G_ux.stack_count == 0) { ux_stack_push(); } ux_flow_init(0, ux_idle_flow, NULL); -#endif +// #endif } unsigned int io_seproxyhal_touch_exit(const bagl_element_t *e) @@ -928,25 +943,25 @@ unsigned int io_seproxyhal_touch_address_cancel(const bagl_element_t *e) return 0; // do not redraw the widget } -#if defined(TARGET_NANOS) -unsigned int ui_address_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter) -{ - switch (button_mask) - { - case BUTTON_EVT_RELEASED | BUTTON_LEFT: // CANCEL - io_seproxyhal_touch_address_cancel(NULL); - break; - - case BUTTON_EVT_RELEASED | BUTTON_RIGHT: - { // OK - io_seproxyhal_touch_address_ok(NULL); - break; - } - } - return 0; -} -#endif // ui_address_nanos_button +// #if defined(TARGET_NANOS) +// unsigned int ui_address_nanos_button(unsigned int button_mask, +// unsigned int button_mask_counter) +// { +// switch (button_mask) +// { +// case BUTTON_EVT_RELEASED | BUTTON_LEFT: // CANCEL +// io_seproxyhal_touch_address_cancel(NULL); +// break; + +// case BUTTON_EVT_RELEASED | BUTTON_RIGHT: +// { // OK +// io_seproxyhal_touch_address_ok(NULL); +// break; +// } +// } +// return 0; +// } +// #endif // ui_address_nanos_button unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e) { @@ -966,89 +981,89 @@ unsigned int io_seproxyhal_touch_tx_cancel(const bagl_element_t *e) return 0; // do not redraw the widget } -#if defined(TARGET_NANOS) - -unsigned int ui_single_action_tx_approval_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter) -{ - switch (button_mask) - { - case BUTTON_EVT_RELEASED | BUTTON_LEFT: - io_seproxyhal_touch_tx_cancel(NULL); - break; - - case BUTTON_EVT_RELEASED | BUTTON_RIGHT: - { - parserStatus_e txResult = parseTx(&txProcessingCtx, NULL, 0); - switch (txResult) { - case STREAM_ACTION_READY: - ux_step = 0; - ux_step_count = 3 + txContent.argumentCount; - if (txProcessingCtx.currentActionNumer > 1) { - snprintf((char *)confirmLabel, sizeof(confirmLabel), "Action #%d", txProcessingCtx.currentActionIndex); - } - UX_REDISPLAY(); - break; - case STREAM_PROCESSING: - io_exchange_with_code(0x9000, 0); - // Display back the original UX - ui_idle(); - break; - case STREAM_FINISHED: - io_seproxyhal_touch_tx_ok(NULL); - break; - default: - io_exchange_with_code(0x6A80, 0); - // Display back the original UX - ui_idle(); - break; - } - } - break; - } - return 0; -} - -unsigned int ui_multiple_action_tx_approval_nanos_button(unsigned int button_mask, - unsigned int button_mask_counter) -{ - switch (button_mask) - { - case BUTTON_EVT_RELEASED | BUTTON_LEFT: - io_seproxyhal_touch_tx_cancel(NULL); - break; - - case BUTTON_EVT_RELEASED | BUTTON_RIGHT: - { - parserStatus_e txResult = parseTx(&txProcessingCtx, NULL, 0); - switch (txResult) { - case STREAM_ACTION_READY: - ux_step = 0; - ux_step_count = 3 + txContent.argumentCount; - UX_REDISPLAY(); - break; - case STREAM_PROCESSING: - io_exchange_with_code(0x9000, 0); - // Display back the original UX - ui_idle(); - break; - case STREAM_FINISHED: - io_seproxyhal_touch_tx_ok(NULL); - break; - default: - io_exchange_with_code(0x6A80, 0); - // Display back the original UX - ui_idle(); - break; - } - } - break; - } - - return 0; -} - -#endif // defined(TARGET_NANOS) +// #if defined(TARGET_NANOS) + +// unsigned int ui_single_action_tx_approval_nanos_button(unsigned int button_mask, +// unsigned int button_mask_counter) +// { +// switch (button_mask) +// { +// case BUTTON_EVT_RELEASED | BUTTON_LEFT: +// io_seproxyhal_touch_tx_cancel(NULL); +// break; + +// case BUTTON_EVT_RELEASED | BUTTON_RIGHT: +// { +// parserStatus_e txResult = parseTx(&txProcessingCtx, NULL, 0); +// switch (txResult) { +// case STREAM_ACTION_READY: +// ux_step = 0; +// ux_step_count = 3 + txContent.argumentCount; +// if (txProcessingCtx.currentActionNumer > 1) { +// snprintf((char *)confirmLabel, sizeof(confirmLabel), "Action #%d", txProcessingCtx.currentActionIndex); +// } +// UX_REDISPLAY(); +// break; +// case STREAM_PROCESSING: +// io_exchange_with_code(0x9000, 0); +// // Display back the original UX +// ui_idle(); +// break; +// case STREAM_FINISHED: +// io_seproxyhal_touch_tx_ok(NULL); +// break; +// default: +// io_exchange_with_code(0x6A80, 0); +// // Display back the original UX +// ui_idle(); +// break; +// } +// } +// break; +// } +// return 0; +// } + +// unsigned int ui_multiple_action_tx_approval_nanos_button(unsigned int button_mask, +// unsigned int button_mask_counter) +// { +// switch (button_mask) +// { +// case BUTTON_EVT_RELEASED | BUTTON_LEFT: +// io_seproxyhal_touch_tx_cancel(NULL); +// break; + +// case BUTTON_EVT_RELEASED | BUTTON_RIGHT: +// { +// parserStatus_e txResult = parseTx(&txProcessingCtx, NULL, 0); +// switch (txResult) { +// case STREAM_ACTION_READY: +// ux_step = 0; +// ux_step_count = 3 + txContent.argumentCount; +// UX_REDISPLAY(); +// break; +// case STREAM_PROCESSING: +// io_exchange_with_code(0x9000, 0); +// // Display back the original UX +// ui_idle(); +// break; +// case STREAM_FINISHED: +// io_seproxyhal_touch_tx_ok(NULL); +// break; +// default: +// io_exchange_with_code(0x6A80, 0); +// // Display back the original UX +// ui_idle(); +// break; +// } +// } +// break; +// } + +// return 0; +// } + +// #endif // defined(TARGET_NANOS) void io_exchange_with_code(uint16_t code, uint32_t tx) { G_io_apdu_buffer[tx++] = code >> 8; @@ -1159,14 +1174,14 @@ void handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, } else { -#if defined(TARGET_NANOS) - // prepare for a UI based reply - ux_step = 0; - ux_step_count = 2; - UX_DISPLAY(ui_address_nanos, ui_address_prepro); -#elif defined(TARGET_NANOX) +// #if defined(TARGET_NANOS) + // // prepare for a UI based reply + // ux_step = 0; + // ux_step_count = 2; + // UX_DISPLAY(ui_address_nanos, ui_address_prepro); +// #elif defined(TARGET_NANOX) ux_flow_init(0, ux_display_public_flow, NULL); -#endif +// #endif *flags |= IO_ASYNCH_REPLY; } @@ -1294,13 +1309,13 @@ void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, { case STREAM_CONFIRM_PROCESSING: snprintf((char *)actionCounter, sizeof(actionCounter), "%d actions", txProcessingCtx.currentActionNumer); -#if defined(TARGET_NANOS) - ux_step = 0; - ux_step_count = 2; - UX_DISPLAY(ui_multiple_action_tx_approval_nanos, ui_multiple_action_tx_approval_prepro); -#elif defined(TARGET_NANOX) +// #if defined(TARGET_NANOS) + // ux_step = 0; + // ux_step_count = 2; + // UX_DISPLAY(ui_multiple_action_tx_approval_nanos, ui_multiple_action_tx_approval_prepro); +// #elif defined(TARGET_NANOX) ux_flow_init(0, ux_multiple_action_sign_flow, NULL); -#endif +// #endif *flags |= IO_ASYNCH_REPLY; @@ -1315,15 +1330,15 @@ void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, strcpy((char *)confirmLabel, "Transaction"); } -#if defined(TARGET_NANOS) - ux_step_count += 3; - UX_DISPLAY(ui_single_action_tx_approval_nanos, ui_single_action_tx_approval_prepro); -#elif defined(TARGET_NANOX) +// #if defined(TARGET_NANOS) + // ux_step_count += 3; + // UX_DISPLAY(ui_single_action_tx_approval_nanos, ui_single_action_tx_approval_prepro); +// #elif defined(TARGET_NANOX) strcpy((char *)confirm_text1, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "Sign" : "Accept"); strcpy((char *)confirm_text2, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "transaction" : "and review next"); ux_flow_init(0, ux_single_action_sign_flow, NULL); -#endif +// #endif *flags |= IO_ASYNCH_REPLY; @@ -1526,22 +1541,24 @@ unsigned char io_event(unsigned char channel) UX_DISPLAYED_EVENT({}); break; +#if 0 case SEPROXYHAL_TAG_TICKER_EVENT: UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, { #if defined(TARGET_NANOS) - if (UX_ALLOWED) - { - if (ux_step_count) - { - // prepare next screen - ux_step = (ux_step + 1) % ux_step_count; - // redisplay screen - UX_REDISPLAY(); - } - } + // if (UX_ALLOWED) + // { + // if (ux_step_count) + // { + // // prepare next screen + // ux_step = (ux_step + 1) % ux_step_count; + // // redisplay screen + // UX_REDISPLAY(); + // } + // } #endif // TARGET_NANOS }); break; +#endif } // close the event if not done previously (by a display or whatever) diff --git a/test/eosBase.pyc b/test/eosBase.pyc deleted file mode 100644 index f490bc97b528103c8db7923d660be31c929d0506..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13269 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 From 4f0ff9e2fe4ebc2317044f462b5caaedccea4768 Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 25 Oct 2020 22:02:23 +0200 Subject: [PATCH 05/16] remove commented code. --- src/main.c | 550 ----------------------------------------------------- 1 file changed, 550 deletions(-) diff --git a/src/main.c b/src/main.c index 9d02900..bdf91d5 100644 --- a/src/main.c +++ b/src/main.c @@ -40,12 +40,6 @@ void ui_idle(void); uint32_t get_public_key_and_set_result(void); uint32_t sign_hash_and_set_result(void); -#if defined(TARGET_NANOS) -// unsigned int ui_address_nanos_button(unsigned int button_mask, unsigned int button_mask_counter); -// unsigned int ui_single_action_tx_approval_nanos_button(unsigned int button_mask, unsigned int button_mask_counter); -// unsigned int ui_multiple_action_tx_approval_nanos_button(unsigned int button_mask, unsigned int button_mask_counter); -#endif // #if defined(TARGET_NANOS) - #define MAX_BIP32_PATH 10 #define CLA 0xD4 @@ -100,17 +94,10 @@ txProcessingContent_t txContent; volatile char actionCounter[32]; volatile char confirmLabel[32]; -// #ifdef TARGET_NANOX - #include "ux.h" ux_state_t G_ux; bolos_ux_params_t G_ux_params; -// #else // TARGET_NANOX - -// ux_state_t ux; - -// #endif // TARGET_NANOX // display stepped screens unsigned int ux_step; unsigned int ux_step_count; @@ -130,403 +117,6 @@ const bagl_element_t *ui_menu_item_out_over(const bagl_element_t *e) return e; } -// #if defined(TARGET_NANOS) - -// // const ux_menu_entry_t menu_main[]; -// // const ux_menu_entry_t menu_settings[]; -// // const ux_menu_entry_t menu_settings_data[]; - -// // #ifdef HAVE_U2F - -// // change the setting -// // void menu_settings_data_change(unsigned int enabled) -// // { -// // uint8_t dataAllowed = enabled; -// // nvm_write(&N_storage.dataAllowed, (void *)&dataAllowed, sizeof(uint8_t)); -// // // go back to the menu entry -// // UX_MENU_DISPLAY(0, menu_settings, NULL); -// // } - -// // show the currently activated entry -// // void menu_settings_data_init(unsigned int ignored) { -// // UNUSED(ignored); -// // UX_MENU_DISPLAY(N_storage.dataAllowed?1:0, menu_settings_data, NULL); -// // } - -// // const ux_menu_entry_t menu_settings_data[] = { -// // {NULL, menu_settings_data_change, 0, NULL, "No", NULL, 0, 0}, -// // {NULL, menu_settings_data_change, 1, NULL, "Yes", NULL, 0, 0}, -// // UX_MENU_END}; - -// // const ux_menu_entry_t menu_settings[] = { -// // {NULL, menu_settings_data_init, 0, NULL, "Arbitrary data", NULL, 0, 0}, -// // {menu_main, NULL, 1, &C_icon_back, "Back", NULL, 61, 40}, -// // UX_MENU_END}; -// // #endif // HAVE_U2F - -// // const ux_menu_entry_t menu_about[] = { -// // {NULL, NULL, 0, NULL, "Version", APPVERSION, 0, 0}, -// // {menu_main, NULL, 2, &C_icon_back, "Back", NULL, 61, 40}, -// // UX_MENU_END}; - -// // const ux_menu_entry_t menu_main[] = { -// // {NULL, NULL, 0, &C_nanos_badge_eos, "Use wallet to", -// // "view accounts", 33, 12}, -// // {menu_settings, NULL, 0, NULL, "Settings", NULL, 0, 0}, -// // {menu_about, NULL, 0, NULL, "About", NULL, 0, 0}, -// // {NULL, os_sched_exit, 0, &C_icon_dashboard, "Quit app", NULL, 50, 29}, -// // UX_MENU_END}; - -// #endif // #if defined(TARGET_NANOS) - -// #if defined(TARGET_NANOS) -// const bagl_element_t ui_address_nanos[] = { -// // type userid x y w h str rad -// // fill fg bg fid iid txt touchparams... ] -// {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, -// 0, 0}, -// NULL, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, - -// {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, -// BAGL_GLYPH_ICON_CROSS}, -// NULL, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, -// BAGL_GLYPH_ICON_CHECK}, -// NULL, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, - -// //{{BAGL_ICON , 0x01, 31, 9, 14, 14, 0, 0, 0 -// //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_EYE_BADGE }, NULL, 0, 0, 0, -// //NULL, NULL, NULL }, -// {{BAGL_LABELINE, 0x01, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, -// "Confirm", -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// {{BAGL_LABELINE, 0x01, 0, 26, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, -// "Public Key", -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, - -// {{BAGL_LABELINE, 0x02, 0, 12, 128, 12, 0, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, -// "Public Key", -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, -// (char *)tmpCtx.publicKeyContext.address, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// }; - -// unsigned int ui_address_prepro(const bagl_element_t *element) -// { -// if (element->component.userid > 0) -// { -// unsigned int display = (ux_step == element->component.userid - 1); -// if (display) -// { -// switch (element->component.userid) -// { -// case 1: -// UX_CALLBACK_SET_INTERVAL(2000); -// break; -// case 2: -// UX_CALLBACK_SET_INTERVAL(MAX( -// 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); -// break; -// } -// } -// return display; -// } -// return 1; -// } -// #endif // #if defined(TARGET_NANOS) - - -// #if defined(TARGET_NANOS) -// const bagl_element_t ui_single_action_tx_approval_nanos[] = { -// // type userid x y w h str rad -// // fill fg bg fid iid txt touchparams... ] -// {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, -// 0, 0}, -// NULL, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, - -// {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, -// BAGL_GLYPH_ICON_CROSS}, -// NULL, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, -// BAGL_GLYPH_ICON_CHECK}, -// NULL, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, - -// //{{BAGL_ICON , 0x01, 21, 9, 14, 14, 0, 0, 0 -// //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_TRANSACTION_BADGE }, NULL, 0, 0, -// //0, NULL, NULL, NULL }, -// {{BAGL_LABELINE, 0x01, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, -// "Confirm", -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// {{BAGL_LABELINE, 0x01, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, -// (char *)confirmLabel, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, - -// {{BAGL_LABELINE, 0x02, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, -// "Contract", -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, -// (char *)txContent.contract, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, - -// {{BAGL_LABELINE, 0x03, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, -// "Action", -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// {{BAGL_LABELINE, 0x03, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 50}, -// (char *)txContent.action, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, - -// {{BAGL_LABELINE, 0x04, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, -// (char *)txContent.arg.label, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// {{BAGL_LABELINE, 0x04, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, -// (char *)txContent.arg.data, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// }; - -// unsigned int ui_single_action_tx_approval_prepro(const bagl_element_t *element) -// { -// unsigned int display = 1; -// if (element->component.userid > 0) -// { -// if (ux_step > 3 && element->component.userid == 4) { -// display = 1; -// } else { -// display = (ux_step == element->component.userid - 1); -// } -// if (display) -// { -// switch (element->component.userid) -// { -// case 1: -// UX_CALLBACK_SET_INTERVAL(2000); -// break; - -// case 2: -// case 3: -// UX_CALLBACK_SET_INTERVAL(MAX( -// 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); -// break; - -// case 4: -// UX_CALLBACK_SET_INTERVAL(MAX( -// 3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); -// printArgument(ux_step - 3, &txProcessingCtx); -// break; -// } -// } -// } -// return display; -// } - -// #endif // #if defined(TARGET_NANOS) - -// #if defined(TARGET_NANOS) -// const bagl_element_t ui_multiple_action_tx_approval_nanos[] = { -// // type userid x y w h str rad -// // fill fg bg fid iid txt touchparams... ] -// {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, -// 0, 0}, -// NULL, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, - -// {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, -// BAGL_GLYPH_ICON_CROSS}, -// NULL, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, -// BAGL_GLYPH_ICON_CHECK}, -// NULL, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, - -// //{{BAGL_ICON , 0x01, 21, 9, 14, 14, 0, 0, 0 -// //, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_TRANSACTION_BADGE }, NULL, 0, 0, -// //0, NULL, NULL, NULL }, -// {{BAGL_LABELINE, 0x01, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, -// "Confirm", -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// {{BAGL_LABELINE, 0x01, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, -// "Transaction", -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, - -// {{BAGL_LABELINE, 0x02, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_REGULAR_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, -// "With", -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// {{BAGL_LABELINE, 0x02, 23, 26, 82, 12, 0x80 | 10, 0, 0, 0xFFFFFF, 0x000000, -// BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 26}, -// (char *)actionCounter, -// 0, -// 0, -// 0, -// NULL, -// NULL, -// NULL}, -// }; - -// unsigned int ui_multiple_action_tx_approval_prepro(const bagl_element_t *element) -// { -// unsigned int display = 1; -// if (element->component.userid > 0) -// { -// display = (ux_step == element->component.userid - 1); -// if (display) -// { -// switch (element->component.userid) -// { -// case 1: -// case 2: -// UX_CALLBACK_SET_INTERVAL(2000); -// break; -// } -// } -// } -// return display; -// } -// #endif // #if defined(TARGET_NANOS) - -// #if defined(TARGET_NANOX) - void display_settings(void); void switch_settings_contract_data(void); @@ -904,19 +494,14 @@ void ux_multiple_action_sign_flow_ok_pressed() } } -// #endif // #if defined(TARGET_NANOX)/ void ui_idle(void) { -// #if defined(TARGET_NANOS) -// UX_MENU_DISPLAY(0, menu_main, NULL); -// #elif defined(TARGET_NANOX) // reserve a display stack slot if none yet if(G_ux.stack_count == 0) { ux_stack_push(); } ux_flow_init(0, ux_idle_flow, NULL); -// #endif } unsigned int io_seproxyhal_touch_exit(const bagl_element_t *e) @@ -943,26 +528,6 @@ unsigned int io_seproxyhal_touch_address_cancel(const bagl_element_t *e) return 0; // do not redraw the widget } -// #if defined(TARGET_NANOS) -// unsigned int ui_address_nanos_button(unsigned int button_mask, -// unsigned int button_mask_counter) -// { -// switch (button_mask) -// { -// case BUTTON_EVT_RELEASED | BUTTON_LEFT: // CANCEL -// io_seproxyhal_touch_address_cancel(NULL); -// break; - -// case BUTTON_EVT_RELEASED | BUTTON_RIGHT: -// { // OK -// io_seproxyhal_touch_address_ok(NULL); -// break; -// } -// } -// return 0; -// } -// #endif // ui_address_nanos_button - unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e) { uint32_t tx = sign_hash_and_set_result(); @@ -981,90 +546,6 @@ unsigned int io_seproxyhal_touch_tx_cancel(const bagl_element_t *e) return 0; // do not redraw the widget } -// #if defined(TARGET_NANOS) - -// unsigned int ui_single_action_tx_approval_nanos_button(unsigned int button_mask, -// unsigned int button_mask_counter) -// { -// switch (button_mask) -// { -// case BUTTON_EVT_RELEASED | BUTTON_LEFT: -// io_seproxyhal_touch_tx_cancel(NULL); -// break; - -// case BUTTON_EVT_RELEASED | BUTTON_RIGHT: -// { -// parserStatus_e txResult = parseTx(&txProcessingCtx, NULL, 0); -// switch (txResult) { -// case STREAM_ACTION_READY: -// ux_step = 0; -// ux_step_count = 3 + txContent.argumentCount; -// if (txProcessingCtx.currentActionNumer > 1) { -// snprintf((char *)confirmLabel, sizeof(confirmLabel), "Action #%d", txProcessingCtx.currentActionIndex); -// } -// UX_REDISPLAY(); -// break; -// case STREAM_PROCESSING: -// io_exchange_with_code(0x9000, 0); -// // Display back the original UX -// ui_idle(); -// break; -// case STREAM_FINISHED: -// io_seproxyhal_touch_tx_ok(NULL); -// break; -// default: -// io_exchange_with_code(0x6A80, 0); -// // Display back the original UX -// ui_idle(); -// break; -// } -// } -// break; -// } -// return 0; -// } - -// unsigned int ui_multiple_action_tx_approval_nanos_button(unsigned int button_mask, -// unsigned int button_mask_counter) -// { -// switch (button_mask) -// { -// case BUTTON_EVT_RELEASED | BUTTON_LEFT: -// io_seproxyhal_touch_tx_cancel(NULL); -// break; - -// case BUTTON_EVT_RELEASED | BUTTON_RIGHT: -// { -// parserStatus_e txResult = parseTx(&txProcessingCtx, NULL, 0); -// switch (txResult) { -// case STREAM_ACTION_READY: -// ux_step = 0; -// ux_step_count = 3 + txContent.argumentCount; -// UX_REDISPLAY(); -// break; -// case STREAM_PROCESSING: -// io_exchange_with_code(0x9000, 0); -// // Display back the original UX -// ui_idle(); -// break; -// case STREAM_FINISHED: -// io_seproxyhal_touch_tx_ok(NULL); -// break; -// default: -// io_exchange_with_code(0x6A80, 0); -// // Display back the original UX -// ui_idle(); -// break; -// } -// } -// break; -// } - -// return 0; -// } - -// #endif // defined(TARGET_NANOS) - void io_exchange_with_code(uint16_t code, uint32_t tx) { G_io_apdu_buffer[tx++] = code >> 8; G_io_apdu_buffer[tx++] = code & 0xFF; @@ -1174,14 +655,7 @@ void handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, } else { -// #if defined(TARGET_NANOS) - // // prepare for a UI based reply - // ux_step = 0; - // ux_step_count = 2; - // UX_DISPLAY(ui_address_nanos, ui_address_prepro); -// #elif defined(TARGET_NANOX) ux_flow_init(0, ux_display_public_flow, NULL); -// #endif *flags |= IO_ASYNCH_REPLY; } @@ -1330,15 +804,10 @@ void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, strcpy((char *)confirmLabel, "Transaction"); } -// #if defined(TARGET_NANOS) - // ux_step_count += 3; - // UX_DISPLAY(ui_single_action_tx_approval_nanos, ui_single_action_tx_approval_prepro); -// #elif defined(TARGET_NANOX) strcpy((char *)confirm_text1, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "Sign" : "Accept"); strcpy((char *)confirm_text2, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "transaction" : "and review next"); ux_flow_init(0, ux_single_action_sign_flow, NULL); -// #endif *flags |= IO_ASYNCH_REPLY; @@ -1540,25 +1009,6 @@ unsigned char io_event(unsigned char channel) case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: UX_DISPLAYED_EVENT({}); break; - -#if 0 - case SEPROXYHAL_TAG_TICKER_EVENT: - UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, { -#if defined(TARGET_NANOS) - // if (UX_ALLOWED) - // { - // if (ux_step_count) - // { - // // prepare next screen - // ux_step = (ux_step + 1) % ux_step_count; - // // redisplay screen - // UX_REDISPLAY(); - // } - // } -#endif // TARGET_NANOS - }); - break; -#endif } // close the event if not done previously (by a display or whatever) From bede684115aba578d36681e3258240435431ee6f Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 25 Oct 2020 22:21:20 +0200 Subject: [PATCH 06/16] update deprecated flow calls. --- src/main.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main.c b/src/main.c index bdf91d5..c5b603e 100644 --- a/src/main.c +++ b/src/main.c @@ -214,7 +214,7 @@ void switch_settings_contract_data() { /////////////////////////////////////////////////////////////////////////////// -UX_FLOW_DEF_NOCB( +UX_STEP_NOCB( ux_display_public_flow_1_step, pnn, { @@ -222,14 +222,14 @@ UX_FLOW_DEF_NOCB( "Verify", "Public Key", }); -UX_FLOW_DEF_NOCB( +UX_STEP_NOCB( ux_display_public_flow_2_step, bnnn_paging, { .title = "Public Key", .text = tmpCtx.publicKeyContext.address, }); -UX_FLOW_DEF_VALID( +UX_STEP_CB( ux_display_public_flow_3_step, pb, io_seproxyhal_touch_address_ok(NULL), @@ -237,7 +237,7 @@ UX_FLOW_DEF_VALID( &C_icon_validate_14, "Approve", }); -UX_FLOW_DEF_VALID( +UX_STEP_CB( ux_display_public_flow_4_step, pb, io_seproxyhal_touch_address_cancel(NULL), @@ -266,7 +266,7 @@ volatile char confirm_text2[16]; void display_next_state(uint8_t state); void ux_single_action_sign_flow_ok_pressed(); -UX_FLOW_DEF_NOCB( +UX_STEP_NOCB( ux_single_action_sign_flow_1_step, pnn, { @@ -274,14 +274,14 @@ UX_FLOW_DEF_NOCB( "Review", confirmLabel, }); -UX_FLOW_DEF_NOCB( +UX_STEP_NOCB( ux_single_action_sign_flow_2_step, bn, { "Contract", txContent.contract, }); -UX_FLOW_DEF_NOCB( +UX_STEP_NOCB( ux_single_action_sign_flow_3_step, bn, { @@ -315,7 +315,7 @@ UX_STEP_INIT( display_next_state(STATE_RIGHT_BORDER); }); -UX_FLOW_DEF_VALID( +UX_STEP_CB( ux_single_action_sign_flow_7_step, pbb, ux_single_action_sign_flow_ok_pressed(), @@ -324,7 +324,7 @@ UX_FLOW_DEF_VALID( confirm_text1, confirm_text2, }); -UX_FLOW_DEF_VALID( +UX_STEP_CB( ux_single_action_sign_flow_8_step, pbb, io_seproxyhal_touch_tx_cancel(NULL), From 6d159c71071d88b4ef618f1ade7083bb4d2d2762 Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 25 Oct 2020 22:32:32 +0200 Subject: [PATCH 07/16] update version, remove unused code --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 97e1705..18d72a4 100755 --- a/Makefile +++ b/Makefile @@ -22,8 +22,8 @@ include $(BOLOS_SDK)/Makefile.defines APPVERSION_M=1 -APPVERSION_N=3 -APPVERSION_P=1 +APPVERSION_N=4 +APPVERSION_P=0 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) APPNAME = Eos From 689523447beac9ccc1b8b52180ffccd1332cd5af Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 25 Oct 2020 22:33:03 +0200 Subject: [PATCH 08/16] remove unused code. --- src/main.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main.c b/src/main.c index c5b603e..1ccb3f1 100644 --- a/src/main.c +++ b/src/main.c @@ -28,7 +28,6 @@ unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; -unsigned int io_seproxyhal_touch_settings(const bagl_element_t *e); unsigned int io_seproxyhal_touch_exit(const bagl_element_t *e); unsigned int io_seproxyhal_touch_tx_ok(const bagl_element_t *e); unsigned int io_seproxyhal_touch_tx_cancel(const bagl_element_t *e); @@ -110,13 +109,6 @@ typedef struct internalStorage_t { const internalStorage_t N_storage_real; #define N_storage (*(volatile internalStorage_t *)PIC(&N_storage_real)) -const bagl_element_t *ui_menu_item_out_over(const bagl_element_t *e) -{ - // the selection rectangle is after the none|touchable - e = (const bagl_element_t *)(((unsigned int)e) + sizeof(bagl_element_t)); - return e; -} - void display_settings(void); void switch_settings_contract_data(void); From 361b3d34690efbdc1873c179880f18bb4e6e20ab Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 25 Oct 2020 22:37:18 +0200 Subject: [PATCH 09/16] remove commented code. --- src/main.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main.c b/src/main.c index 1ccb3f1..d57cc3d 100644 --- a/src/main.c +++ b/src/main.c @@ -775,13 +775,7 @@ void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, { case STREAM_CONFIRM_PROCESSING: snprintf((char *)actionCounter, sizeof(actionCounter), "%d actions", txProcessingCtx.currentActionNumer); -// #if defined(TARGET_NANOS) - // ux_step = 0; - // ux_step_count = 2; - // UX_DISPLAY(ui_multiple_action_tx_approval_nanos, ui_multiple_action_tx_approval_prepro); -// #elif defined(TARGET_NANOX) ux_flow_init(0, ux_multiple_action_sign_flow, NULL); -// #endif *flags |= IO_ASYNCH_REPLY; From 56a27f38360e8e041232ecf059400b76f4e443c7 Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 29 Nov 2020 08:33:34 +0200 Subject: [PATCH 10/16] minor ui fix --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index d57cc3d..f061c73 100644 --- a/src/main.c +++ b/src/main.c @@ -791,7 +791,7 @@ void handleSign(uint8_t p1, uint8_t p2, uint8_t *workBuffer, } strcpy((char *)confirm_text1, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "Sign" : "Accept"); - strcpy((char *)confirm_text2, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "transaction" : "and review next"); + strcpy((char *)confirm_text2, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "transaction" : "& review next"); ux_flow_init(0, ux_single_action_sign_flow, NULL); From d616c6c9ac683aec47d93f512e3c7021ee44e068 Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 29 Nov 2020 15:31:14 +0200 Subject: [PATCH 11/16] changes to debugging library. --- test/decodeTransaction.py | 265 +++++++++++++++++++++++++++ test/eosBase.py | 31 +++- test/getPublicKey.py | 15 +- test/signTransaction.py | 60 +++--- test/testDerivationPathGeneration.py | 15 +- 5 files changed, 321 insertions(+), 65 deletions(-) create mode 100644 test/decodeTransaction.py diff --git a/test/decodeTransaction.py b/test/decodeTransaction.py new file mode 100644 index 0000000..8a1f821 --- /dev/null +++ b/test/decodeTransaction.py @@ -0,0 +1,265 @@ +import binascii +import argparse +from asn1 import Decoder, Numbers +from termcolor import colored + +#define CLA 0xD4 +#define INS_GET_PUBLIC_KEY 0x02 +#define INS_SIGN 0x04 +#define INS_GET_APP_CONFIGURATION 0x06 +#define P1_CONFIRM 0x01 +#define P1_NON_CONFIRM 0x00 +#define P2_NO_CHAINCODE 0x00 +#define P2_CHAINCODE 0x01 +#define P1_FIRST 0x00 +#define P1_MORE 0x80 + +#define OFFSET_CLA 0 +#define OFFSET_INS 1 +#define OFFSET_P1 2 +#define OFFSET_P2 3 +#define OFFSET_LC 4 +#define OFFSET_CDATA 5 + + +def print_value(name, code): + text = "{:>20}: {}".format(name, "{}") + print(text.format(code)) + + +def print_size(name, size): + text = "{:>20}: {}".format(name, "{} {}") + print(text.format(size, int(size, 16))) + + +def print_header(name): + print("{:-^50}".format(name)) + + +def print_path(fp, size, processing_size): + total_path = '' + for i in range(size): + path = fp.read(8) + print_value('path', path) + total_path += path + ':' + + print_value('total path', total_path) + processing_size -= 8*size + return processing_size + + +def get_offset(stack): + for i in range(0, len(stack)): + return stack[i][0] + +def print_offset(buffer, offset): + bin_buf = binascii.unhexlify(buffer[offset:]) + decoder = Decoder() + decoder.start(bin_buf) + _, value = decoder.read() + value = binascii.hexlify(value) + + idx = (buffer[offset:]).find(value.decode('utf-8'))+offset + length = len(value) + + b0 = buffer[:offset] + b1 = buffer[offset:idx] + offset = idx + b2 = buffer[offset:offset+length] + offset += length + b3 = buffer[offset:] + + print(b0, colored(b1, 'red'), colored(b2, 'blue'), b3, sep='') + +codes = { + 'd4': 'cla', + '02': 'instruction pub_key', + '04': 'instruction sing', + '06': 'instruction config', +} + +p1_codes = { + '01': 'p1_confirm', + '00': 'p1_first', + '80': 'p1_more' +} + +p2_codes = { + '01': 'p2_chaincode', + '00': 'p2_no_chaincode', +} + +class Context: + def __init__(self): + self.action_num = 0 + self.action_idx = 0 + self.auth_num = 0 + self.auth_idx = 0 + self.step = 0 + self.action_ready = False + + def __repr__(self): + return 'step :{} act(i): {} act(n): {}, auth(i): {}, auth(n): {}'.format(self.step, self.action_idx, self.action_num, self.auth_idx, self.auth_num) + + +def next_step(context, value): + context.step += 1 + return context + + +def store_action(context, value): + value = int(value, 16) + context.action_num = value + return next_step(context, value) + + +def store_auth(context, value): + value = int(value, 16) + context.auth_num = value + return next_step(context, value) + + +def goto(context, value): + context.step = value + return context + + +def define_next_auth_step(context, value): + context.auth_idx += 1 + if context.auth_num <= context.auth_idx: + return next_step(context, value) + else: + return goto(context, 12) + +def define_next_action_step(context, value): + context.action_idx += 1 + if context.action_num <= context.action_idx: + return next_step(context, value) + else: + context.auth_idx = 0 + context.auth_num = 0 + context.action_ready = True + return goto(context, 9) + +parsing_header = { + 0:'chain id', + 1:'header expiration', + 2:'header block num', + 3:'header block prefix', + 4:'header cpu', + 5:'header net', + 6:'header delay', + 7:'cfa list size', + 8:'action list size', + 9:'action account', + 10:'action name', + 11:'auth list size', + 12:'auth actor', + 13:'auth permissiom', + 14:'action data size', + 15:'action data', + 16:'extention list size', + 17:'context free data' +} + +parsing_actions = { + 0: next_step, + 1: next_step, + 2: next_step, + 3: next_step, + 4: next_step, + 5: next_step, + 6: next_step, + 7: next_step, + 8: store_action, + 9: next_step, + 10: next_step, + 11: store_auth, + 12: next_step, + 13: define_next_auth_step, + 14: next_step, + 15: define_next_action_step, + 16: next_step, + 17: next_step, +} + +parser = argparse.ArgumentParser() +parser.add_argument('--file', help="file to encoded transaction") +args = parser.parse_args() + +if args.file is None: + args.file = 'encoded_transaction.txt' + +with open(args.file) as f: + ctx = Context() + while True: + hex_data = '' + + print_header("INSTUCTION SET") + # cla + k = f.read(2) + print_value(codes[k], k) + + # instuction + k = f.read(2) + print_value(codes[k], k) + + # p1 + p1 = f.read(2) + print_value(p1_codes[p1], p1) + + # p2 + p2 = f.read(2) + print_value(p2_codes[p2], p2) + + print_header("SIZE SET") + + total_size = f.read(2) + print_size('total size', total_size) + processing_size = total_size = int(total_size, 16) + + if p1 == '00': + # path + path_size = f.read(2) + print_size('path size', path_size) + path_size = int(path_size, 16) + + print_header('PATH SET') + processing_size = print_path(f, path_size, processing_size) + + print_header("TX SET") + print_value('processing size', processing_size) + + hex_data += f.readline() + if hex_data[-1] == '\n': + hex_data = hex_data[:-1] + data = binascii.unhexlify(hex_data) + decoder = Decoder() + decoder.start(data) + offset = get_offset(decoder.m_stack) + + while decoder.eof() is not True: + + try: + buffer = decoder.read() + except: + hex_data = hex_data[offset*2:] + break + + print_header(parsing_header[ctx.step]) + + tag = buffer[0] + value = binascii.hexlify(buffer[1]) + ctx = parsing_actions[ctx.step](ctx, value) + + print_offset(hex_data, offset*2) + + print_value('offset', offset) + print_value('ber tag', tag) + print_value('ber value', value) + print_value('context', ctx) + + if ctx.action_ready: + break + + offset = get_offset(decoder.m_stack) diff --git a/test/eosBase.py b/test/eosBase.py index 1b21cf4..ff9f0cc 100644 --- a/test/eosBase.py +++ b/test/eosBase.py @@ -26,6 +26,21 @@ from base58 import b58decode import hashlib +import sys +sys.dont_write_bytecode = True + +def parse_bip32_path(path): + if len(path) == 0: + return b"" + result = b"" + elements = path.split('/') + for pathElement in elements: + element = pathElement.split('\'') + if len(element) == 1: + result = result + struct.pack(">I", int(element[0])) + else: + result = result + struct.pack(">I", 0x80000000 | int(element[0])) + return result class Action: def __init__(self): @@ -375,6 +390,8 @@ def encode(self): print('Signing digest ' + sha.hexdigest()) + chunks = [] + encoder.start() encoder.write(self.chain_id, Numbers.OctetString) encoder.write(self.expiration, Numbers.OctetString) @@ -386,7 +403,12 @@ def encode(self): encoder.write(self.ctx_free_actions_size, Numbers.OctetString) encoder.write(self.actions_size, Numbers.OctetString) + + chunks.append(encoder.output()) + for action in self.actions: + encoder.start() + encoder.write(action.account, Numbers.OctetString) encoder.write(action.name, Numbers.OctetString) encoder.write(action.auth_size, Numbers.OctetString) @@ -396,7 +418,14 @@ def encode(self): encoder.write(permission, Numbers.OctetString) encoder.write(action.data_size, Numbers.OctetString) encoder.write(action.data, Numbers.OctetString) + + chunks.append(encoder.output()) + + encoder.start() + encoder.write(self.tx_ext, Numbers.OctetString) encoder.write(self.cfd, Numbers.OctetString) - return encoder.output() + chunks.append(encoder.output()) + + return chunks diff --git a/test/getPublicKey.py b/test/getPublicKey.py index c9eaa30..adb1709 100644 --- a/test/getPublicKey.py +++ b/test/getPublicKey.py @@ -25,20 +25,7 @@ from base58 import b58encode import hashlib import binascii - - -def parse_bip32_path(path): - if len(path) == 0: - return b"" - result = b"" - elements = path.split('/') - for pathElement in elements: - element = pathElement.split('\'') - if len(element) == 1: - result = result + struct.pack(">I", int(element[0])) - else: - result = result + struct.pack(">I", 0x80000000 | int(element[0])) - return result +from eosBase import parse_bip32_path parser = argparse.ArgumentParser() diff --git a/test/signTransaction.py b/test/signTransaction.py index 264d97b..c811d22 100644 --- a/test/signTransaction.py +++ b/test/signTransaction.py @@ -21,25 +21,11 @@ import binascii import json import struct -from eosBase import Transaction +from eosBase import Transaction, parse_bip32_path from ledgerblue.comm import getDongle import argparse -def parse_bip32_path(path): - if len(path) == 0: - return b"" - result = b"" - elements = path.split('/') - for pathElement in elements: - element = pathElement.split('\'') - if len(element) == 1: - result = result + struct.pack(">I", int(element[0])) - else: - result = result + struct.pack(">I", 0x80000000 | int(element[0])) - return result - - parser = argparse.ArgumentParser() parser.add_argument('--path', help="BIP 32 path to retrieve") parser.add_argument('--file', help="Transaction in JSON format") @@ -57,28 +43,30 @@ def parse_bip32_path(path): with open(args.file) as f: obj = json.load(f) tx = Transaction.parse(obj) - tx_raw = tx.encode() - signData = tx_raw - print("Raw Tx", binascii.hexlify(tx_raw)) + # tx_raw = tx.encode() + tx_chunks = tx.encode() - dongle = getDongle(True) - offset = 0 first = True - singSize = len(signData) - while offset != singSize: - if singSize - offset > 200: - chunk = signData[offset: offset + 200] - else: - chunk = signData[offset:] + dongle = getDongle(True) + for tx_chunk in tx_chunks: + + offset = 0 + singSize = len(tx_chunk) + sliceSize = 121 + while offset != singSize: + if singSize - offset > sliceSize: + transport_chunk = tx_chunk[offset: offset + sliceSize] + else: + transport_chunk = tx_chunk[offset:] - if first: - totalSize = len(donglePath) + 1 + len(chunk) - apdu = bytearray.fromhex("D4040000") + bytes([totalSize, pathSize]) + donglePath + chunk - first = False - else: - totalSize = len(chunk) - apdu = bytearray.fromhex("D4048000") + bytes([totalSize]) + chunk + if first: + totalSize = len(donglePath) + 1 + len(transport_chunk) + apdu = bytearray.fromhex("D4040000") + bytes([totalSize, pathSize]) + donglePath + transport_chunk + first = False + else: + totalSize = len(transport_chunk) + apdu = bytearray.fromhex("D4048000") + bytes([totalSize]) + transport_chunk - offset += len(chunk) - result = dongle.exchange(bytes(apdu)) - print(binascii.hexlify(result)) \ No newline at end of file + offset += len(transport_chunk) + result = dongle.exchange(bytes(apdu)) + print(binascii.hexlify(result)) \ No newline at end of file diff --git a/test/testDerivationPathGeneration.py b/test/testDerivationPathGeneration.py index b26be73..f130b63 100644 --- a/test/testDerivationPathGeneration.py +++ b/test/testDerivationPathGeneration.py @@ -24,20 +24,7 @@ from base58 import b58encode import hashlib import binascii - - -def parse_bip32_path(path): - if len(path) == 0: - return b"" - result = b"" - elements = path.split('/') - for pathElement in elements: - element = pathElement.split('\'') - if len(element) == 1: - result = result + struct.pack(">I", int(element[0])) - else: - result = result + struct.pack(">I", 0x80000000 | int(element[0])) - return result +from eosBase import parse_bip32_path dongle = getDongle(False) From db7085d1e7046846508013bb11736e7eefd180c3 Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 6 Dec 2020 12:56:12 +0200 Subject: [PATCH 12/16] fix for multiple action support. --- src/main.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index f061c73..4eaacd6 100644 --- a/src/main.c +++ b/src/main.c @@ -389,11 +389,9 @@ void ux_single_action_sign_flow_ok_pressed() case STREAM_ACTION_READY: ux_step = 0; ux_step_count = txContent.argumentCount; - if (txProcessingCtx.currentActionNumer > 1) { - snprintf((char *)confirmLabel, sizeof(confirmLabel), "Action #%d", txProcessingCtx.currentActionIndex); - } + snprintf((char *)confirmLabel, sizeof(confirmLabel), "Action #%d", txProcessingCtx.currentActionIndex); strcpy((char *)confirm_text1, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "Sign" : "Accept"); - strcpy((char *)confirm_text2, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "transaction" : "and review next"); + strcpy((char *)confirm_text2, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "transaction" : "& review next"); ux_flow_init(0, ux_single_action_sign_flow, NULL); break; @@ -467,8 +465,12 @@ void ux_multiple_action_sign_flow_ok_pressed() case STREAM_ACTION_READY: ux_step = 0; ux_step_count = txContent.argumentCount; - // TODO: proper redisplya - // UX_REDISPLAY(); + snprintf((char *)confirmLabel, sizeof(confirmLabel), "Action #%d", txProcessingCtx.currentActionIndex); + strcpy((char *)confirm_text1, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "Sign" : "Accept"); + strcpy((char *)confirm_text2, txProcessingCtx.currentActionIndex == txProcessingCtx.currentActionNumer ? "transaction" : "& review next"); + + ux_flow_init(0, ux_single_action_sign_flow, NULL); + break; case STREAM_PROCESSING: io_exchange_with_code(0x9000, 0); From d3b335bfd01d820539c31f2be07f68215acd3a99 Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 6 Dec 2020 12:57:54 +0200 Subject: [PATCH 13/16] update python tools --- test/eosBase.py | 56 +++++++++++++++++++++++++++++++++++++++++ test/signTransaction.py | 5 ++-- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/test/eosBase.py b/test/eosBase.py index ff9f0cc..b41c6e0 100644 --- a/test/eosBase.py +++ b/test/eosBase.py @@ -429,3 +429,59 @@ def encode(self): chunks.append(encoder.output()) return chunks + + + def encode2(self): + encoder = Encoder() + sha = hashlib.sha256() + + sha.update(self.chain_id) + sha.update(self.expiration) + sha.update(self.ref_block_num) + sha.update(self.ref_block_prefix) + sha.update(self.net_usage_words) + sha.update(self.max_cpu_usage_ms) + sha.update(self.delay_sec) + sha.update(self.ctx_free_actions_size) + sha.update(self.actions_size) + for action in self.actions: + sha.update(action.account) + sha.update(action.name) + sha.update(action.auth_size) + for auth in action.auth: + (auth_actor, permission) = auth + sha.update(auth_actor) + sha.update(permission) + + sha.update(action.data_size) + sha.update(action.data) + sha.update(self.tx_ext) + sha.update(self.cfd) + + print('Signing digest ' + sha.hexdigest()) + + encoder.start() + encoder.write(self.chain_id, Numbers.OctetString) + encoder.write(self.expiration, Numbers.OctetString) + encoder.write(self.ref_block_num, Numbers.OctetString) + encoder.write(self.ref_block_prefix, Numbers.OctetString) + encoder.write(self.net_usage_words, Numbers.OctetString) + encoder.write(self.max_cpu_usage_ms, Numbers.OctetString) + encoder.write(self.delay_sec, Numbers.OctetString) + + encoder.write(self.ctx_free_actions_size, Numbers.OctetString) + encoder.write(self.actions_size, Numbers.OctetString) + for action in self.actions: + encoder.write(action.account, Numbers.OctetString) + encoder.write(action.name, Numbers.OctetString) + encoder.write(action.auth_size, Numbers.OctetString) + for auth in action.auth: + (auth_actor, permission) = auth + encoder.write(auth_actor, Numbers.OctetString) + encoder.write(permission, Numbers.OctetString) + encoder.write(action.data_size, Numbers.OctetString) + encoder.write(action.data, Numbers.OctetString) + encoder.write(self.tx_ext, Numbers.OctetString) + encoder.write(self.cfd, Numbers.OctetString) + + return [encoder.output()] \ No newline at end of file diff --git a/test/signTransaction.py b/test/signTransaction.py index c811d22..eca8869 100644 --- a/test/signTransaction.py +++ b/test/signTransaction.py @@ -43,8 +43,7 @@ with open(args.file) as f: obj = json.load(f) tx = Transaction.parse(obj) - # tx_raw = tx.encode() - tx_chunks = tx.encode() + tx_chunks = tx.encode2() first = True dongle = getDongle(True) @@ -52,7 +51,7 @@ offset = 0 singSize = len(tx_chunk) - sliceSize = 121 + sliceSize = 150 while offset != singSize: if singSize - offset > sliceSize: transport_chunk = tx_chunk[offset: offset + sliceSize] From 4e59841b11fbb110728c86f0168dc5f1661e8315 Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 6 Dec 2020 13:13:43 +0200 Subject: [PATCH 14/16] bump version --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 18d72a4..e29da98 100755 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ include $(BOLOS_SDK)/Makefile.defines APPVERSION_M=1 APPVERSION_N=4 -APPVERSION_P=0 +APPVERSION_P=1 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) APPNAME = Eos From bba791e226d7645694b925eb050520ccf93ff98a Mon Sep 17 00:00:00 2001 From: tarassh Date: Sun, 6 Dec 2020 13:18:03 +0200 Subject: [PATCH 15/16] update docs --- doc/eosapp.asc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/eosapp.asc b/doc/eosapp.asc index 796df74..e4d6670 100644 --- a/doc/eosapp.asc +++ b/doc/eosapp.asc @@ -20,6 +20,10 @@ Application version 1.2 - 28th of November 2018 ## 1.3 - Add WebUSB support +## 1.4.1 + - Update to firmware v1.6 + - Fix for https://github.com/tarassh/eos-ledger/issues/13 + ## About This application describes the APDU messages interface to communicate with the Eos application. From 15c5869c07fd582a3710a1cfc5acfb5c95d7ad2f Mon Sep 17 00:00:00 2001 From: tarassh Date: Tue, 8 Dec 2020 09:41:30 +0200 Subject: [PATCH 16/16] remove redundant line --- src/main.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main.c b/src/main.c index 4eaacd6..2f453f9 100644 --- a/src/main.c +++ b/src/main.c @@ -116,7 +116,6 @@ UX_STEP_NOCB( ux_idle_flow_1_step, nn, //pnn, { - "", //&C_icon_dashboard, "Application", "is ready", });