From 6b85fcca23a6512acfedb953fb7913c5f79b1aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Mon, 21 Sep 2020 22:52:14 +0200 Subject: [PATCH 001/142] Bug exception WrongDataRange with high timelock value --- tests/test_sig.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_sig.py b/tests/test_sig.py index 03cd4c2..0e2178d 100644 --- a/tests/test_sig.py +++ b/tests/test_sig.py @@ -84,10 +84,10 @@ def test_gen_txout_keys(monero, state): @staticmethod def test_prefix_hash(monero, button): - expected: bytes = bytes.fromhex("49d03a195e239b52779866b33024210f" - "c7dc66e9c2998975c0aa45c1702549d5") + expected: bytes = bytes.fromhex("9a259973bf721120aceae3d8d40696c0" + "7470331e386028753123f37fee36926b") # should ask for timelock validation - monero.prefix_hash_init(button=button, version=0, timelock=1) + monero.prefix_hash_init(button=button, version=0, timelock=2147483650) result: bytes = monero.prefix_hash_update( index=1, payload=b"", From c749daf91b7a0280065e3bbb0a350687de806586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Mon, 21 Sep 2020 23:00:52 +0200 Subject: [PATCH 002/142] Fix integer overflow when decoding varint --- src/monero_crypto.c | 4 ++-- src/monero_prefix.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/monero_crypto.c b/src/monero_crypto.c index 07cd897..f5352fb 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -110,11 +110,11 @@ unsigned int monero_decode_varint(unsigned char *varint, unsigned int max_len, u if (len == (max_len - 1)) { THROW(SW_WRONG_DATA_RANGE); } - v = v + (((varint[len]) & 0x7f) << (len * 7)); + v = v + ((uint64_t)((varint[len]) & 0x7f) << (len * 7)); len++; } - v = v + (((varint[len]) & 0x7f) << (len * 7)); + v = v + ((uint64_t)((varint[len]) & 0x7f) << (len * 7)); *value = v; return len + 1; } diff --git a/src/monero_prefix.c b/src/monero_prefix.c index de662c5..dac5e50 100644 --- a/src/monero_prefix.c +++ b/src/monero_prefix.c @@ -30,7 +30,7 @@ /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_prefix_hash_init() { - int timelock; + uint64_t timelock; monero_keccak_update_H(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, G_monero_vstate.io_length - G_monero_vstate.io_offset); From 87181614426550408a0e93d199caf8e138f15484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Mon, 10 Aug 2020 15:03:44 +0200 Subject: [PATCH 003/142] Add CLSAG signature --- src/monero_api.h | 5 ++ src/monero_clsag.c | 168 ++++++++++++++++++++++++++++++++++++++++++ src/monero_crypto.c | 2 +- src/monero_dispatch.c | 1 + 4 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 src/monero_clsag.c diff --git a/src/monero_api.h b/src/monero_api.h index a86aa4f..e37a785 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -68,6 +68,10 @@ int monero_apdu_mlsag_prehash_init(void); int monero_apdu_mlsag_prehash_update(void); int monero_apdu_mlsag_prehash_finalize(void); +int monero_apdu_clsag_prepare(void); +int monero_apdu_clsag_hash(void); +int monero_apdu_clsag_sign(void); + int monero_apu_generate_txout_keys(void); int monero_apdu_prefix_hash_init(); @@ -129,6 +133,7 @@ extern const unsigned char C_FAKE_SEC_SPEND_KEY[32]; int is_fake_view_key(unsigned char *s); int is_fake_spend_key(unsigned char *s); +void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes); void monero_sc_add(unsigned char *r, unsigned char *s1, unsigned char *s2); void monero_hash_to_scalar(unsigned char *scalar, unsigned char *raw, unsigned int len); void monero_hash_to_ec(unsigned char *ec, unsigned char *ec_pub); diff --git a/src/monero_clsag.c b/src/monero_clsag.c new file mode 100644 index 0000000..3e03d34 --- /dev/null +++ b/src/monero_clsag.c @@ -0,0 +1,168 @@ +/***************************************************************************** + * Ledger Monero App. + * (c) 2017-2020 Cedric Mesnil , Ledger SAS. + * (c) 2020 Ledger SAS. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ + +#include "os.h" +#include "cx.h" +#include "monero_types.h" +#include "monero_api.h" +#include "monero_vars.h" + +/* ----------------------------------------------------------------------- */ +/* --- --- */ +/* ----------------------------------------------------------------------- */ +/* + bool device_default::clsag_prepare(const rct::key &p, const rct::key &z, rct::key &I, rct::key + &D, const rct::key &H, rct::key &a, rct::key &aG, rct::key &aH) { rct::skpkGen(a,aG); // aG = a*G + rct::scalarmultKey(aH,H,a); // aH = a*H + rct::scalarmultKey(I,H,p); // I = p*H + rct::scalarmultKey(D,H,z); // D = z*H + return true; + } +*/ +int monero_apdu_clsag_prepare() { + int options; + unsigned char a[32]; + unsigned char p[32]; + unsigned char z[32]; + unsigned char H[32]; + unsigned char W[32]; + + G_monero_vstate.tx_sign_cnt++; + if (G_monero_vstate.tx_sign_cnt == 0) { + monero_lock_and_throw(SW_SECURITY_MAX_SIGNATURE_REACHED); + } + + monero_io_fetch_decrypt(p, 32, TYPE_SCALAR); + monero_io_fetch_decrypt(z, 32, TYPE_SCALAR); + monero_io_fetch(H, 32); + monero_io_discard(1); + + // H + monero_ge_fromfe_frombytes(H, H); + + // a + monero_rng_mod_order(a); + monero_io_insert_encrypt(a, 32, TYPE_ALPHA); + + // a.G + monero_ecmul_G(W, a); + monero_io_insert(W, 32); + // a.H + monero_ecmul_k(W, a, H); + monero_io_insert(W, 32); + // I = p.H + monero_ecmul_k(W, p, H); + monero_io_insert(W, 32); + // I = z.H + monero_ecmul(W, z, H); + monero_io_insert(W, 32); + + return SW_OK; +} + +/* ----------------------------------------------------------------------- */ +/* --- --- */ +/* ----------------------------------------------------------------------- */ +int monero_apdu_clsag_hash() { + unsigned char msg[32]; + unsigned char c[32]; + + if (G_monero_vstate.io_p2 == 1) { + monero_keccak_init_H(); + os_memmove(msg, G_monero_vstate.mlsagH, 32); + } else { + monero_io_fetch(msg, 32); + } + monero_io_discard(1); + + monero_keccak_update_H(msg, 32); + if ((G_monero_vstate.options & 0x80) == 0) { + monero_keccak_final_H(c); + monero_reduce(c, c); + monero_io_insert(c, 32); + os_memmove(G_monero_vstate.c, c, 32); + } + return SW_OK; +} + +/* ----------------------------------------------------------------------- */ +/* --- --- */ +/* ----------------------------------------------------------------------- */ +/* + bool device_default::clsag_sign(const rct::key &c, const rct::key &a, const rct::key &p, const + rct::key &z, const rct::key &mu_P, const rct::key &mu_C, rct::key &s) { rct::key s0_p_mu_P; + sc_mul(s0_p_mu_P.bytes,mu_P.bytes,p.bytes); + rct::key s0_add_z_mu_C; + sc_muladd(s0_add_z_mu_C.bytes,mu_C.bytes,z.bytes,s0_p_mu_P.bytes); + sc_mulsub(s.bytes,c.bytes,s0_add_z_mu_C.bytes,a.bytes); + + return true; + } +*/ +int monero_apdu_clsag_sign() { + unsigned char s[32]; + unsigned char a[32]; + unsigned char p[32]; + unsigned char z[32]; + unsigned char mu_P[32]; + unsigned char mu_C[32]; + + if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_FAKE) { + monero_io_fetch(a, 32); + monero_io_fetch(p, 32); + monero_io_fetch(z, 32); + monero_io_fetch(mu_P, 32); + monero_io_fetch(mu_C, 32); + } else if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { + monero_io_fetch_decrypt(a, 32, TYPE_ALPHA); + monero_io_fetch_decrypt(p, 32, TYPE_SCALAR); + monero_io_fetch_decrypt(z, 32, TYPE_SCALAR); + monero_io_fetch(mu_P, 32); + monero_io_fetch(mu_C, 32); + } else { + monero_lock_and_throw(SW_SECURITY_INTERNAL); + } + monero_io_discard(1); + + // check xin and alpha are not null + monero_check_scalar_range_1N(a); + monero_check_scalar_range_1N(p); + monero_check_scalar_range_1N(z); + + monero_reduce(a, a); + monero_reduce(p, p); + monero_reduce(z, z); + monero_reduce(mu_P, mu_P); + monero_reduce(mu_C, mu_C); + monero_reduce(G_monero_vstate.c, G_monero_vstate.c); + + // s0_p_mu_P = mu_P*p ->s + monero_multm(s, p, mu_P); + + // s0_add_z_mu_C = mu_C*z + s0_p_mu_P + monero_multm(mu_P, mu_C, z); + monero_addm(s, s, mu_P); + + // s = c*s0_add_z_mu_C + a + monero_multm(mu_P, G_monero_vstate.c, s); + monero_addm(s, mu_P, a); + + monero_io_insert(s, 32); + monero_io_insert_u32(G_monero_vstate.tx_sig_mode); + return SW_OK; +} diff --git a/src/monero_crypto.c b/src/monero_crypto.c index f5352fb..c1397fd 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -275,7 +275,7 @@ const unsigned char C_fe_qm5div8[] = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd}; -static void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { +void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { #define MOD (unsigned char *)C_ED25519_FIELD, 32 #define fe_isnegative(f) (f[31] & 1) #if 0 diff --git a/src/monero_dispatch.c b/src/monero_dispatch.c index fcbea88..caaf82f 100644 --- a/src/monero_dispatch.c +++ b/src/monero_dispatch.c @@ -50,6 +50,7 @@ int check_potocol() { switch (G_monero_vstate.io_protocol_version) { case 0x00: /* the first one: PCSC epoch */ case 0x03: /* protocol V3 */ + case 0x04: /* protocol V4 */ if (G_monero_vstate.protocol == 0xff) { G_monero_vstate.protocol = G_monero_vstate.io_protocol_version; } From d4278ef9c743c3e2bdf69df57248c23cda770bc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Mon, 10 Aug 2020 15:33:16 +0200 Subject: [PATCH 004/142] Bump version to 1.7.0 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0eb34f2..a2c99ce 100644 --- a/Makefile +++ b/Makefile @@ -39,7 +39,7 @@ endif #DEFINES += MONERO_BETA APPVERSION_M=1 -APPVERSION_N=6 +APPVERSION_N=7 APPVERSION_P=0 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) From eaf4ba1ea2ce29add9659567188e68094e40df8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Thu, 13 Aug 2020 18:48:20 +0200 Subject: [PATCH 005/142] Fix bad function call in monero_apdu_clsag_prepare() --- src/monero_clsag.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monero_clsag.c b/src/monero_clsag.c index 3e03d34..cdd22e7 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -69,7 +69,7 @@ int monero_apdu_clsag_prepare() { monero_ecmul_k(W, p, H); monero_io_insert(W, 32); // I = z.H - monero_ecmul(W, z, H); + monero_ecmul_k(W, z, H); monero_io_insert(W, 32); return SW_OK; From de38f6a4b2568b33bb837e938450ba30712e8db7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Thu, 13 Aug 2020 19:19:39 +0200 Subject: [PATCH 006/142] Add INS_CLSAG to dispatcher --- src/monero_dispatch.c | 50 +++++++++++++++++++++++++++++++++++++++++-- src/monero_types.h | 1 + 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/monero_dispatch.c b/src/monero_dispatch.c index caaf82f..f469a9a 100644 --- a/src/monero_dispatch.c +++ b/src/monero_dispatch.c @@ -112,6 +112,7 @@ int check_ins_access() { case INS_BLIND: case INS_VALIDATE: case INS_MLSAG: + case INS_CLSAG: case INS_GEN_COMMITMENT_MASK: if (os_global_pin_is_validated() != PIN_VERIFIED) { return SW_SECURITY_PIN_LOCKED; @@ -427,8 +428,9 @@ int monero_dispatch() { /* --- MLSAG --- */ case INS_MLSAG: // 1. state machine check - if ((G_monero_vstate.tx_state_ins != INS_VALIDATE) && - (G_monero_vstate.tx_state_ins != INS_MLSAG)) { + if ((G_monero_vstate.tx_state_ins != INS_VALIDATE) && // + (G_monero_vstate.tx_state_ins != INS_MLSAG) && // + (G_monero_vstate.protocol != 3)) { THROW(SW_COMMAND_NOT_ALLOWED); } if (G_monero_vstate.tx_state_ins == INS_VALIDATE) { @@ -467,6 +469,50 @@ int monero_dispatch() { update_protocol(); break; + /* --- CLSAG --- */ + case INS_CLSAG: + // 1. state machine check + if ((G_monero_vstate.tx_state_ins != INS_VALIDATE) && // + (G_monero_vstate.tx_state_ins != INS_CLSAG) && // + (G_monero_vstate.protocol != 4)) { + THROW(SW_COMMAND_NOT_ALLOWED); + } + if (G_monero_vstate.tx_state_ins == INS_VALIDATE) { + if ((G_monero_vstate.tx_state_p1 != 3) || (G_monero_vstate.io_p1 != 1) || + (G_monero_vstate.io_p2 != 0)) { + THROW(SW_SUBCOMMAND_NOT_ALLOWED); + } + } else { + if (G_monero_vstate.tx_state_p1 == 1) { + if (2 != G_monero_vstate.io_p1) { + THROW(SW_SUBCOMMAND_NOT_ALLOWED); + } + } else if (G_monero_vstate.tx_state_p1 == 2) { + if ((2 != G_monero_vstate.io_p1) && (3 != G_monero_vstate.io_p1)) { + THROW(SW_SUBCOMMAND_NOT_ALLOWED); + } + } else if (G_monero_vstate.tx_state_p1 == 3) { + if (1 != G_monero_vstate.io_p1) { + THROW(SW_SUBCOMMAND_NOT_ALLOWED); + } + } else { + THROW(SW_COMMAND_NOT_ALLOWED); + } + } + + // 2. command process + if (G_monero_vstate.io_p1 == 1) { + sw = monero_apdu_clsag_prepare(); + } else if (G_monero_vstate.io_p1 == 2) { + sw = monero_apdu_clsag_hash(); + } else if (G_monero_vstate.io_p1 == 3) { + sw = monero_apdu_clsag_sign(); + } else { + THROW(SW_WRONG_P1P2); + } + update_protocol(); + break; + /* --- KEYS --- */ default: diff --git a/src/monero_types.h b/src/monero_types.h index b98d789..4e46a8a 100644 --- a/src/monero_types.h +++ b/src/monero_types.h @@ -274,6 +274,7 @@ typedef struct monero_v_state_s monero_v_state_t; #define INS_PREFIX_HASH 0x7D #define INS_VALIDATE 0x7C #define INS_MLSAG 0x7E +#define INS_CLSAG 0x7F #define INS_CLOSE_TX 0x80 #define INS_GET_TX_PROOF 0xA0 From c80b4ebb1b0afa2b7cb0518eefbe48f8d1ece8ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Mon, 24 Aug 2020 18:50:59 +0200 Subject: [PATCH 007/142] Fix INS_MLSAG must be compatible with protocol v4 --- src/monero_dispatch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monero_dispatch.c b/src/monero_dispatch.c index f469a9a..839e57f 100644 --- a/src/monero_dispatch.c +++ b/src/monero_dispatch.c @@ -430,7 +430,7 @@ int monero_dispatch() { // 1. state machine check if ((G_monero_vstate.tx_state_ins != INS_VALIDATE) && // (G_monero_vstate.tx_state_ins != INS_MLSAG) && // - (G_monero_vstate.protocol != 3)) { + ((G_monero_vstate.protocol != 3) || (G_monero_vstate.protocol != 4))) { THROW(SW_COMMAND_NOT_ALLOWED); } if (G_monero_vstate.tx_state_ins == INS_VALIDATE) { From f7b2d8a138aa21172722c1363f888310ebfc048c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Mon, 24 Aug 2020 18:55:53 +0200 Subject: [PATCH 008/142] Fix scalar z is not encrypted in the Monero client --- src/monero_clsag.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/monero_clsag.c b/src/monero_clsag.c index cdd22e7..66d1ec0 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -48,7 +48,7 @@ int monero_apdu_clsag_prepare() { } monero_io_fetch_decrypt(p, 32, TYPE_SCALAR); - monero_io_fetch_decrypt(z, 32, TYPE_SCALAR); + monero_io_fetch(z, 32); monero_io_fetch(H, 32); monero_io_discard(1); @@ -131,7 +131,7 @@ int monero_apdu_clsag_sign() { } else if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { monero_io_fetch_decrypt(a, 32, TYPE_ALPHA); monero_io_fetch_decrypt(p, 32, TYPE_SCALAR); - monero_io_fetch_decrypt(z, 32, TYPE_SCALAR); + monero_io_fetch(z, 32); monero_io_fetch(mu_P, 32); monero_io_fetch(mu_C, 32); } else { From feb5dab735646c89b21f0346464163f27b677946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Mon, 24 Aug 2020 18:57:42 +0200 Subject: [PATCH 009/142] Fix wrong parameter order for monero_ecmul_k() --- src/monero_clsag.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/monero_clsag.c b/src/monero_clsag.c index 66d1ec0..dcd3542 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -58,18 +58,18 @@ int monero_apdu_clsag_prepare() { // a monero_rng_mod_order(a); monero_io_insert_encrypt(a, 32, TYPE_ALPHA); - // a.G monero_ecmul_G(W, a); monero_io_insert(W, 32); // a.H - monero_ecmul_k(W, a, H); + monero_ecmul_k(W, H, a); monero_io_insert(W, 32); // I = p.H - monero_ecmul_k(W, p, H); + monero_ecmul_k(W, H, p); monero_io_insert(W, 32); - // I = z.H - monero_ecmul_k(W, z, H); + + // D = z.H + monero_ecmul_k(W, H, z); monero_io_insert(W, 32); return SW_OK; From f55e71c42918f1eb112ba94f8d335f8401251d2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Mon, 24 Aug 2020 19:03:15 +0200 Subject: [PATCH 010/142] Fix tx_sig_mode is not expected by the Monero client --- src/monero_clsag.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monero_clsag.c b/src/monero_clsag.c index dcd3542..eaeebd5 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -163,6 +163,6 @@ int monero_apdu_clsag_sign() { monero_addm(s, mu_P, a); monero_io_insert(s, 32); - monero_io_insert_u32(G_monero_vstate.tx_sig_mode); + return SW_OK; } From f6f9805444038140c686c7a22cad86f8ab5b9805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Mon, 24 Aug 2020 19:07:30 +0200 Subject: [PATCH 011/142] Fix temporarly just check if is scalars are not 0 --- src/monero_clsag.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/monero_clsag.c b/src/monero_clsag.c index eaeebd5..236cc6d 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -137,12 +137,12 @@ int monero_apdu_clsag_sign() { } else { monero_lock_and_throw(SW_SECURITY_INTERNAL); } + monero_io_discard(1); - // check xin and alpha are not null - monero_check_scalar_range_1N(a); - monero_check_scalar_range_1N(p); - monero_check_scalar_range_1N(z); + monero_check_scalar_not_null(a); + monero_check_scalar_not_null(p); + monero_check_scalar_not_null(z); monero_reduce(a, a); monero_reduce(p, p); From 4233e1dcf74359d4be75725ff22bb3cb43dd68bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Mon, 24 Aug 2020 19:09:21 +0200 Subject: [PATCH 012/142] Fix 'a - mu_P' instead of 'a + mu_P' --- src/monero_clsag.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/monero_clsag.c b/src/monero_clsag.c index 236cc6d..3b960ce 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -160,7 +160,8 @@ int monero_apdu_clsag_sign() { // s = c*s0_add_z_mu_C + a monero_multm(mu_P, G_monero_vstate.c, s); - monero_addm(s, mu_P, a); + // s = a - c*(p*mu_P + mu_C*z) + monero_subm(s, a, mu_P); monero_io_insert(s, 32); From ddd939f6a9f88a85d44f62dca85d3956fcfbd89f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Mon, 24 Aug 2020 19:12:37 +0200 Subject: [PATCH 013/142] Add more comments --- src/monero_clsag.c | 53 +++++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/src/monero_clsag.c b/src/monero_clsag.c index 3b960ce..b912da9 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -26,11 +26,16 @@ /* --- --- */ /* ----------------------------------------------------------------------- */ /* - bool device_default::clsag_prepare(const rct::key &p, const rct::key &z, rct::key &I, rct::key - &D, const rct::key &H, rct::key &a, rct::key &aG, rct::key &aH) { rct::skpkGen(a,aG); // aG = a*G - rct::scalarmultKey(aH,H,a); // aH = a*H - rct::scalarmultKey(I,H,p); // I = p*H - rct::scalarmultKey(D,H,z); // D = z*H + bool device_default::clsag_prepare(const rct::key &p, + const rct::key &z, + rct::key &I, rct::key &D, + const rct::key &H, + rct::key &a, rct::key &aG, + rct::key &aH) { + rct::skpkGen(a, aG); // aG = a*G + rct::scalarmultKey(aH, H, a); // aH = a*H + rct::scalarmultKey(I, H, p); // I = p*H + rct::scalarmultKey(D, H, z); // D = z*H return true; } */ @@ -78,6 +83,13 @@ int monero_apdu_clsag_prepare() { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ +/* + bool device_default::clsag_hash(const rct::keyV &data, + rct::key &hash) { + hash = rct::hash_to_scalar(data); + return true; + } +*/ int monero_apdu_clsag_hash() { unsigned char msg[32]; unsigned char c[32]; @@ -104,12 +116,18 @@ int monero_apdu_clsag_hash() { /* --- --- */ /* ----------------------------------------------------------------------- */ /* - bool device_default::clsag_sign(const rct::key &c, const rct::key &a, const rct::key &p, const - rct::key &z, const rct::key &mu_P, const rct::key &mu_C, rct::key &s) { rct::key s0_p_mu_P; - sc_mul(s0_p_mu_P.bytes,mu_P.bytes,p.bytes); +bool device_default::clsag_sign(const rct::key &c, + const rct::key &a, + const rct::key &p, const + rct::key &z, + const rct::key &mu_P, + const rct::key &mu_C, + rct::key &s) { + rct::key s0_p_mu_P; + sc_mul(s0_p_mu_P.bytes, mu_P.bytes, p.bytes); rct::key s0_add_z_mu_C; - sc_muladd(s0_add_z_mu_C.bytes,mu_C.bytes,z.bytes,s0_p_mu_P.bytes); - sc_mulsub(s.bytes,c.bytes,s0_add_z_mu_C.bytes,a.bytes); + sc_muladd(s0_add_z_mu_C.bytes, mu_C.bytes, z.bytes, s0_p_mu_P.bytes); + sc_mulsub(s.bytes, c.bytes, s0_add_z_mu_C.bytes, a.bytes); return true; } @@ -151,14 +169,19 @@ int monero_apdu_clsag_sign() { monero_reduce(mu_C, mu_C); monero_reduce(G_monero_vstate.c, G_monero_vstate.c); - // s0_p_mu_P = mu_P*p ->s - monero_multm(s, p, mu_P); - + // s0_p_mu_P = mu_P*p // s0_add_z_mu_C = mu_C*z + s0_p_mu_P + // + // s = a - c*s0_add_z_mu_C + // = a - c*(mu_C*z + mu_P*p) + + // s = p*mu_P + monero_multm(s, p, mu_P); + // mu_P = mu_C*z monero_multm(mu_P, mu_C, z); + // s = p*mu_P + mu_C*z monero_addm(s, s, mu_P); - - // s = c*s0_add_z_mu_C + a + // mu_P = c * (p*mu_P + mu_C*z) monero_multm(mu_P, G_monero_vstate.c, s); // s = a - c*(p*mu_P + mu_C*z) monero_subm(s, a, mu_P); From a8f881e1ad93ab55f5338b21067fb1d5910f549f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Wed, 26 Aug 2020 20:13:47 +0200 Subject: [PATCH 014/142] Fix wrong call to ge_fromfe_frombytes(H, H) --- src/monero_clsag.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/monero_clsag.c b/src/monero_clsag.c index b912da9..baa0912 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -57,9 +57,6 @@ int monero_apdu_clsag_prepare() { monero_io_fetch(H, 32); monero_io_discard(1); - // H - monero_ge_fromfe_frombytes(H, H); - // a monero_rng_mod_order(a); monero_io_insert_encrypt(a, 32, TYPE_ALPHA); From 725b10a00a9918ccaad11548cc52eec99d963970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Tue, 1 Sep 2020 16:05:57 +0200 Subject: [PATCH 015/142] Fix check prefix hash with protocol v4 --- src/monero_prehash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 231ffcc..399cb48 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -191,7 +191,7 @@ int monero_apdu_mlsag_prehash_finalize() { monero_io_fetch(proof, 32); monero_io_discard(1); monero_keccak_init_H(); - if (G_monero_vstate.io_protocol_version == 3) { + if (G_monero_vstate.io_protocol_version >= 3) { if (os_memcmp(message, G_monero_vstate.prefixH, 32) != 0) { monero_lock_and_throw(SW_SECURITY_PREFIX_HASH); } From c1ec34dcba28c1e65636885df3ebb8c3cdc05200 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Tue, 1 Sep 2020 16:08:25 +0200 Subject: [PATCH 016/142] Update INS_GET_TX_PROOF to InProofv2 --- src/monero_proof.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/monero_proof.c b/src/monero_proof.c index 30eb028..c7edd1c 100644 --- a/src/monero_proof.c +++ b/src/monero_proof.c @@ -25,16 +25,6 @@ /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -/* - * pick random k - * if B: - * compute X = k*B - * else: - * compute X = k*G - * compute Y = k*A - * sig.c = Hs(Msg || D || X || Y) - * sig.r = k - sig.c*r - */ int monero_apdu_get_tx_proof() { unsigned char *msg; unsigned char *R; @@ -45,6 +35,7 @@ int monero_apdu_get_tx_proof() { unsigned char XY[32]; unsigned char sig_c[32]; unsigned char sig_r[32]; + unsigned char sep[32]; #define k (G_monero_vstate.tmp + 256) msg = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; @@ -61,23 +52,43 @@ int monero_apdu_get_tx_proof() { monero_io_discard(0); + // Generate random k monero_rng_mod_order(k); + // tmp = msg os_memmove(G_monero_vstate.tmp + 32 * 0, msg, 32); + // tmp = msg || D os_memmove(G_monero_vstate.tmp + 32 * 1, D, 32); if (G_monero_vstate.options & 1) { + // X = kB monero_ecmul_k(XY, B, k); } else { + // X = kG monero_ecmul_G(XY, k); } + // tmp = msg || D || X os_memmove(G_monero_vstate.tmp + 32 * 2, XY, 32); + // Y = kA monero_ecmul_k(XY, A, k); + // tmp = msg || D || X || Y os_memmove(G_monero_vstate.tmp + 32 * 3, XY, 32); + monero_keccak_H("TXPROOF_V2", 10, sep); + // tmp = msg || D || X || Y || sep + os_memmove(G_monero_vstate.tmp + 32 * 4, sep, 32); + // tmp = msg || D || X || Y || sep || R + os_memmove(G_monero_vstate.tmp + 32 * 5, R, 32); + // tmp = msg || D || X || Y || sep || R || A + os_memmove(G_monero_vstate.tmp + 32 * 6, A, 32); + // tmp = msg || D || X || Y || sep || R || B or [0] + os_memmove(G_monero_vstate.tmp + 32 * 7, B, 32); - monero_hash_to_scalar(sig_c, &G_monero_vstate.tmp[0], 32 * 4); + // sig_c = H_n(tmp) + monero_hash_to_scalar(sig_c, &G_monero_vstate.tmp[0], 32 * 8); + // sig_c*r monero_multm(XY, sig_c, r); + // sig_r = k - sig_c*r monero_subm(sig_r, k, XY); monero_io_insert(sig_c, 32); From 9e2f8eb8c884cff155e97f003e437604fd114c62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Wed, 2 Sep 2020 18:03:02 +0200 Subject: [PATCH 017/142] Add next minimum version for Monero client --- src/monero_init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monero_init.c b/src/monero_init.c index 45d643d..7208456 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -179,7 +179,7 @@ void monero_install(unsigned char netId) { /* ----------------------------------------------------------------------- */ #define MONERO_SUPPORTED_CLIENT_SIZE 1 const char* const monero_supported_client[MONERO_SUPPORTED_CLIENT_SIZE] = { - "0.16.0.", + "0.17.0.", }; int monero_apdu_reset() { From 6878abc9995b49ede07c829eeda175df8daf2f45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Wed, 2 Sep 2020 18:03:37 +0200 Subject: [PATCH 018/142] Update unit tests with new versions --- tests/monero_client/monero_types.py | 1 + tests/test_sig.py | 4 ++-- tests/test_version.py | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/monero_client/monero_types.py b/tests/monero_client/monero_types.py index 9a85be2..42697ec 100644 --- a/tests/monero_client/monero_types.py +++ b/tests/monero_client/monero_types.py @@ -66,6 +66,7 @@ class InsType(enum.IntEnum): INS_PREFIX_HASH = 0x7D INS_VALIDATE = 0x7C INS_MLSAG = 0x7E + INS_CLSAG = 0x7F INS_CLOSE_TX = 0x80 INS_GET_TX_PROOF = 0xA0 diff --git a/tests/test_sig.py b/tests/test_sig.py index 0e2178d..1645774 100644 --- a/tests/test_sig.py +++ b/tests/test_sig.py @@ -48,9 +48,9 @@ def state(): @staticmethod def test_set_sig(monero): major, minor, patch = monero.reset_and_get_version( - monero_client_version=b"0.16.0.0" + monero_client_version=b"0.17.0.0" ) # type: int, int, int - assert (major, minor, patch) == (1, 6, 0) # version of the Monero app + assert (major, minor, patch) == (1, 7, 0) # version of the Monero app sig_mode: SigType = monero.set_signature_mode(sig_type=SigType.REAL) assert sig_mode == SigType.REAL diff --git a/tests/test_version.py b/tests/test_version.py index 4eeb9cf..e05a2d7 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -6,10 +6,10 @@ def test_version(monero): major, minor, patch = monero.reset_and_get_version( - monero_client_version=b"0.16.0.0" + monero_client_version=b"0.17.0.0" ) # type: int, int, int - assert (major, minor, patch) == (1, 6, 0) # version of the Monero app + assert (major, minor, patch) == (1, 7, 0) # version of the Monero app @pytest.mark.xfail(raises=ClientNotSupported) From c6084303138ab0141a9aa8ff4f208b777d2db8e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Wed, 23 Sep 2020 19:14:14 +0200 Subject: [PATCH 019/142] Fix wrong type parameter, need to be cast --- src/monero_proof.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monero_proof.c b/src/monero_proof.c index c7edd1c..9708e47 100644 --- a/src/monero_proof.c +++ b/src/monero_proof.c @@ -73,7 +73,7 @@ int monero_apdu_get_tx_proof() { monero_ecmul_k(XY, A, k); // tmp = msg || D || X || Y os_memmove(G_monero_vstate.tmp + 32 * 3, XY, 32); - monero_keccak_H("TXPROOF_V2", 10, sep); + monero_keccak_H((unsigned char *)"TXPROOF_V2", 10, sep); // tmp = msg || D || X || Y || sep os_memmove(G_monero_vstate.tmp + 32 * 4, sep, 32); // tmp = msg || D || X || Y || sep || R From c3bbd7764e9f21696a963bcc2c3eb0b0d66a9d24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Thu, 24 Sep 2020 18:54:26 +0200 Subject: [PATCH 020/142] Fix wrong first 32 bytes input in clsag_hash() Assumption was right for MLSAG in mlsag_hash() but not in CLSAG. --- src/monero_clsag.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/monero_clsag.c b/src/monero_clsag.c index baa0912..4db70df 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -93,10 +93,9 @@ int monero_apdu_clsag_hash() { if (G_monero_vstate.io_p2 == 1) { monero_keccak_init_H(); - os_memmove(msg, G_monero_vstate.mlsagH, 32); - } else { - monero_io_fetch(msg, 32); } + + monero_io_fetch(msg, 32); monero_io_discard(1); monero_keccak_update_H(msg, 32); From a7ffd0cf73910e3ad38da213e9a6564e85eae3d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Thu, 24 Sep 2020 19:11:57 +0200 Subject: [PATCH 021/142] Update CHANGELOG --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eb171d..9a16def 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ All notable changes to this project will be documented in this file. +## 1.7.1 - 2020-09-24 + +- Fix `clsag_hash()` behavior which is different than MLSAG + +## 1.7.0 - 2020-09-13 + +- Update to protocol v4 to support both MLSAG and CLSAG +- Add CLSAG signature algorithm with `INS_CLSAG` +- Update InProofv1 to InProofv2 ## 1.6.0 - 2020-06-04 From 7f6524834ef620d8b300168e5807d01889c30f84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Thu, 24 Sep 2020 19:24:58 +0200 Subject: [PATCH 022/142] Bump version to 1.7.1 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a2c99ce..16239cd 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ endif APPVERSION_M=1 APPVERSION_N=7 -APPVERSION_P=0 +APPVERSION_P=1 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) SPECVERSION="1.0" From 6a0e31ce23eb8b63ba90b6b0b69f2d08db978924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Thu, 24 Sep 2020 19:32:10 +0200 Subject: [PATCH 023/142] Fix unit tests to only check major and minor version --- tests/test_sig.py | 2 +- tests/test_version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_sig.py b/tests/test_sig.py index 1645774..0313da9 100644 --- a/tests/test_sig.py +++ b/tests/test_sig.py @@ -50,7 +50,7 @@ def test_set_sig(monero): major, minor, patch = monero.reset_and_get_version( monero_client_version=b"0.17.0.0" ) # type: int, int, int - assert (major, minor, patch) == (1, 7, 0) # version of the Monero app + assert (major, minor) == (1, 7) # version of the Monero app sig_mode: SigType = monero.set_signature_mode(sig_type=SigType.REAL) assert sig_mode == SigType.REAL diff --git a/tests/test_version.py b/tests/test_version.py index e05a2d7..c6b98c9 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -9,7 +9,7 @@ def test_version(monero): monero_client_version=b"0.17.0.0" ) # type: int, int, int - assert (major, minor, patch) == (1, 7, 0) # version of the Monero app + assert (major, minor) == (1, 7) # version of the Monero app @pytest.mark.xfail(raises=ClientNotSupported) From 788e0c7f5818b5258ed219f354abae321528e156 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Fri, 2 Oct 2020 11:46:12 +0200 Subject: [PATCH 024/142] Fix mlsag_prehash() do not output hash without DEBUG_HWDEVICE --- src/monero_prehash.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 399cb48..7e3cb96 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -172,10 +172,6 @@ int monero_apdu_mlsag_prehash_finalize() { monero_io_discard(1); monero_keccak_update_H(H, 32); monero_sha256_commitment_update(H, 32); -#ifdef DEBUG_HWDEVICE - monero_io_insert(H, 32); -#endif - } else { // Finalize and check commitment hash control if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { @@ -200,10 +196,8 @@ int monero_apdu_mlsag_prehash_finalize() { monero_keccak_update_H(H, 32); monero_keccak_update_H(proof, 32); monero_keccak_final_H(G_monero_vstate.mlsagH); -#ifdef DEBUG_HWDEVICE + monero_io_insert(G_monero_vstate.mlsagH, 32); - monero_io_insert(H, 32); -#endif } return SW_OK; From d6765d696463c61fed9b417b2252e7c26d98da7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Fri, 2 Oct 2020 11:52:15 +0200 Subject: [PATCH 025/142] Bump version to 1.7.2 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 16239cd..6059616 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ endif APPVERSION_M=1 APPVERSION_N=7 -APPVERSION_P=1 +APPVERSION_P=2 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) SPECVERSION="1.0" From 9553396410d1d41dfe334125bff0f06b30fa66ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Tue, 6 Oct 2020 15:11:43 +0200 Subject: [PATCH 026/142] Fix bad display of base58 address --- src/monero_monero.c | 8 ++++++++ src/monero_ux_nano.c | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/monero_monero.c b/src/monero_monero.c index 1f753bd..61011af 100644 --- a/src/monero_monero.c +++ b/src/monero_monero.c @@ -64,6 +64,8 @@ const unsigned int encoded_block_sizes[] = {0, 2, 3, 5, 6, 7, 9, 10, 11}; #define FULL_BLOCK_SIZE 8 //(sizeof(encoded_block_sizes) / sizeof(encoded_block_sizes[0]) - 1) #define FULL_ENCODED_BLOCK_SIZE 11 // encoded_block_sizes[full_block_size]; #define ADDR_CHECKSUM_SIZE 4 +#define ADDR_LEN 95 +#define INTEGRATED_ADDR_LEN 106 static uint64_t uint_8be_to_64(const unsigned char* data, size_t size) { uint64_t res = 0; @@ -170,5 +172,11 @@ int monero_base58_public_key(char* str_b58, unsigned char* view, unsigned char* &str_b58[full_block_count * FULL_ENCODED_BLOCK_SIZE]); } + if (paymanetID) { + str_b58[INTEGRATED_ADDR_LEN] = '\0'; + } else { + str_b58[ADDR_LEN] = '\0'; + } + return 0; } diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 8d3d7b6..1f78dbd 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -621,8 +621,8 @@ void ui_menu_any_pubaddr_display(unsigned int value, unsigned char* pub_view, break; } - monero_base58_public_key(G_monero_vstate.ux_address + strlen(G_monero_vstate.ux_address), - pub_view, pub_spend, is_subbadress, paymanetID); + monero_base58_public_key(G_monero_vstate.ux_address, pub_view, pub_spend, is_subbadress, + paymanetID); ux_layout_bnnn_paging_reset(); ux_flow_init(0, ux_flow_pubaddr, NULL); } From 7261848bde827578dc6360711655459b403efaa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Tue, 6 Oct 2020 18:04:05 +0200 Subject: [PATCH 027/142] Bump version to 1.7.3 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6059616..470b74f 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ endif APPVERSION_M=1 APPVERSION_N=7 -APPVERSION_P=2 +APPVERSION_P=3 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) SPECVERSION="1.0" From 6ce4d0d43a432b2dac870ebc58a6835552cf78dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Tue, 13 Oct 2020 16:07:07 +0200 Subject: [PATCH 028/142] Support of Monero client 0.17.1.* --- src/monero_init.c | 6 ++---- tests/test_version.py | 7 +++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/monero_init.c b/src/monero_init.c index 7208456..d7975e4 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -177,10 +177,8 @@ void monero_install(unsigned char netId) { /* ----------------------------------------------------------------------- */ /* --- Reset --- */ /* ----------------------------------------------------------------------- */ -#define MONERO_SUPPORTED_CLIENT_SIZE 1 -const char* const monero_supported_client[MONERO_SUPPORTED_CLIENT_SIZE] = { - "0.17.0.", -}; +#define MONERO_SUPPORTED_CLIENT_SIZE 2 +const char* const monero_supported_client[MONERO_SUPPORTED_CLIENT_SIZE] = {"0.17.0.", "0.17.1."}; int monero_apdu_reset() { unsigned int client_version_len; diff --git a/tests/test_version.py b/tests/test_version.py index c6b98c9..d34be04 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -11,6 +11,13 @@ def test_version(monero): assert (major, minor) == (1, 7) # version of the Monero app + # another compatible version of the Monero client + major, minor, patch = monero.reset_and_get_version( + monero_client_version=b"0.17.1.0" + ) # type: int, int, int + + assert (major, minor) == (1, 7) # version of the Monero app + @pytest.mark.xfail(raises=ClientNotSupported) def test_old_client_version(monero): From b7a2108e3682814ad06bf7eed8fd5149abb1e845 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Tue, 13 Oct 2020 16:19:32 +0200 Subject: [PATCH 029/142] Update CHANGELOG --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a16def..e4cf660 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,20 @@ All notable changes to this project will be documented in this file. + +## 1.7.4 - 2020-10-13 + +- Support of Monero client version `0.17.1.*` + +## 1.7.3 - 2020-10-06 + +- Fix garbage when displaying destination address on Nano + +## 1.7.2 - 2020-10-02 + +- Fix behavior without `DEBUG_HWDEVICE` flag + + ## 1.7.1 - 2020-09-24 - Fix `clsag_hash()` behavior which is different than MLSAG From d9b11ff5adb19f8244cdae8fb1dec100414cb370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Tue, 13 Oct 2020 16:19:45 +0200 Subject: [PATCH 030/142] Bump version to 1.7.4 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 470b74f..c33c025 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ endif APPVERSION_M=1 APPVERSION_N=7 -APPVERSION_P=3 +APPVERSION_P=4 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) SPECVERSION="1.0" From 2129576169d39774c205a529b288e9e7f7d09c4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Mon, 16 Nov 2020 17:14:16 +0100 Subject: [PATCH 031/142] Add support of new CX API --- CHANGELOG.md | 3 +++ src/monero_types.h | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4cf660..9557ef2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ All notable changes to this project will be documented in this file. +## 1.7.5 - 2020-11-16 + +- Support of firmware 1.2.4-5 ## 1.7.4 - 2020-10-13 diff --git a/src/monero_types.h b/src/monero_types.h index 4e46a8a..8050f0e 100644 --- a/src/monero_types.h +++ b/src/monero_types.h @@ -23,7 +23,7 @@ #if CX_APILEVEL == 8 #define PIN_VERIFIED (!0) -#elif CX_APILEVEL == 9 || CX_APILEVEL == 10 +#elif CX_APILEVEL >= 9 #define PIN_VERIFIED BOLOS_UX_OK #else From 05c9cd52347f1b24fa20a0e877bc770d589150b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Colas?= Date: Mon, 16 Nov 2020 17:14:52 +0100 Subject: [PATCH 032/142] Bump version to 1.7.5 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c33c025..f824a8e 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ endif APPVERSION_M=1 APPVERSION_N=7 -APPVERSION_P=4 +APPVERSION_P=5 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) SPECVERSION="1.0" From 4976be0aad7baeffcabb5050f3bb910921aaf372 Mon Sep 17 00:00:00 2001 From: Salvatore Ingala <6681844+bigspider@users.noreply.github.com> Date: Tue, 30 Mar 2021 15:37:05 +0200 Subject: [PATCH 033/142] Support of Monero client 0.17.2.* --- src/monero_init.c | 5 +++-- tests/test_version.py | 7 +++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/monero_init.c b/src/monero_init.c index d7975e4..1ce042f 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -177,8 +177,9 @@ void monero_install(unsigned char netId) { /* ----------------------------------------------------------------------- */ /* --- Reset --- */ /* ----------------------------------------------------------------------- */ -#define MONERO_SUPPORTED_CLIENT_SIZE 2 -const char* const monero_supported_client[MONERO_SUPPORTED_CLIENT_SIZE] = {"0.17.0.", "0.17.1."}; +#define MONERO_SUPPORTED_CLIENT_SIZE 3 +const char* const monero_supported_client[MONERO_SUPPORTED_CLIENT_SIZE] = {"0.17.0.", "0.17.1.", + "0.17.2."}; int monero_apdu_reset() { unsigned int client_version_len; diff --git a/tests/test_version.py b/tests/test_version.py index d34be04..8d592ba 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -18,6 +18,13 @@ def test_version(monero): assert (major, minor) == (1, 7) # version of the Monero app + # another compatible version of the Monero client + major, minor, patch = monero.reset_and_get_version( + monero_client_version=b"0.17.2.0" + ) # type: int, int, int + + assert (major, minor) == (1, 7) # version of the Monero app + @pytest.mark.xfail(raises=ClientNotSupported) def test_old_client_version(monero): From 11df3740d143cb629de087c9fb0a9ff74bf307b6 Mon Sep 17 00:00:00 2001 From: Salvatore Ingala <6681844+bigspider@users.noreply.github.com> Date: Tue, 30 Mar 2021 15:37:56 +0200 Subject: [PATCH 034/142] Bump version to 1.7.6 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f824a8e..a7069e7 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ endif APPVERSION_M=1 APPVERSION_N=7 -APPVERSION_P=5 +APPVERSION_P=6 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) SPECVERSION="1.0" From 77b75b2fb572e02b9f2903c05ff033a05a67c19f Mon Sep 17 00:00:00 2001 From: Salvatore Ingala <6681844+bigspider@users.noreply.github.com> Date: Tue, 30 Mar 2021 22:39:45 +0200 Subject: [PATCH 035/142] Update CHANGELOG.md --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9557ef2..e7aaa17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to this project will be documented in this file. +## 1.7.6 - 2021-03-30 + +- Support of Monero client version `0.17.2.*` + ## 1.7.5 - 2020-11-16 - Support of firmware 1.2.4-5 From 9502b22f50e6db38d23bf536ca21a032b45e5cef Mon Sep 17 00:00:00 2001 From: Jonathan Cross Date: Mon, 26 Apr 2021 23:20:27 +0200 Subject: [PATCH 036/142] Fixing string typos like 'Amout'. --- src/monero_ux_nano.c | 8 ++++---- src/monero_ux_nanos.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 1f78dbd..efb1194 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -148,7 +148,7 @@ unsigned int ui_menu_opentx_action(unsigned int value) { } else { monero_abort_tx(0); sw = SW_DENY; - ui_menu_info_display2(0, "Tansaction", "aborted"); + ui_menu_info_display2(0, "Transaction", "aborted"); } monero_io_insert_u16(sw); monero_io_do(IO_RETURN_AFTER_TX); @@ -249,7 +249,7 @@ void ui_menu_timelock_validation_display(unsigned int value) { /* ----------------------------- USER DEST/AMOUNT VALIDATION ----------------------------- */ void ui_menu_validation_action(unsigned int value); -UX_STEP_NOCB(ux_menu_validation_1_step, bn, {"Amout", G_monero_vstate.ux_amount}); +UX_STEP_NOCB(ux_menu_validation_1_step, bn, {"Amount", G_monero_vstate.ux_amount}); UX_STEP_NOCB(ux_menu_validation_2_step, #ifdef UI_NANO_X @@ -360,14 +360,14 @@ void settings_change_account(void) { ui_menu_account_display(0); } const char* const network_submenu_getter_values[] = { #ifdef MONERO_ALPHA - "Unvailable", + "Unavailable", #else "Main Network", #endif "Stage Network", "Test Network", "Abort"}; const char* const network_submenu_getter_values_selected[] = { #ifdef MONERO_ALPHA - "Unvailable", + "Unavailable", #else "Main Network +", #endif diff --git a/src/monero_ux_nanos.c b/src/monero_ux_nanos.c index ea3777d..01665fa 100644 --- a/src/monero_ux_nanos.c +++ b/src/monero_ux_nanos.c @@ -206,7 +206,7 @@ unsigned int ui_menu_opentx_button(unsigned int button_mask, unsigned int button if (sw == SW_OK) { ui_menu_info_display2(0, "Processing TX", "..."); } else { - ui_menu_info_display2(0, "Tansaction", "aborted"); + ui_menu_info_display2(0, "Transaction", "aborted"); } return 0; } From f756b2091d0c423e0fef3e2bf0a9234fa5978cb7 Mon Sep 17 00:00:00 2001 From: Edouard Merle Date: Tue, 1 Sep 2020 13:53:22 +0200 Subject: [PATCH 037/142] add cx and ux missing includes --- src/monero_monero.c | 1 + src/monero_vars.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/monero_monero.c b/src/monero_monero.c index 61011af..783f21b 100644 --- a/src/monero_monero.c +++ b/src/monero_monero.c @@ -17,6 +17,7 @@ *****************************************************************************/ #include "os.h" +#include "cx.h" #include "monero_types.h" #include "monero_api.h" #include "monero_vars.h" diff --git a/src/monero_vars.h b/src/monero_vars.h index 6d047f0..4b70388 100644 --- a/src/monero_vars.h +++ b/src/monero_vars.h @@ -21,6 +21,7 @@ #include "os.h" #include "cx.h" +#include "ux.h" #include "os_io_seproxyhal.h" #include "monero_types.h" #include "monero_api.h" From f4a7e3596a9eef32e4cdadcdc7b1f1527942e1ca Mon Sep 17 00:00:00 2001 From: Edouard Merle Date: Mon, 30 Nov 2020 09:33:19 +0100 Subject: [PATCH 038/142] CX_APILEVEL >= 9 compatibility --- src/monero_types.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/monero_types.h b/src/monero_types.h index 8050f0e..febb84f 100644 --- a/src/monero_types.h +++ b/src/monero_types.h @@ -24,7 +24,6 @@ #if CX_APILEVEL == 8 #define PIN_VERIFIED (!0) #elif CX_APILEVEL >= 9 - #define PIN_VERIFIED BOLOS_UX_OK #else #error CX_APILEVEL not supported From cab07948de2ed64b5bff868da07d317356b639a8 Mon Sep 17 00:00:00 2001 From: Edouard Merle Date: Fri, 26 Feb 2021 10:58:23 +0100 Subject: [PATCH 039/142] remove useless algo assignment --- Makefile | 1 - src/monero_crypto.c | 1 - 2 files changed, 2 deletions(-) diff --git a/Makefile b/Makefile index a7069e7..7745499 100644 --- a/Makefile +++ b/Makefile @@ -159,7 +159,6 @@ CFLAGS += -O3 -Os AS := $(GCCPATH)arm-none-eabi-gcc LD := $(GCCPATH)arm-none-eabi-gcc -#SCRIPT_LD:=script.ld #LDFLAGS += -O0 -gdwarf-2 -gstrict-dwarf LDFLAGS += -O3 -Os diff --git a/src/monero_crypto.c b/src/monero_crypto.c index c1397fd..8776fed 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -158,7 +158,6 @@ int monero_hash_final(cx_hash_t *hasher, unsigned char *out) { /* ----------------------------------------------------------------------- */ int monero_hash(unsigned int algo, cx_hash_t *hasher, unsigned char *buf, unsigned int len, unsigned char *out) { - hasher->algo = algo; if (algo == CX_SHA256) { cx_sha256_init((cx_sha256_t *)hasher); } else { From add4170d04f990280624f8130008fc958ffd8b85 Mon Sep 17 00:00:00 2001 From: Salvatore Ingala <6681844+bigspider@users.noreply.github.com> Date: Tue, 1 Jun 2021 10:26:44 +0200 Subject: [PATCH 040/142] Bump version to 1.7.7 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a7069e7..3a9af8d 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ endif APPVERSION_M=1 APPVERSION_N=7 -APPVERSION_P=6 +APPVERSION_P=7 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) SPECVERSION="1.0" From 8ac57d5853960c312a3d3ae9b266769b439486c8 Mon Sep 17 00:00:00 2001 From: Edouard Merle Date: Wed, 30 Jun 2021 15:27:22 +0200 Subject: [PATCH 041/142] remove unused ble include --- src/monero_main.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/monero_main.c b/src/monero_main.c index d94ac5e..9360f7e 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -31,9 +31,6 @@ #ifdef HAVE_UX_FLOW #include "ux.h" #endif -#ifdef TARGET_NANOX -#include "balenos_ble.h" -#endif /* ----------------------------------------------------------------------- */ /* --- Application Entry --- */ From cd666d6140685aebb75a6b92c196c98b97f754a8 Mon Sep 17 00:00:00 2001 From: TamtamHero <10632523+TamtamHero@users.noreply.github.com> Date: Tue, 13 Jul 2021 15:19:38 +0200 Subject: [PATCH 042/142] Update CI docker image --- .github/workflows/ci-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index 5300341..e537f8a 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest container: - image: docker://ledgerhq/ledger-app-builder:1.6.0 + image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest steps: - name: Clone From ed0113bd3d379cfb4cbed97266f66de343aaea93 Mon Sep 17 00:00:00 2001 From: TamtamHero <10632523+TamtamHero@users.noreply.github.com> Date: Tue, 13 Jul 2021 18:51:25 +0200 Subject: [PATCH 043/142] Update Speculos image --- .github/workflows/ci-workflow.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index e537f8a..e369dfd 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -38,7 +38,7 @@ jobs: runs-on: ubuntu-latest container: - image: docker://ledgerhq/speculos:latest + image: ghcr.io/ledgerhq/speculos:latest ports: - 1234:1234 - 9999:9999 @@ -60,7 +60,7 @@ jobs: - name: Run test run: | - nohup bash -c "python /speculos/speculos.py bin/app.elf --sdk 1.6 --seed \"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about\" --apdu-port 9999 --button-port 42000 --automation-port 43000 --display headless" > speculos.log 2<&1 & + nohup bash -c "python /speculos/speculos.py bin/app.elf --seed \"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about\" --apdu-port 9999 --button-port 42000 --automation-port 43000 --display headless" > speculos.log 2<&1 & pip install pytest pytest From f2e7fe015f8fbebae02bb1c49fde92a8d6c9b21e Mon Sep 17 00:00:00 2001 From: selsta Date: Thu, 28 Oct 2021 20:48:23 +0200 Subject: [PATCH 044/142] monero client 0.17.3.* support --- src/monero_init.c | 6 +++--- tests/test_version.py | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/monero_init.c b/src/monero_init.c index 1ce042f..ad637f3 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -177,9 +177,9 @@ void monero_install(unsigned char netId) { /* ----------------------------------------------------------------------- */ /* --- Reset --- */ /* ----------------------------------------------------------------------- */ -#define MONERO_SUPPORTED_CLIENT_SIZE 3 -const char* const monero_supported_client[MONERO_SUPPORTED_CLIENT_SIZE] = {"0.17.0.", "0.17.1.", - "0.17.2."}; +const char* const monero_supported_client[] = {"0.17.0.", "0.17.1.", "0.17.2.", "0.17.3."}; +#define MONERO_SUPPORTED_CLIENT_SIZE \ + (sizeof(monero_supported_client) / sizeof(monero_supported_client[0])) int monero_apdu_reset() { unsigned int client_version_len; diff --git a/tests/test_version.py b/tests/test_version.py index 8d592ba..0f921c1 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -25,6 +25,12 @@ def test_version(monero): assert (major, minor) == (1, 7) # version of the Monero app + # another compatible version of the Monero client + major, minor, patch = monero.reset_and_get_version( + monero_client_version=b"0.17.3.0" + ) # type: int, int, int + + assert (major, minor) == (1, 7) # version of the Monero app @pytest.mark.xfail(raises=ClientNotSupported) def test_old_client_version(monero): From 48da5fda65d55f0e19aa89ace02058eadcf4e987 Mon Sep 17 00:00:00 2001 From: TamtamHero <10632523+TamtamHero@users.noreply.github.com> Date: Thu, 18 Nov 2021 11:37:52 +0100 Subject: [PATCH 045/142] Bump version 1.7.8 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2e223e6..4b5b869 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ endif APPVERSION_M=1 APPVERSION_N=7 -APPVERSION_P=7 +APPVERSION_P=8 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) SPECVERSION="1.0" From 440ed2567a781c01963fd0ed683d0630eead1c8f Mon Sep 17 00:00:00 2001 From: Edouard Merle Date: Fri, 4 Feb 2022 10:25:23 +0100 Subject: [PATCH 046/142] fix: build for lns+ --- Makefile | 32 ++++++++++++++++---------------- src/monero_nvram.c | 2 +- src/monero_vars.h | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 4b5b869..2e46d19 100644 --- a/Makefile +++ b/Makefile @@ -29,10 +29,10 @@ APPNAME = "Monero" ifeq ($(TARGET_NAME),TARGET_BLUE) ICONNAME = images/icon_monero_blue.gif -else ifeq ($(TARGET_NAME),TARGET_NANOX) -ICONNAME = images/icon_monero_nanox.gif -else +else ifeq ($(TARGET_NAME),TARGET_NANOS) ICONNAME = images/icon_monero.gif +else +ICONNAME = images/icon_monero_nanox.gif endif #DEFINES += MONERO_ALPHA @@ -51,13 +51,13 @@ DEFINES += MONERO_VERSION=$(APPVERSION) DEFINES += MONERO_NAME=$(APPNAME) DEFINES += SPEC_VERSION=$(SPECVERSION) -ifeq ($(TARGET_NAME),TARGET_NANOX) -DEFINES += UI_NANO_X -TARGET_UI := FLOW +ifeq ($(TARGET_NAME),TARGET_NANOS) +DEFINES += UI_NANO_S else ifeq ($(TARGET_NAME),TARGET_BLUE) DEFINES += UI_BLUE else -DEFINES += UI_NANO_S +DEFINES += UI_NANO_X +TARGET_UI := FLOW endif #DEFINES += IOCRYPT @@ -90,9 +90,13 @@ DEFINES += UNUSED\(x\)=\(void\)x DEFINES += APPVERSION=\"$(APPVERSION)\" ifeq ($(TARGET_NAME),TARGET_NANOX) -# DEFINES += HAVE_BLE BLE_COMMAND_TIMEOUT_MS=2000 -# DEFINES += HAVE_BLE_APDU # basic ledger apdu transport over BLE +DEFINES += HAVE_BLE BLE_COMMAND_TIMEOUT_MS=2000 +DEFINES += HAVE_BLE_APDU # basic ledger apdu transport over BLE +endif +ifeq ($(TARGET_NAME),TARGET_NANOS) +DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=128 +else DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300 DEFINES += HAVE_GLO096 DEFINES += HAVE_BAGL BAGL_WIDTH=128 BAGL_HEIGHT=64 @@ -100,10 +104,6 @@ DEFINES += HAVE_BAGL_ELLIPSIS # long label truncation feature DEFINES += HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX DEFINES += HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX DEFINES += HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX -DEFINES += HAVE_BLE BLE_COMMAND_TIMEOUT_MS=2000 -DEFINES += HAVE_BLE_APDU # basic ledger apdu transport over BLE -else -DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=128 endif ifeq ($(TARGET_UI),FLOW) @@ -114,10 +114,10 @@ endif DEBUG = 0 ifneq ($(DEBUG),0) - ifeq ($(TARGET_NAME),TARGET_NANOX) - DEFINES += HAVE_PRINTF PRINTF=mcu_usb_printf - else + ifeq ($(TARGET_NAME),TARGET_NANOS) DEFINES += HAVE_PRINTF PRINTF=screen_printf + else + DEFINES += HAVE_PRINTF PRINTF=mcu_usb_printf endif DEFINES += PLINE="PRINTF(\"FILE:%s..LINE:%d\n\",__FILE__,__LINE__)" # Debug options diff --git a/src/monero_nvram.c b/src/monero_nvram.c index c13a4b5..9184982 100644 --- a/src/monero_nvram.c +++ b/src/monero_nvram.c @@ -22,7 +22,7 @@ #include "monero_api.h" #include "monero_vars.h" -#ifdef TARGET_NANOX +#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) const monero_nv_state_t N_state_pic; #else monero_nv_state_t N_state_pic; diff --git a/src/monero_vars.h b/src/monero_vars.h index 4b70388..741e464 100644 --- a/src/monero_vars.h +++ b/src/monero_vars.h @@ -28,7 +28,7 @@ extern monero_v_state_t G_monero_vstate; -#ifdef TARGET_NANOX +#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) extern const monero_nv_state_t N_state_pic; #define N_monero_pstate ((volatile monero_nv_state_t *)PIC(&N_state_pic)) #else From c1a6eb8bbbc1cc7974ce0938e9d8f920d0ad3ae9 Mon Sep 17 00:00:00 2001 From: j-berman Date: Tue, 21 Jun 2022 17:48:30 +0100 Subject: [PATCH 047/142] support for hf 15 (view tags) --- doc/developer/blue-app-commands.rst | 51 +++++++++++++++++++++++++++++ src/monero_api.h | 3 ++ src/monero_crypto.c | 16 +++++++++ src/monero_dispatch.c | 4 +++ src/monero_key.c | 34 ++++++++++++++++++- src/monero_types.h | 1 + tests/monero_client/monero_types.py | 1 + tests/test_crypto.py | 12 +++++++ 8 files changed, 121 insertions(+), 1 deletion(-) diff --git a/doc/developer/blue-app-commands.rst b/doc/developer/blue-app-commands.rst index fde67f2..ee6fd81 100644 --- a/doc/developer/blue-app-commands.rst +++ b/doc/developer/blue-app-commands.rst @@ -104,6 +104,8 @@ .. |eDRVout| replace:: :math:`\widetilde{\mathfrak{D}_\mathrm{out}}` .. |AKout| replace:: :math:`\mathcal{AK}_\mathrm{amount}` .. |eAKout| replace:: :math:`\widetilde{\mathcal{AK}_\mathrm{amount}}` +.. |vtf| replace:: :math:`\mathit{view_tag_full}` +.. |vt| replace:: :math:`\mathit{view_tag}` .. |ctH| replace:: :math:`\mathcal{H}_\mathrm{commitment}` @@ -198,6 +200,7 @@ To summarize, the signature process is: - compute the range proof - blind the amount + - compute the view tag . Compute the final confidential ring signature @@ -1142,6 +1145,54 @@ return |Img|. +--------+-----------------------------------------------------------------+ +Derive View Tag +~~~~~~~~~~~~~~~~~~ + +**Monero** + +crypto::derive_view_tag. + +**Description** + +Derive the view tag of an output. + + | compute |Drv| = |dec|[|spk|](|eDrv|) + | compute |vtf| = |Hs|("view_tag" \|, |Drv|, |idx|) + | compute |vt| = |vtf|[0:1] + +return |vt|. + +**Command** + ++-----+-----+-----+-----+----------+ +| CLA | INS | P1 | P2 | LC | ++=====+=====+=====+=====+==========+ +| 03 | 3B | 00 | 00 | 25 or 45 | ++-----+-----+-----+-----+----------+ + +**Command data** + ++--------+-----------------------------------------------------------------+ +| Length | Value | ++========+=================================================================+ +| 01 | 00 | ++--------+-----------------------------------------------------------------+ +| 20 | encrypted key derivation |eDrv| | ++--------+-----------------------------------------------------------------+ +| 20 | ephemeral hmac (optional, only during active transaction) | ++--------+-----------------------------------------------------------------+ +| 04 | index | ++--------+-----------------------------------------------------------------+ + +**Response data** + ++--------+-----------------------------------------------------------------+ +| Length | Value | ++========+=================================================================+ +| 01 | view tag |vt| | ++--------+-----------------------------------------------------------------+ + + Generate Keypair ~~~~~~~~~~~~~~~~ diff --git a/src/monero_api.h b/src/monero_api.h index e37a785..5247d7d 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -47,6 +47,7 @@ int monero_apdu_derivation_to_scalar(void); int monero_apdu_derive_public_key(void); int monero_apdu_derive_secret_key(void); int monero_apdu_generate_key_image(void); +int monero_apdu_derive_view_tag(void); int monero_apdu_derive_subaddress_public_key(void); int monero_apdu_get_subaddress(void); int monero_apdu_get_subaddress_spend_public_key(void); @@ -169,6 +170,8 @@ void monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigne unsigned char *ec_pub); void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv); void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x); +void monero_derive_view_tag(unsigned char *view_tag, unsigned char *drv_data, + unsigned int out_idx); void monero_derive_subaddress_public_key(unsigned char *x, unsigned char *pub, unsigned char *drv_data, unsigned int index); diff --git a/src/monero_crypto.c b/src/monero_crypto.c index 8776fed..df01036 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -519,6 +519,22 @@ void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned ch monero_ecmul_k(img, I, x); } +/* ----------------------------------------------------------------------- */ +/* --- --- */ +/* ----------------------------------------------------------------------- */ +void monero_derive_view_tag(unsigned char *view_tag, unsigned char *drv_data, + unsigned int out_idx) { + unsigned char varint[8 + 32 + 8]; + unsigned int len_varint; + + os_memmove(varint, "view_tag", 8); + os_memmove(varint + 8, drv_data, 32); + len_varint = monero_encode_varint(varint + 8 + 32, 8, out_idx); + len_varint += 8 + 32; + monero_keccak_F(varint, len_varint, varint); + os_memmove(view_tag, varint, 1); +} + /* ======================================================================= */ /* SUB ADDRESS */ /* ======================================================================= */ diff --git a/src/monero_dispatch.c b/src/monero_dispatch.c index 839e57f..b11ff4e 100644 --- a/src/monero_dispatch.c +++ b/src/monero_dispatch.c @@ -84,6 +84,7 @@ int check_ins_access() { case INS_DERIVE_PUBLIC_KEY: case INS_DERIVE_SECRET_KEY: case INS_GEN_KEY_IMAGE: + case INS_DERIVE_VIEW_TAG: case INS_SECRET_KEY_TO_PUBLIC_KEY: case INS_SECRET_KEY_ADD: case INS_GENERATE_KEYPAIR: @@ -188,6 +189,9 @@ int monero_dispatch() { case INS_GEN_KEY_IMAGE: sw = monero_apdu_generate_key_image(); break; + case INS_DERIVE_VIEW_TAG: + sw = monero_apdu_derive_view_tag(); + break; case INS_SECRET_KEY_ADD: sw = monero_apdu_sc_add(); break; diff --git a/src/monero_key.c b/src/monero_key.c index f80a4d5..0f552db 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -604,6 +604,27 @@ int monero_apdu_generate_key_image( return SW_OK; } +/* ----------------------------------------------------------------------- */ +/* --- --- */ +/* ----------------------------------------------------------------------- */ +int monero_apdu_derive_view_tag( + /*const crypto::key_derivation &derivation, const size_t output_index, crypto::view_tag &view_tag*/) { + unsigned char derivation[32]; + unsigned int output_index; + unsigned char res[1]; + + // fetch + monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + output_index = monero_io_fetch_u32(); + monero_io_discard(0); + + // derive and keep + monero_derive_view_tag(res, derivation, output_index); + + monero_io_insert(res, 1); + return SW_OK; +} + /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ @@ -692,7 +713,7 @@ int monero_apdu_get_subaddress_secret_key(/*const crypto::secret_key& sec, const /* --- --- */ /* ----------------------------------------------------------------------- */ -int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_sec, crypto::public_key Aout, crypto::public_key Bout, size_t output_index, bool is_change, bool is_subaddress, bool need_additional_key*/) { +int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_sec, crypto::public_key Aout, crypto::public_key Bout, size_t output_index, bool is_change, bool is_subaddress, bool need_additional_key, bool use_view_tags*/) { // IN unsigned int tx_version; unsigned char tx_key[32]; @@ -704,10 +725,12 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se unsigned char is_subaddress; unsigned char need_additional_txkeys; unsigned char additional_txkey_sec[32]; + unsigned char use_view_tags; // OUT unsigned char additional_txkey_pub[32]; #define amount_key tx_key #define out_eph_public_key additional_txkey_sec + unsigned char view_tag[1]; // TMP unsigned char derivation[32]; @@ -728,6 +751,7 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se } else { monero_io_fetch(NULL, 32); } + use_view_tags = monero_io_fetch_u8(); // update outkeys hash control if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { @@ -769,6 +793,11 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se // compute ephemeral output key monero_derive_public_key(out_eph_public_key, derivation, output_index, Bout); + // compute view tag + if (use_view_tags) { + monero_derive_view_tag(view_tag, derivation, output_index); + } + // send all monero_io_discard(0); monero_io_insert_encrypt(amount_key, 32, TYPE_AMOUNT_KEY); @@ -776,6 +805,9 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se if (need_additional_txkeys) { monero_io_insert(additional_txkey_pub, 32); } + if (use_view_tags) { + monero_io_insert(view_tag, 1); + } G_monero_vstate.tx_output_cnt++; return SW_OK; } diff --git a/src/monero_types.h b/src/monero_types.h index febb84f..d83c4d5 100644 --- a/src/monero_types.h +++ b/src/monero_types.h @@ -252,6 +252,7 @@ typedef struct monero_v_state_s monero_v_state_t; #define INS_DERIVE_PUBLIC_KEY 0x36 #define INS_DERIVE_SECRET_KEY 0x38 #define INS_GEN_KEY_IMAGE 0x3A +#define INS_DERIVE_VIEW_TAG 0x3B #define INS_SECRET_KEY_ADD 0x3C #define INS_GENERATE_KEYPAIR 0x40 #define INS_SECRET_SCAL_MUL_KEY 0x42 diff --git a/tests/monero_client/monero_types.py b/tests/monero_client/monero_types.py index 42697ec..8dcd258 100644 --- a/tests/monero_client/monero_types.py +++ b/tests/monero_client/monero_types.py @@ -45,6 +45,7 @@ class InsType(enum.IntEnum): INS_DERIVE_PUBLIC_KEY = 0x36 INS_DERIVE_SECRET_KEY = 0x38 INS_GEN_KEY_IMAGE = 0x3A + INS_DERIVE_VIEW_TAG = 0x3B INS_SECRET_KEY_ADD = 0x3C INS_GENERATE_KEYPAIR = 0x40 INS_SECRET_SCAL_MUL_KEY = 0x42 diff --git a/tests/test_crypto.py b/tests/test_crypto.py index 18ab9b5..7e47bb4 100644 --- a/tests/test_crypto.py +++ b/tests/test_crypto.py @@ -77,3 +77,15 @@ def test_gen_key_derivation(monero): ) assert expected == monero.xor_cipher(_d_in, b"\x55") # decrypt _d_in + +def test_derive_view_tag(monero): + expected_view_tag: bytes = bytes.fromhex("76") + + derivation: bytes = bytes.fromhex("0fc47054f355ced4d67de73bfa12e4c7" + "8ff19089548fffa7d07a674741860f97") + + output_index = 0 + + view_tag: bytes = monero.derive_view_tag(derivation, output_index) + + assert expected_view_tag == view_tag From eb7fee39e63674175c72eb05f409ea8273b9151f Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Wed, 13 Jul 2022 13:27:35 +0200 Subject: [PATCH 048/142] Lint --- src/monero_api.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index 5247d7d..0ce728d 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -170,8 +170,7 @@ void monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigne unsigned char *ec_pub); void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv); void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x); -void monero_derive_view_tag(unsigned char *view_tag, unsigned char *drv_data, - unsigned int out_idx); +void monero_derive_view_tag(unsigned char *view_tag, unsigned char *drv_data, unsigned int out_idx); void monero_derive_subaddress_public_key(unsigned char *x, unsigned char *pub, unsigned char *drv_data, unsigned int index); From 2ec65d615c49878f032f7c5677c60c0dfbb557b3 Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Mon, 18 Jul 2022 14:20:02 +0200 Subject: [PATCH 049/142] Bump version --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2e46d19..ccc3eaa 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ endif APPVERSION_M=1 APPVERSION_N=7 -APPVERSION_P=8 +APPVERSION_P=9 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) SPECVERSION="1.0" From dfafbb7925c89f51e88c707a4eb49eae1dd9876c Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Tue, 19 Jul 2022 16:41:50 +0200 Subject: [PATCH 050/142] Fix signature test when no view_tag is required --- tests/monero_client/monero_cmd.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/monero_client/monero_cmd.py b/tests/monero_client/monero_cmd.py index 41230f6..b81ee61 100644 --- a/tests/monero_client/monero_cmd.py +++ b/tests/monero_client/monero_cmd.py @@ -174,6 +174,7 @@ def gen_txout_keys(self, b"\x01" if is_change_addr else b"\x00", b"\x01" if is_subaddress else b"\x00", b"\x00" * 33, # additional_txkeys + b"\x00" * 33, # use_view_tags )) self.device.send(cla=PROTOCOL_VERSION, From fd5491704d048f9ea6a506dd703babe8d62ff3c0 Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Tue, 19 Jul 2022 16:43:04 +0200 Subject: [PATCH 051/142] Add complete test for view_tags --- tests/monero_client/monero_crypto_cmd.py | 24 +++++++ tests/test_crypto.py | 83 +++++++++++++++++++++--- 2 files changed, 98 insertions(+), 9 deletions(-) diff --git a/tests/monero_client/monero_crypto_cmd.py b/tests/monero_client/monero_crypto_cmd.py index 33cd512..617acd9 100644 --- a/tests/monero_client/monero_crypto_cmd.py +++ b/tests/monero_client/monero_crypto_cmd.py @@ -259,3 +259,27 @@ def gen_key_derivation(self, pub_key: bytes, _priv_key: bytes) -> bytes: assert len(response) == 32 return _d_in + + def derive_view_tag(self, derivation: bytes, output_index: bytes) -> int: + ins: InsType = InsType.INS_DERIVE_VIEW_TAG + + payload: bytes = b"".join([ + derivation, + output_index, + ]) + + self.device.send(cla=PROTOCOL_VERSION, + ins=ins, + p1=0, + p2=0, + option=0, + payload=payload) + + sw, response = self.device.recv() # type: int, bytes + + if not sw & 0x9000: + raise DeviceError(sw, ins) + + assert len(response) == 1 + + return int.from_bytes(response, "big") diff --git a/tests/test_crypto.py b/tests/test_crypto.py index 7e47bb4..a3d1a3d 100644 --- a/tests/test_crypto.py +++ b/tests/test_crypto.py @@ -78,14 +78,79 @@ def test_gen_key_derivation(monero): assert expected == monero.xor_cipher(_d_in, b"\x55") # decrypt _d_in -def test_derive_view_tag(monero): - expected_view_tag: bytes = bytes.fromhex("76") - - derivation: bytes = bytes.fromhex("0fc47054f355ced4d67de73bfa12e4c7" - "8ff19089548fffa7d07a674741860f97") - output_index = 0 +class Derivation_Test: + _derivation: bytes + _output_index: bytes + _expected_view_tag: int + + def __init__(self, derivation, output_index, expected_view_tag): + self._derivation = bytes.fromhex(derivation) + self._output_index = (output_index).to_bytes(4, byteorder='big') + self._expected_view_tag = expected_view_tag + + def do_test(self, monero): + assert self._expected_view_tag == monero.derive_view_tag(self._derivation, self._output_index) + +DERIVATION_TESTS = [ + Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 0, 0x76), + Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 1, 0xd6), + Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 2, 0x87), + Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 3, 0x1b), + Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 12, 0xd6), + Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 13, 0xe9), + Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 14, 0x12), + Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 15, 0x26), + Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 0, 0x70), + Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 1, 0x81), + Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 2, 0xa0), + Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 3, 0xec), + Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 12, 0x22), + Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 13, 0x0a), + Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 14, 0x87), + Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 15, 0x76), + Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 0, 0x93), + Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 1, 0x67), + Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 2, 0x9d), + Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 3, 0x2d), + Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 12, 0x63), + Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 13, 0xcf), + Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 14, 0xef), + Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 15, 0x10), + Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 0, 0x90), + Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 1, 0x5a), + Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 2, 0xde), + Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 3, 0x21), + Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 12, 0x57), + Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 13, 0x52), + Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 14, 0x6f), + Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 15, 0xeb), + Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 0, 0xc6), + Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 1, 0x60), + Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 2, 0xf0), + Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 3, 0x71), + Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 12, 0x0e), + Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 13, 0x42), + Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 14, 0xb2), + Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 15, 0x61), + Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 0, 0x4c), + Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 1, 0x9b), + Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 2, 0x64), + Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 3, 0xff), + Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 12, 0xe3), + Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 13, 0x24), + Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 14, 0xea), + Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 15, 0x3b), + Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 0, 0x74), + Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 1, 0x77), + Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 2, 0xa9), + Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 3, 0x44), + Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 12, 0x75), + Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 13, 0x05), + Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 14, 0xca), + Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 15, 0x00), +] - view_tag: bytes = monero.derive_view_tag(derivation, output_index) - - assert expected_view_tag == view_tag +def test_derive_view_tag(monero): + for test in DERIVATION_TESTS: + test.do_test(monero) From 62fdc2883e9ed980ff008036a6aa7dc56cfcf947 Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Tue, 19 Jul 2022 16:43:55 +0200 Subject: [PATCH 052/142] Fix view tag derivation test by sending encrypted derivation --- tests/test_crypto.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_crypto.py b/tests/test_crypto.py index a3d1a3d..5ec3cf6 100644 --- a/tests/test_crypto.py +++ b/tests/test_crypto.py @@ -90,7 +90,8 @@ def __init__(self, derivation, output_index, expected_view_tag): self._expected_view_tag = expected_view_tag def do_test(self, monero): - assert self._expected_view_tag == monero.derive_view_tag(self._derivation, self._output_index) + encrypted_derivation = monero.xor_cipher(self._derivation, b"\x55") # encrypt with dummy key 0x55 + assert self._expected_view_tag == monero.derive_view_tag(encrypted_derivation, self._output_index) DERIVATION_TESTS = [ Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 0, 0x76), From 4fe19ac7aeb2eb9b59c98d756f4f9e97fc123826 Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Fri, 22 Jul 2022 16:18:32 +0200 Subject: [PATCH 053/142] Review from Selsta --- Makefile | 4 ++-- src/monero_init.c | 2 +- tests/test_sig.py | 11 +++++++---- tests/test_version.py | 31 +++++-------------------------- 4 files changed, 15 insertions(+), 33 deletions(-) diff --git a/Makefile b/Makefile index ccc3eaa..b2eca0e 100644 --- a/Makefile +++ b/Makefile @@ -39,8 +39,8 @@ endif #DEFINES += MONERO_BETA APPVERSION_M=1 -APPVERSION_N=7 -APPVERSION_P=9 +APPVERSION_N=8 +APPVERSION_P=0 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) SPECVERSION="1.0" diff --git a/src/monero_init.c b/src/monero_init.c index ad637f3..7ef66fa 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -177,7 +177,7 @@ void monero_install(unsigned char netId) { /* ----------------------------------------------------------------------- */ /* --- Reset --- */ /* ----------------------------------------------------------------------- */ -const char* const monero_supported_client[] = {"0.17.0.", "0.17.1.", "0.17.2.", "0.17.3."}; +const char* const monero_supported_client[] = {"0.18.0."}; #define MONERO_SUPPORTED_CLIENT_SIZE \ (sizeof(monero_supported_client) / sizeof(monero_supported_client[0])) diff --git a/tests/test_sig.py b/tests/test_sig.py index 0313da9..45fcb05 100644 --- a/tests/test_sig.py +++ b/tests/test_sig.py @@ -1,6 +1,7 @@ import pytest from monero_client.monero_types import SigType, Keys +from monero_client.exception import ClientNotSupported @pytest.mark.incremental @@ -47,10 +48,12 @@ def state(): @staticmethod def test_set_sig(monero): - major, minor, patch = monero.reset_and_get_version( - monero_client_version=b"0.17.0.0" - ) # type: int, int, int - assert (major, minor) == (1, 7) # version of the Monero app + # Send a reset, ignore the version check and version related errors. + # They belong in a dedicated test + with pytest.raises(ClientNotSupported) as excinfo: + monero.reset_and_get_version( + monero_client_version=b"0.0.0.0" + ) sig_mode: SigType = monero.set_signature_mode(sig_type=SigType.REAL) assert sig_mode == SigType.REAL diff --git a/tests/test_version.py b/tests/test_version.py index 0f921c1..7f24e0a 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -1,38 +1,17 @@ import pytest # pylint: disable=wildcard-import, unused-wildcard-import -from monero_client.exception import * +from monero_client.exception import ClientNotSupported def test_version(monero): major, minor, patch = monero.reset_and_get_version( - monero_client_version=b"0.17.0.0" + monero_client_version=b"0.18.0.0" ) # type: int, int, int - assert (major, minor) == (1, 7) # version of the Monero app + assert (major, minor) == (1, 8) # version of the Monero app - # another compatible version of the Monero client - major, minor, patch = monero.reset_and_get_version( - monero_client_version=b"0.17.1.0" - ) # type: int, int, int - - assert (major, minor) == (1, 7) # version of the Monero app - - # another compatible version of the Monero client - major, minor, patch = monero.reset_and_get_version( - monero_client_version=b"0.17.2.0" - ) # type: int, int, int - - assert (major, minor) == (1, 7) # version of the Monero app - - # another compatible version of the Monero client - major, minor, patch = monero.reset_and_get_version( - monero_client_version=b"0.17.3.0" - ) # type: int, int, int - - assert (major, minor) == (1, 7) # version of the Monero app - -@pytest.mark.xfail(raises=ClientNotSupported) def test_old_client_version(monero): # should raise ClientNotSupported[0x6a30] - monero.reset_and_get_version(b"0.15.0.0") + with pytest.raises(ClientNotSupported) as excinfo: + monero.reset_and_get_version(b"0.17.0.0") From c5b95f11c985cbf78085e1624416e483344980b9 Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Fri, 22 Jul 2022 16:26:23 +0200 Subject: [PATCH 054/142] Rationalize Lint CI run --- .github/workflows/lint-workflow.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/lint-workflow.yml b/.github/workflows/lint-workflow.yml index 67a2024..3a64caf 100644 --- a/.github/workflows/lint-workflow.yml +++ b/.github/workflows/lint-workflow.yml @@ -1,6 +1,14 @@ name: Code style check -on: [push, pull_request] +on: + push: + branches: + - master + - develop + pull_request: + branches: + - master + - develop jobs: job_lint: From 1c7bb4b0db0052dc7d0609474af40d95be47b48d Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Fri, 22 Jul 2022 16:31:42 +0200 Subject: [PATCH 055/142] Following suggestion from Selsta, support client v0.18. instead of v0.18.0. --- src/monero_init.c | 2 +- tests/test_version.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/monero_init.c b/src/monero_init.c index 7ef66fa..d521d47 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -177,7 +177,7 @@ void monero_install(unsigned char netId) { /* ----------------------------------------------------------------------- */ /* --- Reset --- */ /* ----------------------------------------------------------------------- */ -const char* const monero_supported_client[] = {"0.18.0."}; +const char* const monero_supported_client[] = {"0.18."}; #define MONERO_SUPPORTED_CLIENT_SIZE \ (sizeof(monero_supported_client) / sizeof(monero_supported_client[0])) diff --git a/tests/test_version.py b/tests/test_version.py index 7f24e0a..4a05775 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -5,13 +5,23 @@ def test_version(monero): + # Monero does not have any consensus changes with minor point upgrades, we support 0.18. + major, minor, patch = monero.reset_and_get_version( monero_client_version=b"0.18.0.0" ) # type: int, int, int assert (major, minor) == (1, 8) # version of the Monero app + major, minor, patch = monero.reset_and_get_version( + monero_client_version=b"0.18.9.0" + ) # type: int, int, int + + assert (major, minor) == (1, 8) # version of the Monero app + def test_old_client_version(monero): # should raise ClientNotSupported[0x6a30] with pytest.raises(ClientNotSupported) as excinfo: monero.reset_and_get_version(b"0.17.0.0") + with pytest.raises(ClientNotSupported) as excinfo: + monero.reset_and_get_version(b"0.19.0.0") From 1629a486f478c0952c9d5f12f8edcb0908cda5c3 Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Mon, 25 Jul 2022 10:58:37 +0200 Subject: [PATCH 056/142] Add an explicit mechanism for the Monero app to refuse some client versions --- src/monero_init.c | 39 ++++++++++++++++++++++++--------------- tests/test_sig.py | 9 +++------ tests/test_version.py | 43 ++++++++++++++++++++++++++++--------------- 3 files changed, 55 insertions(+), 36 deletions(-) diff --git a/src/monero_init.c b/src/monero_init.c index d521d47..72c0d54 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -177,33 +177,42 @@ void monero_install(unsigned char netId) { /* ----------------------------------------------------------------------- */ /* --- Reset --- */ /* ----------------------------------------------------------------------- */ -const char* const monero_supported_client[] = {"0.18."}; -#define MONERO_SUPPORTED_CLIENT_SIZE \ - (sizeof(monero_supported_client) / sizeof(monero_supported_client[0])) +// Accept the following versions and their derivates +const char* const supported_clients[] = {"0.18."}; +#define MONERO_SUPPORTED_CLIENT_SIZE (sizeof(supported_clients) / sizeof(supported_clients[0])) + +// Explicitly refuse the following versions +const char* const refused_clients[] = {"0.18.0.0."}; +#define MONERO_REFUSED_CLIENT_SIZE (sizeof(refused_clients) / sizeof(refused_clients[0])) int monero_apdu_reset() { unsigned int client_version_len; char client_version[16]; + memset(client_version, '\0', 16); client_version_len = G_monero_vstate.io_length - G_monero_vstate.io_offset; if (client_version_len > 14) { THROW(SW_CLIENT_NOT_SUPPORTED + 1); } monero_io_fetch((unsigned char*)&client_version[0], client_version_len); + // Add '.' suffix to avoid 'X.1' prefixing 'X.10' client_version[client_version_len] = '.'; - client_version_len++; - client_version[client_version_len] = 0; - unsigned int i = 0; - while (i < MONERO_SUPPORTED_CLIENT_SIZE) { - unsigned int monero_supported_client_len = strlen((char*)PIC(monero_supported_client[i])); - if ((monero_supported_client_len <= client_version_len) && - (os_memcmp((char*)PIC(monero_supported_client[i]), client_version, - monero_supported_client_len) == 0)) { - break; + // Check if version is explicitly refused + for (uint32_t i = 0; i < MONERO_REFUSED_CLIENT_SIZE; ++i) { + if (strcmp(PIC(refused_clients[i]), client_version) == 0) { + THROW(SW_CLIENT_NOT_SUPPORTED); } - i++; } - if (i == MONERO_SUPPORTED_CLIENT_SIZE) { - THROW(SW_CLIENT_NOT_SUPPORTED); + // Check if version is supported + uint32_t i; + for (i = 0; i < MONERO_SUPPORTED_CLIENT_SIZE + 1; ++i) { + // Use strncmp to allow supported version prefixing client version + unsigned int supported_clients_len = strlen((char*)PIC(supported_clients[i])); + if (strncmp(PIC(supported_clients[i]), client_version, supported_clients_len) == 0) { + break; + } + if (i == MONERO_SUPPORTED_CLIENT_SIZE) { + THROW(SW_CLIENT_NOT_SUPPORTED); + } } monero_io_discard(0); diff --git a/tests/test_sig.py b/tests/test_sig.py index 45fcb05..2429b2e 100644 --- a/tests/test_sig.py +++ b/tests/test_sig.py @@ -48,12 +48,9 @@ def state(): @staticmethod def test_set_sig(monero): - # Send a reset, ignore the version check and version related errors. - # They belong in a dedicated test - with pytest.raises(ClientNotSupported) as excinfo: - monero.reset_and_get_version( - monero_client_version=b"0.0.0.0" - ) + monero.reset_and_get_version( + monero_client_version=b"0.18" + ) sig_mode: SigType = monero.set_signature_mode(sig_type=SigType.REAL) assert sig_mode == SigType.REAL diff --git a/tests/test_version.py b/tests/test_version.py index 4a05775..1997248 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -3,25 +3,38 @@ # pylint: disable=wildcard-import, unused-wildcard-import from monero_client.exception import ClientNotSupported - -def test_version(monero): - # Monero does not have any consensus changes with minor point upgrades, we support 0.18. - +def check_accepted_version(monero, valid_version: bytes): major, minor, patch = monero.reset_and_get_version( - monero_client_version=b"0.18.0.0" + monero_client_version=valid_version ) # type: int, int, int + assert (major, minor, patch) == (1, 8, 0) # version of the Monero app - assert (major, minor) == (1, 8) # version of the Monero app +def check_refused_version(monero, invalid_version: bytes): + with pytest.raises(ClientNotSupported) as excinfo: + monero.reset_and_get_version(invalid_version) - major, minor, patch = monero.reset_and_get_version( - monero_client_version=b"0.18.9.0" - ) # type: int, int, int - assert (major, minor) == (1, 8) # version of the Monero app +def test_version(monero): + # Monero does not have any consensus changes with minor point upgrades, we support the entire 0.18. range, except 0.18.0.0 + check_accepted_version(monero, b"0.18") + check_accepted_version(monero, b"0.18.0.1") + check_accepted_version(monero, b"0.18.0.10") + check_accepted_version(monero, b"0.18.1.1") + check_accepted_version(monero, b"0.18.9.0") + check_accepted_version(monero, b"0.18.18.0") def test_old_client_version(monero): - # should raise ClientNotSupported[0x6a30] - with pytest.raises(ClientNotSupported) as excinfo: - monero.reset_and_get_version(b"0.17.0.0") - with pytest.raises(ClientNotSupported) as excinfo: - monero.reset_and_get_version(b"0.19.0.0") + # Not supported anymore + check_refused_version(monero, b"0.0.0.0") + check_refused_version(monero, b"0.17.0.0") + check_refused_version(monero, b"0.17.18.0") + # Explicitly disabled + check_refused_version(monero, b"0.18.0.0") + # Not yet supported + check_refused_version(monero, b"0.19.0.0") + check_refused_version(monero, b"1.0.0.0") + # Regex shenanigans + check_refused_version(monero, b"") + check_refused_version(monero, b"0") + check_refused_version(monero, b"0.0.") + check_refused_version(monero, b"0.180") From 163e5d2ba8f7212bf3ac73f6c2fc60c7d0a624fb Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Tue, 26 Jul 2022 09:12:23 +0200 Subject: [PATCH 057/142] Separate function for version checking --- src/monero_init.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/monero_init.c b/src/monero_init.c index 72c0d54..bf2dd34 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -185,6 +185,24 @@ const char* const supported_clients[] = {"0.18."}; const char* const refused_clients[] = {"0.18.0.0."}; #define MONERO_REFUSED_CLIENT_SIZE (sizeof(refused_clients) / sizeof(refused_clients[0])) +static bool is_client_version_valid(const char* client_version) { + // Check if version is explicitly refused + for (uint32_t i = 0; i < MONERO_REFUSED_CLIENT_SIZE; ++i) { + if (strcmp(PIC(refused_clients[i]), client_version) == 0) { + return false; + } + } + // Check if version is supported + for (uint32_t i = 0; i < MONERO_SUPPORTED_CLIENT_SIZE; ++i) { + // Use strncmp to allow supported version prefixing client version + unsigned int supported_clients_len = strlen(PIC(supported_clients[i])); + if (strncmp(PIC(supported_clients[i]), client_version, supported_clients_len) == 0) { + return true; + } + } + return false; +} + int monero_apdu_reset() { unsigned int client_version_len; char client_version[16]; @@ -196,23 +214,9 @@ int monero_apdu_reset() { monero_io_fetch((unsigned char*)&client_version[0], client_version_len); // Add '.' suffix to avoid 'X.1' prefixing 'X.10' client_version[client_version_len] = '.'; - // Check if version is explicitly refused - for (uint32_t i = 0; i < MONERO_REFUSED_CLIENT_SIZE; ++i) { - if (strcmp(PIC(refused_clients[i]), client_version) == 0) { - THROW(SW_CLIENT_NOT_SUPPORTED); - } - } - // Check if version is supported - uint32_t i; - for (i = 0; i < MONERO_SUPPORTED_CLIENT_SIZE + 1; ++i) { - // Use strncmp to allow supported version prefixing client version - unsigned int supported_clients_len = strlen((char*)PIC(supported_clients[i])); - if (strncmp(PIC(supported_clients[i]), client_version, supported_clients_len) == 0) { - break; - } - if (i == MONERO_SUPPORTED_CLIENT_SIZE) { - THROW(SW_CLIENT_NOT_SUPPORTED); - } + + if (!is_client_version_valid(client_version)) { + THROW(SW_CLIENT_NOT_SUPPORTED); } monero_io_discard(0); From 3f2eadfadcc5f804231b2416cb0c63701fabed96 Mon Sep 17 00:00:00 2001 From: selsta Date: Wed, 14 Jul 2021 13:36:10 +0200 Subject: [PATCH 058/142] src: rename account to wallet --- src/monero_ux_nanos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monero_ux_nanos.c b/src/monero_ux_nanos.c index 01665fa..d047d6b 100644 --- a/src/monero_ux_nanos.c +++ b/src/monero_ux_nanos.c @@ -564,7 +564,7 @@ void ui_menu_reset_action(unsigned int value) { /* ------------------------------- SETTINGS UX ------------------------------- */ const ux_menu_entry_t ui_menu_settings[] = { - {NULL, ui_menu_account_display, 0, NULL, "Select Account", NULL, 0, 0}, + {NULL, ui_menu_account_display, 0, NULL, "Select Wallet", NULL, 0, 0}, {NULL, ui_menu_network_display, 0, NULL, "Select Network", NULL, 0, 0}, {NULL, ui_menu_words_display, 0, NULL, "Show 25 words", NULL, 0, 0}, {ui_menu_reset, NULL, 0, NULL, "Reset", NULL, 0, 0}, From 4ab384f2a9c42d1e7aad34f3139a8d5e1cfea75a Mon Sep 17 00:00:00 2001 From: Sylvia G Date: Sat, 15 May 2021 19:06:45 +0300 Subject: [PATCH 059/142] seed conversion tool: replace relative import to support pyinstaller pyinstaller can be used to generate a single executable file which can be run in an offline environment. However, it's unclear if it supports running with `python -m` (module mode). --- .gitignore | 7 ++++++- tools/python/README.md | 8 ++++---- tools/python/src/ledger/monero/seedconv.py | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index a8488aa..1185f63 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ debug/ dep/ obj/ - # Editors .vscode/ .idea/ @@ -18,3 +17,9 @@ __pycache__/ *.egg-info/ .eggs/ .python-version + +# Pyinstaller +build/ +dist/ +*.manifest +*.spec diff --git a/tools/python/README.md b/tools/python/README.md index 8d16cfb..b6f1670 100644 --- a/tools/python/README.md +++ b/tools/python/README.md @@ -65,11 +65,11 @@ On Mac/Linux In tools/python/ directory run the command: - PYTHONPATH=`pwd`/src python3 -m ledger.monero.seedconv.py offline + PYTHONPATH=`pwd`/src python3 src/ledger/monero/seedconv.py offline Example: - $ PYTHONPATH="$(pwd)/src" python3 -m ledger.monero.seedconv offline + $ PYTHONPATH="$(pwd)/src" python3 src/ledger/monero/seedconv.py offline ============================================================= Monero Seed Converter v0.9. Copyright (c) Ledger SAS 20018. @@ -113,11 +113,11 @@ Example: In tools/python/ directory run the command: - PYTHONPATH=`pwd`/src python3 -m ledger.monero.seedconv.py online + PYTHONPATH=`pwd`/src python3 src/ledger/monero/seedconv.py online Example: - $ PYTHONPATH=`pwd`/src python3 -m ledger.monero.seedconv.py online + $ PYTHONPATH=`pwd`/src python3 src/ledger/monero/seedconv.py online ============================================================= Monero Seed Converter v0.9. Copyright (c) Ledger SAS 20018. diff --git a/tools/python/src/ledger/monero/seedconv.py b/tools/python/src/ledger/monero/seedconv.py index 0c592c8..4d26495 100644 --- a/tools/python/src/ledger/monero/seedconv.py +++ b/tools/python/src/ledger/monero/seedconv.py @@ -25,7 +25,7 @@ -from .dictionaries.languages import monero_langs +from ledger.monero.dictionaries.languages import monero_langs # ========================================================================================= From fd303139f0f25d9b4fa7d56f0f75eaf0c60a18ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Wed, 3 Aug 2022 12:11:51 +0200 Subject: [PATCH 060/142] Properly escape underscores in documentation --- doc/developer/blue-app-commands.pdf | Bin 355239 -> 361174 bytes doc/developer/blue-app-commands.rst | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/developer/blue-app-commands.pdf b/doc/developer/blue-app-commands.pdf index 72a9b60b502a25bd85a3115dfae738404b0bac79..37d5471d2cad3153d61b4a3ebb4f312c187e8e1d 100644 GIT binary patch delta 173718 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
P3+@+VOBxpwJdoKW%3;i-MANDNFK=&>YNKBm{Oy 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 M8&Frbb+MED7rs(aq5uE@ diff --git a/doc/developer/blue-app-commands.rst b/doc/developer/blue-app-commands.rst index ee6fd81..db46f4a 100644 --- a/doc/developer/blue-app-commands.rst +++ b/doc/developer/blue-app-commands.rst @@ -104,8 +104,8 @@ .. |eDRVout| replace:: :math:`\widetilde{\mathfrak{D}_\mathrm{out}}` .. |AKout| replace:: :math:`\mathcal{AK}_\mathrm{amount}` .. |eAKout| replace:: :math:`\widetilde{\mathcal{AK}_\mathrm{amount}}` -.. |vtf| replace:: :math:`\mathit{view_tag_full}` -.. |vt| replace:: :math:`\mathit{view_tag}` +.. |vtf| replace:: :math:`\mathit{view\_tag\_full}` +.. |vt| replace:: :math:`\mathit{view\_tag}` .. |ctH| replace:: :math:`\mathcal{H}_\mathrm{commitment}` From 183a145394d43e405740e6a26ecb2efee5a9e676 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Wed, 3 Aug 2022 12:19:45 +0200 Subject: [PATCH 061/142] Better prototype for monero_derive_view_tag --- src/monero_api.h | 3 ++- src/monero_crypto.c | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index 0ce728d..89c746d 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -170,7 +170,8 @@ void monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigne unsigned char *ec_pub); void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv); void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x); -void monero_derive_view_tag(unsigned char *view_tag, unsigned char *drv_data, unsigned int out_idx); +void monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_data[static 32], + unsigned int out_idx); void monero_derive_subaddress_public_key(unsigned char *x, unsigned char *pub, unsigned char *drv_data, unsigned int index); diff --git a/src/monero_crypto.c b/src/monero_crypto.c index df01036..d6fe718 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -522,7 +522,7 @@ void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned ch /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_derive_view_tag(unsigned char *view_tag, unsigned char *drv_data, +void monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_data[static 32], unsigned int out_idx) { unsigned char varint[8 + 32 + 8]; unsigned int len_varint; @@ -532,7 +532,7 @@ void monero_derive_view_tag(unsigned char *view_tag, unsigned char *drv_data, len_varint = monero_encode_varint(varint + 8 + 32, 8, out_idx); len_varint += 8 + 32; monero_keccak_F(varint, len_varint, varint); - os_memmove(view_tag, varint, 1); + *view_tag = varint[0]; } /* ======================================================================= */ From 074462509279b47959463991674442e58d89d71e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Wed, 3 Aug 2022 20:43:46 +0200 Subject: [PATCH 062/142] Remove extra arguments passed to monero_abort_tx monero_abort_tx was declared with old-style function declaration. This function was called 3 times with too much arguments, but that was not detected by the compiler. --- src/monero_api.h | 2 +- src/monero_ux_nano.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index 0ce728d..aad8aed 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -116,7 +116,7 @@ int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len); /** uint64 amount to str */ void monero_uint642str(uint64_t val, char *str, unsigned int str_len); -int monero_abort_tx(); +int monero_abort_tx(void); int monero_unblind(unsigned char *v, unsigned char *k, unsigned char *AKout, unsigned int short_amount); void ui_menu_validation_display(unsigned int value); diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index efb1194..59266c6 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -146,7 +146,7 @@ unsigned int ui_menu_opentx_action(unsigned int value) { sw = monero_apdu_open_tx_cont(); ui_menu_info_display2(0, "Processing TX", "..."); } else { - monero_abort_tx(0); + monero_abort_tx(); sw = SW_DENY; ui_menu_info_display2(0, "Transaction", "aborted"); } @@ -229,7 +229,7 @@ void ui_menu_amount_validation_action(unsigned int value) { if (value == ACCEPT) { sw = SW_OK; } else { - monero_abort_tx(0); + monero_abort_tx(); sw = SW_DENY; } monero_io_insert_u16(sw); @@ -275,7 +275,7 @@ void ui_menu_validation_action(unsigned int value) { if (value == ACCEPT) { sw = SW_OK; } else { - monero_abort_tx(0); + monero_abort_tx(); sw = SW_DENY; } monero_io_insert_u16(sw); From 510ad26d7a0213d0632432909de783d6623b58d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Thu, 4 Aug 2022 07:52:13 +0200 Subject: [PATCH 063/142] Replace deprecated functions by newer ones --- src/monero_blind.c | 2 +- src/monero_clsag.c | 2 +- src/monero_crypto.c | 102 ++++++++++++++++----------------- src/monero_init.c | 40 ++++++------- src/monero_io.c | 36 ++++++------ src/monero_key.c | 34 +++++------ src/monero_main.c | 2 +- src/monero_mlsag.c | 4 +- src/monero_monero.c | 8 +-- src/monero_open_tx.c | 6 +- src/monero_prehash.c | 10 ++-- src/monero_proof.c | 16 +++--- src/monero_ux_nano.c | 78 ++++++++++++++------------ src/monero_ux_nanos.c | 127 ++++++++++++++++++++++-------------------- 14 files changed, 240 insertions(+), 227 deletions(-) diff --git a/src/monero_blind.c b/src/monero_blind.c index 63ea7c2..153ce2d 100644 --- a/src/monero_blind.c +++ b/src/monero_blind.c @@ -36,7 +36,7 @@ int monero_apdu_blind() { monero_io_discard(1); if ((G_monero_vstate.options & 0x03) == 2) { - os_memset(k, 0, 32); + memset(k, 0, 32); monero_ecdhHash(AKout, AKout); for (int i = 0; i < 8; i++) { v[i] = v[i] ^ AKout[i]; diff --git a/src/monero_clsag.c b/src/monero_clsag.c index 4db70df..d48796f 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -103,7 +103,7 @@ int monero_apdu_clsag_hash() { monero_keccak_final_H(c); monero_reduce(c, c); monero_io_insert(c, 32); - os_memmove(G_monero_vstate.c, c, 32); + memcpy(G_monero_vstate.c, c, 32); } return SW_OK; } diff --git a/src/monero_crypto.c b/src/monero_crypto.c index df01036..a8c178a 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -304,8 +304,8 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { #define rY (G_monero_vstate.io_buffer + 7 * 32) #define rZ (G_monero_vstate.io_buffer + 8 * 32) - //#define uv7 (G_monero_vstate.io_buffer+9*32) - //#define v3 (G_monero_vstate.io_buffer+10*32) + // #define uv7 (G_monero_vstate.io_buffer+9*32) + // #define v3 (G_monero_vstate.io_buffer+10*32) union { unsigned char _Pxy[65]; struct { @@ -335,7 +335,7 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { cx_math_multm(v, u, u, MOD); /* 2 * u^2 */ cx_math_addm(v, v, v, MOD); - os_memset(w, 0, 32); + memset(w, 0, 32); w[31] = 1; /* w = 1 */ cx_math_addm(w, v, w, MOD); /* w = 2 * u^2 + 1 */ cx_math_multm(x, w, w, MOD); /* w^2 */ @@ -359,7 +359,7 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { cx_math_multm(y, rX, rX, MOD); cx_math_multm(x, y, x, MOD); cx_math_subm(y, w, x, MOD); - os_memmove(z, C_fe_ma, 32); + memcpy(z, C_fe_ma, 32); if (!cx_math_is_zero(y, 32)) { cx_math_addm(y, w, x, MOD); @@ -404,8 +404,8 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { Pxy[0] = 0x04; cx_math_multm(&Pxy[1], rX, u, MOD); cx_math_multm(&Pxy[1 + 32], rY, u, MOD); - cx_edward_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); - os_memmove(ge, &Pxy[1], 32); + cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + memcpy(ge, &Pxy[1], 32); #undef u #undef v @@ -468,7 +468,7 @@ void monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, unsigned char varint[32 + 8]; unsigned int len_varint; - os_memmove(varint, drv_data, 32); + memcpy(varint, drv_data, 32); len_varint = monero_encode_varint(varint + 32, 8, out_idx); len_varint += 32; monero_keccak_F(varint, len_varint, varint); @@ -527,12 +527,12 @@ void monero_derive_view_tag(unsigned char *view_tag, unsigned char *drv_data, unsigned char varint[8 + 32 + 8]; unsigned int len_varint; - os_memmove(varint, "view_tag", 8); - os_memmove(varint + 8, drv_data, 32); + memcpy(varint, "view_tag", 8); + memcpy(varint + 8, drv_data, 32); len_varint = monero_encode_varint(varint + 8 + 32, 8, out_idx); len_varint += 8 + 32; monero_keccak_F(varint, len_varint, varint); - os_memmove(view_tag, varint, 1); + memcpy(view_tag, varint, 1); } /* ======================================================================= */ @@ -582,9 +582,9 @@ void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, unsigned char *index) { unsigned char in[sizeof(C_sub_address_prefix) + 32 + 8]; - os_memmove(in, C_sub_address_prefix, sizeof(C_sub_address_prefix)), - os_memmove(in + sizeof(C_sub_address_prefix), s, 32); - os_memmove(in + sizeof(C_sub_address_prefix) + 32, index, 8); + memcpy(in, C_sub_address_prefix, sizeof(C_sub_address_prefix)); + memcpy(in + sizeof(C_sub_address_prefix), s, 32); + memcpy(in + sizeof(C_sub_address_prefix) + 32, index, 8); // hash_to_scalar with more that 32bytes: monero_keccak_F(in, sizeof(in), sub_s); monero_reduce(sub_s, sub_s); @@ -620,10 +620,10 @@ void monero_ecmul_G(unsigned char *W, unsigned char *scalar32) { unsigned char Pxy[65]; unsigned char s[32]; monero_reverse32(s, scalar32); - os_memmove(Pxy, C_ED25519_G, 65); + memcpy(Pxy, C_ED25519_G, 65); cx_ecfp_scalar_mult(CX_CURVE_Ed25519, Pxy, sizeof(Pxy), s, 32); - cx_edward_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); - os_memmove(W, &Pxy[1], 32); + cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + memcpy(W, &Pxy[1], 32); } /* ----------------------------------------------------------------------- */ @@ -636,13 +636,13 @@ void monero_ecmul_H(unsigned char *W, unsigned char *scalar32) { monero_reverse32(s, scalar32); Pxy[0] = 0x02; - os_memmove(&Pxy[1], C_ED25519_Hy, 32); - cx_edward_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + memcpy(&Pxy[1], C_ED25519_Hy, 32); + cx_edwards_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); cx_ecfp_scalar_mult(CX_CURVE_Ed25519, Pxy, sizeof(Pxy), s, 32); - cx_edward_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); - os_memmove(W, &Pxy[1], 32); + memcpy(W, &Pxy[1], 32); } /* ----------------------------------------------------------------------- */ @@ -655,13 +655,13 @@ void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32) monero_reverse32(s, scalar32); Pxy[0] = 0x02; - os_memmove(&Pxy[1], P, 32); - cx_edward_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + memcpy(&Pxy[1], P, 32); + cx_edwards_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); cx_ecfp_scalar_mult(CX_CURVE_Ed25519, Pxy, sizeof(Pxy), s, 32); - cx_edward_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); - os_memmove(W, &Pxy[1], 32); + memcpy(W, &Pxy[1], 32); } /* ----------------------------------------------------------------------- */ @@ -680,13 +680,13 @@ void monero_ecmul_8(unsigned char *W, unsigned char *P) { unsigned char Pxy[65]; Pxy[0] = 0x02; - os_memmove(&Pxy[1], P, 32); - cx_edward_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + memcpy(&Pxy[1], P, 32); + cx_edwards_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); cx_ecfp_add_point(CX_CURVE_Ed25519, Pxy, Pxy, Pxy, sizeof(Pxy)); cx_ecfp_add_point(CX_CURVE_Ed25519, Pxy, Pxy, Pxy, sizeof(Pxy)); cx_ecfp_add_point(CX_CURVE_Ed25519, Pxy, Pxy, Pxy, sizeof(Pxy)); - cx_edward_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); - os_memmove(W, &Pxy[1], 32); + cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + memcpy(W, &Pxy[1], 32); } /* ----------------------------------------------------------------------- */ @@ -697,17 +697,17 @@ void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q) { unsigned char Qxy[65]; Pxy[0] = 0x02; - os_memmove(&Pxy[1], P, 32); - cx_edward_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + memcpy(&Pxy[1], P, 32); + cx_edwards_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); Qxy[0] = 0x02; - os_memmove(&Qxy[1], Q, 32); - cx_edward_decompress_point(CX_CURVE_Ed25519, Qxy, sizeof(Qxy)); + memcpy(&Qxy[1], Q, 32); + cx_edwards_decompress_point(CX_CURVE_Ed25519, Qxy, sizeof(Qxy)); cx_ecfp_add_point(CX_CURVE_Ed25519, Pxy, Pxy, Qxy, sizeof(Pxy)); - cx_edward_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); - os_memmove(W, &Pxy[1], 32); + cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + memcpy(W, &Pxy[1], 32); } /* ----------------------------------------------------------------------- */ @@ -718,18 +718,18 @@ void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q) { unsigned char Qxy[65]; Pxy[0] = 0x02; - os_memmove(&Pxy[1], P, 32); - cx_edward_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + memcpy(&Pxy[1], P, 32); + cx_edwards_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); Qxy[0] = 0x02; - os_memmove(&Qxy[1], Q, 32); - cx_edward_decompress_point(CX_CURVE_Ed25519, Qxy, sizeof(Qxy)); + memcpy(&Qxy[1], Q, 32); + cx_edwards_decompress_point(CX_CURVE_Ed25519, Qxy, sizeof(Qxy)); cx_math_sub(Qxy + 1, (unsigned char *)C_ED25519_FIELD, Qxy + 1, 32); cx_ecfp_add_point(CX_CURVE_Ed25519, Pxy, Pxy, Qxy, sizeof(Pxy)); - cx_edward_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); - os_memmove(W, &Pxy[1], 32); + cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + memcpy(W, &Pxy[1], 32); } /* ----------------------------------------------------------------------- */ @@ -748,8 +748,8 @@ void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q) { */ void monero_ecdhHash(unsigned char *x, unsigned char *k) { unsigned char data[38]; - os_memmove(data, "amount", 6); - os_memmove(data + 6, k, 32); + memcpy(data, "amount", 6); + memcpy(data + 6, k, 32); monero_keccak_F(data, 38, x); } @@ -769,8 +769,8 @@ void monero_ecdhHash(unsigned char *x, unsigned char *k) { */ void monero_genCommitmentMask(unsigned char *c, unsigned char *sk) { unsigned char data[15 + 32]; - os_memmove(data, "commitment_mask", 15); - os_memmove(data + 15, sk, 32); + memcpy(data, "commitment_mask", 15); + memcpy(data + 15, sk, 32); monero_hash_to_scalar(c, data, 15 + 32); } @@ -820,7 +820,7 @@ void monero_multm_8(unsigned char *r, unsigned char *a) { unsigned char rb[32]; monero_reverse32(ra, a); - os_memset(rb, 0, 32); + memset(rb, 0, 32); rb[31] = 8; cx_math_multm(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); monero_reverse32(r, r); @@ -854,7 +854,7 @@ void monero_uint642str(uint64_t val, char *str, unsigned int str_len) { char stramount[22]; unsigned int offset, len; - os_memset(str, 0, str_len); + memset(str, 0, str_len); offset = 22; while (val) { @@ -866,7 +866,7 @@ void monero_uint642str(uint64_t val, char *str, unsigned int str_len) { if (len > str_len) { THROW(SW_WRONG_DATA_RANGE); } - os_memmove(str, stramount + offset, len); + memcpy(str, stramount + offset, len); } /* ----------------------------------------------------------------------- */ @@ -878,9 +878,9 @@ int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { char stramount[22]; unsigned int offset, len, ov; - os_memset(str, 0, str_len); + memset(str, 0, str_len); - os_memset(stramount, '0', sizeof(stramount)); + memset(stramount, '0', sizeof(stramount)); stramount[21] = 0; // special case if (xmr == 0) { @@ -902,7 +902,7 @@ int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { // offset: 0-7 | 8 | 9-20 |21 // ---------------------- // value: xmr | . | units| 0 - os_memmove(stramount, stramount + 1, 8); + memmove(stramount, stramount + 1, 8); stramount[8] = '.'; offset = 0; while ((stramount[offset] == '0') && (stramount[offset] != '.')) { @@ -921,7 +921,7 @@ int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { len = str_len - 1; ov = 1; } - os_memmove(str, stramount + offset, len); + memcpy(str, stramount + offset, len); return ov; } diff --git a/src/monero_init.c b/src/monero_init.c index bf2dd34..bfc9e27 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -38,10 +38,10 @@ const unsigned char C_FAKE_SEC_SPEND_KEY[32] = { /* --- Boot --- */ /* ----------------------------------------------------------------------- */ void monero_init() { - os_memset(&G_monero_vstate, 0, sizeof(monero_v_state_t)); + memset(&G_monero_vstate, 0, sizeof(monero_v_state_t)); // first init ? - if (os_memcmp((void*)N_monero_pstate->magic, (void*)C_MAGIC, sizeof(C_MAGIC)) != 0) { + if (memcmp((void*)N_monero_pstate->magic, (void*)C_MAGIC, sizeof(C_MAGIC)) != 0) { #if defined(MONERO_ALPHA) || defined(MONERO_BETA) monero_install(STAGENET); #else @@ -64,11 +64,11 @@ void monero_init() { /* --- init private keys --- */ /* ----------------------------------------------------------------------- */ void monero_wipe_private_key() { - os_memset(G_monero_vstate.a, 0, 32); - os_memset(G_monero_vstate.b, 0, 32); - os_memset(G_monero_vstate.A, 0, 32); - os_memset(G_monero_vstate.B, 0, 32); - os_memset(&G_monero_vstate.spk, 0, sizeof(G_monero_vstate.spk)); + memset(G_monero_vstate.a, 0, 32); + memset(G_monero_vstate.b, 0, 32); + memset(G_monero_vstate.A, 0, 32); + memset(G_monero_vstate.B, 0, 32); + memset(&G_monero_vstate.spk, 0, sizeof(G_monero_vstate.spk)); G_monero_vstate.key_set = 0; } @@ -98,8 +98,8 @@ void monero_init_private_key() { break; case KEY_MODE_EXTERNAL: - os_memmove(G_monero_vstate.a, (void*)N_monero_pstate->a, 32); - os_memmove(G_monero_vstate.b, (void*)N_monero_pstate->b, 32); + memcpy(G_monero_vstate.a, (void*)N_monero_pstate->a, 32); + memcpy(G_monero_vstate.b, (void*)N_monero_pstate->b, 32); break; default: @@ -121,24 +121,24 @@ void monero_init_private_key() { void monero_init_ux() { monero_base58_public_key(G_monero_vstate.ux_address, G_monero_vstate.A, G_monero_vstate.B, 0, NULL); - os_memset(G_monero_vstate.ux_wallet_public_short_address, '.', - sizeof(G_monero_vstate.ux_wallet_public_short_address)); + memset(G_monero_vstate.ux_wallet_public_short_address, '.', + sizeof(G_monero_vstate.ux_wallet_public_short_address)); #ifdef HAVE_UX_FLOW #ifdef UI_NANO_X snprintf(G_monero_vstate.ux_wallet_account_name, sizeof(G_monero_vstate.ux_wallet_account_name), "XMR / %d", N_monero_pstate->account_id); - os_memmove(G_monero_vstate.ux_wallet_public_short_address, G_monero_vstate.ux_address, 5); - os_memmove(G_monero_vstate.ux_wallet_public_short_address + 7, - G_monero_vstate.ux_address + 95 - 5, 5); + memcpy(G_monero_vstate.ux_wallet_public_short_address, G_monero_vstate.ux_address, 5); + memcpy(G_monero_vstate.ux_wallet_public_short_address + 7, G_monero_vstate.ux_address + 95 - 5, + 5); G_monero_vstate.ux_wallet_public_short_address[12] = 0; #else snprintf(G_monero_vstate.ux_wallet_account_name, sizeof(G_monero_vstate.ux_wallet_account_name), " XMR / %d", N_monero_pstate->account_id); - os_memmove(G_monero_vstate.ux_wallet_public_short_address, G_monero_vstate.ux_address, 4); - os_memmove(G_monero_vstate.ux_wallet_public_short_address + 6, - G_monero_vstate.ux_address + 95 - 4, 4); + memcpy(G_monero_vstate.ux_wallet_public_short_address, G_monero_vstate.ux_address, 4); + memcpy(G_monero_vstate.ux_wallet_public_short_address + 6, G_monero_vstate.ux_address + 95 - 4, + 4); G_monero_vstate.ux_wallet_public_short_address[10] = 0; #endif @@ -146,9 +146,9 @@ void monero_init_ux() { snprintf(G_monero_vstate.ux_wallet_account_name, sizeof(G_monero_vstate.ux_wallet_account_name), "XMR / %d", N_monero_pstate->account_id); - os_memmove(G_monero_vstate.ux_wallet_public_short_address, G_monero_vstate.ux_address, 5); - os_memmove(G_monero_vstate.ux_wallet_public_short_address + 7, - G_monero_vstate.ux_address + 95 - 5, 5); + memcpy(G_monero_vstate.ux_wallet_public_short_address, G_monero_vstate.ux_address, 5); + memcpy(G_monero_vstate.ux_wallet_public_short_address + 7, G_monero_vstate.ux_address + 95 - 5, + 5); G_monero_vstate.ux_wallet_public_short_address[12] = 0; #endif diff --git a/src/monero_io.c b/src/monero_io.c index 65c9b5a..f6d48ae 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -66,7 +66,7 @@ void monero_io_discard(int clear) { } } -void monero_io_clear() { os_memset(G_monero_vstate.io_buffer, 0, MONERO_IO_BUFFER_LENGTH); } +void monero_io_clear() { memset(G_monero_vstate.io_buffer, 0, MONERO_IO_BUFFER_LENGTH); } /* ----------------------------------------------------------------------- */ /* INSERT data to be sent */ @@ -76,15 +76,15 @@ void monero_io_hole(unsigned int sz) { if ((G_monero_vstate.io_length + sz) > MONERO_IO_BUFFER_LENGTH) { THROW(ERROR_IO_FULL); } - os_memmove(G_monero_vstate.io_buffer + G_monero_vstate.io_offset + sz, - G_monero_vstate.io_buffer + G_monero_vstate.io_offset, - G_monero_vstate.io_length - G_monero_vstate.io_offset); + memmove(G_monero_vstate.io_buffer + G_monero_vstate.io_offset + sz, + G_monero_vstate.io_buffer + G_monero_vstate.io_offset, + G_monero_vstate.io_length - G_monero_vstate.io_offset); G_monero_vstate.io_length += sz; } void monero_io_insert(unsigned char const* buff, unsigned int len) { monero_io_hole(len); - os_memmove(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, buff, len); + memcpy(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, buff, len); G_monero_vstate.io_offset += len; } @@ -96,7 +96,7 @@ void monero_io_insert_hmac_for(unsigned char* buffer, int len, int type) { unsigned char hmac[32 + 1 + 4]; - os_memmove(hmac, buffer, 32); + memcpy(hmac, buffer, 32); hmac[32] = type; if (type == TYPE_ALPHA) { hmac[33] = (G_monero_vstate.tx_sign_cnt >> 0) & 0xFF; @@ -126,7 +126,7 @@ void monero_io_insert_encrypt(unsigned char* buffer, int len, int type) { G_monero_vstate.io_buffer[G_monero_vstate.io_offset + i] = buffer[i] ^ 0x55; } #elif defined(IONOCRYPT) - os_memmove(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, buffer, len); + memcpy(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, buffer, len); #else cx_aes(&G_monero_vstate.spk, CX_ENCRYPT | CX_CHAIN_CBC | CX_LAST | CX_PAD_NONE, buffer, len, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len); @@ -206,7 +206,7 @@ void monero_io_assert_available(int sz) { int monero_io_fetch(unsigned char* buffer, int len) { monero_io_assert_available(len); if (buffer) { - os_memmove(buffer, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len); + memcpy(buffer, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len); } G_monero_vstate.io_offset += len; return len; @@ -220,7 +220,7 @@ static void monero_io_verify_hmac_for(const unsigned char* buffer, int len, } unsigned char hmac[37]; - os_memmove(hmac, buffer, 32); + memcpy(hmac, buffer, 32); hmac[32] = type; if (type == TYPE_ALPHA) { hmac[33] = (G_monero_vstate.tx_sign_cnt >> 0) & 0xFF; @@ -234,7 +234,7 @@ static void monero_io_verify_hmac_for(const unsigned char* buffer, int len, hmac[36] = 0; } cx_hmac_sha256(G_monero_vstate.hmac_key, 32, hmac, 37, hmac, 32); - if (os_memcmp(hmac, expected_hmac, 32)) { + if (memcmp(hmac, expected_hmac, 32)) { monero_lock_and_throw(SW_SECURITY_HMAC); } } @@ -260,7 +260,7 @@ int monero_io_fetch_decrypt(unsigned char* buffer, int len, int type) { buffer[i] = G_monero_vstate.io_buffer[G_monero_vstate.io_offset + i] ^ 0x55; } #elif defined(IONOCRYPT) - os_memmove(buffer, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len); + memcpy(buffer, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len); #else // IOCRYPT cx_aes(&G_monero_vstate.spk, CX_DECRYPT | CX_CHAIN_CBC | CX_LAST | CX_PAD_NONE, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len, buffer, len); @@ -293,7 +293,7 @@ int monero_io_fetch_decrypt_key(unsigned char* buffer) { k = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; // view? - if (os_memcmp(k, C_FAKE_SEC_VIEW_KEY, 32) == 0) { + if (memcmp(k, C_FAKE_SEC_VIEW_KEY, 32) == 0) { G_monero_vstate.io_offset += 32; if (G_monero_vstate.tx_in_progress) { monero_io_assert_available(32); @@ -302,11 +302,11 @@ int monero_io_fetch_decrypt_key(unsigned char* buffer) { TYPE_SCALAR); G_monero_vstate.io_offset += 32; } - os_memmove(buffer, G_monero_vstate.a, 32); + memcpy(buffer, G_monero_vstate.a, 32); return 32; } // spend? - else if (os_memcmp(k, C_FAKE_SEC_SPEND_KEY, 32) == 0) { + else if (memcmp(k, C_FAKE_SEC_SPEND_KEY, 32) == 0) { switch (G_monero_vstate.io_ins) { case INS_VERIFY_KEY: case INS_DERIVE_SECRET_KEY: @@ -322,7 +322,7 @@ int monero_io_fetch_decrypt_key(unsigned char* buffer) { G_monero_vstate.io_buffer + G_monero_vstate.io_offset, TYPE_SCALAR); } - os_memmove(buffer, G_monero_vstate.b, 32); + memcpy(buffer, G_monero_vstate.b, 32); return 32; } // else @@ -432,8 +432,8 @@ int monero_io_do(unsigned int io_flags) { if (G_monero_vstate.io_length > MAX_OUT) { THROW(SW_IO_FULL); } - os_memmove(G_io_apdu_buffer, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, - G_monero_vstate.io_length); + memcpy(G_io_apdu_buffer, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, + G_monero_vstate.io_length); if (io_flags & IO_RETURN_AFTER_TX) { monero_io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, G_monero_vstate.io_length); @@ -453,7 +453,7 @@ int monero_io_do(unsigned int io_flags) { G_monero_vstate.io_lc = 0; G_monero_vstate.io_le = 0; G_monero_vstate.io_lc = G_io_apdu_buffer[4]; - os_memmove(G_monero_vstate.io_buffer, G_io_apdu_buffer + 5, G_monero_vstate.io_lc); + memcpy(G_monero_vstate.io_buffer, G_io_apdu_buffer + 5, G_monero_vstate.io_lc); G_monero_vstate.io_length = G_monero_vstate.io_lc; return 0; diff --git a/src/monero_key.c b/src/monero_key.c index 0f552db..db6c70b 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -156,7 +156,7 @@ int monero_apdu_manage_seedwords() { w_start = 0; for (int i = 0; i < 24; i++) { w_end = N_monero_pstate->words[i][0]; - os_memmove(word, &N_monero_pstate->words[i][1], w_end); + memcpy(word, &N_monero_pstate->words[i][1], w_end); word[w_end] = (i == 23) ? 0 : ' '; w_end++; monero_nvm_write(N_monero_pstate->words_list + w_start, word, w_end); @@ -215,8 +215,8 @@ int monero_apdu_display_address() { if (minor | major) { monero_get_subaddress(C, D, index); } else { - os_memmove(C, G_monero_vstate.A, 32); - os_memmove(D, G_monero_vstate.B, 32); + memcpy(C, G_monero_vstate.A, 32); + memcpy(D, G_monero_vstate.B, 32); } // prepare UI @@ -241,9 +241,9 @@ int monero_apdu_display_address() { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -int is_fake_view_key(unsigned char *s) { return os_memcmp(s, C_FAKE_SEC_VIEW_KEY, 32) == 0; } +int is_fake_view_key(unsigned char *s) { return memcmp(s, C_FAKE_SEC_VIEW_KEY, 32) == 0; } -int is_fake_spend_key(unsigned char *s) { return os_memcmp(s, C_FAKE_SEC_SPEND_KEY, 32) == 0; } +int is_fake_spend_key(unsigned char *s) { return memcmp(s, C_FAKE_SEC_SPEND_KEY, 32) == 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ @@ -263,7 +263,7 @@ int monero_apdu_put_key() { monero_io_fetch(sec, 32); monero_io_fetch(pub, 32); monero_ecmul_G(raw, sec); - if (os_memcmp(pub, raw, 32)) { + if (memcmp(pub, raw, 32)) { THROW(SW_WRONG_DATA); return SW_WRONG_DATA; } @@ -273,7 +273,7 @@ int monero_apdu_put_key() { monero_io_fetch(sec, 32); monero_io_fetch(pub, 32); monero_ecmul_G(raw, sec); - if (os_memcmp(pub, raw, 32)) { + if (memcmp(pub, raw, 32)) { THROW(SW_WRONG_DATA); return SW_WRONG_DATA; } @@ -368,15 +368,15 @@ int monero_apdu_verify_key() { monero_secret_key_to_public_key(computed_pub, priv); break; case 1: - os_memmove(computed_pub, G_monero_vstate.A, 32); + memcpy(computed_pub, G_monero_vstate.A, 32); break; case 2: - os_memmove(computed_pub, G_monero_vstate.B, 32); + memcpy(computed_pub, G_monero_vstate.B, 32); break; default: THROW(SW_WRONG_P1P2); } - if (os_memcmp(computed_pub, pub, 32) == 0) { + if (memcmp(computed_pub, pub, 32) == 0) { verified = 1; } @@ -394,8 +394,8 @@ int monero_apdu_get_chacha8_prekey(/*char *prekey*/) { unsigned char pre[32]; monero_io_discard(0); - os_memmove(abt, G_monero_vstate.a, 32); - os_memmove(abt + 32, G_monero_vstate.b, 32); + memcpy(abt, G_monero_vstate.a, 32); + memcpy(abt + 32, G_monero_vstate.b, 32); abt[64] = CHACHA8_KEY_TAIL; monero_keccak_F(abt, 65, pre); monero_io_insert((unsigned char *)G_monero_vstate.keccakF.acc, 200); @@ -420,8 +420,8 @@ int monero_apdu_sc_add(/*unsigned char *r, unsigned char *s1, unsigned char *s2* // https://github.com/monero-project/monero/blob/v0.15.0.5/src/cryptonote_basic/cryptonote_format_utils.cpp#L331 // // hwdev.sc_secret_add(scalar_step2, scalar_step1,subaddr_sk); - if ((os_memcmp(s1, G_monero_vstate.last_derive_secret_key, 32) != 0) || - (os_memcmp(s2, G_monero_vstate.last_get_subaddress_secret_key, 32) != 0)) { + if ((memcmp(s1, G_monero_vstate.last_derive_secret_key, 32) != 0) || + (memcmp(s2, G_monero_vstate.last_get_subaddress_secret_key, 32) != 0)) { monero_lock_and_throw(SW_WRONG_DATA); } } @@ -577,7 +577,7 @@ int monero_apdu_derive_secret_key(/*const crypto::key_derivation &derivation, co monero_derive_secret_key(drvsec, derivation, output_index, sec); // sec key - os_memmove(G_monero_vstate.last_derive_secret_key, drvsec, 32); + memcpy(G_monero_vstate.last_derive_secret_key, drvsec, 32); monero_io_insert_encrypt(drvsec, 32, TYPE_SCALAR); return SW_OK; } @@ -704,7 +704,7 @@ int monero_apdu_get_subaddress_secret_key(/*const crypto::secret_key& sec, const monero_get_subaddress_secret_key(sub_sec, sec, index); - os_memmove(G_monero_vstate.last_get_subaddress_secret_key, sub_sec, 32); + memcpy(G_monero_vstate.last_get_subaddress_secret_key, sub_sec, 32); monero_io_insert_encrypt(sub_sec, 32, TYPE_SCALAR); return SW_OK; } @@ -770,7 +770,7 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se monero_ecmul_G(additional_txkey_pub, additional_txkey_sec); } } else { - os_memset(additional_txkey_pub, 0, 32); + memset(additional_txkey_pub, 0, 32); } // derivation diff --git a/src/monero_main.c b/src/monero_main.c index 9360f7e..650188c 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -80,7 +80,7 @@ void monero_main(void) { } } -unsigned char io_event(unsigned char channel) { +unsigned char io_event(unsigned char channel __attribute__((unused))) { unsigned int s_before; unsigned int s_after; diff --git a/src/monero_mlsag.c b/src/monero_mlsag.c index 415cc93..7c255d5 100644 --- a/src/monero_mlsag.c +++ b/src/monero_mlsag.c @@ -79,7 +79,7 @@ int monero_apdu_mlsag_hash() { unsigned char c[32]; if (G_monero_vstate.io_p2 == 1) { monero_keccak_init_H(); - os_memmove(msg, G_monero_vstate.mlsagH, 32); + memcpy(msg, G_monero_vstate.mlsagH, 32); } else { monero_io_fetch(msg, 32); } @@ -90,7 +90,7 @@ int monero_apdu_mlsag_hash() { monero_keccak_final_H(c); monero_reduce(c, c); monero_io_insert(c, 32); - os_memmove(G_monero_vstate.c, c, 32); + memcpy(G_monero_vstate.c, c, 32); } return SW_OK; } diff --git a/src/monero_monero.c b/src/monero_monero.c index 783f21b..bdb306d 100644 --- a/src/monero_monero.c +++ b/src/monero_monero.c @@ -150,15 +150,15 @@ int monero_base58_public_key(char* str_b58, unsigned char* view, unsigned char* } offset = monero_encode_varint(data, 8, prefix); - os_memmove(data + offset, spend, 32); - os_memmove(data + offset + 32, view, 32); + memcpy(data + offset, spend, 32); + memcpy(data + offset + 32, view, 32); offset += 64; if (paymanetID) { - os_memmove(data + offset, paymanetID, 8); + memcpy(data + offset, paymanetID, 8); offset += 8; } monero_keccak_F(data, offset, G_monero_vstate.mlsagH); - os_memmove(data + offset, G_monero_vstate.mlsagH, 4); + memcpy(data + offset, G_monero_vstate.mlsagH, 4); offset += 4; unsigned int full_block_count = (offset) / FULL_BLOCK_SIZE; diff --git a/src/monero_open_tx.c b/src/monero_open_tx.c index 093eec0..58e8cf7 100644 --- a/src/monero_open_tx.c +++ b/src/monero_open_tx.c @@ -26,8 +26,8 @@ /* --- --- */ /* ----------------------------------------------------------------------- */ void monero_reset_tx(int reset_tx_cnt) { - os_memset(G_monero_vstate.r, 0, 32); - os_memset(G_monero_vstate.R, 0, 32); + memset(G_monero_vstate.r, 0, 32); + memset(G_monero_vstate.R, 0, 32); cx_rng(G_monero_vstate.hmac_key, 32); monero_keccak_init_H(); @@ -66,7 +66,7 @@ int monero_apdu_open_tx_cont() { G_monero_vstate.tx_in_progress = 1; #ifdef DEBUG_HWDEVICE - os_memset(G_monero_vstate.hmac_key, 0xab, 32); + memset(G_monero_vstate.hmac_key, 0xab, 32); #else cx_rng(G_monero_vstate.hmac_key, 32); #endif diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 7e3cb96..1e49198 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -119,9 +119,9 @@ int monero_apdu_mlsag_prehash_update() { monero_ecmul_H(aH, v); monero_ecadd(aH, kG, aH); } else { - os_memmove(aH, kG, 32); + memcpy(aH, kG, 32); } - if (os_memcmp(C, aH, 32)) { + if (memcmp(C, aH, 32)) { monero_lock_and_throw(SW_SECURITY_COMMITMENT_CONTROL); } // update commitment hash control @@ -131,7 +131,7 @@ int monero_apdu_mlsag_prehash_update() { if (G_monero_vstate.io_protocol_version >= 2) { // finalize and check destination hash_control monero_sha256_outkeys_final(k); - if (os_memcmp(k, G_monero_vstate.OUTK, 32)) { + if (memcmp(k, G_monero_vstate.OUTK, 32)) { monero_lock_and_throw(SW_SECURITY_OUTKEYS_CHAIN_CONTROL); } } @@ -176,7 +176,7 @@ int monero_apdu_mlsag_prehash_finalize() { // Finalize and check commitment hash control if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { monero_sha256_commitment_final(H); - if (os_memcmp(H, G_monero_vstate.C, 32)) { + if (memcmp(H, G_monero_vstate.C, 32)) { monero_lock_and_throw(SW_SECURITY_COMMITMENT_CHAIN_CONTROL); } } @@ -188,7 +188,7 @@ int monero_apdu_mlsag_prehash_finalize() { monero_io_discard(1); monero_keccak_init_H(); if (G_monero_vstate.io_protocol_version >= 3) { - if (os_memcmp(message, G_monero_vstate.prefixH, 32) != 0) { + if (memcmp(message, G_monero_vstate.prefixH, 32) != 0) { monero_lock_and_throw(SW_SECURITY_PREFIX_HASH); } } diff --git a/src/monero_proof.c b/src/monero_proof.c index 9708e47..ca4b265 100644 --- a/src/monero_proof.c +++ b/src/monero_proof.c @@ -55,9 +55,9 @@ int monero_apdu_get_tx_proof() { // Generate random k monero_rng_mod_order(k); // tmp = msg - os_memmove(G_monero_vstate.tmp + 32 * 0, msg, 32); + memcpy(G_monero_vstate.tmp + 32 * 0, msg, 32); // tmp = msg || D - os_memmove(G_monero_vstate.tmp + 32 * 1, D, 32); + memcpy(G_monero_vstate.tmp + 32 * 1, D, 32); if (G_monero_vstate.options & 1) { // X = kB @@ -67,21 +67,21 @@ int monero_apdu_get_tx_proof() { monero_ecmul_G(XY, k); } // tmp = msg || D || X - os_memmove(G_monero_vstate.tmp + 32 * 2, XY, 32); + memcpy(G_monero_vstate.tmp + 32 * 2, XY, 32); // Y = kA monero_ecmul_k(XY, A, k); // tmp = msg || D || X || Y - os_memmove(G_monero_vstate.tmp + 32 * 3, XY, 32); + memcpy(G_monero_vstate.tmp + 32 * 3, XY, 32); monero_keccak_H((unsigned char *)"TXPROOF_V2", 10, sep); // tmp = msg || D || X || Y || sep - os_memmove(G_monero_vstate.tmp + 32 * 4, sep, 32); + memcpy(G_monero_vstate.tmp + 32 * 4, sep, 32); // tmp = msg || D || X || Y || sep || R - os_memmove(G_monero_vstate.tmp + 32 * 5, R, 32); + memcpy(G_monero_vstate.tmp + 32 * 5, R, 32); // tmp = msg || D || X || Y || sep || R || A - os_memmove(G_monero_vstate.tmp + 32 * 6, A, 32); + memcpy(G_monero_vstate.tmp + 32 * 6, A, 32); // tmp = msg || D || X || Y || sep || R || B or [0] - os_memmove(G_monero_vstate.tmp + 32 * 7, B, 32); + memcpy(G_monero_vstate.tmp + 32 * 7, B, 32); // sig_c = H_n(tmp) monero_hash_to_scalar(sig_c, &G_monero_vstate.tmp[0], 32 * 8); diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 59266c6..e0ee24d 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -85,14 +85,16 @@ UX_STEP_CB(ux_menu_words_3_step, pb, ui_menu_words_back(0), {&C_icon_back, "back UX_FLOW(ux_flow_words, &ux_menu_words_1_step, &ux_menu_words_2_step, &ux_menu_words_3_step); -void ui_menu_words_clear(unsigned int value) { +void ui_menu_words_clear(unsigned int value __attribute__((unused))) { monero_clear_words(); ui_menu_main_display(0); } -void ui_menu_words_back(unsigned int value) { ui_menu_main_display(1); } +void ui_menu_words_back(unsigned int value __attribute__((unused))) { ui_menu_main_display(1); } -void ui_menu_words_display(unsigned int value) { ux_flow_init(0, ux_flow_words, NULL); } +void ui_menu_words_display(unsigned int value __attribute__((unused))) { + ux_flow_init(0, ux_flow_words, NULL); +} void settings_show_25_words(void) { ui_menu_words_display(0); } /* -------------------------------- INFO UX --------------------------------- */ @@ -106,7 +108,7 @@ UX_STEP_CB(ux_menu_info_1_step, nn, ui_menu_info_action(0), UX_FLOW(ux_flow_info, &ux_menu_info_1_step); -unsigned int ui_menu_info_action(unsigned int value) { +unsigned int ui_menu_info_action(unsigned int value __attribute__((unused))) { if (G_monero_vstate.protocol_barrier == PROTOCOL_LOCKED) { ui_menu_pinlock_display(); } else { @@ -115,13 +117,15 @@ unsigned int ui_menu_info_action(unsigned int value) { return 0; } -void ui_menu_info_display2(unsigned int value, char* line1, char* line2) { +void ui_menu_info_display2(unsigned int value __attribute__((unused)), char* line1, char* line2) { snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "%s", line1); snprintf(G_monero_vstate.ux_info2, sizeof(G_monero_vstate.ux_info2), "%s", line2); ux_flow_init(0, ux_flow_info, NULL); } -void ui_menu_info_display(unsigned int value) { ux_flow_init(0, ux_flow_info, NULL); } +void ui_menu_info_display(unsigned int value __attribute__((unused))) { + ux_flow_init(0, ux_flow_info, NULL); +} /* -------------------------------- OPEN TX UX --------------------------------- */ unsigned int ui_menu_opentx_action(unsigned int value); @@ -139,7 +143,7 @@ unsigned int ui_menu_opentx_action(unsigned int value) { unsigned char x[32]; monero_io_discard(0); - os_memset(x, 0, 32); + memset(x, 0, 32); sw = SW_OK; if (value == ACCEPT) { @@ -166,7 +170,7 @@ void ui_menu_opentx_display(unsigned int value) { } } #else -void ui_menu_opentx_display(unsigned int value) { +void ui_menu_opentx_display(unsigned int value __attribute__((unused))) { uint32_t i; if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "Processing TX"); @@ -237,13 +241,15 @@ void ui_menu_amount_validation_action(unsigned int value) { ui_menu_info_display2(0, "Processing TX", "..."); } -void ui_menu_fee_validation_display(unsigned int value) { ux_flow_init(0, ux_flow_fee, NULL); } +void ui_menu_fee_validation_display(unsigned int value __attribute__((unused))) { + ux_flow_init(0, ux_flow_fee, NULL); +} -void ui_menu_change_validation_display(unsigned int value) { +void ui_menu_change_validation_display(unsigned int value __attribute__((unused))) { ux_flow_init(0, ux_flow_change, NULL); } -void ui_menu_timelock_validation_display(unsigned int value) { +void ui_menu_timelock_validation_display(unsigned int value __attribute__((unused))) { ux_flow_init(0, ux_flow_timelock, NULL); } /* ----------------------------- USER DEST/AMOUNT VALIDATION ----------------------------- */ @@ -268,7 +274,9 @@ UX_STEP_CB(ux_menu_validation_4_step, pb, ui_menu_validation_action(REJECT), UX_FLOW(ux_flow_validation, &ux_menu_validation_1_step, &ux_menu_validation_2_step, &ux_menu_validation_3_step, &ux_menu_validation_4_step); -void ui_menu_validation_display(unsigned int value) { ux_flow_init(0, ux_flow_validation, NULL); } +void ui_menu_validation_display(unsigned int value __attribute__((unused))) { + ux_flow_init(0, ux_flow_validation, NULL); +} void ui_menu_validation_action(unsigned int value) { unsigned short sw; @@ -297,7 +305,7 @@ UX_STEP_CB(ux_menu_export_viewkey_3_step, pb, ui_menu_export_viewkey_action(REJE UX_FLOW(ux_flow_export_viewkey, &ux_menu_export_viewkey_1_step, &ux_menu_export_viewkey_2_step, &ux_menu_export_viewkey_3_step); -void ui_export_viewkey_display(unsigned int value) { +void ui_export_viewkey_display(unsigned int value __attribute__((unused))) { ux_flow_init(0, ux_flow_export_viewkey, NULL); } @@ -306,7 +314,7 @@ unsigned int ui_menu_export_viewkey_action(unsigned int value) { unsigned char x[32]; monero_io_discard(0); - os_memset(x, 0, 32); + memset(x, 0, 32); sw = SW_OK; if (value == ACCEPT) { @@ -350,11 +358,11 @@ void account_submenu_selector(unsigned int idx) { ui_menu_main_display(0); } -void ui_menu_account_display(unsigned int value) { +void ui_menu_account_display(void) { ux_menulist_init(G_ux.stack_count - 1, account_submenu_getter, account_submenu_selector); } -void settings_change_account(void) { ui_menu_account_display(0); } +void settings_change_account(void) { ui_menu_account_display(); } /* -------------------------------- NETWORK UX --------------------------------- */ @@ -429,13 +437,13 @@ void network_submenu_selector(unsigned int idx) { ui_menu_main_display(0); } -void ui_menu_network_display(unsigned int value) { +void ui_menu_network_display(void) { ux_menulist_init(G_ux.stack_count - 1, network_submenu_getter, network_submenu_selector); } -void settings_change_network(void) { ui_menu_network_display(0); } +void settings_change_network(void) { ui_menu_network_display(); } /* -------------------------------- RESET UX --------------------------------- */ -void ui_menu_reset_display(unsigned int value); +void ui_menu_reset_display(void); void ui_menu_reset_action(unsigned int value); UX_STEP_NOCB(ux_menu_reset_1_step, nn, @@ -458,9 +466,9 @@ UX_STEP_CB(ux_menu_reset_3_step, pb, ui_menu_reset_action(ACCEPT), UX_FLOW(ux_flow_reset, &ux_menu_reset_1_step, &ux_menu_reset_2_step, &ux_menu_reset_3_step); -void ui_menu_reset_display(unsigned int value) { ux_flow_init(0, ux_flow_reset, 0); } +void ui_menu_reset_display(void) { ux_flow_init(0, ux_flow_reset, 0); } -void settings_reset(void) { ui_menu_reset_display(0); } +void settings_reset(void) { ui_menu_reset_display(); } void ui_menu_reset_action(unsigned int value) { if (value == ACCEPT) { @@ -549,7 +557,7 @@ UX_FLOW(ux_flow_about, #endif &ux_menu_about_2_step); -void ui_menu_about_display(unsigned int value) { ux_flow_init(0, ux_flow_about, NULL); } +void ui_menu_about_display(void) { ux_flow_init(0, ux_flow_about, NULL); } #undef STR #undef XSTR @@ -583,7 +591,7 @@ UX_STEP_CB(ux_menu_pubaddr_2_step, pb, ui_menu_pubaddr_action(0), {&C_icon_back, UX_FLOW(ux_flow_pubaddr, &ux_menu_pubaddr_01_step, &ux_menu_pubaddr_02_step, &ux_menu_pubaddr_1_step, &ux_menu_pubaddr_2_step); -void ui_menu_pubaddr_action(unsigned int value) { +void ui_menu_pubaddr_action(unsigned int value __attribute__((unused))) { if (G_monero_vstate.disp_addr_mode) { monero_io_insert_u16(SW_OK); monero_io_do(IO_RETURN_AFTER_TX); @@ -595,29 +603,29 @@ void ui_menu_pubaddr_action(unsigned int value) { /** * */ -void ui_menu_any_pubaddr_display(unsigned int value, unsigned char* pub_view, - unsigned char* pub_spend, unsigned char is_subbadress, - unsigned char* paymanetID) { +void ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), + unsigned char* pub_view, unsigned char* pub_spend, + unsigned char is_subbadress, unsigned char* paymanetID) { memset(G_monero_vstate.ux_address, 0, sizeof(G_monero_vstate.ux_address)); switch (G_monero_vstate.disp_addr_mode) { case 0: case DISP_MAIN: - os_memmove(ADDR_TYPE, "Main", 4); - os_memmove(ADDR_MAJOR, "Major: 0", 8); - os_memmove(ADDR_MINOR, "minor: 0", 8); + memcpy(ADDR_TYPE, "Main", 4); + memcpy(ADDR_MAJOR, "Major: 0", 8); + memcpy(ADDR_MINOR, "minor: 0", 8); break; case DISP_SUB: - os_memmove(ADDR_TYPE, "Sub", 3); + memcpy(ADDR_TYPE, "Sub", 3); snprintf(ADDR_MAJOR, 16, "Major: %d", G_monero_vstate.disp_addr_M); snprintf(ADDR_MINOR, 16, "minor: %d", G_monero_vstate.disp_addr_m); break; case DISP_INTEGRATED: - os_memmove(ADDR_TYPE, "Integrated", 10); - os_memmove(ADDR_IDSTR, "Payment ID", 10); - os_memmove(ADDR_ID, G_monero_vstate.payment_id, 16); + memcpy(ADDR_TYPE, "Integrated", 10); + memcpy(ADDR_IDSTR, "Payment ID", 10); + memcpy(ADDR_ID, G_monero_vstate.payment_id, 16); break; } @@ -651,14 +659,14 @@ UX_STEP_CB(ux_menu_main_2_step, pb, settings_submenu_selector), {&C_icon_coggle, "Settings"}); -UX_STEP_CB(ux_menu_main_3_step, pb, ui_menu_about_display(0), {&C_icon_certificate, "About"}); +UX_STEP_CB(ux_menu_main_3_step, pb, ui_menu_about_display(), {&C_icon_certificate, "About"}); UX_STEP_CB(ux_menu_main_4_step, pb, os_sched_exit(0), {&C_icon_dashboard_x, "Quit app"}); UX_FLOW(ux_flow_main, &ux_menu_main_1_step, &ux_menu_main_2_step, &ux_menu_main_3_step, &ux_menu_main_4_step); -void ui_menu_main_display(unsigned int value) { +void ui_menu_main_display(unsigned int value __attribute__((unused))) { // reserve a display stack slot if none yet if (G_ux.stack_count == 0) { ux_stack_push(); diff --git a/src/monero_ux_nanos.c b/src/monero_ux_nanos.c index d047d6b..2ff1895 100644 --- a/src/monero_ux_nanos.c +++ b/src/monero_ux_nanos.c @@ -104,16 +104,16 @@ const bagl_element_t* ui_menu_words_preprocessor(const ux_menu_entry_t* entry, return element; } -void ui_menu_words_display(unsigned int value) { +void ui_menu_words_display(unsigned int value __attribute__((unused))) { UX_MENU_DISPLAY(0, ui_menu_words, ui_menu_words_preprocessor); } -void ui_menu_words_clear(unsigned int value) { +void ui_menu_words_clear(unsigned int value __attribute__((unused))) { monero_clear_words(); ui_menu_main_display(0); } -void ui_menu_words_back(unsigned int value) { ui_menu_settings_display(1); } +void ui_menu_words_back(unsigned int value __attribute__((unused))) { ui_menu_settings_display(1); } /* -------------------------------- INFO UX --------------------------------- */ unsigned int ui_menu_info_button(unsigned int button_mask, unsigned int button_mask_counter); @@ -132,7 +132,8 @@ const bagl_element_t ui_menu_info[] = { G_monero_vstate.ux_info2}, }; -unsigned int ui_menu_info_button(unsigned int button_mask, unsigned int button_mask_counter) { +unsigned int ui_menu_info_button(unsigned int button_mask, + unsigned int button_mask_counter __attribute__((unused))) { switch (button_mask) { case BUTTON_EVT_RELEASED | BUTTON_RIGHT: case BUTTON_EVT_RELEASED | BUTTON_LEFT: @@ -149,13 +150,15 @@ unsigned int ui_menu_info_button(unsigned int button_mask, unsigned int button_m return 0; } -void ui_menu_info_display2(unsigned int value, char* line1, char* line2) { +void ui_menu_info_display2(unsigned int value __attribute__((unused)), char* line1, char* line2) { snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "%s", line1); snprintf(G_monero_vstate.ux_info2, sizeof(G_monero_vstate.ux_info2), "%s", line2); UX_DISPLAY(ui_menu_info, NULL); } -void ui_menu_info_display(unsigned int value) { UX_DISPLAY(ui_menu_info, NULL); } +void ui_menu_info_display(unsigned int value __attribute__((unused))) { + UX_DISPLAY(ui_menu_info, NULL); +} /* -------------------------------- OPEN TX UX --------------------------------- */ @@ -180,12 +183,13 @@ const bagl_element_t ui_menu_opentx[] = { }; -unsigned int ui_menu_opentx_button(unsigned int button_mask, unsigned int button_mask_counter) { +unsigned int ui_menu_opentx_button(unsigned int button_mask, + unsigned int button_mask_counter __attribute__((unused))) { unsigned int sw; unsigned char x[32]; monero_io_discard(0); - os_memset(x, 0, 32); + memset(x, 0, 32); sw = SW_OK; switch (button_mask) { @@ -221,7 +225,7 @@ void ui_menu_opentx_display(unsigned int value) { } } #else -void ui_menu_opentx_display(unsigned int value) { +void ui_menu_opentx_display(unsigned int value __attribute__((unused))) { uint32_t i; if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "Processing TX"); @@ -283,13 +287,13 @@ void ui_menu_amount_validation_action(unsigned int value) { ui_menu_info_display2(0, "Processing TX", "..."); } -void ui_menu_fee_validation_display(unsigned int value) { +void ui_menu_fee_validation_display(unsigned int value __attribute__((unused))) { UX_MENU_DISPLAY(0, ui_menu_fee_validation, ui_menu_amount_validation_preprocessor); } -void ui_menu_change_validation_display(unsigned int value) { +void ui_menu_change_validation_display(unsigned int value __attribute__((unused))) { UX_MENU_DISPLAY(0, ui_menu_change_validation, ui_menu_amount_validation_preprocessor); } -void ui_menu_timelock_validation_display(unsigned int value) { +void ui_menu_timelock_validation_display(unsigned int value __attribute__((unused))) { UX_MENU_DISPLAY(0, ui_menu_timelock_validation, ui_menu_amount_validation_preprocessor); } @@ -319,48 +323,48 @@ const bagl_element_t* ui_menu_validation_preprocessor(const ux_menu_entry_t* ent /* --- Destination --- */ if (entry == &ui_menu_validation[1]) { if (element->component.userid == 0x22) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 0, 11); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 0, 11); element->text = G_monero_vstate.ux_menu; } } if (entry == &ui_menu_validation[2]) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); if (element->component.userid == 0x21) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 1, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 1, 11); } if (element->component.userid == 0x22) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 2, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 2, 11); } element->text = G_monero_vstate.ux_menu; } if (entry == &ui_menu_validation[3]) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); if (element->component.userid == 0x21) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 3, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 3, 11); } if (element->component.userid == 0x22) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 4, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 4, 11); } element->text = G_monero_vstate.ux_menu; } if (entry == &ui_menu_validation[4]) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); if (element->component.userid == 0x21) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 5, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 5, 11); } if (element->component.userid == 0x22) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 6, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 6, 11); } element->text = G_monero_vstate.ux_menu; } if (entry == &ui_menu_validation[5]) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); if (element->component.userid == 0x21) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 7, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 7, 11); } if (element->component.userid == 0x22) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 8, 7); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 8, 7); } element->text = G_monero_vstate.ux_menu; } @@ -368,7 +372,7 @@ const bagl_element_t* ui_menu_validation_preprocessor(const ux_menu_entry_t* ent return element; } -void ui_menu_validation_display(unsigned int value) { +void ui_menu_validation_display(unsigned int value __attribute__((unused))) { UX_MENU_DISPLAY(0, ui_menu_validation, ui_menu_validation_preprocessor); } @@ -407,7 +411,7 @@ const bagl_element_t ui_export_viewkey[] = { G_monero_vstate.ux_menu}, }; -void ui_export_viewkey_display(unsigned int value) { +void ui_export_viewkey_display(unsigned int value __attribute__((unused))) { UX_DISPLAY(ui_export_viewkey, (void*)ui_export_viewkey_prepro); } @@ -424,12 +428,13 @@ unsigned int ui_export_viewkey_prepro(const bagl_element_t* element) { return 1; } -unsigned int ui_export_viewkey_button(unsigned int button_mask, unsigned int button_mask_counter) { +unsigned int ui_export_viewkey_button(unsigned int button_mask, + unsigned int button_mask_counter __attribute__((unused))) { unsigned int sw; unsigned char x[32]; monero_io_discard(0); - os_memset(x, 0, 32); + memset(x, 0, 32); sw = SW_OK; switch (button_mask) { @@ -472,7 +477,7 @@ const ux_menu_entry_t ui_menu_account[] = { const bagl_element_t* ui_menu_account_preprocessor(const ux_menu_entry_t* entry, bagl_element_t* element) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); for (unsigned int i = 2; i < 12; i++) { if ((entry == &ui_menu_account[i]) && (element->component.userid == 0x20) && (N_monero_pstate->account_id == (i - 2))) { @@ -509,23 +514,23 @@ const ux_menu_entry_t ui_menu_network[] = { const bagl_element_t* ui_menu_network_preprocessor(const ux_menu_entry_t* entry, bagl_element_t* element) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); if ((entry == &ui_menu_network[2]) && (element->component.userid == 0x20) && (N_monero_pstate->network_id == TESTNET)) { - os_memmove(G_monero_vstate.ux_menu, "Test Network ", 14); + memcpy(G_monero_vstate.ux_menu, "Test Network ", 14); G_monero_vstate.ux_menu[13] = '+'; element->text = G_monero_vstate.ux_menu; } if ((entry == &ui_menu_network[3]) && (element->component.userid == 0x20) && (N_monero_pstate->network_id == STAGENET)) { - os_memmove(G_monero_vstate.ux_menu, "Stage Network ", 14); + memcpy(G_monero_vstate.ux_menu, "Stage Network ", 14); G_monero_vstate.ux_menu[13] = '+'; element->text = G_monero_vstate.ux_menu; } #ifndef MONERO_ALPHA if ((entry == &ui_menu_network[4]) && (element->component.userid == 0x20) && (N_monero_pstate->network_id == MAINNET)) { - os_memmove(G_monero_vstate.ux_menu, "Main Network ", 14); + memcpy(G_monero_vstate.ux_menu, "Main Network ", 14); G_monero_vstate.ux_menu[13] = '+'; element->text = G_monero_vstate.ux_menu; } @@ -551,7 +556,7 @@ const ux_menu_entry_t ui_menu_reset[] = { {NULL, ui_menu_reset_action, 0, NULL, "Yes", NULL, 0, 0}, UX_MENU_END}; -void ui_menu_reset_action(unsigned int value) { +void ui_menu_reset_action(unsigned int value __attribute__((unused))) { unsigned char magic[4]; magic[0] = 0; magic[1] = 0; @@ -613,30 +618,30 @@ const bagl_element_t* ui_menu_pubaddr_preprocessor(const ux_menu_entry_t* entry, bagl_element_t* element) { /* --- address --- */ if (entry == &ui_menu_pubaddr[0]) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); if (element->component.userid == 0x21) { switch (G_monero_vstate.disp_addr_mode) { case 0: case DISP_MAIN: - os_memmove(G_monero_vstate.ux_menu, "Main", 4); + memcpy(G_monero_vstate.ux_menu, "Main", 4); break; case DISP_SUB: - os_memmove(G_monero_vstate.ux_menu, "Sub", 3); + memcpy(G_monero_vstate.ux_menu, "Sub", 3); break; case DISP_INTEGRATED: - os_memmove(G_monero_vstate.ux_menu, "Integrated", 10); + memcpy(G_monero_vstate.ux_menu, "Integrated", 10); break; } element->text = G_monero_vstate.ux_menu; } if (element->component.userid == 0x22) { - os_memmove(G_monero_vstate.ux_menu, "Address", 7); + memcpy(G_monero_vstate.ux_menu, "Address", 7); element->text = G_monero_vstate.ux_menu; } } if (entry == &ui_menu_pubaddr[1]) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); if (element->component.userid == 0x21) { switch (G_monero_vstate.disp_addr_mode) { case 0: @@ -646,7 +651,7 @@ const bagl_element_t* ui_menu_pubaddr_preprocessor(const ux_menu_entry_t* entry, G_monero_vstate.disp_addr_M); break; case DISP_INTEGRATED: - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.payment_id, 8); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.payment_id, 8); break; } element->text = G_monero_vstate.ux_menu; @@ -660,7 +665,7 @@ const bagl_element_t* ui_menu_pubaddr_preprocessor(const ux_menu_entry_t* entry, G_monero_vstate.disp_addr_m); break; case DISP_INTEGRATED: - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.payment_id + 8, 8); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.payment_id + 8, 8); break; } element->text = G_monero_vstate.ux_menu; @@ -669,58 +674,58 @@ const bagl_element_t* ui_menu_pubaddr_preprocessor(const ux_menu_entry_t* entry, } if (entry == &ui_menu_pubaddr[2]) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); if (element->component.userid == 0x21) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 0, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 0, 11); } if (element->component.userid == 0x22) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 1, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 1, 11); } element->text = G_monero_vstate.ux_menu; } if (entry == &ui_menu_pubaddr[3]) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); if (element->component.userid == 0x21) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 2, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 2, 11); } if (element->component.userid == 0x22) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 3, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 3, 11); } element->text = G_monero_vstate.ux_menu; } if (entry == &ui_menu_pubaddr[4]) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); if (element->component.userid == 0x21) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 4, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 4, 11); } if (element->component.userid == 0x22) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 5, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 5, 11); } element->text = G_monero_vstate.ux_menu; } if (entry == &ui_menu_pubaddr[5]) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); if (element->component.userid == 0x21) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 6, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 6, 11); } if (element->component.userid == 0x22) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 7, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 7, 11); } element->text = G_monero_vstate.ux_menu; } if (entry == &ui_menu_pubaddr[6]) { - os_memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); + memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); if (element->component.userid == 0x21) { if (G_monero_vstate.disp_addr_mode == DISP_INTEGRATED) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 8, 11); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 8, 11); } else { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 8, 7); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 8, 7); } } if (element->component.userid == 0x22) { if (G_monero_vstate.disp_addr_mode == DISP_INTEGRATED) { - os_memmove(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 9, 7); + memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 9, 7); } } element->text = G_monero_vstate.ux_menu; @@ -729,7 +734,7 @@ const bagl_element_t* ui_menu_pubaddr_preprocessor(const ux_menu_entry_t* entry, return element; } -void ui_menu_pubaddr_action(unsigned int value) { +void ui_menu_pubaddr_action(unsigned int value __attribute__((unused))) { if (G_monero_vstate.disp_addr_mode) { monero_io_insert_u16(SW_OK); monero_io_do(IO_RETURN_AFTER_TX); From c95fa33974a2d3955e5e4c062f2ade5c5b10671e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Thu, 4 Aug 2022 07:56:58 +0200 Subject: [PATCH 064/142] Fix wrong check on protocol version when handling MLSAG --- src/monero_dispatch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monero_dispatch.c b/src/monero_dispatch.c index b11ff4e..be29f84 100644 --- a/src/monero_dispatch.c +++ b/src/monero_dispatch.c @@ -434,7 +434,7 @@ int monero_dispatch() { // 1. state machine check if ((G_monero_vstate.tx_state_ins != INS_VALIDATE) && // (G_monero_vstate.tx_state_ins != INS_MLSAG) && // - ((G_monero_vstate.protocol != 3) || (G_monero_vstate.protocol != 4))) { + (G_monero_vstate.protocol != 3 && G_monero_vstate.protocol != 4)) { THROW(SW_COMMAND_NOT_ALLOWED); } if (G_monero_vstate.tx_state_ins == INS_VALIDATE) { From 8c0d3b1a735fa22ec1b680a7991504fe182c2243 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Thu, 4 Aug 2022 08:06:43 +0200 Subject: [PATCH 065/142] Fix last compilation warnings --- src/monero_api.h | 2 +- src/monero_clsag.c | 1 - src/monero_crypto.c | 4 ++-- src/monero_key.c | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index aad8aed..cf4467e 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -242,7 +242,7 @@ unsigned int monero_encode_varint(unsigned char *varint, unsigned int max_len, u /** * LE-7-bits decoding. High bit set says one more byte to decode. */ -unsigned int monero_decode_varint(unsigned char *varint, unsigned int max_len, uint64_t *v); +unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, uint64_t *value); /** */ void monero_reverse32(unsigned char *rscal, unsigned char *scal); diff --git a/src/monero_clsag.c b/src/monero_clsag.c index d48796f..73db36e 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -40,7 +40,6 @@ } */ int monero_apdu_clsag_prepare() { - int options; unsigned char a[32]; unsigned char p[32]; unsigned char z[32]; diff --git a/src/monero_crypto.c b/src/monero_crypto.c index a8c178a..b510de8 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -101,9 +101,9 @@ unsigned int monero_encode_varint(unsigned char *varint, unsigned int max_len, u /* ----------------------------------------------------------------------- */ /* --- assert: max_len>0 --- */ /* ----------------------------------------------------------------------- */ -unsigned int monero_decode_varint(unsigned char *varint, unsigned int max_len, uint64_t *value) { +unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, uint64_t *value) { uint64_t v; - int len; + size_t len; v = 0; len = 0; while ((varint[len]) & 0x80) { diff --git a/src/monero_key.c b/src/monero_key.c index db6c70b..948be9a 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -156,10 +156,10 @@ int monero_apdu_manage_seedwords() { w_start = 0; for (int i = 0; i < 24; i++) { w_end = N_monero_pstate->words[i][0]; - memcpy(word, &N_monero_pstate->words[i][1], w_end); + memcpy(word, (char *)&N_monero_pstate->words[i][1], w_end); word[w_end] = (i == 23) ? 0 : ' '; w_end++; - monero_nvm_write(N_monero_pstate->words_list + w_start, word, w_end); + monero_nvm_write((char *)N_monero_pstate->words_list + w_start, word, w_end); w_start += w_end; } #endif From b635807a43d8f616646966dbb8a11ded7153a9b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Thu, 4 Aug 2022 08:09:12 +0200 Subject: [PATCH 066/142] Add noreturn attribute to monero_lock_and_throw This helps static analyzers, and removes a fake positive found by Clang Static Analyzer --- src/monero_api.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monero_api.h b/src/monero_api.h index cf4467e..0f5f093 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -21,7 +21,7 @@ int monero_apdu_reset(void); int monero_apdu_lock(void); -void monero_lock_and_throw(int sw); +void monero_lock_and_throw(int sw) __attribute__((noreturn)); void monero_install(unsigned char netId); void monero_init(void); From 33a50f068752dd94c580a998a85ad61ff996aa4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Thu, 4 Aug 2022 08:16:29 +0200 Subject: [PATCH 067/142] Fix last defects identified by Clang Static Analyzer --- src/monero_key.c | 3 +-- src/monero_monero.c | 3 +++ src/monero_open_tx.c | 4 +--- src/monero_ux_nano.c | 3 +-- src/monero_ux_nanos.c | 3 +-- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/monero_key.c b/src/monero_key.c index 948be9a..4acce08 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -715,7 +715,6 @@ int monero_apdu_get_subaddress_secret_key(/*const crypto::secret_key& sec, const int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_sec, crypto::public_key Aout, crypto::public_key Bout, size_t output_index, bool is_change, bool is_subaddress, bool need_additional_key, bool use_view_tags*/) { // IN - unsigned int tx_version; unsigned char tx_key[32]; unsigned char *txkey_pub; unsigned char *Aout; @@ -734,7 +733,7 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se // TMP unsigned char derivation[32]; - tx_version = monero_io_fetch_u32(); + monero_io_fetch_u32(); // skip tx_version monero_io_fetch_decrypt_key(tx_key); txkey_pub = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; monero_io_fetch(NULL, 32); diff --git a/src/monero_monero.c b/src/monero_monero.c index bdb306d..0923358 100644 --- a/src/monero_monero.c +++ b/src/monero_monero.c @@ -147,6 +147,9 @@ int monero_base58_public_key(char* str_b58, unsigned char* view, unsigned char* } break; #endif + default: + str_b58[0] = 0; + return 0; } offset = monero_encode_varint(data, 8, prefix); diff --git a/src/monero_open_tx.c b/src/monero_open_tx.c index 58e8cf7..aae6afd 100644 --- a/src/monero_open_tx.c +++ b/src/monero_open_tx.c @@ -47,9 +47,7 @@ void monero_reset_tx(int reset_tx_cnt) { * HD wallet not yet supported : account is assumed to be zero */ int monero_apdu_open_tx() { - unsigned int account; - - account = monero_io_fetch_u32(); + monero_io_fetch_u32(); // skip account monero_io_discard(1); diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index e0ee24d..fd90577 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -139,12 +139,11 @@ UX_STEP_CB(ux_menu_opentx_3_step, pb, ui_menu_opentx_action(REJECT), {&C_icon_cr UX_FLOW(ux_flow_opentx, &ux_menu_opentx_1_step, &ux_menu_opentx_2_step, &ux_menu_opentx_3_step); unsigned int ui_menu_opentx_action(unsigned int value) { - unsigned int sw; + unsigned int sw = SW_OK; unsigned char x[32]; monero_io_discard(0); memset(x, 0, 32); - sw = SW_OK; if (value == ACCEPT) { sw = monero_apdu_open_tx_cont(); diff --git a/src/monero_ux_nanos.c b/src/monero_ux_nanos.c index 2ff1895..9b3fe90 100644 --- a/src/monero_ux_nanos.c +++ b/src/monero_ux_nanos.c @@ -185,12 +185,11 @@ const bagl_element_t ui_menu_opentx[] = { unsigned int ui_menu_opentx_button(unsigned int button_mask, unsigned int button_mask_counter __attribute__((unused))) { - unsigned int sw; + unsigned int sw = SW_OK; unsigned char x[32]; monero_io_discard(0); memset(x, 0, 32); - sw = SW_OK; switch (button_mask) { case BUTTON_EVT_RELEASED | BUTTON_LEFT: // CANCEL From 81e79bcf9cb783d6ba83f67aa117dcd5c6f04386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Thu, 4 Aug 2022 08:21:16 +0200 Subject: [PATCH 068/142] Enable Clang Static Analyzer in CI --- .github/workflows/ci-workflow.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml index e369dfd..627c486 100644 --- a/.github/workflows/ci-workflow.yml +++ b/.github/workflows/ci-workflow.yml @@ -32,6 +32,26 @@ jobs: name: monero-app-debug path: bin + scan-build: + name: Clang Static Analyzer + runs-on: ubuntu-latest + + container: + image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest + + steps: + - uses: actions/checkout@v2 + + - name: Build with Clang Static Analyzer + run: | + make clean + scan-build --use-cc=clang -analyze-headers -enable-checker security -enable-checker unix -enable-checker valist -o scan-build --status-bugs make default + - uses: actions/upload-artifact@v2 + if: failure() + with: + name: scan-build + path: scan-build + job_test: name: Test needs: job_build_debug From cfe1c85479634066ca7cf5b1bc8babfc961fde2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Thu, 4 Aug 2022 08:34:50 +0200 Subject: [PATCH 069/142] Add CodeQL workflow --- .github/workflows/codeql-workflow.yml | 43 +++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/workflows/codeql-workflow.yml diff --git a/.github/workflows/codeql-workflow.yml b/.github/workflows/codeql-workflow.yml new file mode 100644 index 0000000..cc08e94 --- /dev/null +++ b/.github/workflows/codeql-workflow.yml @@ -0,0 +1,43 @@ +name: "CodeQL" +on: + workflow_dispatch: + push: + branches: + - master + - develop + pull_request: + branches: + - master + - develop + +jobs: + analyse: + name: Analyse + strategy: + matrix: + sdk: [ "$NANOS_SDK", "$NANOX_SDK", "$NANOSP_SDK" ] + language: [ 'cpp', 'python' ] + runs-on: ubuntu-latest + + container: + image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest + + steps: + - name: Clone + uses: actions/checkout@v2 + with: + submodules: recursive + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + queries: security-and-quality + + - name: Build Nano + run: | + make clean + make BOLOS_SDK=${{ matrix.sdk }} + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 From b84dea117cdd4f3075aa6e7a654ca32c6123269c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Thu, 4 Aug 2022 08:51:56 +0200 Subject: [PATCH 070/142] Fix code scanning alert #19 --- src/monero_ux_nanos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monero_ux_nanos.c b/src/monero_ux_nanos.c index 9b3fe90..9b7fe60 100644 --- a/src/monero_ux_nanos.c +++ b/src/monero_ux_nanos.c @@ -91,7 +91,7 @@ const ux_menu_entry_t ui_menu_words[] = { const bagl_element_t* ui_menu_words_preprocessor(const ux_menu_entry_t* entry, bagl_element_t* element) { - if ((entry->userid >= 0) && (entry->userid < 25)) { + if (entry->userid < 25) { if (element->component.userid == 0x21) { element->text = N_monero_pstate->words[entry->userid]; } From 3ea7572d814bf86ba0aba26ee5ad474040f8b5de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Thu, 4 Aug 2022 08:53:47 +0200 Subject: [PATCH 071/142] Fix code scanning alert #11 --- src/monero_crypto.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/monero_crypto.c b/src/monero_crypto.c index b510de8..d32aa69 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -304,8 +304,6 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { #define rY (G_monero_vstate.io_buffer + 7 * 32) #define rZ (G_monero_vstate.io_buffer + 8 * 32) - // #define uv7 (G_monero_vstate.io_buffer+9*32) - // #define v3 (G_monero_vstate.io_buffer+10*32) union { unsigned char _Pxy[65]; struct { From d6901aba6c9cd2bca132c450fb82ee22495a325b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Thu, 4 Aug 2022 09:22:31 +0200 Subject: [PATCH 072/142] Remove commented-out code --- src/monero_crypto.c | 2 -- src/monero_main.c | 1 - src/monero_monero.c | 1 - src/monero_open_tx.c | 3 --- 4 files changed, 7 deletions(-) diff --git a/src/monero_crypto.c b/src/monero_crypto.c index d32aa69..220d1db 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -390,7 +390,6 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { setsign: if (fe_isnegative(rX) != sign) { - // fe_neg(r->X, r->X); cx_math_sub(rX, (unsigned char *)C_ED25519_FIELD, rX, 32); } cx_math_addm(rZ, z, w, MOD); @@ -947,7 +946,6 @@ int monero_bamount2str(unsigned char *binary, char *str, unsigned int str_len) { /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_vamount2str(unsigned char *binary, char *str, unsigned int str_len) { - // return monero_amount2str(monero_vamount2uint64(binary), str,str_len); uint64_t amount; monero_decode_varint(binary, 8, &amount); return monero_amount2str(amount, str, str_len); diff --git a/src/monero_main.c b/src/monero_main.c index 650188c..cce96e6 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -51,7 +51,6 @@ void monero_main(void) { sw = 0; cont = 0; monero_io_discard(1); - // THROW(EXCEPTION_IO_RESET); } CATCH_OTHER(e) { monero_reset_tx(1); diff --git a/src/monero_monero.c b/src/monero_monero.c index 0923358..91a9681 100644 --- a/src/monero_monero.c +++ b/src/monero_monero.c @@ -116,7 +116,6 @@ int monero_base58_public_key(char* str_b58, unsigned char* view, unsigned char* unsigned int offset; unsigned int prefix; - // data[0] = N_monero_pstate->network_id; switch (N_monero_pstate->network_id) { case TESTNET: if (paymanetID) { diff --git a/src/monero_open_tx.c b/src/monero_open_tx.c index aae6afd..618b901 100644 --- a/src/monero_open_tx.c +++ b/src/monero_open_tx.c @@ -54,9 +54,6 @@ int monero_apdu_open_tx() { monero_reset_tx(0); G_monero_vstate.tx_cnt++; ui_menu_opentx_display(0); - if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { - // return 0; - } return monero_apdu_open_tx_cont(); } From 3d7d9910aad2b26ba01943a2caceee16001ab788 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Thu, 4 Aug 2022 10:01:24 +0200 Subject: [PATCH 073/142] Remove old-style function declarations --- src/monero_api.h | 100 ++++++++++++++++++++++++++++---------------- src/monero_crypto.c | 4 +- src/monero_io.c | 4 +- src/monero_key.c | 4 +- src/monero_prefix.c | 4 +- 5 files changed, 74 insertions(+), 42 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index 0f5f093..01a0440 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -19,6 +19,8 @@ #ifndef MONERO_API_H #define MONERO_API_H +#include "monero_vars.h" + int monero_apdu_reset(void); int monero_apdu_lock(void); void monero_lock_and_throw(int sw) __attribute__((noreturn)); @@ -34,7 +36,7 @@ int monero_dispatch(void); int monero_apdu_put_key(void); int monero_apdu_get_key(void); int monero_apdu_display_address(void); -int monero_apdu_manage_seedwords(); +int monero_apdu_manage_seedwords(void); int monero_apdu_verify_key(void); int monero_apdu_get_chacha8_prekey(void); int monero_apdu_sc_add(void); @@ -75,8 +77,8 @@ int monero_apdu_clsag_sign(void); int monero_apu_generate_txout_keys(void); -int monero_apdu_prefix_hash_init(); -int monero_apdu_prefix_hash_update(); +int monero_apdu_prefix_hash_init(void); +int monero_apdu_prefix_hash_update(void); int monero_apdu_mlsag_prepare(void); int monero_apdu_mlsag_hash(void); @@ -178,7 +180,7 @@ void monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *ind void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *index); void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, unsigned char *index); -void monero_clear_words(); +void monero_clear_words(void); /* ----------------------------------------------------------------------- */ /* --- CRYPTO ---- */ /* ----------------------------------------------------------------------- */ @@ -190,39 +192,67 @@ void monero_aes_generate(cx_aes_key_t *sk); /* Compute Monero-Hash of data*/ void monero_hash_init_keccak(cx_hash_t *hasher); void monero_hash_init_sha256(cx_hash_t *hasher); -void monero_hash_update(cx_hash_t *hasher, unsigned char *buf, unsigned int len); +void monero_hash_update(cx_hash_t *hasher, const unsigned char *buf, unsigned int len); int monero_hash_final(cx_hash_t *hasher, unsigned char *out); -int monero_hash(unsigned int algo, cx_hash_t *hasher, unsigned char *buf, unsigned int len, +int monero_hash(unsigned int algo, cx_hash_t *hasher, const unsigned char *buf, unsigned int len, unsigned char *out); -#define monero_keccak_init_F() monero_hash_init_keccak((cx_hash_t *)&G_monero_vstate.keccakF) -#define monero_keccak_update_F(buf, len) \ - monero_hash_update((cx_hash_t *)&G_monero_vstate.keccakF, (buf), (len)) -#define monero_keccak_final_F(out) monero_hash_final((cx_hash_t *)&G_monero_vstate.keccakF, (out)) -#define monero_keccak_F(buf, len, out) \ - monero_hash(CX_KECCAK, (cx_hash_t *)&G_monero_vstate.keccakF, (buf), (len), (out)) - -#define monero_keccak_init_H() monero_hash_init_keccak((cx_hash_t *)&G_monero_vstate.keccakH) -#define monero_keccak_update_H(buf, len) \ - monero_hash_update((cx_hash_t *)&G_monero_vstate.keccakH, (buf), (len)) -#define monero_keccak_final_H(out) monero_hash_final((cx_hash_t *)&G_monero_vstate.keccakH, (out)) -#define monero_keccak_H(buf, len, out) \ - monero_hash(CX_KECCAK, (cx_hash_t *)&G_monero_vstate.keccakH, (buf), (len), (out)) - -#define monero_sha256_commitment_init() \ - monero_hash_init_sha256((cx_hash_t *)&G_monero_vstate.sha256_commitment) -#define monero_sha256_commitment_update(buf, len) \ - monero_hash_update((cx_hash_t *)&G_monero_vstate.sha256_commitment, (buf), (len)) -#define monero_sha256_commitment_final(out) \ - monero_hash_final((cx_hash_t *)&G_monero_vstate.sha256_commitment, \ - (out) ? (out) : G_monero_vstate.C) - -#define monero_sha256_outkeys_init() \ - monero_hash_init_sha256((cx_hash_t *)&G_monero_vstate.sha256_out_keys) -#define monero_sha256_outkeys_update(buf, len) \ - monero_hash_update((cx_hash_t *)&G_monero_vstate.sha256_out_keys, (buf), (len)) -#define monero_sha256_outkeys_final(out) \ - monero_hash_final((cx_hash_t *)&G_monero_vstate.sha256_out_keys, (out)) +static inline void monero_keccak_init_F(void) { + monero_hash_init_keccak((cx_hash_t *)&G_monero_vstate.keccakF); +} + +static inline void monero_keccak_update_F(const unsigned char *buf, size_t len) { + monero_hash_update((cx_hash_t *)&G_monero_vstate.keccakF, buf, len); +} + +static inline int monero_keccak_final_F(unsigned char *out) { + return monero_hash_final((cx_hash_t *)&G_monero_vstate.keccakF, out); +} + +static inline int monero_keccak_F(unsigned char *buf, size_t len, unsigned char *out) { + return monero_hash(CX_KECCAK, (cx_hash_t *)&G_monero_vstate.keccakF, buf, len, out); +} + +static inline void monero_keccak_init_H(void) { + monero_hash_init_keccak((cx_hash_t *)&G_monero_vstate.keccakH); +} + +static inline void monero_keccak_update_H(const unsigned char *buf, size_t len) { + monero_hash_update((cx_hash_t *)&G_monero_vstate.keccakH, buf, len); +} + +static inline int monero_keccak_final_H(unsigned char *out) { + return monero_hash_final((cx_hash_t *)&G_monero_vstate.keccakH, out); +} + +static inline int monero_keccak_H(const unsigned char *buf, size_t len, unsigned char *out) { + return monero_hash(CX_KECCAK, (cx_hash_t *)&G_monero_vstate.keccakH, buf, len, out); +} + +static inline void monero_sha256_commitment_init(void) { + monero_hash_init_sha256((cx_hash_t *)&G_monero_vstate.sha256_commitment); +} + +static inline void monero_sha256_commitment_update(const unsigned char *buf, size_t len) { + monero_hash_update((cx_hash_t *)&G_monero_vstate.sha256_commitment, buf, len); +} + +static inline int monero_sha256_commitment_final(unsigned char *out) { + unsigned char *digest = out ? out : G_monero_vstate.C; + return monero_hash_final((cx_hash_t *)&G_monero_vstate.sha256_commitment, digest); +} + +static inline void monero_sha256_outkeys_init(void) { + monero_hash_init_sha256((cx_hash_t *)&G_monero_vstate.sha256_out_keys); +} + +static inline void monero_sha256_outkeys_update(const unsigned char *buf, size_t len) { + monero_hash_update((cx_hash_t *)&G_monero_vstate.sha256_out_keys, buf, len); +} + +static inline int monero_sha256_outkeys_final(unsigned char *out) { + return monero_hash_final((cx_hash_t *)&G_monero_vstate.sha256_out_keys, out); +} /* * check 1words_list, NULL, sizeof(N_monero_pstate->words_list)); } @@ -109,7 +109,7 @@ static void monero_set_word(unsigned int n, unsigned int idx, unsigned int w_sta #define word_list_length 1626 #define seed G_monero_vstate.b -int monero_apdu_manage_seedwords() { +int monero_apdu_manage_seedwords(void) { unsigned int w_start, w_end; unsigned short wc[4]; diff --git a/src/monero_prefix.c b/src/monero_prefix.c index dac5e50..c08c4e7 100644 --- a/src/monero_prefix.c +++ b/src/monero_prefix.c @@ -29,7 +29,7 @@ /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -int monero_apdu_prefix_hash_init() { +int monero_apdu_prefix_hash_init(void) { uint64_t timelock; monero_keccak_update_H(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, @@ -59,7 +59,7 @@ int monero_apdu_prefix_hash_init() { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -int monero_apdu_prefix_hash_update() { +int monero_apdu_prefix_hash_update(void) { monero_keccak_update_H(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, G_monero_vstate.io_length - G_monero_vstate.io_offset); monero_io_discard(0); From 4e47e6b91a4a0ae55b0020221fc998533b1e6b75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Wed, 10 Aug 2022 18:47:35 +0200 Subject: [PATCH 074/142] Make checks on memcmp return values more readable --- src/monero_io.c | 2 +- src/monero_key.c | 4 ++-- src/monero_prehash.c | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/monero_io.c b/src/monero_io.c index 5652fc9..82223d4 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -236,7 +236,7 @@ static void monero_io_verify_hmac_for(const unsigned char* buffer, int len, hmac[36] = 0; } cx_hmac_sha256(G_monero_vstate.hmac_key, 32, hmac, 37, hmac, 32); - if (memcmp(hmac, expected_hmac, 32)) { + if (memcmp(hmac, expected_hmac, 32) != 0) { monero_lock_and_throw(SW_SECURITY_HMAC); } } diff --git a/src/monero_key.c b/src/monero_key.c index dcf6257..6bd8761 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -263,7 +263,7 @@ int monero_apdu_put_key() { monero_io_fetch(sec, 32); monero_io_fetch(pub, 32); monero_ecmul_G(raw, sec); - if (memcmp(pub, raw, 32)) { + if (memcmp(pub, raw, 32) != 0) { THROW(SW_WRONG_DATA); return SW_WRONG_DATA; } @@ -273,7 +273,7 @@ int monero_apdu_put_key() { monero_io_fetch(sec, 32); monero_io_fetch(pub, 32); monero_ecmul_G(raw, sec); - if (memcmp(pub, raw, 32)) { + if (memcmp(pub, raw, 32) != 0) { THROW(SW_WRONG_DATA); return SW_WRONG_DATA; } diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 1e49198..f016981 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -121,7 +121,7 @@ int monero_apdu_mlsag_prehash_update() { } else { memcpy(aH, kG, 32); } - if (memcmp(C, aH, 32)) { + if (memcmp(C, aH, 32) != 0) { monero_lock_and_throw(SW_SECURITY_COMMITMENT_CONTROL); } // update commitment hash control @@ -131,7 +131,7 @@ int monero_apdu_mlsag_prehash_update() { if (G_monero_vstate.io_protocol_version >= 2) { // finalize and check destination hash_control monero_sha256_outkeys_final(k); - if (memcmp(k, G_monero_vstate.OUTK, 32)) { + if (memcmp(k, G_monero_vstate.OUTK, 32) != 0) { monero_lock_and_throw(SW_SECURITY_OUTKEYS_CHAIN_CONTROL); } } @@ -176,7 +176,7 @@ int monero_apdu_mlsag_prehash_finalize() { // Finalize and check commitment hash control if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { monero_sha256_commitment_final(H); - if (memcmp(H, G_monero_vstate.C, 32)) { + if (memcmp(H, G_monero_vstate.C, 32) != 0) { monero_lock_and_throw(SW_SECURITY_COMMITMENT_CHAIN_CONTROL); } } From 06fca3f08b79a23eeab37ed1b6562ffd11f21f93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Baptiste=20B=C3=A9drune?= Date: Wed, 10 Aug 2022 19:00:13 +0200 Subject: [PATCH 075/142] Do not allow short functions on a single line --- .clang-format | 1 + src/monero_crypto.c | 8 ++++++-- src/monero_io.c | 8 ++++++-- src/monero_key.c | 8 ++++++-- src/monero_main.c | 14 ++++++++++---- src/monero_ux_nano.c | 44 ++++++++++++++++++++++++++++++++----------- src/monero_ux_nanos.c | 8 ++++++-- 7 files changed, 68 insertions(+), 23 deletions(-) diff --git a/.clang-format b/.clang-format index a9d6f7a..570f635 100644 --- a/.clang-format +++ b/.clang-format @@ -6,6 +6,7 @@ Language: Cpp ColumnLimit: 100 PointerAlignment: Right AlignAfterOpenBracket: Align +AllowShortFunctionsOnASingleLine: None AlignConsecutiveMacros: true AllowAllParametersOfDeclarationOnNextLine: false SortIncludes: false diff --git a/src/monero_crypto.c b/src/monero_crypto.c index a343ab7..3af9854 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -135,9 +135,13 @@ void monero_reverse32(unsigned char *rscal, unsigned char *scal) { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_hash_init_sha256(cx_hash_t *hasher) { cx_sha256_init((cx_sha256_t *)hasher); } +void monero_hash_init_sha256(cx_hash_t *hasher) { + cx_sha256_init((cx_sha256_t *)hasher); +} -void monero_hash_init_keccak(cx_hash_t *hasher) { cx_keccak_init((cx_sha3_t *)hasher, 256); } +void monero_hash_init_keccak(cx_hash_t *hasher) { + cx_keccak_init((cx_sha3_t *)hasher, 256); +} /* ----------------------------------------------------------------------- */ /* --- --- */ diff --git a/src/monero_io.c b/src/monero_io.c index 82223d4..0f350bb 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -50,7 +50,9 @@ void monero_io_set_offset(unsigned int offset) { } } -void monero_io_mark() { G_monero_vstate.io_mark = G_monero_vstate.io_offset; } +void monero_io_mark() { + G_monero_vstate.io_mark = G_monero_vstate.io_offset; +} void monero_io_inserted(unsigned int len) { G_monero_vstate.io_offset += len; @@ -66,7 +68,9 @@ void monero_io_discard(int clear) { } } -void monero_io_clear() { memset(G_monero_vstate.io_buffer, 0, MONERO_IO_BUFFER_LENGTH); } +void monero_io_clear() { + memset(G_monero_vstate.io_buffer, 0, MONERO_IO_BUFFER_LENGTH); +} /* ----------------------------------------------------------------------- */ /* INSERT data to be sent */ diff --git a/src/monero_key.c b/src/monero_key.c index 6bd8761..828607a 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -241,9 +241,13 @@ int monero_apdu_display_address() { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -int is_fake_view_key(unsigned char *s) { return memcmp(s, C_FAKE_SEC_VIEW_KEY, 32) == 0; } +int is_fake_view_key(unsigned char *s) { + return memcmp(s, C_FAKE_SEC_VIEW_KEY, 32) == 0; +} -int is_fake_spend_key(unsigned char *s) { return memcmp(s, C_FAKE_SEC_SPEND_KEY, 32) == 0; } +int is_fake_spend_key(unsigned char *s) { + return memcmp(s, C_FAKE_SEC_SPEND_KEY, 32) == 0; +} /* ----------------------------------------------------------------------- */ /* --- --- */ diff --git a/src/monero_main.c b/src/monero_main.c index cce96e6..e82f812 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -163,8 +163,11 @@ unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) { void app_exit(void) { BEGIN_TRY_L(exit) { - TRY_L(exit) { os_sched_exit(-1); } - FINALLY_L(exit) {} + TRY_L(exit) { + os_sched_exit(-1); + } + FINALLY_L(exit) { + } } END_TRY_L(exit); } @@ -215,8 +218,11 @@ __attribute__((section(".boot"))) int main(void) { // reset IO and UX ; } - CATCH_OTHER(e) { cont = 0; } - FINALLY {} + CATCH_OTHER(e) { + cont = 0; + } + FINALLY { + } } END_TRY; } diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index fd90577..1893f52 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -90,13 +90,17 @@ void ui_menu_words_clear(unsigned int value __attribute__((unused))) { ui_menu_main_display(0); } -void ui_menu_words_back(unsigned int value __attribute__((unused))) { ui_menu_main_display(1); } +void ui_menu_words_back(unsigned int value __attribute__((unused))) { + ui_menu_main_display(1); +} void ui_menu_words_display(unsigned int value __attribute__((unused))) { ux_flow_init(0, ux_flow_words, NULL); } -void settings_show_25_words(void) { ui_menu_words_display(0); } +void settings_show_25_words(void) { + ui_menu_words_display(0); +} /* -------------------------------- INFO UX --------------------------------- */ unsigned int ui_menu_info_action(unsigned int value); @@ -347,7 +351,9 @@ const char* account_submenu_getter(unsigned int idx) { } } -void account_back(void) { ui_menu_main_display(0); } +void account_back(void) { + ui_menu_main_display(0); +} void account_submenu_selector(unsigned int idx) { if (idx <= 9) { @@ -361,7 +367,9 @@ void ui_menu_account_display(void) { ux_menulist_init(G_ux.stack_count - 1, account_submenu_getter, account_submenu_selector); } -void settings_change_account(void) { ui_menu_account_display(); } +void settings_change_account(void) { + ui_menu_account_display(); +} /* -------------------------------- NETWORK UX --------------------------------- */ @@ -410,7 +418,9 @@ const char* network_submenu_getter(unsigned int idx) { } } -void network_back(void) { ui_menu_main_display(0); } +void network_back(void) { + ui_menu_main_display(0); +} static void network_set_net(unsigned int network) { monero_install(network); @@ -440,7 +450,9 @@ void ui_menu_network_display(void) { ux_menulist_init(G_ux.stack_count - 1, network_submenu_getter, network_submenu_selector); } -void settings_change_network(void) { ui_menu_network_display(); } +void settings_change_network(void) { + ui_menu_network_display(); +} /* -------------------------------- RESET UX --------------------------------- */ void ui_menu_reset_display(void); void ui_menu_reset_action(unsigned int value); @@ -465,9 +477,13 @@ UX_STEP_CB(ux_menu_reset_3_step, pb, ui_menu_reset_action(ACCEPT), UX_FLOW(ux_flow_reset, &ux_menu_reset_1_step, &ux_menu_reset_2_step, &ux_menu_reset_3_step); -void ui_menu_reset_display(void) { ux_flow_init(0, ux_flow_reset, 0); } +void ui_menu_reset_display(void) { + ux_flow_init(0, ux_flow_reset, 0); +} -void settings_reset(void) { ui_menu_reset_display(); } +void settings_reset(void) { + ui_menu_reset_display(); +} void ui_menu_reset_action(unsigned int value) { if (value == ACCEPT) { @@ -494,7 +510,9 @@ const char* settings_submenu_getter(unsigned int idx) { return NULL; } -void settings_back(void) { ui_menu_main_display(0); } +void settings_back(void) { + ui_menu_main_display(0); +} void settings_submenu_selector(unsigned int idx) { switch (idx) { @@ -556,7 +574,9 @@ UX_FLOW(ux_flow_about, #endif &ux_menu_about_2_step); -void ui_menu_about_display(void) { ux_flow_init(0, ux_flow_about, NULL); } +void ui_menu_about_display(void) { + ux_flow_init(0, ux_flow_about, NULL); +} #undef STR #undef XSTR @@ -674,7 +694,9 @@ void ui_menu_main_display(unsigned int value __attribute__((unused))) { } /* --- INIT --- */ -void ui_init(void) { ui_menu_main_display(0); } +void ui_init(void) { + ui_menu_main_display(0); +} void io_seproxyhal_display(const bagl_element_t* element) { io_seproxyhal_display_default((bagl_element_t*)element); diff --git a/src/monero_ux_nanos.c b/src/monero_ux_nanos.c index 9b7fe60..4517c01 100644 --- a/src/monero_ux_nanos.c +++ b/src/monero_ux_nanos.c @@ -113,7 +113,9 @@ void ui_menu_words_clear(unsigned int value __attribute__((unused))) { ui_menu_main_display(0); } -void ui_menu_words_back(unsigned int value __attribute__((unused))) { ui_menu_settings_display(1); } +void ui_menu_words_back(unsigned int value __attribute__((unused))) { + ui_menu_settings_display(1); +} /* -------------------------------- INFO UX --------------------------------- */ unsigned int ui_menu_info_button(unsigned int button_mask, unsigned int button_mask_counter); @@ -771,7 +773,9 @@ const ux_menu_entry_t ui_menu_main[] = { {NULL, (void*)os_sched_exit, 0, &C_icon_dashboard, "Quit app", NULL, 50, 29}, UX_MENU_END}; -void ui_menu_main_display(unsigned int value) { UX_MENU_DISPLAY(value, ui_menu_main, NULL); } +void ui_menu_main_display(unsigned int value) { + UX_MENU_DISPLAY(value, ui_menu_main, NULL); +} void ui_init(void) { ui_menu_main_display(0); From 446d7b0dfa49e92bf961d7c1439c66ac140a277e Mon Sep 17 00:00:00 2001 From: Francois Beutin Date: Thu, 15 Dec 2022 16:11:17 +0100 Subject: [PATCH 076/142] Bump version --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b2eca0e..a97ca37 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ endif APPVERSION_M=1 APPVERSION_N=8 -APPVERSION_P=0 +APPVERSION_P=1 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) SPECVERSION="1.0" From c5dbf50c7a19fa537d9be34ab239e6c157a6f83a Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Fri, 27 Jan 2023 13:09:16 +0100 Subject: [PATCH 077/142] Bump version --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a97ca37..19a0faf 100644 --- a/Makefile +++ b/Makefile @@ -40,7 +40,7 @@ endif APPVERSION_M=1 APPVERSION_N=8 -APPVERSION_P=1 +APPVERSION_P=2 APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) SPECVERSION="1.0" From 5014233f34c81c357f767eaff43a4bb3b74f22f2 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 4 May 2023 09:43:58 +0200 Subject: [PATCH 078/142] Tests: adapt for Ragger --- tests/conftest.py | 30 +++--- tests/monero_client/io/button.py | 33 ------ tests/monero_client/io/comm.py | 20 ---- tests/monero_client/io/display.py | 72 ------------- tests/monero_client/io/hid_device.py | 87 ---------------- tests/monero_client/io/tcp_client.py | 39 ------- tests/monero_client/io/transport.py | 42 ++++++-- tests/monero_client/monero_cmd.py | 125 +++++++++++++++-------- tests/monero_client/monero_crypto_cmd.py | 4 +- tests/monero_client/utils/utils.py | 50 +++++++++ tests/requirements.txt | 3 + tests/test_sig.py | 15 ++- 12 files changed, 195 insertions(+), 325 deletions(-) delete mode 100644 tests/monero_client/io/button.py delete mode 100644 tests/monero_client/io/comm.py delete mode 100644 tests/monero_client/io/display.py delete mode 100644 tests/monero_client/io/hid_device.py delete mode 100644 tests/monero_client/io/tcp_client.py create mode 100644 tests/monero_client/utils/utils.py create mode 100644 tests/requirements.txt diff --git a/tests/conftest.py b/tests/conftest.py index 975d8c5..0458863 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,30 +1,30 @@ from typing import Dict, Tuple import pytest -from monero_client.io.button import Button, FakeButton from monero_client.monero_cmd import MoneroCmd -SPECULOS: bool = True +from ragger.conftest import configuration +########################### +### CONFIGURATION START ### +########################### +MNEMONIC = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about" -@pytest.fixture(scope="module") -def monero(): - monero_client = MoneroCmd(debug=True, - speculos=SPECULOS) +configuration.OPTIONAL.CUSTOM_SEED = MNEMONIC - yield monero_client - - monero_client.device.close() +######################### +### CONFIGURATION END ### +######################### +# Pull all features from the base ragger conftest using the overridden configuration +pytest_plugins = ("ragger.conftest.base_conftest", ) -@pytest.fixture(scope="module") -def button(): - button_client = (Button(server="127.0.0.1", port=42000) - if SPECULOS else FakeButton()) - yield button_client +@pytest.fixture() +def monero(backend, debug=False): + monero_client = MoneroCmd(debug, backend) - button_client.close() + yield monero_client _test_failed_incremental: Dict[str, Dict[Tuple[int, ...], str]] = {} diff --git a/tests/monero_client/io/button.py b/tests/monero_client/io/button.py deleted file mode 100644 index 954150f..0000000 --- a/tests/monero_client/io/button.py +++ /dev/null @@ -1,33 +0,0 @@ -import socket - - -class FakeButton: - def right_click(self): - pass - - def left_click(self): - pass - - def both_click(self): - pass - - def close(self): - pass - - -class Button: - def __init__(self, server: str, port: int) -> None: - self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.socket.connect((server, port)) - - def right_click(self): - self.socket.sendall(b"Rr") - - def left_click(self): - self.socket.sendall(b"Ll") - - def both_click(self): - self.socket.sendall(b"LRlr") - - def close(self): - self.socket.close() diff --git a/tests/monero_client/io/comm.py b/tests/monero_client/io/comm.py deleted file mode 100644 index 6d4d11f..0000000 --- a/tests/monero_client/io/comm.py +++ /dev/null @@ -1,20 +0,0 @@ -from abc import ABCMeta, abstractmethod -from typing import Tuple - - -class Comm(metaclass=ABCMeta): - @abstractmethod - def send(self, apdus: bytes) -> None: - raise NotImplementedError - - @abstractmethod - def recv(self) -> Tuple[int, bytes]: - raise NotImplementedError - - @abstractmethod - def exchange(self, apdus: bytes) -> Tuple[int, bytes]: - raise NotImplementedError - - @abstractmethod - def close(self) -> None: - raise NotImplementedError diff --git a/tests/monero_client/io/display.py b/tests/monero_client/io/display.py deleted file mode 100644 index 1d69188..0000000 --- a/tests/monero_client/io/display.py +++ /dev/null @@ -1,72 +0,0 @@ -import json -import queue -import socket -from typing import Optional - - -class FakeDisplay: - def listen(self): - pass - - def close(self): - pass - - -class Display: - def __init__(self, server: str, port: int) -> None: - self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.socket.connect((server, port)) - self.q: queue.Queue = queue.Queue() - - def listen(self): - while True: - text: Optional[bytes] = json.loads( - self.socket.recv(1000) - ).get("text") - - if text: - self.q.put(text) - - def close(self): - self.socket.close() - - -# class DisplayClientProtocol(asyncio.Protocol): -# def __init__(self, q, on_con_lost): -# self.on_con_lost = on_con_lost -# self.q = q -# self.transport = None -# -# def connection_made(self, transport): -# self.transport = transport -# -# def data_received(self, data): -# text: Optional[bytes] = json.loads(data).get("text") -# if text: -# logging.debug("+ %s", text) -# self.q.put(text) -# -# def connection_lost(self, exc): -# print('The server closed the connection') -# self.on_con_lost.set_result(True) -# -# -# async def main(): -# loop = asyncio.get_running_loop() -# -# on_con_lost = loop.create_future() -# q = queue.Queue() -# -# transport, protocol = await loop.create_connection( -# lambda: DisplayClientProtocol(q, on_con_lost), -# "127.0.0.1", -# 43000 -# ) -# -# try: -# await on_con_lost -# finally: -# transport.close() -# -# -# asyncio.run(main()) diff --git a/tests/monero_client/io/hid_device.py b/tests/monero_client/io/hid_device.py deleted file mode 100644 index a52508e..0000000 --- a/tests/monero_client/io/hid_device.py +++ /dev/null @@ -1,87 +0,0 @@ -import logging -from typing import List, Tuple - -try: - import hid -except ImportError: - hid = None - -from monero_client.io.comm import Comm - -LEDGER_VENDOR_ID: int = 0x2C97 - - -class HID(Comm): - def __init__(self) -> None: - if hid is None: - raise ImportError("hidapi is not installed!") - - self.device = hid.device() - self.path = HID.enumerate_devices()[0] - self.device.open_path(self.path) - self.device.set_nonblocking(True) - self.__opened: bool = True - - @staticmethod - def enumerate_devices() -> List[bytes]: - devices: List[bytes] = [] - - for hid_device in hid.enumerate(LEDGER_VENDOR_ID, 0): - if (hid_device.get("interface_number") == 0 or - hid_device.get("usage_page") == 0xffa0): - devices.append(hid_device["path"]) - - assert len(devices) != 0, f"Can't find device with vendor_id {LEDGER_VENDOR_ID}" - - return devices - - def send(self, apdus: bytes) -> None: - data: bytes = int.to_bytes(len(apdus), 2, byteorder="big") + apdus - offset: int = 0 - seq_idx: int = 0 - - while offset < len(data): - # Header: channel (0x101), tag (0x05), sequence index - header: bytes = (b"\x01\x01\x05" + - seq_idx.to_bytes(2, byteorder="big")) - data_chunk: bytes = (header + - data[offset:offset + 64 - len(header)]) - - self.device.write(b"\x00" + data_chunk) - logging.debug("=> %s", data_chunk.hex()) - offset += 64 - len(header) - seq_idx += 1 - - def recv(self) -> Tuple[int, bytes]: - seq_idx: int = 0 - self.device.set_nonblocking(False) - data_chunk: bytes = bytes(self.device.read(64 + 1)) - self.device.set_nonblocking(True) - - assert data_chunk[:2] == b"\x01\x01" - assert data_chunk[2] == 5 - assert data_chunk[3:5] == seq_idx.to_bytes(2, byteorder="big") - - data_len: int = int.from_bytes(data_chunk[5:7], byteorder="big") - data: bytes = data_chunk[7:] - - while len(data) < data_len: - read_bytes = bytes(self.device.read(64 + 1, timeout_ms=1000)) - data += read_bytes[5:] - - logging.debug("<= %s", data[:data_len].hex()) - - sw: int = int.from_bytes(data[data_len - 2:data_len], byteorder="big") - data = data[:data_len - 2] - - return sw, data - - def exchange(self, apdus: bytes) -> Tuple[int, bytes]: - self.send(apdus) - - return self.recv() - - def close(self): - if self.__opened: - self.device.close() - self.__opened = False diff --git a/tests/monero_client/io/tcp_client.py b/tests/monero_client/io/tcp_client.py deleted file mode 100644 index a25341c..0000000 --- a/tests/monero_client/io/tcp_client.py +++ /dev/null @@ -1,39 +0,0 @@ -import logging -import socket -from typing import Tuple - -from monero_client.io.comm import Comm - - -class TCPClient(Comm): - def __init__(self, server: str, port: int) -> None: - self.server: str = server - self.port: int = port - self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.socket.connect((self.server, self.port)) - self.__opened: bool = True - - def send(self, apdus: bytes) -> None: - logging.debug("=> %s", apdus.hex()) - length: bytes = int.to_bytes(len(apdus), 4, byteorder="big") - self.socket.send(length + apdus) - - def recv(self) -> Tuple[int, bytes]: - length: int = int.from_bytes(self.socket.recv(4), byteorder="big") - data: bytes = self.socket.recv(length) - sw: int = int.from_bytes(self.socket.recv(2), byteorder="big") - - logging.debug("<= %s %s", data.hex(), hex(sw)[2:]) - - return sw, data - - def exchange(self, apdus: bytes) -> Tuple[int, bytes]: - self.send(apdus) - sw, response = self.recv() # type: int, bytes - - return sw, response - - def close(self): - if self.__opened: - self.socket.close() - self.__opened = False diff --git a/tests/monero_client/io/transport.py b/tests/monero_client/io/transport.py index 855b757..147badd 100644 --- a/tests/monero_client/io/transport.py +++ b/tests/monero_client/io/transport.py @@ -2,18 +2,18 @@ import logging import struct from typing import Union, Tuple - -from monero_client.io.tcp_client import TCPClient -from monero_client.io.hid_device import HID +from ragger.backend.interface import BackendInterface, RAPDU +from contextlib import contextmanager class Transport: - def __init__(self, debug: bool = False, speculos: bool = False) -> None: + backend: BackendInterface + + def __init__(self, backend, debug) -> None: if debug: logging.basicConfig(format="%(message)s", level=logging.DEBUG) - self.com: Union[TCPClient, HID] = (TCPClient(server="127.0.0.1", port=9999) - if speculos else HID()) + self._client = backend def exchange(self, cla: int, @@ -30,7 +30,7 @@ def exchange(self, 1 + len(payload), option) - return self.com.exchange(header + payload) + return self._client.exchange(header + payload) def send(self, cla: int, @@ -46,10 +46,30 @@ def send(self, p2, 1 + len(payload), option) - self.com.send(header + payload) + self._client.send_raw(header + payload) + + @contextmanager + def send_async(self, + cla: int, + ins: enum.IntEnum, + p1: int = 0, + p2: int = 0, + option: int = 0, + payload: bytes = b"") -> None: + header: bytes = struct.pack("BBBBBB", + cla, + ins.value, + p1, + p2, + 1 + len(payload), + option) + with self._client.exchange_async_raw(header + payload): + yield def recv(self) -> Tuple[int, bytes]: - return self.com.recv() + response = self._client.receive() + return (response.status, response.data) - def close(self) -> None: - self.com.close() + def async_response(self) -> Tuple[int, bytes]: + response = self._client.last_async_response + return (response.status, response.data) diff --git a/tests/monero_client/monero_cmd.py b/tests/monero_client/monero_cmd.py index b81ee61..adec954 100644 --- a/tests/monero_client/monero_cmd.py +++ b/tests/monero_client/monero_cmd.py @@ -24,15 +24,18 @@ from .monero_types import InsType, Type, SigType from .crypto.hmac import hmac_sha256 from .exception.device_error import DeviceError -from .io.button import Button from .utils.varint import encode_varint +from .utils.utils import get_nano_review_instructions, get_stax_review_instructions +from pathlib import Path +from ragger.navigator import NavInsID, NavIns PROTOCOL_VERSION: int = 3 +TESTS_ROOT_DIR = Path(__file__).parent class MoneroCmd(MoneroCryptoCmd): - def __init__(self, debug: bool = False, speculos: bool = False) -> None: - MoneroCryptoCmd.__init__(self, debug, speculos) + def __init__(self, debug, backend) -> None: + MoneroCryptoCmd.__init__(self, backend, debug) def reset_and_get_version(self, monero_client_version: bytes @@ -201,7 +204,7 @@ def gen_txout_keys(self, return _ak_amount, out_ephemeral_pub_key - def prefix_hash_init(self, button: Button, version: int, timelock: int) -> None: + def prefix_hash_init(self, backend, test_name, firmware, navigator, version: int, timelock: int) -> None: ins: InsType = InsType.INS_PREFIX_HASH payload: bytes = b"".join([ @@ -209,21 +212,27 @@ def prefix_hash_init(self, button: Button, version: int, timelock: int) -> None: encode_varint(timelock) ]) - self.device.send(cla=PROTOCOL_VERSION, - ins=ins, - p1=1, - p2=0, - option=0, - payload=payload) + if firmware.device == "nanos": + instructions = get_nano_review_instructions(2) + elif firmware.device.startswith("nano"): + instructions = get_nano_review_instructions(1) + else: + instructions = [ + NavIns(NavInsID.USE_CASE_REVIEW_TAP) + ] - # "Timelock" -> go down - button.right_click() - # "Reject Timelock" -> go down - button.right_click() - # "Accept Timelock" -> accept - button.both_click() + with self.device.send_async(cla=PROTOCOL_VERSION, + ins=ins, + p1=1, + p2=0, + option=0, + payload=payload): - sw, response = self.device.recv() # type: int, bytes + navigator.navigate_and_compare(TESTS_ROOT_DIR, + test_name + "_hash_init", + instructions, screen_change_after_last_instruction=False) + + sw, response = self.device.async_response() # type: int, bytes if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins, message="P1=1 (init)") @@ -346,7 +355,10 @@ def unblind(self, return mask, amount def validate_prehash_init(self, - button: Button, + backend, + test_name, + firmware, + navigator, index: int, txntype: int, txnfee: int) -> None: @@ -355,21 +367,30 @@ def validate_prehash_init(self, # txntype is skipped in the app payload: bytes = struct.pack("B", txntype) + encode_varint(txnfee) - self.device.send(cla=PROTOCOL_VERSION, - ins=ins, - p1=1, - p2=index, - option=0, - payload=payload) - - # "Fee" -> go down - button.right_click() - # "Reject Fee" -> go down - button.right_click() - # "Accept Fee" -> accept - button.both_click() - - sw, response = self.device.recv() # type: int, bytes + if firmware.device == "nanos": + instructions = get_nano_review_instructions(2) + elif firmware.device.startswith("nano"): + instructions = get_nano_review_instructions(1) + else: + instructions = [ + NavIns(NavInsID.USE_CASE_REVIEW_TAP) + ] + + with self.device.send_async(cla=PROTOCOL_VERSION, + ins=ins, + p1=1, + p2=index, + option=0, + payload=payload): + + if firmware.device.startswith("nano"): + navigator.navigate_and_compare(TESTS_ROOT_DIR, + test_name + "_prehash_init", + instructions, screen_change_after_last_instruction=False) + else: + pass + + sw, response = self.device.async_response() # type: int, bytes if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins, message="P1=1 (init)") @@ -377,6 +398,10 @@ def validate_prehash_init(self, assert len(response) == 0 def validate_prehash_update(self, + backend, + test_name, + firmware, + navigator, index: int, is_short: bool, is_change_addr: bool, @@ -404,14 +429,32 @@ def validate_prehash_update(self, blinded_amount )) - self.device.send(cla=PROTOCOL_VERSION, - ins=ins, - p1=2, - p2=index, - option=(0 if is_last else 0x80) | (0x02 if is_short else 0), - payload=payload) - - sw, response = self.device.recv() # type: int, bytes + if firmware.device == "nanos": + instructions = get_nano_review_instructions(7) + elif firmware.device.startswith("nano"): + instructions = get_nano_review_instructions(3) + else: + instructions = [ + NavIns(NavInsID.USE_CASE_REVIEW_TAP), + NavIns(NavInsID.USE_CASE_REVIEW_TAP), + NavIns(NavInsID.USE_CASE_REVIEW_CONFIRM) + ] + + with self.device.send_async(cla=PROTOCOL_VERSION, + ins=ins, + p1=2, + p2=index, + option=(0 if is_last else 0x80) | ( + 0x02 if is_short else 0), + payload=payload): + + backend.wait_for_text_on_screen("Processing") + backend.wait_for_text_not_on_screen("Processing") + navigator.navigate_and_compare(TESTS_ROOT_DIR, + test_name + "_prehash_update", + instructions, screen_change_after_last_instruction=False, screen_change_before_first_instruction=False) + + sw, response = self.device.async_response() # type: int, bytes if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins, message="P1=2 (update)") diff --git a/tests/monero_client/monero_crypto_cmd.py b/tests/monero_client/monero_crypto_cmd.py index 617acd9..24e6aff 100644 --- a/tests/monero_client/monero_crypto_cmd.py +++ b/tests/monero_client/monero_crypto_cmd.py @@ -13,8 +13,8 @@ class MoneroCryptoCmd: HMAC_KEY: bytes = b"\xab" * 32 - def __init__(self, debug: bool = False, speculos: bool = False) -> None: - self.device = Transport(debug=debug, speculos=speculos) + def __init__(self, backend, debug: bool = False) -> None: + self.device = Transport(backend, debug=debug) self.is_in_tx_mode = False @staticmethod diff --git a/tests/monero_client/utils/utils.py b/tests/monero_client/utils/utils.py new file mode 100644 index 0000000..5c6dc8b --- /dev/null +++ b/tests/monero_client/utils/utils.py @@ -0,0 +1,50 @@ +from bip32 import HARDENED_INDEX + +from ragger.backend import SpeculosBackend +from ragger.navigator import NavInsID, NavIns +from ragger.backend.interface import RAPDU + + +def get_nano_review_instructions(num_screen_skip): + instructions = [NavIns(NavInsID.RIGHT_CLICK)] * num_screen_skip + instructions.append(NavIns(NavInsID.BOTH_CLICK)) + return instructions + + +def get_stax_review_instructions(num_screen_skip): + instructions = [NavIns(NavInsID.USE_CASE_CHOICE_CONFIRM)] + + for i in range(num_screen_skip): + instructions.append(NavIns(NavInsID.USE_CASE_REVIEW_TAP)) + + instructions.append(NavIns(NavInsID.USE_CASE_REVIEW_CONFIRM)) + instructions.append(NavIns(NavInsID.USE_CASE_STATUS_DISMISS)) + return instructions + + +def get_stax_review_instructions_with_warning(num_screen_skip): + instructions = [NavIns(NavInsID.USE_CASE_CHOICE_CONFIRM)] + instructions.append(NavIns(NavInsID.USE_CASE_CHOICE_CONFIRM)) + + for i in range(num_screen_skip): + instructions.append(NavIns(NavInsID.USE_CASE_REVIEW_TAP)) + + instructions.append(NavIns(NavInsID.USE_CASE_REVIEW_CONFIRM)) + instructions.append(NavIns(NavInsID.USE_CASE_STATUS_DISMISS)) + return instructions + + +def get_async_response(backend: SpeculosBackend) -> RAPDU: + return backend.last_async_response + + +def pack_derivation_path(derivation_path: str) -> bytes: + split = derivation_path.split("/") + assert split.pop(0) == "m", "master expected" + derivation_path: bytes = (len(split)).to_bytes(1, byteorder='big') + for i in split: + if (i[-1] == "'"): + derivation_path += (int(i[:-1]) | HARDENED_INDEX).to_bytes(4, byteorder='big') + else: + derivation_path += int(i).to_bytes(4, byteorder='big') + return derivation_path diff --git a/tests/requirements.txt b/tests/requirements.txt new file mode 100644 index 0000000..82e6053 --- /dev/null +++ b/tests/requirements.txt @@ -0,0 +1,3 @@ +base58 +bip32 +ragger[tests,speculos] diff --git a/tests/test_sig.py b/tests/test_sig.py index 2429b2e..57b2a37 100644 --- a/tests/test_sig.py +++ b/tests/test_sig.py @@ -83,11 +83,12 @@ def test_gen_txout_keys(monero, state): state["_ak_amount"].append(_ak_amount) # _ak_amount_t @staticmethod - def test_prefix_hash(monero, button): + def test_prefix_hash(monero, backend, navigator, firmware, test_name): expected: bytes = bytes.fromhex("9a259973bf721120aceae3d8d40696c0" "7470331e386028753123f37fee36926b") # should ask for timelock validation - monero.prefix_hash_init(button=button, version=0, timelock=2147483650) + monero.prefix_hash_init(backend, test_name, firmware, + navigator=navigator, version=0, timelock=2147483650) result: bytes = monero.prefix_hash_update( index=1, payload=b"", @@ -128,17 +129,21 @@ def test_blind(monero, state): state["blinded_mask"].append(blinded_mask) state["blinded_amount"].append(blinded_amount) - @staticmethod - def test_validate(monero, button, state): assert len(state["y"]) != 0 assert len(state["_ak_amount"]) != 0 assert len(state["blinded_amount"]) != 0 assert len(state["blinded_mask"]) != 0 + @staticmethod + def test_validate(monero, backend, navigator, firmware, test_name, state): + fee: int = 100000000 # 0.0001 XMR # should ask for fee validation - monero.validate_prehash_init(button=button, + monero.validate_prehash_init(backend, + navigator=navigator, + firmware=firmware, + test_name=test_name, index=1, # start at 1 txntype=0, txnfee=fee) From 6062dc62235e50cf57603c4b71070e0455f82bca Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 4 May 2023 10:12:56 +0200 Subject: [PATCH 079/142] Tests: tweaks and improvements --- Makefile | 1 + src/monero_prehash.c | 6 + tests/monero_client/monero_cmd.py | 2 +- tests/monero_client/monero_crypto_cmd.py | 72 +++++++-- tests/test_crypto.py | 196 ++++++++++++++++------- tests/test_sig.py | 48 ++++-- tests/test_version.py | 19 +-- 7 files changed, 243 insertions(+), 101 deletions(-) diff --git a/Makefile b/Makefile index 19a0faf..eafc7ff 100644 --- a/Makefile +++ b/Makefile @@ -122,6 +122,7 @@ ifneq ($(DEBUG),0) DEFINES += PLINE="PRINTF(\"FILE:%s..LINE:%d\n\",__FILE__,__LINE__)" # Debug options DEFINES += DEBUG_HWDEVICE + DEFINES += BYPASS_COMMITMENT_FOR_TESTS DEFINES += IODUMMYCRYPT # or IONOCRYPT # Stagenet network by default DEFINES += MONERO_BETA diff --git a/src/monero_prehash.c b/src/monero_prehash.c index f016981..84ba076 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -122,7 +122,9 @@ int monero_apdu_mlsag_prehash_update() { memcpy(aH, kG, 32); } if (memcmp(C, aH, 32) != 0) { +#ifndef BYPASS_COMMITMENT_FOR_TESTS monero_lock_and_throw(SW_SECURITY_COMMITMENT_CONTROL); +#endif } // update commitment hash control monero_sha256_commitment_update(C, 32); @@ -177,7 +179,9 @@ int monero_apdu_mlsag_prehash_finalize() { if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { monero_sha256_commitment_final(H); if (memcmp(H, G_monero_vstate.C, 32) != 0) { +#ifndef BYPASS_COMMITMENT_FOR_TESTS monero_lock_and_throw(SW_SECURITY_COMMITMENT_CHAIN_CONTROL); +#endif } } // compute last H @@ -189,7 +193,9 @@ int monero_apdu_mlsag_prehash_finalize() { monero_keccak_init_H(); if (G_monero_vstate.io_protocol_version >= 3) { if (memcmp(message, G_monero_vstate.prefixH, 32) != 0) { +#ifndef BYPASS_COMMITMENT_FOR_TESTS monero_lock_and_throw(SW_SECURITY_PREFIX_HASH); +#endif } } monero_keccak_update_H(message, 32); diff --git a/tests/monero_client/monero_cmd.py b/tests/monero_client/monero_cmd.py index adec954..3be68f0 100644 --- a/tests/monero_client/monero_cmd.py +++ b/tests/monero_client/monero_cmd.py @@ -501,4 +501,4 @@ def validate_prehash_finalize(self, if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins, message="P1=3 (finalize)") - assert len(response) == 0 + assert len(response) == 32 diff --git a/tests/monero_client/monero_crypto_cmd.py b/tests/monero_client/monero_crypto_cmd.py index 24e6aff..88680dd 100644 --- a/tests/monero_client/monero_crypto_cmd.py +++ b/tests/monero_client/monero_crypto_cmd.py @@ -6,8 +6,12 @@ from .monero_types import InsType from .monero_types import Type from .io.transport import Transport +from pathlib import Path +from ragger.navigator import NavInsID, NavIns +from .utils.utils import get_nano_review_instructions PROTOCOL_VERSION: int = 3 +TESTS_ROOT_DIR = Path(__file__).parent class MoneroCryptoCmd: @@ -102,19 +106,69 @@ def get_public_keys(self) -> Tuple[bytes, bytes, str]: return view_pub_key, spend_pub_key, base58_address - def get_private_view_key(self, button) -> bytes: + def display_address(self, test_name, firmware, navigator, derivation: bytes, output_index: bytes) -> bytes: + ins: InsType = InsType.INS_DISPLAY_ADDRESS + + payload: bytes = b"".join([ + derivation, + output_index, + ]) + + if firmware.device == "nanos": + instructions = get_nano_review_instructions(7) + elif firmware.device.startswith("nano"): + instructions = get_nano_review_instructions(4) + else: + instructions = [ + NavIns(NavInsID.USE_CASE_CHOICE_CONFIRM), + NavIns(NavInsID.TOUCH, (200, 410)), + NavIns(NavInsID.USE_CASE_ADDRESS_CONFIRMATION_EXIT_QR), + NavIns(NavInsID.USE_CASE_ADDRESS_CONFIRMATION_TAP), + NavIns(NavInsID.USE_CASE_ADDRESS_CONFIRMATION_CONFIRM), + NavIns(NavInsID.USE_CASE_STATUS_DISMISS) + ] + + with self.device.send_async(cla=PROTOCOL_VERSION, + ins=ins, + p1=0, + p2=0, + option=0, + payload=payload): + + navigator.navigate_and_compare(TESTS_ROOT_DIR, + test_name, + instructions) + + sw, response = self.device.async_response() # type: int, bytes + + if not sw & 0x9000: + raise DeviceError(sw, ins, "P1=2") + + return response # priv_view_key + + def get_private_view_key(self, test_name, firmware, navigator) -> bytes: ins: InsType = InsType.INS_GET_KEY - self.device.send(cla=PROTOCOL_VERSION, - ins=ins, - p1=2, - p2=0, - option=0) + if firmware.device == "nanos": + instructions = get_nano_review_instructions(1) + elif firmware.device.startswith("nano"): + instructions = get_nano_review_instructions(1) + else: + instructions = [ + NavIns(NavInsID.USE_CASE_CHOICE_CONFIRM) + ] - # "Export View Key" - button.right_click() + with self.device.send_async(cla=PROTOCOL_VERSION, + ins=ins, + p1=2, + p2=0, + option=0): - sw, response = self.device.recv() # type: int, bytes + navigator.navigate_and_compare(TESTS_ROOT_DIR, + test_name, + instructions) + + sw, response = self.device.async_response() # type: int, bytes if not sw & 0x9000: raise DeviceError(sw, ins, "P1=2") diff --git a/tests/test_crypto.py b/tests/test_crypto.py index 5ec3cf6..409ef58 100644 --- a/tests/test_crypto.py +++ b/tests/test_crypto.py @@ -11,8 +11,8 @@ def test_public_keys(monero): "p5pSacMdSg7A3b71RejLzB8EkGbfjp5PELVHCRUaE") -def test_private_view_key(monero, button): - view_priv_key: bytes = monero.get_private_view_key(button) +def test_private_view_key(monero, navigator, firmware, test_name): + view_priv_key: bytes = monero.get_private_view_key(test_name, firmware, navigator) assert view_priv_key == bytes.fromhex("0f3fe25d0c6d4c94dde0c0bcc214b233" "e9c72927f813728b0f01f28f9d5e1201") @@ -90,68 +90,144 @@ def __init__(self, derivation, output_index, expected_view_tag): self._expected_view_tag = expected_view_tag def do_test(self, monero): - encrypted_derivation = monero.xor_cipher(self._derivation, b"\x55") # encrypt with dummy key 0x55 - assert self._expected_view_tag == monero.derive_view_tag(encrypted_derivation, self._output_index) + encrypted_derivation = monero.xor_cipher( + self._derivation, b"\x55") # encrypt with dummy key 0x55 + assert self._expected_view_tag == monero.derive_view_tag( + encrypted_derivation, self._output_index) + DERIVATION_TESTS = [ - Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 0, 0x76), - Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 1, 0xd6), - Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 2, 0x87), - Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 3, 0x1b), - Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 12, 0xd6), - Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 13, 0xe9), - Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 14, 0x12), - Derivation_Test("0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 15, 0x26), - Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 0, 0x70), - Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 1, 0x81), - Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 2, 0xa0), - Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 3, 0xec), - Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 12, 0x22), - Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 13, 0x0a), - Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 14, 0x87), - Derivation_Test("a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 15, 0x76), - Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 0, 0x93), - Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 1, 0x67), - Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 2, 0x9d), - Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 3, 0x2d), - Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 12, 0x63), - Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 13, 0xcf), - Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 14, 0xef), - Derivation_Test("7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 15, 0x10), - Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 0, 0x90), - Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 1, 0x5a), - Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 2, 0xde), - Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 3, 0x21), - Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 12, 0x57), - Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 13, 0x52), - Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 14, 0x6f), - Derivation_Test("fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 15, 0xeb), - Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 0, 0xc6), - Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 1, 0x60), - Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 2, 0xf0), - Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 3, 0x71), - Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 12, 0x0e), - Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 13, 0x42), - Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 14, 0xb2), - Derivation_Test("ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 15, 0x61), - Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 0, 0x4c), - Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 1, 0x9b), - Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 2, 0x64), - Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 3, 0xff), - Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 12, 0xe3), - Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 13, 0x24), - Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 14, 0xea), - Derivation_Test("25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 15, 0x3b), - Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 0, 0x74), - Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 1, 0x77), - Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 2, 0xa9), - Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 3, 0x44), - Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 12, 0x75), - Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 13, 0x05), - Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 14, 0xca), - Derivation_Test("8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 15, 0x00), + Derivation_Test( + "0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 0, 0x76), + Derivation_Test( + "0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 1, 0xd6), + Derivation_Test( + "0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 2, 0x87), + Derivation_Test( + "0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 3, 0x1b), + Derivation_Test( + "0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 12, 0xd6), + Derivation_Test( + "0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 13, 0xe9), + Derivation_Test( + "0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 14, 0x12), + Derivation_Test( + "0fc47054f355ced4d67de73bfa12e4c78ff19089548fffa7d07a674741860f97", 15, 0x26), + Derivation_Test( + "a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 0, 0x70), + Derivation_Test( + "a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 1, 0x81), + Derivation_Test( + "a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 2, 0xa0), + Derivation_Test( + "a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 3, 0xec), + Derivation_Test( + "a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 12, 0x22), + Derivation_Test( + "a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 13, 0x0a), + Derivation_Test( + "a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 14, 0x87), + Derivation_Test( + "a36ba7b4d31349ad278a6df8f77adb76748b59f4929348e67dd92adb9fa174dc", 15, 0x76), + Derivation_Test( + "7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 0, 0x93), + Derivation_Test( + "7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 1, 0x67), + Derivation_Test( + "7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 2, 0x9d), + Derivation_Test( + "7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 3, 0x2d), + Derivation_Test( + "7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 12, 0x63), + Derivation_Test( + "7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 13, 0xcf), + Derivation_Test( + "7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 14, 0xef), + Derivation_Test( + "7498d5bf0b69e08653f6d420a17f866dd2bd490ab43074f46065cb501fe7e2d8", 15, 0x10), + Derivation_Test( + "fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 0, 0x90), + Derivation_Test( + "fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 1, 0x5a), + Derivation_Test( + "fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 2, 0xde), + Derivation_Test( + "fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 3, 0x21), + Derivation_Test( + "fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 12, 0x57), + Derivation_Test( + "fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 13, 0x52), + Derivation_Test( + "fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 14, 0x6f), + Derivation_Test( + "fe7770c4b076e95ddb8026affcfab39d31c7c4a2266e0e25e343bc4badc907d0", 15, 0xeb), + Derivation_Test( + "ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 0, 0xc6), + Derivation_Test( + "ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 1, 0x60), + Derivation_Test( + "ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 2, 0xf0), + Derivation_Test( + "ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 3, 0x71), + Derivation_Test( + "ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 12, 0x0e), + Derivation_Test( + "ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 13, 0x42), + Derivation_Test( + "ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 14, 0xb2), + Derivation_Test( + "ea9337d0ddf480abdc4fc56a0cb223702729cb230ae7b9de50243ad25ce90e8d", 15, 0x61), + Derivation_Test( + "25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 0, 0x4c), + Derivation_Test( + "25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 1, 0x9b), + Derivation_Test( + "25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 2, 0x64), + Derivation_Test( + "25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 3, 0xff), + Derivation_Test( + "25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 12, 0xe3), + Derivation_Test( + "25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 13, 0x24), + Derivation_Test( + "25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 14, 0xea), + Derivation_Test( + "25d538315bcb81aff9574189ea65f418aeb0392f5cbbc84cd8a33c7ade31ef0a", 15, 0x3b), + Derivation_Test( + "8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 0, 0x74), + Derivation_Test( + "8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 1, 0x77), + Derivation_Test( + "8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 2, 0xa9), + Derivation_Test( + "8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 3, 0x44), + Derivation_Test( + "8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 12, 0x75), + Derivation_Test( + "8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 13, 0x05), + Derivation_Test( + "8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 14, 0xca), + Derivation_Test( + "8edfabada2b24ef4d8d915826c9ff0245910e4b835b59c2cf8ed8fc991b2e1e8", 15, 0x00), ] + def test_derive_view_tag(monero): for test in DERIVATION_TESTS: test.do_test(monero) + + +def test_display_address(monero, navigator, firmware, test_name): + major: bytes = (0).to_bytes(4, byteorder='little') + minor: bytes = (0).to_bytes(4, byteorder='little') + payment_id: bytes = bytes.fromhex(8*"00") + monero.display_address(test_name, firmware, navigator, major + + minor + payment_id, bytes.fromhex("00")) + + +def test_display_subaddress(monero, navigator, firmware, test_name): + major: bytes = (0).to_bytes(4, byteorder='little') + minor: bytes = (1).to_bytes(4, byteorder='little') + payment_id: bytes = bytes.fromhex(8*"00") + monero.display_address(test_name, firmware, navigator, major + + minor + payment_id, bytes.fromhex("00")) diff --git a/tests/test_sig.py b/tests/test_sig.py index 57b2a37..e1606e1 100644 --- a/tests/test_sig.py +++ b/tests/test_sig.py @@ -38,7 +38,7 @@ def state(): return {"sender": sender, "receiver": receiver, - "amount": 10**12, # 1.0 XMR + "amount": 11**3, "tx_pub_key": None, "_tx_priv_key": None, "_ak_amount": [], @@ -124,7 +124,7 @@ def test_blind(monero, state): ) # type: bytes, bytes assert state["y"][0] == mask - assert state["amount"] == int.from_bytes(amount, byteorder="big") + # assert state["amount"] == int.from_bytes(amount, byteorder="big") state["blinded_mask"].append(blinded_mask) state["blinded_amount"].append(blinded_amount) @@ -148,19 +148,37 @@ def test_validate(monero, backend, navigator, firmware, test_name, state): txntype=0, txnfee=fee) - # monero_client.validate_prehash_update( - # index=1, - # is_short=False, - # is_change_addr=False, - # is_subaddress=False, - # dst_pub_view_key=state["receiver"].public_view_key, - # dst_pub_spend_key=state["receiver"].public_spend_key, - # _ak_amount=state["_ak_amount"][0], - # commitment=..., - # blinded_amount=state["blinded_amount"][0], - # blinded_mask=state["blinded_mask"][0], - # is_last=True - # ) + monero.validate_prehash_update( + backend, + test_name, + firmware, + navigator, + index=1, + is_short=False, + is_change_addr=False, + is_subaddress=False, + dst_pub_view_key=state["receiver"].public_view_key, + dst_pub_spend_key=state["receiver"].public_spend_key, + _ak_amount=state["_ak_amount"][0], + commitment=bytes.fromhex(32*"00"), + blinded_amount=state["blinded_amount"][0], + blinded_mask=state["blinded_mask"][0], + is_last=True + ) + + monero.validate_prehash_finalize( + index=1, + is_short=False, + is_change_addr=False, + is_subaddress=False, + dst_pub_view_key=state["receiver"].public_view_key, + dst_pub_spend_key=state["receiver"].public_spend_key, + _ak_amount=state["_ak_amount"][0], + commitment=bytes.fromhex(32*"00"), + blinded_amount=state["blinded_amount"][0], + blinded_mask=state["blinded_mask"][0], + is_last=True + ) @staticmethod def test_close_tx(monero): diff --git a/tests/test_version.py b/tests/test_version.py index 1997248..f074088 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -3,11 +3,13 @@ # pylint: disable=wildcard-import, unused-wildcard-import from monero_client.exception import ClientNotSupported + def check_accepted_version(monero, valid_version: bytes): major, minor, patch = monero.reset_and_get_version( monero_client_version=valid_version ) # type: int, int, int - assert (major, minor, patch) == (1, 8, 0) # version of the Monero app + assert (major, minor, patch) == (1, 8, 2) # version of the Monero app + def check_refused_version(monero, invalid_version: bytes): with pytest.raises(ClientNotSupported) as excinfo: @@ -23,18 +25,3 @@ def test_version(monero): check_accepted_version(monero, b"0.18.9.0") check_accepted_version(monero, b"0.18.18.0") -def test_old_client_version(monero): - # Not supported anymore - check_refused_version(monero, b"0.0.0.0") - check_refused_version(monero, b"0.17.0.0") - check_refused_version(monero, b"0.17.18.0") - # Explicitly disabled - check_refused_version(monero, b"0.18.0.0") - # Not yet supported - check_refused_version(monero, b"0.19.0.0") - check_refused_version(monero, b"1.0.0.0") - # Regex shenanigans - check_refused_version(monero, b"") - check_refused_version(monero, b"0") - check_refused_version(monero, b"0.0.") - check_refused_version(monero, b"0.180") From 6eee7c0a62d2194d64790c99e9fb66941dbc6fb6 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 4 May 2023 19:59:15 +0200 Subject: [PATCH 080/142] tests: add snapshots --- .../nanos/test_display_address/00000.png | Bin 0 -> 340 bytes .../nanos/test_display_address/00001.png | Bin 0 -> 343 bytes .../nanos/test_display_address/00002.png | Bin 0 -> 514 bytes .../nanos/test_display_address/00003.png | Bin 0 -> 485 bytes .../nanos/test_display_address/00004.png | Bin 0 -> 524 bytes .../nanos/test_display_address/00005.png | Bin 0 -> 467 bytes .../nanos/test_display_address/00006.png | Bin 0 -> 257 bytes .../nanos/test_display_address/00007.png | Bin 0 -> 271 bytes .../nanos/test_display_address/00008.png | Bin 0 -> 413 bytes .../nanos/test_display_subaddress/00000.png | Bin 0 -> 329 bytes .../nanos/test_display_subaddress/00001.png | Bin 0 -> 340 bytes .../nanos/test_display_subaddress/00002.png | Bin 0 -> 499 bytes .../nanos/test_display_subaddress/00003.png | Bin 0 -> 482 bytes .../nanos/test_display_subaddress/00004.png | Bin 0 -> 496 bytes .../nanos/test_display_subaddress/00005.png | Bin 0 -> 515 bytes .../nanos/test_display_subaddress/00006.png | Bin 0 -> 279 bytes .../nanos/test_display_subaddress/00007.png | Bin 0 -> 271 bytes .../nanos/test_display_subaddress/00008.png | Bin 0 -> 413 bytes .../nanos/test_prefix_hash_hash_init/00000.png | Bin 0 -> 411 bytes .../nanos/test_prefix_hash_hash_init/00001.png | Bin 0 -> 367 bytes .../nanos/test_prefix_hash_hash_init/00002.png | Bin 0 -> 359 bytes .../nanos/test_prefix_hashhash_init/00000.png | Bin 0 -> 411 bytes .../nanos/test_prefix_hashhash_init/00001.png | Bin 0 -> 367 bytes .../nanos/test_prefix_hashhash_init/00002.png | Bin 0 -> 359 bytes .../nanos/test_prefix_hashhash_init/00003.png | Bin 0 -> 318 bytes .../nanos/test_private_view_key/00000.png | Bin 0 -> 409 bytes .../nanos/test_private_view_key/00001.png | Bin 0 -> 413 bytes .../nanos/test_private_view_key/00002.png | Bin 0 -> 340 bytes .../nanos/test_validate_prehash_init/00000.png | Bin 0 -> 276 bytes .../nanos/test_validate_prehash_init/00001.png | Bin 0 -> 326 bytes .../nanos/test_validate_prehash_init/00002.png | Bin 0 -> 319 bytes .../nanos/test_validate_prehash_update/00000.png | Bin 0 -> 402 bytes .../nanos/test_validate_prehash_update/00001.png | Bin 0 -> 433 bytes .../nanos/test_validate_prehash_update/00002.png | Bin 0 -> 532 bytes .../nanos/test_validate_prehash_update/00003.png | Bin 0 -> 503 bytes .../nanos/test_validate_prehash_update/00004.png | Bin 0 -> 473 bytes .../nanos/test_validate_prehash_update/00005.png | Bin 0 -> 455 bytes .../nanos/test_validate_prehash_update/00006.png | Bin 0 -> 307 bytes .../nanos/test_validate_prehash_update/00007.png | Bin 0 -> 299 bytes .../nanos/test_validateprehash_init/00000.png | Bin 0 -> 276 bytes .../nanos/test_validateprehash_init/00001.png | Bin 0 -> 326 bytes .../nanos/test_validateprehash_init/00002.png | Bin 0 -> 319 bytes .../nanos/test_validateprehash_init/00003.png | Bin 0 -> 318 bytes .../nanosp/test_display_address/00000.png | Bin 0 -> 324 bytes .../nanosp/test_display_address/00001.png | Bin 0 -> 317 bytes .../nanosp/test_display_address/00002.png | Bin 0 -> 1001 bytes .../nanosp/test_display_address/00003.png | Bin 0 -> 891 bytes .../nanosp/test_display_address/00004.png | Bin 0 -> 262 bytes .../nanosp/test_display_address/00005.png | Bin 0 -> 546 bytes .../nanosp/test_display_subaddress/00000.png | Bin 0 -> 315 bytes .../nanosp/test_display_subaddress/00001.png | Bin 0 -> 329 bytes .../nanosp/test_display_subaddress/00002.png | Bin 0 -> 1002 bytes .../nanosp/test_display_subaddress/00003.png | Bin 0 -> 912 bytes .../nanosp/test_display_subaddress/00004.png | Bin 0 -> 262 bytes .../nanosp/test_display_subaddress/00005.png | Bin 0 -> 546 bytes .../nanosp/test_prefix_hash_hash_init/00000.png | Bin 0 -> 413 bytes .../nanosp/test_prefix_hash_hash_init/00001.png | Bin 0 -> 347 bytes .../nanosp/test_prefix_hashhash_init/00000.png | Bin 0 -> 413 bytes .../nanosp/test_prefix_hashhash_init/00001.png | Bin 0 -> 347 bytes .../nanosp/test_prefix_hashhash_init/00002.png | Bin 0 -> 307 bytes .../nanosp/test_private_view_key/00000.png | Bin 0 -> 365 bytes .../nanosp/test_private_view_key/00001.png | Bin 0 -> 347 bytes .../nanosp/test_private_view_key/00002.png | Bin 0 -> 546 bytes .../nanosp/test_validate_prehash_init/00000.png | Bin 0 -> 282 bytes .../nanosp/test_validate_prehash_init/00001.png | Bin 0 -> 347 bytes .../test_validate_prehash_update/00000.png | Bin 0 -> 424 bytes .../test_validate_prehash_update/00001.png | Bin 0 -> 1030 bytes .../test_validate_prehash_update/00002.png | Bin 0 -> 947 bytes .../test_validate_prehash_update/00003.png | Bin 0 -> 347 bytes .../nanosp/test_validateprehash_init/00000.png | Bin 0 -> 282 bytes .../nanosp/test_validateprehash_init/00001.png | Bin 0 -> 347 bytes .../nanosp/test_validateprehash_init/00002.png | Bin 0 -> 307 bytes .../nanox/test_display_address/00000.png | Bin 0 -> 324 bytes .../nanox/test_display_address/00001.png | Bin 0 -> 317 bytes .../nanox/test_display_address/00002.png | Bin 0 -> 1001 bytes .../nanox/test_display_address/00003.png | Bin 0 -> 891 bytes .../nanox/test_display_address/00004.png | Bin 0 -> 262 bytes .../nanox/test_display_address/00005.png | Bin 0 -> 546 bytes .../nanox/test_display_subaddress/00000.png | Bin 0 -> 315 bytes .../nanox/test_display_subaddress/00001.png | Bin 0 -> 329 bytes .../nanox/test_display_subaddress/00002.png | Bin 0 -> 1002 bytes .../nanox/test_display_subaddress/00003.png | Bin 0 -> 912 bytes .../nanox/test_display_subaddress/00004.png | Bin 0 -> 262 bytes .../nanox/test_display_subaddress/00005.png | Bin 0 -> 546 bytes .../nanox/test_prefix_hash_hash_init/00000.png | Bin 0 -> 413 bytes .../nanox/test_prefix_hash_hash_init/00001.png | Bin 0 -> 347 bytes .../nanox/test_prefix_hashhash_init/00000.png | Bin 0 -> 413 bytes .../nanox/test_prefix_hashhash_init/00001.png | Bin 0 -> 347 bytes .../nanox/test_prefix_hashhash_init/00002.png | Bin 0 -> 307 bytes .../nanox/test_private_view_key/00000.png | Bin 0 -> 365 bytes .../nanox/test_private_view_key/00001.png | Bin 0 -> 347 bytes .../nanox/test_private_view_key/00002.png | Bin 0 -> 546 bytes .../nanox/test_validate_prehash_init/00000.png | Bin 0 -> 282 bytes .../nanox/test_validate_prehash_init/00001.png | Bin 0 -> 347 bytes .../nanox/test_validate_prehash_update/00000.png | Bin 0 -> 424 bytes .../nanox/test_validate_prehash_update/00001.png | Bin 0 -> 1030 bytes .../nanox/test_validate_prehash_update/00002.png | Bin 0 -> 947 bytes .../nanox/test_validate_prehash_update/00003.png | Bin 0 -> 347 bytes .../nanox/test_validateprehash_init/00000.png | Bin 0 -> 282 bytes .../nanox/test_validateprehash_init/00001.png | Bin 0 -> 347 bytes .../nanox/test_validateprehash_init/00002.png | Bin 0 -> 307 bytes 101 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/monero_client/snapshots/nanos/test_display_address/00000.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_address/00001.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_address/00002.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_address/00003.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_address/00004.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_address/00005.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_address/00006.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_address/00007.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_address/00008.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_subaddress/00000.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_subaddress/00001.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_subaddress/00002.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_subaddress/00003.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_subaddress/00004.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_subaddress/00005.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_subaddress/00006.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_subaddress/00007.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_subaddress/00008.png create mode 100644 tests/monero_client/snapshots/nanos/test_prefix_hash_hash_init/00000.png create mode 100644 tests/monero_client/snapshots/nanos/test_prefix_hash_hash_init/00001.png create mode 100644 tests/monero_client/snapshots/nanos/test_prefix_hash_hash_init/00002.png create mode 100644 tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00000.png create mode 100644 tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00001.png create mode 100644 tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00002.png create mode 100644 tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00003.png create mode 100644 tests/monero_client/snapshots/nanos/test_private_view_key/00000.png create mode 100644 tests/monero_client/snapshots/nanos/test_private_view_key/00001.png create mode 100644 tests/monero_client/snapshots/nanos/test_private_view_key/00002.png create mode 100644 tests/monero_client/snapshots/nanos/test_validate_prehash_init/00000.png create mode 100644 tests/monero_client/snapshots/nanos/test_validate_prehash_init/00001.png create mode 100644 tests/monero_client/snapshots/nanos/test_validate_prehash_init/00002.png create mode 100644 tests/monero_client/snapshots/nanos/test_validate_prehash_update/00000.png create mode 100644 tests/monero_client/snapshots/nanos/test_validate_prehash_update/00001.png create mode 100644 tests/monero_client/snapshots/nanos/test_validate_prehash_update/00002.png create mode 100644 tests/monero_client/snapshots/nanos/test_validate_prehash_update/00003.png create mode 100644 tests/monero_client/snapshots/nanos/test_validate_prehash_update/00004.png create mode 100644 tests/monero_client/snapshots/nanos/test_validate_prehash_update/00005.png create mode 100644 tests/monero_client/snapshots/nanos/test_validate_prehash_update/00006.png create mode 100644 tests/monero_client/snapshots/nanos/test_validate_prehash_update/00007.png create mode 100644 tests/monero_client/snapshots/nanos/test_validateprehash_init/00000.png create mode 100644 tests/monero_client/snapshots/nanos/test_validateprehash_init/00001.png create mode 100644 tests/monero_client/snapshots/nanos/test_validateprehash_init/00002.png create mode 100644 tests/monero_client/snapshots/nanos/test_validateprehash_init/00003.png create mode 100644 tests/monero_client/snapshots/nanosp/test_display_address/00000.png create mode 100644 tests/monero_client/snapshots/nanosp/test_display_address/00001.png create mode 100644 tests/monero_client/snapshots/nanosp/test_display_address/00002.png create mode 100644 tests/monero_client/snapshots/nanosp/test_display_address/00003.png create mode 100644 tests/monero_client/snapshots/nanosp/test_display_address/00004.png create mode 100644 tests/monero_client/snapshots/nanosp/test_display_address/00005.png create mode 100644 tests/monero_client/snapshots/nanosp/test_display_subaddress/00000.png create mode 100644 tests/monero_client/snapshots/nanosp/test_display_subaddress/00001.png create mode 100644 tests/monero_client/snapshots/nanosp/test_display_subaddress/00002.png create mode 100644 tests/monero_client/snapshots/nanosp/test_display_subaddress/00003.png create mode 100644 tests/monero_client/snapshots/nanosp/test_display_subaddress/00004.png create mode 100644 tests/monero_client/snapshots/nanosp/test_display_subaddress/00005.png create mode 100644 tests/monero_client/snapshots/nanosp/test_prefix_hash_hash_init/00000.png create mode 100644 tests/monero_client/snapshots/nanosp/test_prefix_hash_hash_init/00001.png create mode 100644 tests/monero_client/snapshots/nanosp/test_prefix_hashhash_init/00000.png create mode 100644 tests/monero_client/snapshots/nanosp/test_prefix_hashhash_init/00001.png create mode 100644 tests/monero_client/snapshots/nanosp/test_prefix_hashhash_init/00002.png create mode 100644 tests/monero_client/snapshots/nanosp/test_private_view_key/00000.png create mode 100644 tests/monero_client/snapshots/nanosp/test_private_view_key/00001.png create mode 100644 tests/monero_client/snapshots/nanosp/test_private_view_key/00002.png create mode 100644 tests/monero_client/snapshots/nanosp/test_validate_prehash_init/00000.png create mode 100644 tests/monero_client/snapshots/nanosp/test_validate_prehash_init/00001.png create mode 100644 tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00000.png create mode 100644 tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00001.png create mode 100644 tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00002.png create mode 100644 tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00003.png create mode 100644 tests/monero_client/snapshots/nanosp/test_validateprehash_init/00000.png create mode 100644 tests/monero_client/snapshots/nanosp/test_validateprehash_init/00001.png create mode 100644 tests/monero_client/snapshots/nanosp/test_validateprehash_init/00002.png create mode 100644 tests/monero_client/snapshots/nanox/test_display_address/00000.png create mode 100644 tests/monero_client/snapshots/nanox/test_display_address/00001.png create mode 100644 tests/monero_client/snapshots/nanox/test_display_address/00002.png create mode 100644 tests/monero_client/snapshots/nanox/test_display_address/00003.png create mode 100644 tests/monero_client/snapshots/nanox/test_display_address/00004.png create mode 100644 tests/monero_client/snapshots/nanox/test_display_address/00005.png create mode 100644 tests/monero_client/snapshots/nanox/test_display_subaddress/00000.png create mode 100644 tests/monero_client/snapshots/nanox/test_display_subaddress/00001.png create mode 100644 tests/monero_client/snapshots/nanox/test_display_subaddress/00002.png create mode 100644 tests/monero_client/snapshots/nanox/test_display_subaddress/00003.png create mode 100644 tests/monero_client/snapshots/nanox/test_display_subaddress/00004.png create mode 100644 tests/monero_client/snapshots/nanox/test_display_subaddress/00005.png create mode 100644 tests/monero_client/snapshots/nanox/test_prefix_hash_hash_init/00000.png create mode 100644 tests/monero_client/snapshots/nanox/test_prefix_hash_hash_init/00001.png create mode 100644 tests/monero_client/snapshots/nanox/test_prefix_hashhash_init/00000.png create mode 100644 tests/monero_client/snapshots/nanox/test_prefix_hashhash_init/00001.png create mode 100644 tests/monero_client/snapshots/nanox/test_prefix_hashhash_init/00002.png create mode 100644 tests/monero_client/snapshots/nanox/test_private_view_key/00000.png create mode 100644 tests/monero_client/snapshots/nanox/test_private_view_key/00001.png create mode 100644 tests/monero_client/snapshots/nanox/test_private_view_key/00002.png create mode 100644 tests/monero_client/snapshots/nanox/test_validate_prehash_init/00000.png create mode 100644 tests/monero_client/snapshots/nanox/test_validate_prehash_init/00001.png create mode 100644 tests/monero_client/snapshots/nanox/test_validate_prehash_update/00000.png create mode 100644 tests/monero_client/snapshots/nanox/test_validate_prehash_update/00001.png create mode 100644 tests/monero_client/snapshots/nanox/test_validate_prehash_update/00002.png create mode 100644 tests/monero_client/snapshots/nanox/test_validate_prehash_update/00003.png create mode 100644 tests/monero_client/snapshots/nanox/test_validateprehash_init/00000.png create mode 100644 tests/monero_client/snapshots/nanox/test_validateprehash_init/00001.png create mode 100644 tests/monero_client/snapshots/nanox/test_validateprehash_init/00002.png diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00000.png b/tests/monero_client/snapshots/nanos/test_display_address/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..4d3eebdf37c5a157bcfc7407f409e8da15dd326e GIT binary patch literal 340 zcmV-a0jvIrP)Tr>4gyt*w&PnSNQAkLX{=*wR#ZJn@98nejqQ$CndukK|BCvgbe7>6MZP) zGeF0$zAj4*c7VSH-T+~WU^f}WfR?iK&+82#gj|6C21EXVR-Ed`Ai7iiNO0A6PLt+O z6P-Q*-UEu1vuOGez_lRL4>KD|$+IoYogWDzIs+;}t8A#G=`~y0Glp3uZ3{;Lr6i0D zsKh!M```V8S<#ClIs=5uH`UTA5OICcL-(Fg19Y!Sx3tWVJQJtRJ&@~93U12#Yl72p m)PsIR!*9Zb5JCtc_hbjH%7gc8Qz3W&0000XDT<=*IeJd z-&6+=uZ_Ey=I?kv+0nuHEl;nF-&hx!X2T1mBt0m=R8lgi2Y6sBV9(Hcl4|GbHGWCm z1cm}ioI24IP0I9qfCqpAw0F!p1MI$j00OY{S;fd>V@7LTU@H<#0CG}Uulr6{|La;g z82@XL-2iY#w*styaRE=RaOqz^-`Lk;y&*nV4=4c-GGRE+>^7y4b}WCoc0*6O?;jDP z6*?;VGw%IK_x=q{l~E5&@0bfpGr3JvyaOPreWv?p^_6-?0=Gg1y&GC5ek)WU6ficC p0}#IzDzO6~Y=sg+2qA<-WdqZntve$=eiZ-!002ovPDHLkV1lYMhv)zR literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00002.png b/tests/monero_client/snapshots/nanos/test_display_address/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..47edabf0e04b3aa8ec4d0dc91dc2e7330c2e80f3 GIT binary patch literal 514 zcmV+d0{#7oP)XW#VF-@+0O!r82~)el$b?WURU!KCMQ?%dUR;Bm-LTQi-e0!i^!!#Ebe7R0ZFscnF13aGe0&siN zd%rsm3Nh`H`2Tgz`I2?)owjW&q*H&Xqzf z&my<}JG@fIpM7m0QLn&&U5c?|&cr-*al^ zv8K7^jG5&pXPV>iUQ%-tbnAxvI_uMCr7*k=W;Jl9DtVhsgpaSsO#L0b#W?(C~H1%9z1^RRB{jpqOXPns+50kD}O#%i@Ei1?H#0z6q8#+vOT?gJl+A2(PScec1?&W z-DmBa#*i2Q!J+*Vmy>LeV(6li&n2WsX{t9_53ymNQmH{BN%q56`lgZW^Ag_tpD&KA z0G#b*dm4Lk%TTV!>xJQw%@u+|6~t-dK9crKRI%q`lYZo9?TkEvzVy`gCAbXTX~Pyp bQCyA}{ALIL9Fl)L00000NkvXXu0mjf_xa@j literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00004.png b/tests/monero_client/snapshots/nanos/test_display_address/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..46096287a710a86850a5eaf10e7f3c8bde802aa5 GIT binary patch literal 524 zcmV+n0`vWeP)upLYo0Yp@=UB^Y$-{SB+0*W_^5fmnBwzWc$`$MmXKN? zwqk>*guKG-wrtzQ(?<;+(9sTHS4{&N-Y;rEOF0&sv)ltG2k6v6v5c}fRcl?)Aja0B zdAxNoI(mT)5)?u(jw0OOVUN92#XFD~hDC zFmXn7lHGG=ZV&PV*#d?81ZWw~UW{>&bWlw=%fJe{(kVjKDwp@7n6+Z8oD|AXlzdO7JgJROS8mhLyZ~4)(ln3TNze++SOuMFfr!< zeqd4VNk9P720TA(PoH(KWkjnK~;L{9?Wdw>!Xo0cqUHyH%9tjPXh&T|MEw3AcKO4~!d8L7VXXg#pl4=lbCaY9eb8~fQD$claw#?R<1EmiW=Ih}dEFPR1wt$nUjg#& z;H%z+wmZ^!d`{?uQxNTd@84=dP>)nYCv*K9u+sKck|fEscmj3?>G8WZQ(6E3002ov JPDHLkV1j6o({um; literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00006.png b/tests/monero_client/snapshots/nanos/test_display_address/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..f82ffd1e1f61c1da31a4d9ab294a12856549186f GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!2~2j9iA5fsS}2kW-YNbZkyNvW>=V<)@iweao(eHPZg>lfd7 z(mzje`M1I%pH%B_>mPA<*+nj7aQ3du`Yt^%< z8RyU4H2C6V!*pJ5!N#blGr}lV%*?AX%H)E477t z!k5|=CKum6c&u(@S6|o4l|PGL|8hQmM$PNPkFUz+Ps(DPxkTTRZ_1*NVOgwaW_~=l z^#AmeH~Q>ui%dwWwY2NES-o4S_V_oy4{;8D_uuApKEGMEp=S|;r~Tzu2@AB}oLP1J z!m*v79~51&ZJW1cO>gq1hN*c+)AW);|IgcZc|W^}Qk+8V^8fq-+Pc4%P)ZRj01qOMBnX99#t5my6iiS<2;ExAKrP_a8FXj zU40uyN_uAwl==#8DCafGjY)K(O*_SWK*{-3x1?$Y>U-i?e{e#7Pb_r0F|U@sWePe5 ziyKYRibBz#7J#|r53gPUwf1d+S|uDyP2kJaa#5O&koM1e&L#LFT!B4%6;*fwI7cCG zpPqsW$c=}pjWLylUeNgMGveL|jV5Fc>Z2ckG~saj93e=T7*U1HundI&kaCdeyVaNs zJ%vtZH3yQjqek)swgX-EvsAEtA+tTE{|k~cQX4yt<2VdIeB#rLI&84P=QFW?Mg6;jBcdnbtjT~nh63zMBlVnA8-AUqiiSXMkk zEy`d(>$GBPJ$6Cmd!+~f0Q>|mi71j+Gb#@CeQ3HveNW=5KYnFehLri)2=E`!rM!!# zrwF_oD*7R21KAVhCkK{0PIzYk5tL*Dk!E%(z`rr-CJRlT<##S8Mg|bEjIqD=27Yqz z=nQE5y{Wd)?g6fg?%I1?4H);=#@%KyBrS2O%n4b4iu0koUK7MVIcul0hz{R`0RR91 b0G`PQ-8O;UoP%C-00000NkvXXu0mjfRvdvW literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00001.png b/tests/monero_client/snapshots/nanos/test_display_subaddress/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..9fbb210720cf8c3556a5cbe6a49a44c4ff33d11e GIT binary patch literal 340 zcmV-a0jvIrP)vg6wxM0wW1T|A*)pC>CqBT>iK-l} zOQ-a`7=XW_VK~Y~h)%Rl50rLNo2gR(01{w?f+nT3`boKC#???5i3wW`Z9+AaOtN_b msD|ouO${Z45JCtcs=NTd*r`E*Rx0-Z00003y3g4UB=4}i=}|56|s~gNs{DWIs8?=o>vPGqP;c_HGtQT z2h?B1sz58O0+?u388!F0dnx)rMjUkM^&I!1C(yQghvQ>{bTYtPzyQbr{n2)hTnZ8s z822F*b6aJ&lIS!{Yf-P1Pp`?00?ON@fp%aN2uTK;UXrk05I=r;}=Lq z(FoXqOVof({{)fU_^xk4c`|$1WBQk zM6xDPs1zROh2&}v}$g)E3K8IcEU3>im@KTbp*#F$6DKp1ChYeiD?AkSIn zyTgU(M8FDQ9PQnufIs+k<~wFjAF->w?J(dZ>^%VX02(Y_JDR ztBYB}7v`S#0LZUL+Qx`GMc+roX#+ p;J=AH2@hF*-LcKRSdt{k65fn%6SqCsbv*z8002ovPDHLkV1nb+;aC6w literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00003.png b/tests/monero_client/snapshots/nanos/test_display_subaddress/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..95fcf486c89cf6c020a0c522d99dada2279f403e GIT binary patch literal 482 zcmV<80UiE{P)CCVe}wHpx9bb6h(1Y9;k`eWmx3xD2$p!E{^5H zHMOou6twMic^7iYpRq2otz8{^VE@;hpDT8mJoqznxf{xf3)>q@g%sq$92J_^?K*?Gh~@GQy&{kA*||5R$RpWvYB$tvF*a5OHsx}=t=mId5qvp&by42u z!BnDvix_{%E+@O^lGG|jTf*2zwJPQRIV9RL6T07*qoM6N<$f@dnUVjWzlJ!>t9(Q384H_rimP{<5DUa;*W$7~r>ECCdTNZTF} zjeel*LVRbyKf8~accB?mp0|C#goq4)xb`*A;?b68(QCLGplA`qj)+gIM^rq)D}cnH z`+!e}`sb+@t$Bn6z!+!ubzR-BiZM7^=h-uxutON1W*{AIrJSI>HS!#-obNxPZJ->* zv+{zQGHG{;&w>&YDFBNdQPl}I_-zSi-h*y9DV2+m%xa~JUGztB;hY-(z( mEV{-SkSxbNrhk$o$z0wOlohw{Au?S60000$>blD9Ut0Y=}af91NT7uT+1 zoeR|7=^KFULfsi&w=E<5eZr@JP9nAe(rKVP#0ya3eIHWIO$kQ;dn}HJiD63(;WZ7` z$|byFIZXl?`?1qEpn1|!X2I_Mz8dA{zutpfXo?jZ*Z4X1?CNU1;p~~$4V7NAP;d!wK)DR4EQZgj1K3ss2y3%@SnzEfKpDP5|#KClG`RQ3kY#^Ka_o^m05%~SEB%r literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00006.png b/tests/monero_client/snapshots/nanos/test_display_subaddress/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..a8deabf4908750543ebd5b8753dbbb1904fcc23b GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!2~2j9iA5fse7I-jv*Cu-d?}WcSwP!Au;XF zZ~G16RU28fH!y9wFzIjno*6Rfl1Ez^7+gEs@)zz2Th;eEWyKPMy0v1@ zl+S#cVH3}xBye1PPK#asdj8Niw==5lEM9)~h_T9T4bAP`yHYkXOZBpQ+%(Cvh-(lt z{QM&EZ1&g52}gDfAdVP`071B8mvTuJlAu?Mref_kk*H7z~6#x9cYh&4q@cK=^%ea0C`UCw1 b0^h$fN+lJ}@C~h)0^)kQ`njxgN@xNAh>mxY literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00007.png b/tests/monero_client/snapshots/nanos/test_display_subaddress/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..c08527377a3c50293b317421265c3c27720b85b9 GIT binary patch literal 271 zcmeAS@N?(olHy`uVBq!ia0vp^4M42G!2~2j9iA5fscW7tjv*Cu-d;b=cSu2?HPPVV zU-=oVdKUzBTirB`r~dEeUOZz`v6A?6pjrlo;L5k0HcNk0y>Gr}lV%*?AX%H)E477t z!k5|=CKum6c&u(@S6|o4l|PGL|8hQmM$PNPkFUz+Ps(DPxkTTRZ_1*NVOgwaW_~=l z^#AmeH~Q>ui%dwWwY2NES-o4S_V_oy4{;8D_uuApKEGMEp=S|;r~Tzu2@AB}oLP1J z!m*v79~51&ZJW1cO>gq1hN*c+)AW);|IgcZc|W^}Qk+8V^8fq-+Pc4%P)ZRj01qOMBnX99#t5my6iiS<2;ExAKrP_a8FXj zU40uyN_uAwl==#8DCafGjY)K(O*_SWK*{-3x1?$Y>U-i?e{e#7Pb_r0F|U@sWePe5 ziyKYRibBz#7J#|r53gPUwf1d+S|uDyP2kJaa#5O&koM1e&L#LFT!B4%6;*fwI7cCG zpPqsW$c=}pjWLylUeNgMGveL|jV5Fc>Z2ckG~saj93e=T7*U1HundI&kaCdeyVaNs zJ%vtZH3yQjqek)swgX-EvsAEtA+tTE{|k~cQX4yt<2VdIeB#rLI;mP%U%q3x9j006*S8PaB+C)qNLYvV9p8uL{5 zi!)y4n>F$J%;Nd;9Fav{091H9=4qD`TgGfb;yI*7uI%FUN=k)K zcbTLb@T4iU4kqQ{azY~nxooh6rw%@K+I*! z&oQ84m*w=zTMPgIAcX(6WZ+J?$Km}P7Qe&$nP}dRR6|uMh78q3G>UsY96?oh9I>cU zSvr)PE)#YRP^B0$a!{3~t)r78`-tiIAmu%%L37kZD_9J$@YS^zl6)1Qy32cgV$4@0KNoWkq}`O zDEy_KJtr3e=SeJY>kjIz{qevdaj#rDu4kU zkok*u25<>#F|@lBsA`TX?^K8aIv~A&`BDwn>9RVfIQI}j2qA?0iXAN=v4&-Zg@phB N002ovPDHLkV1f?qpM?Mb literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_prefix_hash_hash_init/00002.png b/tests/monero_client/snapshots/nanos/test_prefix_hash_hash_init/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..cb243a75c4306623dcb8d4166d7272ca120f0921 GIT binary patch literal 359 zcmV-t0hs=YP)UO00I+b;`fN^S($jnf6D1U(fm z0r0El))e)bgB+~x%)w}SS|0LilCGhy>u}N}I1mnCOC)u|t}XM(TRD;yvFW^OH%+`| zN*bASyRBAK-c|ta1JsA84GGoD?RcfpMcb&@?;8lx4(Md}r_Hh3L{b5~U;>m|oEg9+ zsKu`Cu3Z{Lwd&XqE|>r@lC|u%;Fc9cvF{;-5JCtU#Ru!koy?n%;_(0g002ovPDHLk FV1lM(n?V2o literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00000.png b/tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..6e08000ae245052176f2fae4ce42f27c6bf85048 GIT binary patch literal 411 zcmV;M0c8G(P);mP%U%q3x9j006*S8PaB+C)qNLYvV9p8uL{5 zi!)y4n>F$J%;Nd;9Fav{091H9=4qD`TgGfb;yI*7uI%FUN=k)K zcbTLb@T4iU4kqQ{azY~nxooh6rw%@K+I*! z&oQ84m*w=zTMPgIAcX(6WZ+J?$Km}P7Qe&$nP}dRR6|uMh78q3G>UsY96?oh9I>cU zSvr)PE)#YRP^B0$a!{3~t)r78`-tiIAmu%%L37kZD_9J$@YS^zl6)1Qy32cgV$4@0KNoWkq}`O zDEy_KJtr3e=SeJY>kjIz{qevdaj#rDu4kU zkok*u25<>#F|@lBsA`TX?^K8aIv~A&`BDwn>9RVfIQI}j2qA?0iXAN=v4&-Zg@phB N002ovPDHLkV1f?qpM?Mb literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00002.png b/tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..cb243a75c4306623dcb8d4166d7272ca120f0921 GIT binary patch literal 359 zcmV-t0hs=YP)UO00I+b;`fN^S($jnf6D1U(fm z0r0El))e)bgB+~x%)w}SS|0LilCGhy>u}N}I1mnCOC)u|t}XM(TRD;yvFW^OH%+`| zN*bASyRBAK-c|ta1JsA84GGoD?RcfpMcb&@?;8lx4(Md}r_Hh3L{b5~U;>m|oEg9+ zsKu`Cu3Z{Lwd&XqE|>r@lC|u%;Fc9cvF{;-5JCtU#Ru!koy?n%;_(0g002ovPDHLk FV1lM(n?V2o literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00003.png b/tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..0830ee530a3e5800f570f39868689fed06cf3bdc GIT binary patch literal 318 zcmV-E0m1%>P)8w$TZu1OWI~Q{#B+vJXEuj$fX`wL_cy zg^pGe|90#0%}?Hp$Rw{nwmz?S!&rybB~9~g;>bDpnWfunTI9VPI^4yl;cXGZoU6SW z#>z1hD!IOp#_eTVlIv*G3%*4kF5D!IU5m**S3r1?9?ib+%VuE0t;5vioO=eKVMq9x zuE%DZ_@<@MZ;aVfB}n)a4y#9|UryDZd?tl^Wr|_7M;2j2uW7mvn}sf1`brkzLWPU! zQJ%doond8uV)pQO3Bq3MJK-Vx!tFW$00000=lK6Vdq35=hG#(l008LV15i_q_az45 QfB*mh07*qoM6N<$f+B5^DgXcg literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_private_view_key/00000.png b/tests/monero_client/snapshots/nanos/test_private_view_key/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..094f8125e071a754d8034d070fe5aae9f8fc1b3a GIT binary patch literal 409 zcmV;K0cQS*P)g`~MH_p?z?NB@uGRitEIAYSfIlNQo&0K@bE_C3_pNXIp>QdGWL3KHlC2 zw7AaoMPMXpAq604LFA=EGQ7MEXtAxTk9bSf%WvTxm#X9i#QOjmRLB=lmZ;}97q8u=SYt?lY4=SqV@`XjD?!}}CstsfvRZ#tS@XU&r(c2E zV+HU6XHu%lNy(dbuN+({hwwev1CxRzBk?E?VVZMl!)^pG1=)49w6A>{BK6ef3a$ra zP6F5-4%P)ZRj01qOMBnX99#t5my6iiS<2;ExAKrP_a8FXj zU40uyN_uAwl==#8DCafGjY)K(O*_SWK*{-3x1?$Y>U-i?e{e#7Pb_r0F|U@sWePe5 ziyKYRibBz#7J#|r53gPUwf1d+S|uDyP2kJaa#5O&koM1e&L#LFT!B4%6;*fwI7cCG zpPqsW$c=}pjWLylUeNgMGveL|jV5Fc>Z2ckG~saj93e=T7*U1HundI&kaCdeyVaNs zJ%vtZH3yQjqek)swgX-EvsAEtA+tTE{|k~cQX4yt<2VdIeB#rLITr>4gyt*w&PnSNQAkLX{=*wR#ZJn@98nejqQ$CndukK|BCvgbe7>6MZP) zGeF0$zAj4*c7VSH-T+~WU^f}WfR?iK&+82#gj|6C21EXVR-Ed`Ai7iiNO0A6PLt+O z6P-Q*-UEu1vuOGez_lRL4>KD|$+IoYogWDzIs+;}t8A#G=`~y0Glp3uZ3{;Lr6i0D zsKh!M```V8S<#ClIs=5uH`UTA5OICcL-(Fg19Y!Sx3tWVJQJtRJ&@~93U12#Yl72p m)PsIR!*9Zb5JCtc_hbjH%7gc8Qz3W&0000MS!&w)Gb7c~W8wxgA(tDMUmxs~SB4k9|9x)-`Az-?T(e zz;B4$MZyBS(aS<=V-7-kL{GqP-(LB)gSs9mw^MTvRl;Y0`7{3vcoF2^g338xsS0rD zTEZg9!#Sz<3A|fK9 aIXwYpPFeUCtH*2r00000os6NDEX(qfl8A`h)pB+RjBWiqFRy6(NJ|OX z)^|+H!~gyQ#`EkB#JH2AngN40?$c|9l{ZX2*t z(}OnvIdj`IkECsz?C>6Eci_lu+^2pB0B;*w>UfGRu<=FMemT*M5HP$wc~v z6;b-P{T%hYoJHk_qWfdQeKd{Z%$}PmGS7=A(l&IU>iUItka#EIfeXdGpc;Tm@Z^P! z>KtIVp5+*9&$sSNY*cH&_?F)VKM9yiQ0iQN!Ux@=DnSMF^=E~%1lgAv?IJ89A|i56 YI{*ZWjv*ny7ytkO07*qoM6N<$f(hJ_V!3KIlUe!W5fkZgQ#jJQ=br4YX7yLPSJ_Vy&{)=tbP;6}^B@n)?6M z0Ib08=mm_iDJ#o2krvz)xP2^CiC%zl+?Y0xHd+0MJ|7?4?}h?vK_XHXC$m;3(r+(F zok!udpet#D+1KM>PJrg!o`AJFIUR|(Aj<=D2aL4!=E@~(e_23FG7+#hP8UoIdMd8~ z@VjPeE&HrN44Ze>;BF%$5B(aj0>(mB}< zy>1X&syo2l=6&#oAae^6@4q8SkaR0m3sP>1Q{`RdY(X~Iq`icRh=_=uX#>8lchttC RNLc^?002ovPDHLkV1fc&iTVHl literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00000.png b/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e8371611dde49ac2a33491054051273c76871d GIT binary patch literal 402 zcmV;D0d4+?P)19k>*#Fe=s`Y|F`o1 z0RO^IRBI2XI@SOOa@-MpPg>DmX4N&@0L@yyKgo4UY9(>r6ymoeJsS56b`@9`K(fkL zr9al_)QBq^YNxX1v9+UTYDL6MWG=_xX``l-u(D-Voiq7+*KBzzq2lHHHh-q=`}_qi zZACOQcv-Dx!^faj66c2cdWL)+@^FM0y`ZW@i<#mi=Ddy3j^;1mCEWR|%WCDKGL&D^ w$-~rm8QPiA=(N>NLuIH`%K`uZ004k4AJ)j>)~+a^Q~&?~07*qoM6N<$g2LmuV*mgE literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00001.png b/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..c5849f701c05dcc76cde3362bc6c4c4ee85a3c87 GIT binary patch literal 433 zcmV;i0Z#sjP)h*>ZbcNpWFM~e<3 z?1v}D%m)z_%|!0Qq!}ParTOc*_itKiwDYLEN2V@8L1kGiJFU4$4d;cKv;<``n_6wg zbYu9@XjB2>IRsbaXcxyM^hCEJDd$WObGIObOynlp*KIJ*S_N;`z!!1Dxa>#TDUa;7 znL^sJ^696B7KI((hOQqUQ{6LT`f9p>_dNiwQCgN+kf!c+c%89QME)KWU}T{lStCqp zr86~A>L<;R+nM(a5VuWztrb%wROpfC1Tu4|wr0OSeg!Z!9COa*C9~q23tgd@%`3`l ze{o{o_kcy1y+sW#fGNo#j)Ttp6jK?0RAKxIptVLVZDv%@rX4SpO~>5=W8yP)Q$h$K bgb)ut{<#Cl4IWE;00000NkvXXu0mjfPIbGX literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00002.png b/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..e2c23b752668daf15a4da75d0e9eb584eb3c1577 GIT binary patch literal 532 zcmV+v0_**WP)#XLQIaG{@>E{aN7y$aqSsq^_&1BU z^}Nv_{>g_hrcuAbpEojGIXEK5*Lf8dWv=!2l)B5p6LBY=OMOWzLK!@g1V2 zwIIcK2ZUxLO+eg{Cr3O%=ng0|6aAVml2^0n{`>a((sa&7ZYA zUduLhq@l#l@XHE~4oyaKC8)S;wpw`*^OLa6%>u$b7%)ev%x>j$H<=8dgEcF>m`iYY zBjB7|;-~M~zMYczk?c9G8;W;_?9x+{?AD9gf3<2@>~_p2^dwy4{T}>`>axzEcHh*~ zz}2<nyUJ`!mHE6 z!Ud==XEgunS{BR@2uO!&ewe!ABwU=!_^>shd1aSSVc`M{*wp2K-HbAJZ7|st)+S*i z9|m5eXsLxhiz2%mr~{@Z^Unc0IilEb7if9==<06h<5_+V072q!Y;bsPs7aFKx%>cl WtTUH^iC%O70000&8F{PAY6e*wvIeyd6NH9;AznE?{ViRSxLr ze)IWhhY}PiWITZ`LXiY7!W8JX$0Ddu$kasr*X_{MQ|OW4KcHKt`Qo6EDrzqgXH(y?R~JA?f_)2m&iGfY}ucZ$ieLCmkk};s7b`OM5>Ax zVUnq69X`R?iAX!F!u23F4#_JS$yio_$f?0BKM9ZVNIiEVFl`ztet9qQNeDi3ZXnJKWZK4w15xH^EEaQM($x%HaVUp*ba4GFss2<^He znd%a=0n3A*1LiG`PATPKa%@FVIw9DDx^2`6KL^xX)B0M_C7jXyt5*tvQNrIl8ZTTE tC8yWO1~MD^W4uqocg1p~Pm(0LDjzC3D@7h@wmtv=002ovPDHLkV1nuXJJZ&~C(g8i2>|j(9EoDuAu6MAr``xUt1hI>CN7{JT zVUZc26S!xZL88~9gc;Be80@x*ikyw10SB|8F0<+klM=TO$xTRJf~L+b#hc0(v|XE}LFCK;GYjl@^QpaB+A7Tm-^f4EMALY{5>(_;!@nqs;;Fm5|T#X z5y|?x18sXbkLw>EoBHj=+XG4|=kaD`yqx>253-MKLj-)ZLk)R&t!rJ)U;+J<9Ul^JTdV00DBrr+LQ2tWnWvO@2)sQ zXObi?L`o9=1GPOh3*&@6@uEJ}kF`tMxnJ3Bo|3e~+0(lkYKN_5)+d0DGl5hkoqfFM zV$lRB6}s_Ca%-V`DZxq+MK~f!6Q*1V7+HN5d!!UGj$Tq_ZHH%3s^8V#_BbCh0Y*ri zArnL1#7H{gg`jzaOzPr!fOIiw*_NeP1YhgBms|14ESdm(_oAdd#^`KW+C*oqKT>M+ xES8JL8L}}55Q3H_Ae)a literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00006.png b/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..5eebeda449645be684915c86fe09b57674ab6f67 GIT binary patch literal 307 zcmV-30nGl1P)h8mVGtm$m$z_UyJAdUXr$76@C2y&y3sm{F<`Bx z2A%-kxw*|Pw$05B&trB1Jx1$3^hE&h*3i($oo&F{hj9F6N23rhcsu0{;9Jm&P}qvd z{&}9Q%)@_C@kOlrG2tFfL*LnBCq;}?swdJK+NEX)?8}C~BN@N(N21Am!M}#a7jTZx z`}_isBLOBO0VcyQKxqBRT^kAH0wjZ%Qv)G{5JHFrIRO_2iCBvQm1zI~002ovPDHLk FV1iU=hm`;T literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00007.png b/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00007.png new file mode 100644 index 0000000000000000000000000000000000000000..9af91ea0364d70462b19d207fe7b2507f3cababf GIT binary patch literal 299 zcmV+`0o4A9P)Vyj9^3;7>9CS!I(w`4JUOy0q!$Y+LPSJ_Vy&{)=t*4X6+MA(z4ZUf z04(5l^aOl#$;$G}NE;jiZeI&kq9>qi7pAVGF4lacUvDqW--ZHfK_XHXqq5p$WZqto zI!}k!f{v64W?lQi+yTAr`VLsDQB%)|2{Im-J;2k}n80xXNAm(o==w!p;Qh&^F?i}PlhW2N!oNGUS0Ld|c xU<@Ew{s4OGH($WPOCG?m@#f5ch=_>jfj-r+b)L?vVZi_Z002ovPDHLkV1g;3g}DF# literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_validateprehash_init/00000.png b/tests/monero_client/snapshots/nanos/test_validateprehash_init/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..b3351dbf9fb75eb725f24dcc6915e30d79876b0b GIT binary patch literal 276 zcmV+v0qg#WP)MS!&w)Gb7c~W8wxgA(tDMUmxs~SB4k9|9x)-`Az-?T(e zz;B4$MZyBS(aS<=V-7-kL{GqP-(LB)gSs9mw^MTvRl;Y0`7{3vcoF2^g338xsS0rD zTEZg9!#Sz<3A|fK9 aIXwYpPFeUCtH*2r00000os6NDEX(qfl8A`h)pB+RjBWiqFRy6(NJ|OX z)^|+H!~gyQ#`EkB#JH2AngN40?$c|9l{ZX2*t z(}OnvIdj`IkECsz?C>6Eci_lu+^2pB0B;*w>UfGRu<=FMemT*M5HP$wc~v z6;b-P{T%hYoJHk_qWfdQeKd{Z%$}PmGS7=A(l&IU>iUItka#EIfeXdGpc;Tm@Z^P! z>KtIVp5+*9&$sSNY*cH&_?F)VKM9yiQ0iQN!Ux@=DnSMF^=E~%1lgAv?IJ89A|i56 YI{*ZWjv*ny7ytkO07*qoM6N<$f(hJ_V!3KIlUe!W5fkZgQ#jJQ=br4YX7yLPSJ_Vy&{)=tbP;6}^B@n)?6M z0Ib08=mm_iDJ#o2krvz)xP2^CiC%zl+?Y0xHd+0MJ|7?4?}h?vK_XHXC$m;3(r+(F zok!udpet#D+1KM>PJrg!o`AJFIUR|(Aj<=D2aL4!=E@~(e_23FG7+#hP8UoIdMd8~ z@VjPeE&HrN44Ze>;BF%$5B(aj0>(mB}< zy>1X&syo2l=6&#oAae^6@4q8SkaR0m3sP>1Q{`RdY(X~Iq`icRh=_=uX#>8lchttC RNLc^?002ovPDHLkV1fc&iTVHl literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_validateprehash_init/00003.png b/tests/monero_client/snapshots/nanos/test_validateprehash_init/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..0830ee530a3e5800f570f39868689fed06cf3bdc GIT binary patch literal 318 zcmV-E0m1%>P)8w$TZu1OWI~Q{#B+vJXEuj$fX`wL_cy zg^pGe|90#0%}?Hp$Rw{nwmz?S!&rybB~9~g;>bDpnWfunTI9VPI^4yl;cXGZoU6SW z#>z1hD!IOp#_eTVlIv*G3%*4kF5D!IU5m**S3r1?9?ib+%VuE0t;5vioO=eKVMq9x zuE%DZ_@<@MZ;aVfB}n)a4y#9|UryDZd?tl^Wr|_7M;2j2uW7mvn}sf1`brkzLWPU! zQJ%doond8uV)pQO3Bq3MJK-Vx!tFW$00000=lK6Vdq35=hG#(l008LV15i_q_az45 QfB*mh07*qoM6N<$f+B5^DgXcg literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00000.png b/tests/monero_client/snapshots/nanosp/test_display_address/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..658e5946d69cab2c026fda65615095e9fc9697e1 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{6-ba4!+nDh3gciv$I0fvC6 zuWEPxd)!&dy*;c|a8v9e#^-xQ6GVL5`h`6>fx1AT!hY$LAg}#PtA71j!1lX`FJZ}? z;u4POwXW<1_wWDQw{+i>P2#KE?`(Wpcs?z3?JiU9v;TrCPjE$CXJVdEe6OhXj!&QT zxgxo*LU9*wF<-)bFZK!6UeykM z`ZND(JbH5Ee)OutoyMVcGW^!FpGx;0kDl9@`2Vs_^o6=9_9^07aZ5{AHLBfeVpCgs zD|*%IS*xV7r-@DoI<-IU`_HSsH+fz^P_}BA5;b{a{mvUZd)8Q0a56(Yb>Q|dHf^T; UU-egsSb;=5UHx3vIVCg!08>_ossI20 literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00001.png b/tests/monero_client/snapshots/nanosp/test_display_address/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..688401ee5d0981a26360f2fcfb8acb1958d76e0d GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|?kNba4!+nDh2VU|+L>0Kiy%yx9`IOJ}hor2-eKX(ed(&0gIL}Ue>vL;b&Du!r_`_R1?6m&zs_bs&{fRm3 zXP&#UM#!J~t$xhNC{=Zn+@Z@I)(_^nUptsz|2ut|(yB+K_Z^6 KelF{r5}E+|AcqD3 literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00002.png b/tests/monero_client/snapshots/nanosp/test_display_address/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..fe01a44139a0c561d7d64fc520a14817470317a9 GIT binary patch literal 1001 zcmVY)My3MRcN^YvatAcBH((^{cWC=?2XLZR>`T-SA7mwyPz zXZeH8(I?j*Xw$Rs^Muky+&#Lce(<#x#d_~!l>UupMer+KBZl}6;%?}@YYX9jvgZSs zn~ozpKub5epwlRSXP$b!cX6Sox%|mwf(v-SO{d`C4wyW4=Kh`rx}aJ_0hTf&7pH1K zJ5W?RL9-S;X!^F&l^=lNI^F4?Go1^2@(aj#&L1bX-3#K>4xk6_^l(Zp&)GU;v`&!= zn05!m7J!}quKprNxWs^J$}vUk@*A315@^bsitaUOaZKFAhHht~rcGq! zwiWInC}UG%WXYm-3&7SPTV#pXtLY zU#7_?oEO{JC+BZ5JMH8faKPf}Hu~DX?I!CQJjrglQ*nB^&fL&r8uR7FZ5| z*6R2t2C*H3fp}7ztr3^k#O45q$A}olq10IecsYsGOb>Yd(464~Jj*w{hN^TfcojWi zf0Z%y&-x&TiWsb!m{}TmxoX!# z-C&1JqvHK5c!k`&(}|6v`L~#ZAVEwkrgCn}Ckd5ghzBRK$lny4h$tC<7Km@-JdeVlGR0RvJe92|9oRAQrk{*gXw{`8yw-NJ|`# z(2~QP6E)w0ld02mzs?Ziom`5cb92vGxw{6u9;=5$vQ+9(||&vb3#A;dYQF>#w0@&*9xCTCJSg`@mn(+d?XHo$Zm8=685K8}rO z;h)LOH8FmW!Htm9OOZyNeAR4W-Z2>OII~L~ct;Ah_79(CCs1tY!>9lh3WY+U@DP3j X^-+Vut~4WS00000NkvXXu0mjf@|4&X literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00003.png b/tests/monero_client/snapshots/nanosp/test_display_address/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..74a8cafbc8de0148c512665ca51d412b028d5641 GIT binary patch literal 891 zcmV->1BCpEP)lB6eRbg~~j0*cvcsm})F{JS3a$cw6alX?n8i)@dX5w)iS}WisBHAVJ z_H^>!0Mel3Z6MDk77it6#fB#L@)FHO6z!$ir0NYI;exrpW?^nzu(?UKP;%r_G6#%; zN%fc*UZdNtk-%=7y^=fNihCXkUSm41j3k#mn!DoDi0^615zSsnx<)*ADm^Vv2cto$Z)Y`-b~<@k^S(zBXPZG z0h4VFx1;TQRuGl4EK@tx$Squevc->(7cNXC8joo~v-{BA%CNRpE%cTwXb+ny9DRu` zL*!^e6FY~J0&}5Zid55rF=8NBqh62)SM^UjoK; z<7I6j-)}vT!MP-w>(>GFT(m)n7jZHdWu-*kv;%&HkUE>y6SM=|H5Ny#BQDPNt6i7y zS&pQ6C>V0fTz-v0AydvUwYCIYwo@^{w@%A;d|?QT~K5($YXM!XXFRrygZPyfi19da(zGB%LO_g=?LH|Nrx5$(ON=vdXclK9yi1@CK(a~u?hLV? zj*-ZsG*l4)STp(C(4EK2-HqSV(EAk1(XM9cij=$pJ_l%#*dAR#`SyMJh^!jdg#%bAIPv6)Xs=1>x-KXeqqW5H$Y%+DVi}N8}_2KMV*3nacxr z!Y^6BqH+bF-2uki&}yiFAthdg?wQnF|2$7*z%jnNauwO8X_}^Knx=Ume*wtrryQcT RXzTz0002ovPDHLkV1jJWsZ;;} literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00004.png b/tests/monero_client/snapshots/nanosp/test_display_address/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..2eca27132b4f988b670a9d3bf979711576fd2572 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h5*QfEC~978JRyuEpl_mF`Ai-WWF z%l#_f4=GQQ7gJE^zbt1gYO(v1rQb22QV@8s((?J7%~hh)@2nR8u=~pk|COw3zVts{ z5qr{gBI_2<`kunoaR;v7^PjiFOR3yJz0x}2ix8HG9=K|3YPh(fd2hpl=a~le zWsWb+RsMQiTED!x%4)@O=6~KdmUrYf=Uv};WVYia--@L*Qo3wuL5%Y|etX_r)v)G; z|5`4K)VVCY+$S!rYB)04a%IER_g0zlzO&cxL7c{r@ru!;)Zb*z#Ej1%5l>e?mvv4F FO#mM1Ysvrs literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00005.png b/tests/monero_client/snapshots/nanosp/test_display_address/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..960d4c51d4d333c8c9525a85215778294ea14093 GIT binary patch literal 546 zcmV+-0^R+IP)_wu1D^8h7fR;)`s6t0QHr?lKV z0y(|h@{nFyfMy#j-mdQCZd-Zku=!&Fl**F5R=~)jLL*#s_D+t)N)cP zdyvD$rhdsFpGMGOrf&eEK}8-ZU1PRB>c$4Elm0kXBWs0t1&S9bk*20wD+Ti{W2A{ek1k`*!Vj7 kNp1`P00000000~D57Eb2Dg{HNq5uE@07*qoM6N<$f&{npP5=M^ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_display_subaddress/00000.png b/tests/monero_client/snapshots/nanosp/test_display_subaddress/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..4b4d3d974bd35b6539752ec79acd5f35646b31bb GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|?kOba4!+nDh2#AYYRK55tAb zJ)Ga|g~~rNM^5t;=-rjK=R51<3CmJbCr<(D0fC0%+2Oyh|IwXSY&qkm9Ctyk?1A=E zG2zGc)x9+Ciabd0TOO)!x??Nfg9(|lE=4szt&q5TroklUmAI{Ff=BI^1$Qo-_S|su zsrmYzAuwTN$#(9?2Dh19d1amWI4wBcwLPydVbPW&;NFp z5p&Q--KXW>^|NK3wAN?JI(S9%C(Er2npVG-ZMAg;Co{x94CRq#+cGykKldHP_jL7h JS?83{1OT^HgAxD$ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_display_subaddress/00001.png b/tests/monero_client/snapshots/nanosp/test_display_subaddress/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..a13595301cdea54db7859d2e1ad7f93833c7e26d GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|BH6ylU<&C z*}6(gNl9oSoBw-;W3No6?pg0?B0Nj^tIw9TKeZx_p`yShvo(ZpD zc)D~?ZSorB;4r1vYBs#PnUeA%=iaaTo4!o)=eJHP@3(o)U(})=cRHDtDWCu9v2&5B z)Is$sx!TWsPbS?lJ&`wQdq7aLN^o=ZQlIy-j{Y0ERkmHvE)rZMn)qw(vxHDS{j=LL zZ0j~iOMO`Ka?SmVHurw~S#ee}h4lh=ksITjK!$WhvxnM#CC-d6PcbkYu&-d8VsXy( SG2a9|kf^7tpUXO@geCwkF@~4` literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_display_subaddress/00002.png b/tests/monero_client/snapshots/nanosp/test_display_subaddress/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..2801466ceb0093560747e51129d3659c82dcf808 GIT binary patch literal 1002 zcmVjZz&HTqE3pjJcg-P#CzWX}g@ zZaS`1fR%1^L)lZgW|?}ucXgxLTsgu_NC5=WbP6t30P`5k{XGqIL#>E9SjvoC+TJ%ejZF5aY5sIe>;qJH=KxQW&*1Xk)JV0 zhq!9-#pZ^y;s7{Ws0}K%?R2Qw_Xn9G3r_8sWhXxe8BczQS&O2vE=K>*YQX+Ri2h3|#jpzYM&UexLD19I!p*9;zp^2gAMN*$&^)(Qg;fbTbQ zxQ8-KfVt?;+Izc%yI}d20%|=-i@k$o`#yJ$M77B`ci2#ZNq-`{5oaM??PCGZm2c<% zRYxBN>t=7;0)`5Akbepla0HuNF}Mo3y}uA?{7%N2euPeuchK-wid3)S3IqK*ukf~7d3qgAM@Qd#096Dn)gw9`D)gUE!o zq{DlGTw_B)EM=BeG5&P*X=o8iNhf=J<$LhHnt1Z=#`!M4w?-_? zItZsA_ta2{YKYw$5a+=KhC6d5VAZCjR@=R~G`|8CxF9vPK|a|hLbPlf!6&?S^nQMJ&o8y*D1A?@QoB&vtgueTg z%^wSd&|X3i0P8?Ff5qW}0U24xr4$lWR?KU}-=fTHD=IX^#ugPB_hwW83WY+UP7S?4^Ev&g*f6++u?tdQReAIIyuiez3}&g-n`&cASp3StMum3Unj8U=re2zumf z9!~rYAOlKv1L>PsSiqVU2b#3yB}hdtXwyuxY6lQ=oojzgLOZz5;U?9(7Dp^g&VaJu zP`w(8HR!r(k73(Ruiy!I>~3Ab?bCT>&*IX(x#@rWl7}svEi0{5|S?w z({|%`CucKm3KB9?htwYqbYmx=fPp3-bfq1Uu%4C?Yoe$6Afg3cKv3MH?G{vvz$TykrjzzN_+^QisNM=U1B5rM=| zvCn^p*>tqIPnFb7*KiYmx_P$5l+h;8*;25_G%JYJl(P;s?EP0c#yoxT^h=k_p*x^; zXLpJ64zGRW_aR*JQvbtUHYwb>sEuyUpZkGw{6eD4-UG4ryM6En&%phV9r@n{MU8&o z+VApa?}hAg-?TID2psC1gAEvioO7@gKD_ozdG3*k6yniPv@A*%U(J`Et09-q@0Vg7 zl!{O!^G7JoAM1;(iAXeqBNVWhT9CBfwjLoU2iI%4Q1#SH)0RES?BKA z{+)MnUy>wAj)0_D^fZ}L2gz((iFu@?r zH9_xQ&dh+eoHYSX{DG+Xvh3G+zX?FE1jL$T4$c|(hf~ggMak6j6C3Zh14K7+pl|s! m4qwQhOomQLk|arzEZ_$Nc0#{fSYBxW0000x8HG9=K|3YPh(fd2hpl=a~le zWsWb+RsMQiTED!x%4)@O=6~KdmUrYf=Uv};WVYia--@L*Qo3wuL5%Y|etX_r)v)G; z|5`4K)VVCY+$S!rYB)04a%IER_g0zlzO&cxL7c{r@ru!;)Zb*z#Ej1%5l>e?mvv4F FO#mM1Ysvrs literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_display_subaddress/00005.png b/tests/monero_client/snapshots/nanosp/test_display_subaddress/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..960d4c51d4d333c8c9525a85215778294ea14093 GIT binary patch literal 546 zcmV+-0^R+IP)_wu1D^8h7fR;)`s6t0QHr?lKV z0y(|h@{nFyfMy#j-mdQCZd-Zku=!&Fl**F5R=~)jLL*#s_D+t)N)cP zdyvD$rhdsFpGMGOrf&eEK}8-ZU1PRB>c$4Elm0kXBWs0t1&S9bk*20wD+Ti{W2A{ek1k`*!Vj7 kNp1`P00000000~D57Eb2Dg{HNq5uE@07*qoM6N<$f&{npP5=M^ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_prefix_hash_hash_init/00000.png b/tests/monero_client/snapshots/nanosp/test_prefix_hash_hash_init/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..b02564fa7b5410cfb8be6fc302281ed2b744aa53 GIT binary patch literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>w~ba4!+nDh2VVBTQ`o`%Ho zTfRH~Puy`@PRUh|t$kZJ@74ddxkpU2_|&#?0CmB@j-$#?*KNI)wq!~X&$J-BpJ%2o ztFJg-|8aKF^~cuc_wCCSH$72V;Qf5@wN>Ab>`XqV^3wLo**S9`o$KDeongQVx`+P)7$u9`H7#3W>q_K?&qf16%}%S zZJJ}cb?LI(`5Trdn<#}()$)m9dRLdW`)zi*%YW@a*5h1Sj?-7y&*S=5@nYVVyC-B_ z-!#lj|G(+b9>JZh3xq@h(%(uZ+ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_prefix_hash_hash_init/00001.png b/tests/monero_client/snapshots/nanosp/test_prefix_hash_hash_init/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..0a22ed9c048e1c509e4db8bb538a09179382d08c GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYw~ba4!+nDh2VVBTQ`o`%Ho zTfRH~Puy`@PRUh|t$kZJ@74ddxkpU2_|&#?0CmB@j-$#?*KNI)wq!~X&$J-BpJ%2o ztFJg-|8aKF^~cuc_wCCSH$72V;Qf5@wN>Ab>`XqV^3wLo**S9`o$KDeongQVx`+P)7$u9`H7#3W>q_K?&qf16%}%S zZJJ}cb?LI(`5Trdn<#}()$)m9dRLdW`)zi*%YW@a*5h1Sj?-7y&*S=5@nYVVyC-B_ z-!#lj|G(+b9>JZh3xq@h(%(uZ+ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_prefix_hashhash_init/00001.png b/tests/monero_client/snapshots/nanosp/test_prefix_hashhash_init/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..0a22ed9c048e1c509e4db8bb538a09179382d08c GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYJWBdvN%ubj7hzN2rKU;o#ueP&Ci z6u)zl?W>tp=5_ar-fHP|-DAD~1x3nz=bkJ!FFiWbZ1>T1`*`j0KEJ(a_c>wNQ&HWt z15r_H-frDkxAvfq`)=#1HTp|imgVQL>EwMl?09Qd_55?aH`qVuzrMu!vTxS99j})v zFSWhUH1A`+%LVfl%ReU-{_dXcHN8Ck(Au)AuNIX|O`bh7yXJ7s@3QOt`@Je}etTOx zZMU4Gyz&R%A5DIhmh3=xzsvvUuLt%41H%LBzl=N9ZrwU{VzwMe$kWx&Wt~$(6988l BiiiLJ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_private_view_key/00000.png b/tests/monero_client/snapshots/nanosp/test_private_view_key/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..0128f84273be0d97ba4b874ce0cfe50dbc0bf243 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-yba4!+nDh2VAm1Sco`#2+ zdpN(_3zdIlyetq=DCl|nV?94xVYXGo%*Pf$O)zjki2pT9lx2G6@+myVH$!Y01C`EK zM5=#?J-2g;)7=U2ueB!Dz06_TTeEb7TajzkmSg#I*Hx@(c*f_edH2V;+9>r6yBUN7 zrq!)%p8atL%h&Ulw2xmgUNSdh-;|U8J8n2lcY5)}eo?&hmp_l=59sPC8o1pTTAY9K z`it*3r_4L4^Ecn#VpGxvKl7$LpMI#_In$MMCUbMC)rG&>{bF9-8(Ke#ExY!@e)f!8 zkIeFB7_4KsX@B9~MSu6tRX2VHtggJnz3T6t;-F^>?Edo2Hqhp|R-RjEpWDxWq0eMJ z=WnhT`B$H*XP#%7&)@prc>iDi&+P_gPZPhg!@SN=_JM6}r?B_J17!vvF;7=Nmvv4F FO#q#_pn(7Y literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_private_view_key/00001.png b/tests/monero_client/snapshots/nanosp/test_private_view_key/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..0a22ed9c048e1c509e4db8bb538a09179382d08c GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oY_wu1D^8h7fR;)`s6t0QHr?lKV z0y(|h@{nFyfMy#j-mdQCZd-Zku=!&Fl**F5R=~)jLL*#s_D+t)N)cP zdyvD$rhdsFpGMGOrf&eEK}8-ZU1PRB>c$4Elm0kXBWs0t1&S9bk*20wD+Ti{W2A{ek1k`*!Vj7 kNp1`P00000000~D57Eb2Dg{HNq5uE@07*qoM6N<$f&{npP5=M^ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_validate_prehash_init/00000.png b/tests/monero_client/snapshots/nanosp/test_validate_prehash_init/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..7013ca3729c1c32ddbbdd454a910c1042e965d06 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h5*QV%^{978JRyuIPrcgTQ;^#b1` zwVnSb)`*KuUF0*Bv5U>J?R!|}u8n_Yo4nn|2viRO`5!089tc)S+LN<3HT2W_bvIe( zeDJJ&ufR)=QeQff6Y(G;bcz!p2S+~sSuKa&1 zn>}A|@zh)W`LMJ8_0NN|7^nOZvdey&KYu+(LMoGoT0;s`!n1-bo1S>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYHAbEemdJ(|CErc{#U2wq#dne4Jlvr$N0HlT*%o|+x6?6+NQsj zSe*Nek{k=L62|J#pm z_g|*BPcJG7d~0yeuj#RKRSDAgTe~DWM4fbaBK_ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00001.png b/tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..7f630e37c9c05ecd2c8f418ab442eaebbdecb9e5 GIT binary patch literal 1030 zcmV+h1o``kP)~gWr%i^P>y1!r&Li!m86)Ae^7)@= zwQ6LG<@^AQdkEb(DKtR}4%_F`3bjHsst(uEbKRl>pqyDJpH*>I|b zPiK7qc6m}1MNxbTrW)!fFuN{W^1Uqg)~X6Ms&V=lc7$87uEuRE9 z#JRsC-Mv2b-Lv|VFH$t9)~K}BFzh-kdCE-u;`g2&RfD;lz36NC=zS3_?>U0C2M zY40nWmR!J+8oGVWI?!xdnUxb3oWj;xzaTok0^~L=k5gKK7J_FiL(S$%6HvXdw)ZHQ zGowTu-O#dhz{|`BDoRs#)7ffsZ9g#kEjs{HHKDejnf(`?aAl`JQE?8n3*AYO9$i?w~2Lunz8fe>D!%K zapOv*wk>SJ-U^ThQJ7*&JM^6cPdrs^MTXozU}R8iEAP=CcXS~Phc0d436tGoYE)($ zuGE+Ok#EGN!0(r58(HF+D_~L7d}dHZQ4}Wu{iS>;I$DA#*u*jASfF*Juqs~+Em0G{ zE`uT970_vYOzgroO03a{#|Xb=r>qBMsvLc!+i4%~RE#nH zMC_G8lR{h8*EI$-7}$rE09#lgLv~NewIR|aYDNn29Y9&Lz)sxVxJ;LPmTu(hAA^J% zR*2%BlE#rSr?GgDwgZq?vR7k+bPb7ij)i7+ODT_pFv%fk5Q9+I@tUhgv#C;7Kv(siE*0!4+hy2RmtHtgI&X(;H|AzvijZ8GuK%I4vt$*S?Q(R#ru!hQ z=w`nF>0-J4Di+lw7Yuo%ZWf@0Y#Ns2K{DgFy9iKx-FDhlyx zsND`kWz7UFKf5R1t==3}Lso~HU~cax^0%z%e*nJsoM82oktYRpK-YctcoY}gY}qp^U%Sl(QN=FKS7 zY$mza;8E!GntmG!OP;V@ulcZrLpB4V6-uu<%MiRav$j!DQcm|sz8S6s>LpKIVD6^0 zls{>UVkA2!Q}{Ur#gqwK%Dk?Fjh>Gf=LmgPE^Sq$2VT45yK6yucE{EN6G1Ob=GXTm z%B5uwOuu7w*~D~u1Qx)WRm(57=#4c`{=?~}a%i8xlH~t3RELiL(H(P$(YBMVP`v=> z!03U3jB-hmGu|#o$DaX<%l5|yDnTmNKY>vTI#bfS-dVP97#u!^%zwx<0X8A1eZOg% z=7Wj+Q(niLYO)gGS1B7}Gh3H-MbW#-!4X-{?ZkSjQ3Y%)JAFKo3A0%bY~1EME>LpB z?g^=CZ=@z$%t5J-hx^d4RERFqq7gQ_irXjrf3=`o=w39IlCt=O1qfI62NzO`bI(s$ z0Ln?pthhX0v;c`uTG%qadc7Vuwg#Ykm$Y-^KaGHIc2O&tlp}vrM=wCrG)?pE_zTv- V>t|?IDFy%l002ovPDHLkV1m<@yRQHM literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00003.png b/tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..0a22ed9c048e1c509e4db8bb538a09179382d08c GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYJ?R!|}u8n_Yo4nn|2viRO`5!089tc)S+LN<3HT2W_bvIe( zeDJJ&ufR)=QeQff6Y(G;bcz!p2S+~sSuKa&1 zn>}A|@zh)W`LMJ8_0NN|7^nOZvdey&KYu+(LMoGoT0;s`!n1-bo1S>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYJWBdvN%ubj7hzN2rKU;o#ueP&Ci z6u)zl?W>tp=5_ar-fHP|-DAD~1x3nz=bkJ!FFiWbZ1>T1`*`j0KEJ(a_c>wNQ&HWt z15r_H-frDkxAvfq`)=#1HTp|imgVQL>EwMl?09Qd_55?aH`qVuzrMu!vTxS99j})v zFSWhUH1A`+%LVfl%ReU-{_dXcHN8Ck(Au)AuNIX|O`bh7yXJ7s@3QOt`@Je}etTOx zZMU4Gyz&R%A5DIhmh3=xzsvvUuLt%41H%LBzl=N9ZrwU{VzwMe$kWx&Wt~$(6988l BiiiLJ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_display_address/00000.png b/tests/monero_client/snapshots/nanox/test_display_address/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..658e5946d69cab2c026fda65615095e9fc9697e1 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{6-ba4!+nDh3gciv$I0fvC6 zuWEPxd)!&dy*;c|a8v9e#^-xQ6GVL5`h`6>fx1AT!hY$LAg}#PtA71j!1lX`FJZ}? z;u4POwXW<1_wWDQw{+i>P2#KE?`(Wpcs?z3?JiU9v;TrCPjE$CXJVdEe6OhXj!&QT zxgxo*LU9*wF<-)bFZK!6UeykM z`ZND(JbH5Ee)OutoyMVcGW^!FpGx;0kDl9@`2Vs_^o6=9_9^07aZ5{AHLBfeVpCgs zD|*%IS*xV7r-@DoI<-IU`_HSsH+fz^P_}BA5;b{a{mvUZd)8Q0a56(Yb>Q|dHf^T; UU-egsSb;=5UHx3vIVCg!08>_ossI20 literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_display_address/00001.png b/tests/monero_client/snapshots/nanox/test_display_address/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..688401ee5d0981a26360f2fcfb8acb1958d76e0d GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|?kNba4!+nDh2VU|+L>0Kiy%yx9`IOJ}hor2-eKX(ed(&0gIL}Ue>vL;b&Du!r_`_R1?6m&zs_bs&{fRm3 zXP&#UM#!J~t$xhNC{=Zn+@Z@I)(_^nUptsz|2ut|(yB+K_Z^6 KelF{r5}E+|AcqD3 literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_display_address/00002.png b/tests/monero_client/snapshots/nanox/test_display_address/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..fe01a44139a0c561d7d64fc520a14817470317a9 GIT binary patch literal 1001 zcmVY)My3MRcN^YvatAcBH((^{cWC=?2XLZR>`T-SA7mwyPz zXZeH8(I?j*Xw$Rs^Muky+&#Lce(<#x#d_~!l>UupMer+KBZl}6;%?}@YYX9jvgZSs zn~ozpKub5epwlRSXP$b!cX6Sox%|mwf(v-SO{d`C4wyW4=Kh`rx}aJ_0hTf&7pH1K zJ5W?RL9-S;X!^F&l^=lNI^F4?Go1^2@(aj#&L1bX-3#K>4xk6_^l(Zp&)GU;v`&!= zn05!m7J!}quKprNxWs^J$}vUk@*A315@^bsitaUOaZKFAhHht~rcGq! zwiWInC}UG%WXYm-3&7SPTV#pXtLY zU#7_?oEO{JC+BZ5JMH8faKPf}Hu~DX?I!CQJjrglQ*nB^&fL&r8uR7FZ5| z*6R2t2C*H3fp}7ztr3^k#O45q$A}olq10IecsYsGOb>Yd(464~Jj*w{hN^TfcojWi zf0Z%y&-x&TiWsb!m{}TmxoX!# z-C&1JqvHK5c!k`&(}|6v`L~#ZAVEwkrgCn}Ckd5ghzBRK$lny4h$tC<7Km@-JdeVlGR0RvJe92|9oRAQrk{*gXw{`8yw-NJ|`# z(2~QP6E)w0ld02mzs?Ziom`5cb92vGxw{6u9;=5$vQ+9(||&vb3#A;dYQF>#w0@&*9xCTCJSg`@mn(+d?XHo$Zm8=685K8}rO z;h)LOH8FmW!Htm9OOZyNeAR4W-Z2>OII~L~ct;Ah_79(CCs1tY!>9lh3WY+U@DP3j X^-+Vut~4WS00000NkvXXu0mjf@|4&X literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_display_address/00003.png b/tests/monero_client/snapshots/nanox/test_display_address/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..74a8cafbc8de0148c512665ca51d412b028d5641 GIT binary patch literal 891 zcmV->1BCpEP)lB6eRbg~~j0*cvcsm})F{JS3a$cw6alX?n8i)@dX5w)iS}WisBHAVJ z_H^>!0Mel3Z6MDk77it6#fB#L@)FHO6z!$ir0NYI;exrpW?^nzu(?UKP;%r_G6#%; zN%fc*UZdNtk-%=7y^=fNihCXkUSm41j3k#mn!DoDi0^615zSsnx<)*ADm^Vv2cto$Z)Y`-b~<@k^S(zBXPZG z0h4VFx1;TQRuGl4EK@tx$Squevc->(7cNXC8joo~v-{BA%CNRpE%cTwXb+ny9DRu` zL*!^e6FY~J0&}5Zid55rF=8NBqh62)SM^UjoK; z<7I6j-)}vT!MP-w>(>GFT(m)n7jZHdWu-*kv;%&HkUE>y6SM=|H5Ny#BQDPNt6i7y zS&pQ6C>V0fTz-v0AydvUwYCIYwo@^{w@%A;d|?QT~K5($YXM!XXFRrygZPyfi19da(zGB%LO_g=?LH|Nrx5$(ON=vdXclK9yi1@CK(a~u?hLV? zj*-ZsG*l4)STp(C(4EK2-HqSV(EAk1(XM9cij=$pJ_l%#*dAR#`SyMJh^!jdg#%bAIPv6)Xs=1>x-KXeqqW5H$Y%+DVi}N8}_2KMV*3nacxr z!Y^6BqH+bF-2uki&}yiFAthdg?wQnF|2$7*z%jnNauwO8X_}^Knx=Ume*wtrryQcT RXzTz0002ovPDHLkV1jJWsZ;;} literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_display_address/00004.png b/tests/monero_client/snapshots/nanox/test_display_address/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..2eca27132b4f988b670a9d3bf979711576fd2572 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h5*QfEC~978JRyuEpl_mF`Ai-WWF z%l#_f4=GQQ7gJE^zbt1gYO(v1rQb22QV@8s((?J7%~hh)@2nR8u=~pk|COw3zVts{ z5qr{gBI_2<`kunoaR;v7^PjiFOR3yJz0x}2ix8HG9=K|3YPh(fd2hpl=a~le zWsWb+RsMQiTED!x%4)@O=6~KdmUrYf=Uv};WVYia--@L*Qo3wuL5%Y|etX_r)v)G; z|5`4K)VVCY+$S!rYB)04a%IER_g0zlzO&cxL7c{r@ru!;)Zb*z#Ej1%5l>e?mvv4F FO#mM1Ysvrs literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_display_address/00005.png b/tests/monero_client/snapshots/nanox/test_display_address/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..960d4c51d4d333c8c9525a85215778294ea14093 GIT binary patch literal 546 zcmV+-0^R+IP)_wu1D^8h7fR;)`s6t0QHr?lKV z0y(|h@{nFyfMy#j-mdQCZd-Zku=!&Fl**F5R=~)jLL*#s_D+t)N)cP zdyvD$rhdsFpGMGOrf&eEK}8-ZU1PRB>c$4Elm0kXBWs0t1&S9bk*20wD+Ti{W2A{ek1k`*!Vj7 kNp1`P00000000~D57Eb2Dg{HNq5uE@07*qoM6N<$f&{npP5=M^ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_display_subaddress/00000.png b/tests/monero_client/snapshots/nanox/test_display_subaddress/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..4b4d3d974bd35b6539752ec79acd5f35646b31bb GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|?kOba4!+nDh2#AYYRK55tAb zJ)Ga|g~~rNM^5t;=-rjK=R51<3CmJbCr<(D0fC0%+2Oyh|IwXSY&qkm9Ctyk?1A=E zG2zGc)x9+Ciabd0TOO)!x??Nfg9(|lE=4szt&q5TroklUmAI{Ff=BI^1$Qo-_S|su zsrmYzAuwTN$#(9?2Dh19d1amWI4wBcwLPydVbPW&;NFp z5p&Q--KXW>^|NK3wAN?JI(S9%C(Er2npVG-ZMAg;Co{x94CRq#+cGykKldHP_jL7h JS?83{1OT^HgAxD$ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_display_subaddress/00001.png b/tests/monero_client/snapshots/nanox/test_display_subaddress/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..a13595301cdea54db7859d2e1ad7f93833c7e26d GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|BH6ylU<&C z*}6(gNl9oSoBw-;W3No6?pg0?B0Nj^tIw9TKeZx_p`yShvo(ZpD zc)D~?ZSorB;4r1vYBs#PnUeA%=iaaTo4!o)=eJHP@3(o)U(})=cRHDtDWCu9v2&5B z)Is$sx!TWsPbS?lJ&`wQdq7aLN^o=ZQlIy-j{Y0ERkmHvE)rZMn)qw(vxHDS{j=LL zZ0j~iOMO`Ka?SmVHurw~S#ee}h4lh=ksITjK!$WhvxnM#CC-d6PcbkYu&-d8VsXy( SG2a9|kf^7tpUXO@geCwkF@~4` literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_display_subaddress/00002.png b/tests/monero_client/snapshots/nanox/test_display_subaddress/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..2801466ceb0093560747e51129d3659c82dcf808 GIT binary patch literal 1002 zcmVjZz&HTqE3pjJcg-P#CzWX}g@ zZaS`1fR%1^L)lZgW|?}ucXgxLTsgu_NC5=WbP6t30P`5k{XGqIL#>E9SjvoC+TJ%ejZF5aY5sIe>;qJH=KxQW&*1Xk)JV0 zhq!9-#pZ^y;s7{Ws0}K%?R2Qw_Xn9G3r_8sWhXxe8BczQS&O2vE=K>*YQX+Ri2h3|#jpzYM&UexLD19I!p*9;zp^2gAMN*$&^)(Qg;fbTbQ zxQ8-KfVt?;+Izc%yI}d20%|=-i@k$o`#yJ$M77B`ci2#ZNq-`{5oaM??PCGZm2c<% zRYxBN>t=7;0)`5Akbepla0HuNF}Mo3y}uA?{7%N2euPeuchK-wid3)S3IqK*ukf~7d3qgAM@Qd#096Dn)gw9`D)gUE!o zq{DlGTw_B)EM=BeG5&P*X=o8iNhf=J<$LhHnt1Z=#`!M4w?-_? zItZsA_ta2{YKYw$5a+=KhC6d5VAZCjR@=R~G`|8CxF9vPK|a|hLbPlf!6&?S^nQMJ&o8y*D1A?@QoB&vtgueTg z%^wSd&|X3i0P8?Ff5qW}0U24xr4$lWR?KU}-=fTHD=IX^#ugPB_hwW83WY+UP7S?4^Ev&g*f6++u?tdQReAIIyuiez3}&g-n`&cASp3StMum3Unj8U=re2zumf z9!~rYAOlKv1L>PsSiqVU2b#3yB}hdtXwyuxY6lQ=oojzgLOZz5;U?9(7Dp^g&VaJu zP`w(8HR!r(k73(Ruiy!I>~3Ab?bCT>&*IX(x#@rWl7}svEi0{5|S?w z({|%`CucKm3KB9?htwYqbYmx=fPp3-bfq1Uu%4C?Yoe$6Afg3cKv3MH?G{vvz$TykrjzzN_+^QisNM=U1B5rM=| zvCn^p*>tqIPnFb7*KiYmx_P$5l+h;8*;25_G%JYJl(P;s?EP0c#yoxT^h=k_p*x^; zXLpJ64zGRW_aR*JQvbtUHYwb>sEuyUpZkGw{6eD4-UG4ryM6En&%phV9r@n{MU8&o z+VApa?}hAg-?TID2psC1gAEvioO7@gKD_ozdG3*k6yniPv@A*%U(J`Et09-q@0Vg7 zl!{O!^G7JoAM1;(iAXeqBNVWhT9CBfwjLoU2iI%4Q1#SH)0RES?BKA z{+)MnUy>wAj)0_D^fZ}L2gz((iFu@?r zH9_xQ&dh+eoHYSX{DG+Xvh3G+zX?FE1jL$T4$c|(hf~ggMak6j6C3Zh14K7+pl|s! m4qwQhOomQLk|arzEZ_$Nc0#{fSYBxW0000x8HG9=K|3YPh(fd2hpl=a~le zWsWb+RsMQiTED!x%4)@O=6~KdmUrYf=Uv};WVYia--@L*Qo3wuL5%Y|etX_r)v)G; z|5`4K)VVCY+$S!rYB)04a%IER_g0zlzO&cxL7c{r@ru!;)Zb*z#Ej1%5l>e?mvv4F FO#mM1Ysvrs literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_display_subaddress/00005.png b/tests/monero_client/snapshots/nanox/test_display_subaddress/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..960d4c51d4d333c8c9525a85215778294ea14093 GIT binary patch literal 546 zcmV+-0^R+IP)_wu1D^8h7fR;)`s6t0QHr?lKV z0y(|h@{nFyfMy#j-mdQCZd-Zku=!&Fl**F5R=~)jLL*#s_D+t)N)cP zdyvD$rhdsFpGMGOrf&eEK}8-ZU1PRB>c$4Elm0kXBWs0t1&S9bk*20wD+Ti{W2A{ek1k`*!Vj7 kNp1`P00000000~D57Eb2Dg{HNq5uE@07*qoM6N<$f&{npP5=M^ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_prefix_hash_hash_init/00000.png b/tests/monero_client/snapshots/nanox/test_prefix_hash_hash_init/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..b02564fa7b5410cfb8be6fc302281ed2b744aa53 GIT binary patch literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>w~ba4!+nDh2VVBTQ`o`%Ho zTfRH~Puy`@PRUh|t$kZJ@74ddxkpU2_|&#?0CmB@j-$#?*KNI)wq!~X&$J-BpJ%2o ztFJg-|8aKF^~cuc_wCCSH$72V;Qf5@wN>Ab>`XqV^3wLo**S9`o$KDeongQVx`+P)7$u9`H7#3W>q_K?&qf16%}%S zZJJ}cb?LI(`5Trdn<#}()$)m9dRLdW`)zi*%YW@a*5h1Sj?-7y&*S=5@nYVVyC-B_ z-!#lj|G(+b9>JZh3xq@h(%(uZ+ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_prefix_hash_hash_init/00001.png b/tests/monero_client/snapshots/nanox/test_prefix_hash_hash_init/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..0a22ed9c048e1c509e4db8bb538a09179382d08c GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYw~ba4!+nDh2VVBTQ`o`%Ho zTfRH~Puy`@PRUh|t$kZJ@74ddxkpU2_|&#?0CmB@j-$#?*KNI)wq!~X&$J-BpJ%2o ztFJg-|8aKF^~cuc_wCCSH$72V;Qf5@wN>Ab>`XqV^3wLo**S9`o$KDeongQVx`+P)7$u9`H7#3W>q_K?&qf16%}%S zZJJ}cb?LI(`5Trdn<#}()$)m9dRLdW`)zi*%YW@a*5h1Sj?-7y&*S=5@nYVVyC-B_ z-!#lj|G(+b9>JZh3xq@h(%(uZ+ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_prefix_hashhash_init/00001.png b/tests/monero_client/snapshots/nanox/test_prefix_hashhash_init/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..0a22ed9c048e1c509e4db8bb538a09179382d08c GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYJWBdvN%ubj7hzN2rKU;o#ueP&Ci z6u)zl?W>tp=5_ar-fHP|-DAD~1x3nz=bkJ!FFiWbZ1>T1`*`j0KEJ(a_c>wNQ&HWt z15r_H-frDkxAvfq`)=#1HTp|imgVQL>EwMl?09Qd_55?aH`qVuzrMu!vTxS99j})v zFSWhUH1A`+%LVfl%ReU-{_dXcHN8Ck(Au)AuNIX|O`bh7yXJ7s@3QOt`@Je}etTOx zZMU4Gyz&R%A5DIhmh3=xzsvvUuLt%41H%LBzl=N9ZrwU{VzwMe$kWx&Wt~$(6988l BiiiLJ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_private_view_key/00000.png b/tests/monero_client/snapshots/nanox/test_private_view_key/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..0128f84273be0d97ba4b874ce0cfe50dbc0bf243 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|=-yba4!+nDh2VAm1Sco`#2+ zdpN(_3zdIlyetq=DCl|nV?94xVYXGo%*Pf$O)zjki2pT9lx2G6@+myVH$!Y01C`EK zM5=#?J-2g;)7=U2ueB!Dz06_TTeEb7TajzkmSg#I*Hx@(c*f_edH2V;+9>r6yBUN7 zrq!)%p8atL%h&Ulw2xmgUNSdh-;|U8J8n2lcY5)}eo?&hmp_l=59sPC8o1pTTAY9K z`it*3r_4L4^Ecn#VpGxvKl7$LpMI#_In$MMCUbMC)rG&>{bF9-8(Ke#ExY!@e)f!8 zkIeFB7_4KsX@B9~MSu6tRX2VHtggJnz3T6t;-F^>?Edo2Hqhp|R-RjEpWDxWq0eMJ z=WnhT`B$H*XP#%7&)@prc>iDi&+P_gPZPhg!@SN=_JM6}r?B_J17!vvF;7=Nmvv4F FO#q#_pn(7Y literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_private_view_key/00001.png b/tests/monero_client/snapshots/nanox/test_private_view_key/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..0a22ed9c048e1c509e4db8bb538a09179382d08c GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oY_wu1D^8h7fR;)`s6t0QHr?lKV z0y(|h@{nFyfMy#j-mdQCZd-Zku=!&Fl**F5R=~)jLL*#s_D+t)N)cP zdyvD$rhdsFpGMGOrf&eEK}8-ZU1PRB>c$4Elm0kXBWs0t1&S9bk*20wD+Ti{W2A{ek1k`*!Vj7 kNp1`P00000000~D57Eb2Dg{HNq5uE@07*qoM6N<$f&{npP5=M^ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_validate_prehash_init/00000.png b/tests/monero_client/snapshots/nanox/test_validate_prehash_init/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..7013ca3729c1c32ddbbdd454a910c1042e965d06 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h5*QV%^{978JRyuIPrcgTQ;^#b1` zwVnSb)`*KuUF0*Bv5U>J?R!|}u8n_Yo4nn|2viRO`5!089tc)S+LN<3HT2W_bvIe( zeDJJ&ufR)=QeQff6Y(G;bcz!p2S+~sSuKa&1 zn>}A|@zh)W`LMJ8_0NN|7^nOZvdey&KYu+(LMoGoT0;s`!n1-bo1S>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYHAbEemdJ(|CErc{#U2wq#dne4Jlvr$N0HlT*%o|+x6?6+NQsj zSe*Nek{k=L62|J#pm z_g|*BPcJG7d~0yeuj#RKRSDAgTe~DWM4fbaBK_ literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_validate_prehash_update/00001.png b/tests/monero_client/snapshots/nanox/test_validate_prehash_update/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..7f630e37c9c05ecd2c8f418ab442eaebbdecb9e5 GIT binary patch literal 1030 zcmV+h1o``kP)~gWr%i^P>y1!r&Li!m86)Ae^7)@= zwQ6LG<@^AQdkEb(DKtR}4%_F`3bjHsst(uEbKRl>pqyDJpH*>I|b zPiK7qc6m}1MNxbTrW)!fFuN{W^1Uqg)~X6Ms&V=lc7$87uEuRE9 z#JRsC-Mv2b-Lv|VFH$t9)~K}BFzh-kdCE-u;`g2&RfD;lz36NC=zS3_?>U0C2M zY40nWmR!J+8oGVWI?!xdnUxb3oWj;xzaTok0^~L=k5gKK7J_FiL(S$%6HvXdw)ZHQ zGowTu-O#dhz{|`BDoRs#)7ffsZ9g#kEjs{HHKDejnf(`?aAl`JQE?8n3*AYO9$i?w~2Lunz8fe>D!%K zapOv*wk>SJ-U^ThQJ7*&JM^6cPdrs^MTXozU}R8iEAP=CcXS~Phc0d436tGoYE)($ zuGE+Ok#EGN!0(r58(HF+D_~L7d}dHZQ4}Wu{iS>;I$DA#*u*jASfF*Juqs~+Em0G{ zE`uT970_vYOzgroO03a{#|Xb=r>qBMsvLc!+i4%~RE#nH zMC_G8lR{h8*EI$-7}$rE09#lgLv~NewIR|aYDNn29Y9&Lz)sxVxJ;LPmTu(hAA^J% zR*2%BlE#rSr?GgDwgZq?vR7k+bPb7ij)i7+ODT_pFv%fk5Q9+I@tUhgv#C;7Kv(siE*0!4+hy2RmtHtgI&X(;H|AzvijZ8GuK%I4vt$*S?Q(R#ru!hQ z=w`nF>0-J4Di+lw7Yuo%ZWf@0Y#Ns2K{DgFy9iKx-FDhlyx zsND`kWz7UFKf5R1t==3}Lso~HU~cax^0%z%e*nJsoM82oktYRpK-YctcoY}gY}qp^U%Sl(QN=FKS7 zY$mza;8E!GntmG!OP;V@ulcZrLpB4V6-uu<%MiRav$j!DQcm|sz8S6s>LpKIVD6^0 zls{>UVkA2!Q}{Ur#gqwK%Dk?Fjh>Gf=LmgPE^Sq$2VT45yK6yucE{EN6G1Ob=GXTm z%B5uwOuu7w*~D~u1Qx)WRm(57=#4c`{=?~}a%i8xlH~t3RELiL(H(P$(YBMVP`v=> z!03U3jB-hmGu|#o$DaX<%l5|yDnTmNKY>vTI#bfS-dVP97#u!^%zwx<0X8A1eZOg% z=7Wj+Q(niLYO)gGS1B7}Gh3H-MbW#-!4X-{?ZkSjQ3Y%)JAFKo3A0%bY~1EME>LpB z?g^=CZ=@z$%t5J-hx^d4RERFqq7gQ_irXjrf3=`o=w39IlCt=O1qfI62NzO`bI(s$ z0Ln?pthhX0v;c`uTG%qadc7Vuwg#Ykm$Y-^KaGHIc2O&tlp}vrM=wCrG)?pE_zTv- V>t|?IDFy%l002ovPDHLkV1m<@yRQHM literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanox/test_validate_prehash_update/00003.png b/tests/monero_client/snapshots/nanox/test_validate_prehash_update/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..0a22ed9c048e1c509e4db8bb538a09179382d08c GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYJ?R!|}u8n_Yo4nn|2viRO`5!089tc)S+LN<3HT2W_bvIe( zeDJJ&ufR)=QeQff6Y(G;bcz!p2S+~sSuKa&1 zn>}A|@zh)W`LMJ8_0NN|7^nOZvdey&KYu+(LMoGoT0;s`!n1-bo1S>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYJWBdvN%ubj7hzN2rKU;o#ueP&Ci z6u)zl?W>tp=5_ar-fHP|-DAD~1x3nz=bkJ!FFiWbZ1>T1`*`j0KEJ(a_c>wNQ&HWt z15r_H-frDkxAvfq`)=#1HTp|imgVQL>EwMl?09Qd_55?aH`qVuzrMu!vTxS99j})v zFSWhUH1A`+%LVfl%ReU-{_dXcHN8Ck(Au)AuNIX|O`bh7yXJ7s@3QOt`@Je}etTOx zZMU4Gyz&R%A5DIhmh3=xzsvvUuLt%41H%LBzl=N9ZrwU{VzwMe$kWx&Wt~$(6988l BiiiLJ literal 0 HcmV?d00001 From 664db2d716419766c746447b6d1ef8df287cf7b7 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 11 May 2023 17:59:27 +0200 Subject: [PATCH 081/142] codeql: remove deprecated workflow --- .github/workflows/codeql-workflow.yml | 43 --------------------------- 1 file changed, 43 deletions(-) delete mode 100644 .github/workflows/codeql-workflow.yml diff --git a/.github/workflows/codeql-workflow.yml b/.github/workflows/codeql-workflow.yml deleted file mode 100644 index cc08e94..0000000 --- a/.github/workflows/codeql-workflow.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: "CodeQL" -on: - workflow_dispatch: - push: - branches: - - master - - develop - pull_request: - branches: - - master - - develop - -jobs: - analyse: - name: Analyse - strategy: - matrix: - sdk: [ "$NANOS_SDK", "$NANOX_SDK", "$NANOSP_SDK" ] - language: [ 'cpp', 'python' ] - runs-on: ubuntu-latest - - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest - - steps: - - name: Clone - uses: actions/checkout@v2 - with: - submodules: recursive - - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - queries: security-and-quality - - - name: Build Nano - run: | - make clean - make BOLOS_SDK=${{ matrix.sdk }} - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 From 37fc964bbed294598c56e9a5e6492c8058411ec0 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 4 May 2023 19:45:30 +0200 Subject: [PATCH 082/142] CI: update workflows --- .../workflows/build_and_functional_tests.yml | 34 +++++++ .github/workflows/ci-workflow.yml | 91 ------------------- .github/workflows/guidelines_enforcer.yml | 23 +++++ 3 files changed, 57 insertions(+), 91 deletions(-) create mode 100644 .github/workflows/build_and_functional_tests.yml delete mode 100644 .github/workflows/ci-workflow.yml create mode 100644 .github/workflows/guidelines_enforcer.yml diff --git a/.github/workflows/build_and_functional_tests.yml b/.github/workflows/build_and_functional_tests.yml new file mode 100644 index 0000000..051edb4 --- /dev/null +++ b/.github/workflows/build_and_functional_tests.yml @@ -0,0 +1,34 @@ +name: Build and run functional tests using ragger through reusable workflow + +# This workflow will build the app and then run functional tests using the Ragger framework upon Speculos emulation. +# It calls a reusable workflow developed by Ledger's internal developer team to build the application and upload the +# resulting binaries. +# It then calls another reusable workflow to run the Ragger tests on the compiled application binary. +# +# While this workflow is optional, having functional testing on your application is mandatory and this workflow and +# tooling environment is meant to be easy to use and adapt after forking your application + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + build_application: + name: Build application using the reusable workflow + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_build.yml@v1 + with: + upload_app_binaries_artifact: "compiled_app_binaries" + flags: "DEBUG=1" + + ragger_tests: + name: Run ragger tests using the reusable workflow + needs: build_application + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_ragger_tests.yml@v1 + with: + download_app_binaries_artifact: "compiled_app_binaries" + test_dir: tests diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml deleted file mode 100644 index 627c486..0000000 --- a/.github/workflows/ci-workflow.yml +++ /dev/null @@ -1,91 +0,0 @@ -name: Compilation - -on: - push: - branches: - - master - - develop - pull_request: - branches: - - master - - develop - -jobs: - job_build_debug: - name: Build debug - runs-on: ubuntu-latest - - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest - - steps: - - name: Clone - uses: actions/checkout@v2 - - - name: Build - run: | - make DEBUG=1 - - - name: Upload app binary - uses: actions/upload-artifact@v2 - with: - name: monero-app-debug - path: bin - - scan-build: - name: Clang Static Analyzer - runs-on: ubuntu-latest - - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest - - steps: - - uses: actions/checkout@v2 - - - name: Build with Clang Static Analyzer - run: | - make clean - scan-build --use-cc=clang -analyze-headers -enable-checker security -enable-checker unix -enable-checker valist -o scan-build --status-bugs make default - - uses: actions/upload-artifact@v2 - if: failure() - with: - name: scan-build - path: scan-build - - job_test: - name: Test - needs: job_build_debug - runs-on: ubuntu-latest - - container: - image: ghcr.io/ledgerhq/speculos:latest - ports: - - 1234:1234 - - 9999:9999 - - 40000:40000 - - 41000:41000 - - 42000:42000 - - 43000:43000 - options: --entrypoint /bin/bash - - steps: - - name: Clone - uses: actions/checkout@v2 - - - name: Download app binary - uses: actions/download-artifact@v2 - with: - name: monero-app-debug - path: bin - - - name: Run test - run: | - nohup bash -c "python /speculos/speculos.py bin/app.elf --seed \"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about\" --apdu-port 9999 --button-port 42000 --automation-port 43000 --display headless" > speculos.log 2<&1 & - pip install pytest - pytest - - - name: Upload Speculos log - uses: actions/upload-artifact@v2 - with: - name: speculos-log - path: speculos.log diff --git a/.github/workflows/guidelines_enforcer.yml b/.github/workflows/guidelines_enforcer.yml new file mode 100644 index 0000000..fdaf9f2 --- /dev/null +++ b/.github/workflows/guidelines_enforcer.yml @@ -0,0 +1,23 @@ +name: Ensure compliance with Ledger guidelines + +# This workflow is mandatory in all applications +# It calls a reusable workflow guidelines_enforcer developed by Ledger's internal developer team. +# The successful completion of the reusable workflow is a mandatory step for an app to be available on the Ledger +# application store. +# +# More information on the guidelines can be found in the repository: +# LedgerHQ/ledger-app-workflows/ + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + guidelines_enforcer: + name: Call Ledger guidelines_enforcer + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_guidelines_enforcer.yml@v1 From 3e2662cbd38002f1a8374a90dc66ba0a7cfc0fec Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 27 Apr 2023 16:18:02 +0200 Subject: [PATCH 083/142] ui_menu_main_display: remove useless parameter --- src/monero_api.h | 4 ++-- src/monero_open_tx.c | 2 +- src/monero_ux_nano.c | 32 ++++++++++++++++---------------- src/monero_ux_nanos.c | 39 ++++++++++++++++++++++----------------- 4 files changed, 41 insertions(+), 36 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index ffeba31..f94d5ec 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -87,9 +87,9 @@ int monero_apdu_close_tx(void); void ui_init(void); void ui_menu_lock_display(void); -void ui_menu_main_display(unsigned int value); +void ui_menu_main_display(void); void ui_menu_info_display(unsigned int value); -void ui_menu_info_display2(unsigned int value, char *line1, char *line2); +void ui_menu_info_display2(unsigned int value, const char *line1, const char *line2); void ui_export_viewkey_display(unsigned int value); void ui_menu_any_pubaddr_display(unsigned int value, unsigned char *pub_view, unsigned char *pub_spend, unsigned char is_subbadress, diff --git a/src/monero_open_tx.c b/src/monero_open_tx.c index 618b901..742b1dd 100644 --- a/src/monero_open_tx.c +++ b/src/monero_open_tx.c @@ -84,7 +84,7 @@ int monero_apdu_open_tx_cont() { int monero_apdu_close_tx() { monero_io_discard(1); monero_reset_tx(G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL); - ui_menu_main_display(0); + ui_menu_main_display(); return SW_OK; } diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 1893f52..7e8e60a 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -36,7 +36,7 @@ #define ACCEPT 0xACCE #define REJECT ~ACCEPT -void ui_menu_main_display(unsigned int value); +void ui_menu_main_display(); /* -------------------------------------- LOCK--------------------------------------- */ @@ -59,7 +59,7 @@ void ui_menu_pinlock_display() { ux_params.len = sizeof(ux_params.u.validate_pin); ux_params.u.validate_pin.cancellable = 0; os_ux((bolos_ux_params_t*)&ux_params); - ui_menu_main_display(0); + ui_menu_main_display(); } /* -------------------------------------- 25 WORDS --------------------------------------- */ @@ -87,11 +87,11 @@ UX_FLOW(ux_flow_words, &ux_menu_words_1_step, &ux_menu_words_2_step, &ux_menu_wo void ui_menu_words_clear(unsigned int value __attribute__((unused))) { monero_clear_words(); - ui_menu_main_display(0); + ui_menu_main_display(); } void ui_menu_words_back(unsigned int value __attribute__((unused))) { - ui_menu_main_display(1); + ui_menu_main_display(); } void ui_menu_words_display(unsigned int value __attribute__((unused))) { @@ -116,7 +116,7 @@ unsigned int ui_menu_info_action(unsigned int value __attribute__((unused))) { if (G_monero_vstate.protocol_barrier == PROTOCOL_LOCKED) { ui_menu_pinlock_display(); } else { - ui_menu_main_display(0); + ui_menu_main_display(); } return 0; } @@ -329,7 +329,7 @@ unsigned int ui_menu_export_viewkey_action(unsigned int value) { } monero_io_insert_u16(sw); monero_io_do(IO_RETURN_AFTER_TX); - ui_menu_main_display(0); + ui_menu_main_display(); return 0; } @@ -352,7 +352,7 @@ const char* account_submenu_getter(unsigned int idx) { } void account_back(void) { - ui_menu_main_display(0); + ui_menu_main_display(); } void account_submenu_selector(unsigned int idx) { @@ -360,7 +360,7 @@ void account_submenu_selector(unsigned int idx) { monero_nvm_write((void*)&N_monero_pstate->account_id, &idx, sizeof(unsigned int)); monero_init(); } - ui_menu_main_display(0); + ui_menu_main_display(); } void ui_menu_account_display(void) { @@ -419,7 +419,7 @@ const char* network_submenu_getter(unsigned int idx) { } void network_back(void) { - ui_menu_main_display(0); + ui_menu_main_display(); } static void network_set_net(unsigned int network) { @@ -443,7 +443,7 @@ void network_submenu_selector(unsigned int idx) { default: break; } - ui_menu_main_display(0); + ui_menu_main_display(); } void ui_menu_network_display(void) { @@ -495,7 +495,7 @@ void ui_menu_reset_action(unsigned int value) { monero_nvm_write((void*)N_monero_pstate->magic, magic, 4); monero_init(); } - ui_menu_main_display(0); + ui_menu_main_display(); } /* ------------------------------- SETTINGS UX ------------------------------- */ @@ -511,7 +511,7 @@ const char* settings_submenu_getter(unsigned int idx) { } void settings_back(void) { - ui_menu_main_display(0); + ui_menu_main_display(); } void settings_submenu_selector(unsigned int idx) { @@ -560,7 +560,7 @@ UX_STEP_NOCB(ux_menu_about_1b_step, nn, #endif -UX_STEP_CB(ux_menu_about_2_step, pb, ui_menu_main_display(0), +UX_STEP_CB(ux_menu_about_2_step, pb, ui_menu_main_display(), { &C_icon_back, "Back", @@ -616,7 +616,7 @@ void ui_menu_pubaddr_action(unsigned int value __attribute__((unused))) { monero_io_do(IO_RETURN_AFTER_TX); } G_monero_vstate.disp_addr_mode = 0; - ui_menu_main_display(0); + ui_menu_main_display(); } /** @@ -685,7 +685,7 @@ UX_STEP_CB(ux_menu_main_4_step, pb, os_sched_exit(0), {&C_icon_dashboard_x, "Qui UX_FLOW(ux_flow_main, &ux_menu_main_1_step, &ux_menu_main_2_step, &ux_menu_main_3_step, &ux_menu_main_4_step); -void ui_menu_main_display(unsigned int value __attribute__((unused))) { +void ui_menu_main_display(void) { // reserve a display stack slot if none yet if (G_ux.stack_count == 0) { ux_stack_push(); @@ -695,7 +695,7 @@ void ui_menu_main_display(unsigned int value __attribute__((unused))) { /* --- INIT --- */ void ui_init(void) { - ui_menu_main_display(0); + ui_menu_main_display(); } void io_seproxyhal_display(const bagl_element_t* element) { diff --git a/src/monero_ux_nanos.c b/src/monero_ux_nanos.c index 4517c01..e81a8b9 100644 --- a/src/monero_ux_nanos.c +++ b/src/monero_ux_nanos.c @@ -39,7 +39,7 @@ void ui_menu_reset_action(unsigned int value); const ux_menu_entry_t ui_menu_settings[]; const ux_menu_entry_t ui_menu_main[]; -void ui_menu_main_display(unsigned int value); +void ui_menu_main_display_value(unsigned int value); const bagl_element_t* ui_menu_main_preprocessor(const ux_menu_entry_t* entry, bagl_element_t* element); @@ -65,7 +65,7 @@ void ui_menu_pinlock_display() { ux_params.len = sizeof(ux_params.u.validate_pin); ux_params.u.validate_pin.cancellable = 0; os_ux((bolos_ux_params_t*)&ux_params); - ui_menu_main_display(0); + ui_menu_main_display_value(0); } /* -------------------------------------- 25 WORDS --------------------------------------- */ @@ -110,7 +110,7 @@ void ui_menu_words_display(unsigned int value __attribute__((unused))) { void ui_menu_words_clear(unsigned int value __attribute__((unused))) { monero_clear_words(); - ui_menu_main_display(0); + ui_menu_main_display_value(0); } void ui_menu_words_back(unsigned int value __attribute__((unused))) { @@ -142,7 +142,7 @@ unsigned int ui_menu_info_button(unsigned int button_mask, if (G_monero_vstate.protocol_barrier == PROTOCOL_LOCKED) { ui_menu_pinlock_display(); } else { - ui_menu_main_display(0); + ui_menu_main_display_value(0); } break; @@ -454,7 +454,7 @@ unsigned int ui_export_viewkey_button(unsigned int button_mask, } monero_io_insert_u16(sw); monero_io_do(IO_RETURN_AFTER_TX); - ui_menu_main_display(0); + ui_menu_main_display_value(0); return 0; } @@ -463,7 +463,7 @@ unsigned int ui_export_viewkey_button(unsigned int button_mask, void ui_menu_account_action(unsigned int value); const ux_menu_entry_t ui_menu_account[] = { {NULL, NULL, 0, NULL, "It will reset", "the application!", 0, 0}, - {NULL, ui_menu_main_display, 0, &C_badge_back, "Abort", NULL, 61, 40}, + {NULL, ui_menu_main_display_value, 0, &C_badge_back, "Abort", NULL, 61, 40}, {NULL, ui_menu_account_action, 0, NULL, "0", NULL, 0, 0}, {NULL, ui_menu_account_action, 1, NULL, "1", NULL, 0, 0}, {NULL, ui_menu_account_action, 2, NULL, "2", NULL, 0, 0}, @@ -494,7 +494,7 @@ const bagl_element_t* ui_menu_account_preprocessor(const ux_menu_entry_t* entry, void ui_menu_account_action(unsigned int value) { monero_nvm_write((void*)&N_monero_pstate->account_id, &value, sizeof(unsigned int)); monero_init(); - ui_menu_main_display(0); + ui_menu_main_display_value(0); } void ui_menu_account_display(unsigned int value) { @@ -505,7 +505,7 @@ void ui_menu_account_display(unsigned int value) { void ui_menu_network_action(unsigned int value); const ux_menu_entry_t ui_menu_network[] = { {NULL, NULL, 0, NULL, "It will reset", "the application!", 0, 0}, - {NULL, ui_menu_main_display, 0, &C_badge_back, "Abort", NULL, 61, 40}, + {NULL, ui_menu_main_display_value, 0, &C_badge_back, "Abort", NULL, 61, 40}, {NULL, ui_menu_network_action, TESTNET, NULL, "Test Network ", NULL, 0, 0}, {NULL, ui_menu_network_action, STAGENET, NULL, "Stage Network", NULL, 0, 0}, #ifndef MONERO_ALPHA @@ -542,7 +542,7 @@ const bagl_element_t* ui_menu_network_preprocessor(const ux_menu_entry_t* entry, void ui_menu_network_action(unsigned int value) { monero_install(value); monero_init(); - ui_menu_main_display(0); + ui_menu_main_display_value(0); } void ui_menu_network_display(unsigned int value) { @@ -553,7 +553,7 @@ void ui_menu_network_display(unsigned int value) { const ux_menu_entry_t ui_menu_reset[] = { {NULL, NULL, 0, NULL, "Really Reset ?", NULL, 0, 0}, - {NULL, ui_menu_main_display, 0, &C_badge_back, "No", NULL, 61, 40}, + {NULL, ui_menu_main_display_value, 0, &C_badge_back, "No", NULL, 61, 40}, {NULL, ui_menu_reset_action, 0, NULL, "Yes", NULL, 0, 0}, UX_MENU_END}; @@ -565,7 +565,7 @@ void ui_menu_reset_action(unsigned int value __attribute__((unused))) { magic[3] = 0; monero_nvm_write(N_monero_pstate->magic, magic, 4); monero_init(); - ui_menu_main_display(0); + ui_menu_main_display_value(0); } /* ------------------------------- SETTINGS UX ------------------------------- */ @@ -574,7 +574,7 @@ const ux_menu_entry_t ui_menu_settings[] = { {NULL, ui_menu_network_display, 0, NULL, "Select Network", NULL, 0, 0}, {NULL, ui_menu_words_display, 0, NULL, "Show 25 words", NULL, 0, 0}, {ui_menu_reset, NULL, 0, NULL, "Reset", NULL, 0, 0}, - {NULL, ui_menu_main_display, 2, &C_badge_back, "Back", NULL, 61, 40}, + {NULL, ui_menu_main_display_value, 2, &C_badge_back, "Back", NULL, 61, 40}, UX_MENU_END}; void ui_menu_settings_display(unsigned int value) { @@ -591,7 +591,7 @@ const ux_menu_entry_t ui_menu_about[] = { {NULL, NULL, -1, NULL, "(c) Ledger SAS", NULL, 0, 0}, {NULL, NULL, -1, NULL, "Spec " XSTR(SPEC_VERSION), NULL, 0, 0}, {NULL, NULL, -1, NULL, "App " XSTR(MONERO_VERSION), NULL, 0, 0}, - {NULL, ui_menu_main_display, 3, &C_badge_back, "Back", NULL, 61, 40}, + {NULL, ui_menu_main_display_value, 3, &C_badge_back, "Back", NULL, 61, 40}, UX_MENU_END}; #undef STR @@ -611,7 +611,8 @@ const ux_menu_entry_t ui_menu_pubaddr[] = { {NULL, NULL, 7, NULL, "l3.1", "l3.2", 0, 0}, {NULL, NULL, 6, NULL, "l4.1", "l4.2", 0, 0}, {NULL, NULL, 7, NULL, "l5.1", "l5.2", 0, 0}, - //{NULL, ui_menu_main_display, 0, &C_badge_back, "Back", NULL, 61, 40}, + //{NULL, ui_menu_main_display_value, 0, &C_badge_back, "Back", NULL, 61, + // 40}, {NULL, ui_menu_pubaddr_action, 0, &C_badge_back, "Ok", NULL, 61, 40}, UX_MENU_END}; @@ -743,7 +744,7 @@ void ui_menu_pubaddr_action(unsigned int value __attribute__((unused))) { G_monero_vstate.disp_addr_mode = 0; G_monero_vstate.disp_addr_M = 0; G_monero_vstate.disp_addr_m = 0; - ui_menu_main_display(0); + ui_menu_main_display_value(0); } void ui_menu_any_pubaddr_display(unsigned int value, unsigned char* pub_view, @@ -773,12 +774,16 @@ const ux_menu_entry_t ui_menu_main[] = { {NULL, (void*)os_sched_exit, 0, &C_icon_dashboard, "Quit app", NULL, 50, 29}, UX_MENU_END}; -void ui_menu_main_display(unsigned int value) { +void ui_menu_main_display_value(unsigned int value) { UX_MENU_DISPLAY(value, ui_menu_main, NULL); } +void ui_menu_main_display(void) { + ui_menu_main_display_value(0); +} + void ui_init(void) { - ui_menu_main_display(0); + ui_menu_main_display_value(0); // setup the first screen changing UX_CALLBACK_SET_INTERVAL(1000); } From 4ca06a6fc8449764cd655ad3561d2f5739b1c583 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 27 Apr 2023 16:21:38 +0200 Subject: [PATCH 084/142] misc: clear warnings --- src/monero_dispatch.c | 2 +- src/monero_key.c | 2 +- src/monero_monero.c | 7 +++++++ src/monero_ux_nano.c | 3 ++- src/monero_ux_nanos.c | 3 ++- 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/monero_dispatch.c b/src/monero_dispatch.c index be29f84..4280260 100644 --- a/src/monero_dispatch.c +++ b/src/monero_dispatch.c @@ -58,7 +58,7 @@ int check_potocol() { break; } // unknown protocol or hot protocol switch is not allowed - // FALL THROUGH + __attribute__((fallthrough)); default: return SW_PROTOCOL_NOT_SUPPORTED; diff --git a/src/monero_key.c b/src/monero_key.c index 828607a..a24df6f 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -321,7 +321,7 @@ int monero_apdu_get_key() { } break; -#if DEBUG_HWDEVICE +#ifdef DEBUG_HWDEVICE // get info case 3: { unsigned int path[5]; diff --git a/src/monero_monero.c b/src/monero_monero.c index 91a9681..598a82b 100644 --- a/src/monero_monero.c +++ b/src/monero_monero.c @@ -73,24 +73,31 @@ static uint64_t uint_8be_to_64(const unsigned char* data, size_t size) { switch (9 - size) { case 1: res |= *data++; + __attribute__((fallthrough)); case 2: res <<= 8; res |= *data++; + __attribute__((fallthrough)); case 3: res <<= 8; res |= *data++; + __attribute__((fallthrough)); case 4: res <<= 8; res |= *data++; + __attribute__((fallthrough)); case 5: res <<= 8; res |= *data++; + __attribute__((fallthrough)); case 6: res <<= 8; res |= *data++; + __attribute__((fallthrough)); case 7: res <<= 8; res |= *data++; + __attribute__((fallthrough)); case 8: res <<= 8; res |= *data; diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 7e8e60a..65dfa27 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -121,7 +121,8 @@ unsigned int ui_menu_info_action(unsigned int value __attribute__((unused))) { return 0; } -void ui_menu_info_display2(unsigned int value __attribute__((unused)), char* line1, char* line2) { +void ui_menu_info_display2(unsigned int value __attribute__((unused)), const char* line1, + const char* line2) { snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "%s", line1); snprintf(G_monero_vstate.ux_info2, sizeof(G_monero_vstate.ux_info2), "%s", line2); ux_flow_init(0, ux_flow_info, NULL); diff --git a/src/monero_ux_nanos.c b/src/monero_ux_nanos.c index e81a8b9..8bbe135 100644 --- a/src/monero_ux_nanos.c +++ b/src/monero_ux_nanos.c @@ -152,7 +152,8 @@ unsigned int ui_menu_info_button(unsigned int button_mask, return 0; } -void ui_menu_info_display2(unsigned int value __attribute__((unused)), char* line1, char* line2) { +void ui_menu_info_display2(unsigned int value __attribute__((unused)), const char* line1, + const char* line2) { snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "%s", line1); snprintf(G_monero_vstate.ux_info2, sizeof(G_monero_vstate.ux_info2), "%s", line2); UX_DISPLAY(ui_menu_info, NULL); From efd649fda33e5d97fff7e53f5a44ed3ba2e95561 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 27 Apr 2023 16:23:11 +0200 Subject: [PATCH 085/142] main.c: add missing CLOSE_TRY --- src/monero_main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/monero_main.c b/src/monero_main.c index e82f812..51bccbd 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -216,10 +216,12 @@ __attribute__((section(".boot"))) int main(void) { } CATCH(EXCEPTION_IO_RESET) { // reset IO and UX + CLOSE_TRY; ; } CATCH_OTHER(e) { cont = 0; + CLOSE_TRY; } FINALLY { } From b73c2ca833beb88b70c91200ce8171418d33b65e Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 17 Jan 2023 15:10:47 +0100 Subject: [PATCH 086/142] cleanup: remove deprecated BLUE related code --- Makefile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Makefile b/Makefile index eafc7ff..175c305 100644 --- a/Makefile +++ b/Makefile @@ -27,9 +27,7 @@ include $(BOLOS_SDK)/Makefile.defines APP_LOAD_PARAMS= --path "2147483692/2147483776" --curve secp256k1 $(COMMON_LOAD_PARAMS) --appFlags 0x240 APPNAME = "Monero" -ifeq ($(TARGET_NAME),TARGET_BLUE) -ICONNAME = images/icon_monero_blue.gif -else ifeq ($(TARGET_NAME),TARGET_NANOS) +ifeq ($(TARGET_NAME),TARGET_NANOS) ICONNAME = images/icon_monero.gif else ICONNAME = images/icon_monero_nanox.gif @@ -53,8 +51,6 @@ DEFINES += SPEC_VERSION=$(SPECVERSION) ifeq ($(TARGET_NAME),TARGET_NANOS) DEFINES += UI_NANO_S -else ifeq ($(TARGET_NAME),TARGET_BLUE) -DEFINES += UI_BLUE else DEFINES += UI_NANO_X TARGET_UI := FLOW From eea258d2a177d7c3c5b1e178fa4d3a9febead73e Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 17 Jan 2023 14:38:36 +0100 Subject: [PATCH 087/142] Stax: add new glyphs --- glyphs/Monero_64px.gif | Bin 0 -> 340 bytes images/icon_monero_stax.gif | Bin 0 -> 181 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 glyphs/Monero_64px.gif create mode 100644 images/icon_monero_stax.gif diff --git a/glyphs/Monero_64px.gif b/glyphs/Monero_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..d7bdae59117ea143a090ba08534ad17b220bdcd4 GIT binary patch literal 340 zcmV-a0jvH;Nk%w1VL$*t0Pq0-00030|NkNR1ONa4001HX3rTHZXJt)cXK7<=4rgI) zZDBnyE;KbXH8eEae+;V7EwiB9XQ zwGvEcGE?W9toIJ@3!;KVK&nXOAd!_Nlj3}mqS6GldI()@tZeME{ef+`@A&F9pE2cV zn{6mr-ET-*9bYQsYxq352a?xSS2H7M;?kq&1C`_02>H?^M7d%CXvwFk>fZuuLhF(XRsWo mgxuUQOvjMfjfe9L+Uut0qO=Zo8VeTdh;SE3VeIA=0027$^`0&O literal 0 HcmV?d00001 diff --git a/images/icon_monero_stax.gif b/images/icon_monero_stax.gif new file mode 100644 index 0000000000000000000000000000000000000000..0b9408b417dc4cc668e5b9b5ec05da7a8aad6df6 GIT binary patch literal 181 zcmZ?wbhEHbRA5kG_`t{j1poj4SNzEWVlgQG=l0A^Oi%SqOwUZt=1Wh^%}um5&@(Xw zK?WU=5|BOyro5hh_R}xt&zQ5Jt#f7Q&eLyOc~zzzNS@^v<;MHF?^yZ9&1$xM4c~;!CfIJMOJm_~}U= d_u})PjjZ?Qe_>aOU=J35QOd!_5y-$`4FGx0NtOTr literal 0 HcmV?d00001 From 01e55df6313f8fcfe388b87634962eccbd687aa6 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 17 Jan 2023 15:54:46 +0100 Subject: [PATCH 088/142] main: change bluetooth conditional flag --- src/monero_main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/monero_main.c b/src/monero_main.c index 51bccbd..f0048b7 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -196,11 +196,11 @@ __attribute__((section(".boot"))) int main(void) { io_usb_ccid_set_card_inserted(1); #endif -#ifdef TARGET_NANOX +#ifdef HAVE_BLE G_io_app.plane_mode = os_setting_get(OS_SETTING_PLANEMODE, NULL, 0); BLE_power(0, NULL); - BLE_power(1, "Nano X - Monero"); -#endif + BLE_power(1, NULL); +#endif // HAVE_BLE monero_init(); From 1fda3283f8a105321960dc931646253bf686b825 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 26 Jan 2023 18:51:50 +0100 Subject: [PATCH 089/142] ux: add transaction_start and transaction_signed functions that will be used for stax --- src/monero_api.h | 4 ++++ src/monero_prefix.c | 2 +- src/monero_prehash.c | 4 ++++ src/monero_ux_nano.c | 16 ++++++++++++++++ src/monero_ux_nanos.c | 15 +++++++++++++++ 5 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/monero_api.h b/src/monero_api.h index f94d5ec..07c076e 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -96,6 +96,8 @@ void ui_menu_any_pubaddr_display(unsigned int value, unsigned char *pub_view, unsigned char *paymanetID); void ui_menu_pubaddr_display(unsigned int value); +unsigned int ui_menu_transaction_start(void); +unsigned int ui_menu_transaction_signed(void); /* ----------------------------------------------------------------------- */ /* --- MISC ---- */ /* ----------------------------------------------------------------------- */ @@ -122,8 +124,10 @@ int monero_abort_tx(void); int monero_unblind(unsigned char *v, unsigned char *k, unsigned char *AKout, unsigned int short_amount); void ui_menu_validation_display(unsigned int value); +void ui_menu_validation_display_last(unsigned int value); void ui_menu_fee_validation_display(unsigned int value); void ui_menu_change_validation_display(unsigned int value); +void ui_menu_change_validation_display_last(unsigned int value); void ui_menu_timelock_validation_display(unsigned int value); void ui_menu_opentx_display(unsigned int value); diff --git a/src/monero_prefix.c b/src/monero_prefix.c index c08c4e7..54d5ed6 100644 --- a/src/monero_prefix.c +++ b/src/monero_prefix.c @@ -48,7 +48,7 @@ int monero_apdu_prefix_hash_init(void) { ui_menu_timelock_validation_display(0); return 0; } else { - return SW_OK; + return ui_menu_transaction_start(); } } else { monero_io_discard(1); diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 84ba076..195fd7a 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -204,6 +204,10 @@ int monero_apdu_mlsag_prehash_finalize() { monero_keccak_final_H(G_monero_vstate.mlsagH); monero_io_insert(G_monero_vstate.mlsagH, 32); + + if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { + ui_menu_transaction_signed(); + } } return SW_OK; diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 65dfa27..bab856c 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -133,6 +133,14 @@ void ui_menu_info_display(unsigned int value __attribute__((unused))) { } /* -------------------------------- OPEN TX UX --------------------------------- */ +unsigned int ui_menu_transaction_start(void) { + return SW_OK; +} + +unsigned int ui_menu_transaction_signed(void) { + return SW_OK; +} + unsigned int ui_menu_opentx_action(unsigned int value); UX_STEP_NOCB(ux_menu_opentx_1_step, nn, {"Process", "new TX ?"}); @@ -253,6 +261,10 @@ void ui_menu_change_validation_display(unsigned int value __attribute__((unused) ux_flow_init(0, ux_flow_change, NULL); } +void ui_menu_change_validation_display_last(unsigned int value __attribute__((unused))) { + ux_flow_init(0, ux_flow_change, NULL); +} + void ui_menu_timelock_validation_display(unsigned int value __attribute__((unused))) { ux_flow_init(0, ux_flow_timelock, NULL); } @@ -282,6 +294,10 @@ void ui_menu_validation_display(unsigned int value __attribute__((unused))) { ux_flow_init(0, ux_flow_validation, NULL); } +void ui_menu_validation_display_last(unsigned int value __attribute__((unused))) { + ux_flow_init(0, ux_flow_validation, NULL); +} + void ui_menu_validation_action(unsigned int value) { unsigned short sw; if (value == ACCEPT) { diff --git a/src/monero_ux_nanos.c b/src/monero_ux_nanos.c index 8bbe135..28ab06c 100644 --- a/src/monero_ux_nanos.c +++ b/src/monero_ux_nanos.c @@ -165,6 +165,14 @@ void ui_menu_info_display(unsigned int value __attribute__((unused))) { /* -------------------------------- OPEN TX UX --------------------------------- */ +unsigned int ui_menu_transaction_signed(void) { + return SW_OK; +} + +unsigned int ui_menu_transaction_start(void) { + return SW_OK; +} + unsigned int ui_menu_opentx_button(unsigned int button_mask, unsigned int button_mask_counter); const bagl_element_t ui_menu_opentx[] = { @@ -295,6 +303,9 @@ void ui_menu_fee_validation_display(unsigned int value __attribute__((unused))) void ui_menu_change_validation_display(unsigned int value __attribute__((unused))) { UX_MENU_DISPLAY(0, ui_menu_change_validation, ui_menu_amount_validation_preprocessor); } +void ui_menu_change_validation_display_last(unsigned int value __attribute__((unused))) { + UX_MENU_DISPLAY(0, ui_menu_change_validation, ui_menu_amount_validation_preprocessor); +} void ui_menu_timelock_validation_display(unsigned int value __attribute__((unused))) { UX_MENU_DISPLAY(0, ui_menu_timelock_validation, ui_menu_amount_validation_preprocessor); } @@ -378,6 +389,10 @@ void ui_menu_validation_display(unsigned int value __attribute__((unused))) { UX_MENU_DISPLAY(0, ui_menu_validation, ui_menu_validation_preprocessor); } +void ui_menu_validation_display_last(unsigned int value __attribute__((unused))) { + UX_MENU_DISPLAY(0, ui_menu_validation, ui_menu_validation_preprocessor); +} + void ui_menu_validation_action(unsigned int value) { unsigned short sw; if (value == ACCEPT) { From ae75a01a58a7390fbf07754e47d3dcabab76aa63 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Wed, 18 Jan 2023 16:58:02 +0100 Subject: [PATCH 090/142] monero_ux_nano: fix typo --- src/monero_ux_nano.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index bab856c..199945a 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -674,7 +674,7 @@ void ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), void ui_menu_pubaddr_display(unsigned int value) { G_monero_vstate.disp_addr_mode = 0; G_monero_vstate.disp_addr_M = 0; - G_monero_vstate.disp_addr_M = 0; + G_monero_vstate.disp_addr_m = 0; ui_menu_any_pubaddr_display(value, G_monero_vstate.A, G_monero_vstate.B, 0, NULL); } From 205ac3782eaa6d338ad52460c5a2d3468e17a558 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 17 Jan 2023 15:56:57 +0100 Subject: [PATCH 091/142] Stax: add support for nbgl --- Makefile | 17 +- src/monero_api.h | 2 + src/monero_main.c | 10 + src/monero_nvram.c | 2 +- src/monero_open_tx.c | 2 + src/monero_prehash.c | 15 +- src/monero_ux_stax.c | 453 ++++++++++++++++++++++++++++++++++++++ src/monero_ux_stax_menu.c | 266 ++++++++++++++++++++++ src/monero_vars.h | 2 +- 9 files changed, 759 insertions(+), 10 deletions(-) create mode 100644 src/monero_ux_stax.c create mode 100644 src/monero_ux_stax_menu.c diff --git a/Makefile b/Makefile index 175c305..2fbb1e9 100644 --- a/Makefile +++ b/Makefile @@ -29,6 +29,8 @@ APPNAME = "Monero" ifeq ($(TARGET_NAME),TARGET_NANOS) ICONNAME = images/icon_monero.gif +else ifeq ($(TARGET_NAME),TARGET_STAX) +ICONNAME = images/icon_monero_stax.gif else ICONNAME = images/icon_monero_nanox.gif endif @@ -51,6 +53,9 @@ DEFINES += SPEC_VERSION=$(SPECVERSION) ifeq ($(TARGET_NAME),TARGET_NANOS) DEFINES += UI_NANO_S +else ifeq ($(TARGET_NAME),TARGET_STAX) +DEFINES += UI_STAX +DEFINES += NBGL_QRCODE else DEFINES += UI_NANO_X TARGET_UI := FLOW @@ -73,7 +78,7 @@ DEFINES += NO_CONSENT endif DEFINES += OS_IO_SEPROXYHAL -DEFINES += HAVE_BAGL HAVE_SPRINTF +DEFINES += HAVE_SPRINTF DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=4 IO_HID_EP_LENGTH=64 HAVE_USB_APDU DEFINES += CUSTOM_IO_APDU_BUFFER_SIZE=\(255+5+64\) DEFINES += HAVE_LEGACY_PID @@ -85,22 +90,25 @@ DEFINES += HAVE_IO_U2F HAVE_U2F DEFINES += UNUSED\(x\)=\(void\)x DEFINES += APPVERSION=\"$(APPVERSION)\" -ifeq ($(TARGET_NAME),TARGET_NANOX) +ifeq ($(TARGET_NAME),$(filter $(TARGET_NAME),TARGET_NANOX TARGET_STAX)) DEFINES += HAVE_BLE BLE_COMMAND_TIMEOUT_MS=2000 DEFINES += HAVE_BLE_APDU # basic ledger apdu transport over BLE endif ifeq ($(TARGET_NAME),TARGET_NANOS) DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=128 +DEFINES += HAVE_BAGL else DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300 -DEFINES += HAVE_GLO096 +ifneq ($(TARGET_NAME),TARGET_STAX) DEFINES += HAVE_BAGL BAGL_WIDTH=128 BAGL_HEIGHT=64 +DEFINES += HAVE_GLO096 DEFINES += HAVE_BAGL_ELLIPSIS # long label truncation feature DEFINES += HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX DEFINES += HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX DEFINES += HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX endif +endif ifeq ($(TARGET_UI),FLOW) DEFINES += HAVE_UX_FLOW @@ -172,11 +180,10 @@ ifeq ($(TARGET_UI),FLOW) SDK_SOURCE_PATH += lib_ux endif -ifeq ($(TARGET_NAME),TARGET_NANOX) +ifeq ($(TARGET_NAME),$(filter $(TARGET_NAME),TARGET_NANOX TARGET_STAX)) SDK_SOURCE_PATH += lib_blewbxx lib_blewbxx_impl endif - load: all python -m ledgerblue.loadApp $(APP_LOAD_PARAMS) diff --git a/src/monero_api.h b/src/monero_api.h index 07c076e..58b8ca6 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -131,6 +131,8 @@ void ui_menu_change_validation_display_last(unsigned int value); void ui_menu_timelock_validation_display(unsigned int value); void ui_menu_opentx_display(unsigned int value); + +void display_account(void); /* ----------------------------------------------------------------------- */ /* --- KEYS & ADDRESS ---- */ /* ----------------------------------------------------------------------- */ diff --git a/src/monero_main.c b/src/monero_main.c index f0048b7..8d4bc94 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -94,7 +94,9 @@ unsigned char io_event(unsigned char channel __attribute__((unused))) { break; // power off if long push, else pass to the application callback if any case SEPROXYHAL_TAG_BUTTON_PUSH_EVENT: // for Nano S +#ifdef HAVE_BAGL UX_BUTTON_PUSH_EVENT(G_io_seproxyhal_spi_buffer); +#endif break; // other events are propagated to the UX just in case @@ -103,14 +105,21 @@ unsigned char io_event(unsigned char channel __attribute__((unused))) { break; case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: +#ifdef HAVE_BAGL UX_DISPLAYED_EVENT({}); +#endif // HAVE_BAGL +#ifdef HAVE_NBGL + UX_DEFAULT_EVENT(); +#endif // HAVE_NBGL break; case SEPROXYHAL_TAG_TICKER_EVENT: UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, { +#ifdef HAVE_BAGL // only allow display when not locked of overlayed by an OS UX. if (UX_ALLOWED) { UX_REDISPLAY(); } +#endif }); break; } @@ -182,6 +191,7 @@ __attribute__((section(".boot"))) int main(void) { // ensure exception will work as planned os_boot(); while (cont) { + // Initialize the UX system UX_INIT(); BEGIN_TRY { diff --git a/src/monero_nvram.c b/src/monero_nvram.c index 9184982..495f881 100644 --- a/src/monero_nvram.c +++ b/src/monero_nvram.c @@ -22,7 +22,7 @@ #include "monero_api.h" #include "monero_vars.h" -#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) +#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) const monero_nv_state_t N_state_pic; #else monero_nv_state_t N_state_pic; diff --git a/src/monero_open_tx.c b/src/monero_open_tx.c index 742b1dd..640b287 100644 --- a/src/monero_open_tx.c +++ b/src/monero_open_tx.c @@ -84,7 +84,9 @@ int monero_apdu_open_tx_cont() { int monero_apdu_close_tx() { monero_io_discard(1); monero_reset_tx(G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL); +#ifdef HAVE_BAGL ui_menu_main_display(); +#endif return SW_OK; } diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 195fd7a..5735926 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -147,10 +147,19 @@ int monero_apdu_mlsag_prehash_update() { amount = monero_bamount2uint64(v); if (amount) { monero_amount2str(amount, G_monero_vstate.ux_amount, 15); - if (!is_change) { - ui_menu_validation_display(0); + + if ((G_monero_vstate.options & IN_OPTION_MORE_COMMAND) == 0) { + if (!is_change) { + ui_menu_validation_display_last(0); + } else { + ui_menu_change_validation_display_last(0); + } } else { - ui_menu_change_validation_display(0); + if (!is_change) { + ui_menu_validation_display(0); + } else { + ui_menu_change_validation_display(0); + } } return 0; } diff --git a/src/monero_ux_stax.c b/src/monero_ux_stax.c new file mode 100644 index 0000000..0c03bb1 --- /dev/null +++ b/src/monero_ux_stax.c @@ -0,0 +1,453 @@ +/***************************************************************************** + * Ledger Monero App. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ + +#if defined(UI_STAX) + +#include "os.h" +#include "ux.h" +#include "cx.h" +#include "monero_types.h" +#include "monero_api.h" +#include "monero_vars.h" + +#include "monero_ux_msg.h" +#include "os_io_seproxyhal.h" +#include "string.h" +#include "glyphs.h" + +#include "nbgl_use_case.h" + +#define QUIT_TOKEN 0 +#define CONTINUE_TOKEN 1 +/* ----------------------------------------------------------------------- */ +/* --- Stax UI layout --- */ +/* ----------------------------------------------------------------------- */ + +typedef struct { + nbgl_layoutTagValue_t tagValuePair[6]; + nbgl_layoutTagValueList_t tagValueList; + nbgl_pageInfoLongPress_t infoLongPress; + char timelockBuffer[23]; + char feeBuffer[23]; + char changeBuffer[23]; + nbgl_pageContent_t content; + nbgl_pageNavigationInfo_t nav; +} TransactionContext_t; + +static TransactionContext_t transactionContext; +static nbgl_page_t* pageContext; + +static void release_context(void) { + if (pageContext != NULL) { + nbgl_pageRelease(pageContext); + pageContext = NULL; + } +} + +/* -------------------------------------- LOCK--------------------------------------- */ + +void ui_menu_pinlock_display() { + struct { + bolos_ux_t ux_id; + // length of parameters in the u union to be copied during the syscall + unsigned int len; + union { + struct { + unsigned int cancellable; + } validate_pin; + } u; + + } ux_params; + + os_global_pin_invalidate(); + G_monero_vstate.protocol_barrier = PROTOCOL_LOCKED_UNLOCKABLE; + ux_params.ux_id = BOLOS_UX_VALIDATE_PIN; + ux_params.len = sizeof(ux_params.u.validate_pin); + ux_params.u.validate_pin.cancellable = 0; + os_ux((bolos_ux_params_t*)&ux_params); + ui_menu_main_display(); +} + +/* -------------------------------- INFO UX --------------------------------- */ + +static void ui_menu_info_action(void) { + if (G_monero_vstate.protocol_barrier == PROTOCOL_LOCKED) { + ui_menu_pinlock_display(); + } else { + ui_menu_main_display(); + } +} + +void ui_menu_info_display2(unsigned int value __attribute__((unused)), + const char* line1 __attribute__((unused)), + const char* line2 __attribute__((unused))) { + nbgl_useCaseStatus("Transaction\ncancelled", false, ui_menu_info_action); +} + +void ui_menu_info_display(unsigned int value __attribute__((unused))) { + nbgl_useCaseStatus("Security Error", false, ui_menu_info_action); +} + +/* -------------------------------- OPEN TX UX --------------------------------- */ +static void ui_menu_validation_action_cancel(void) { + monero_abort_tx(); + monero_io_insert_u16(SW_DENY); + monero_io_do(IO_RETURN_AFTER_TX); +} + +static void ui_menu_validation_action_confirm(void) { + monero_io_discard(0); + monero_io_insert_u16(SW_OK); + monero_io_do(IO_RETURN_AFTER_TX); + nbgl_useCaseSpinner("Processing TX"); +} + +static void ui_menu_validation_action_cancel_prompt(void) { + nbgl_useCaseConfirm("Reject transaction?", "", "Yes, Reject", "Go back to transaction", + ui_menu_validation_action_cancel); +} + +static void ui_menu_validation_action(bool value) { + if (value) { + transactionContext.tagValueList.nbPairs = 0; + ui_menu_validation_action_confirm(); + } else { + ui_menu_validation_action_cancel_prompt(); + } +} + +unsigned int ui_menu_transaction_start(void) { + transactionContext.tagValueList.nbPairs = 0; + nbgl_useCaseReviewStart(&C_Monero_64px, "Review Transaction\nto send Monero", "", + "Reject transaction", ui_menu_validation_action_confirm, + ui_menu_validation_action_cancel_prompt); + return 0; +} + +unsigned int ui_menu_transaction_signed(void) { + nbgl_useCaseStatus("TRANSACTION\nSIGNED", true, ui_menu_main_display); + return 0; +} + +void ui_menu_opentx_display(unsigned int value __attribute__((unused))) { + if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { + nbgl_useCaseSpinner("Processing TX"); + } else { + nbgl_useCaseSpinner("Preparing TX"); + } +} + +/* ----------------- FEE/CHANGE/TIMELOCK VALIDATION ----------------- */ + +void ui_menu_fee_validation_display(unsigned int value __attribute__((unused))) { + uint8_t nbPairs = transactionContext.tagValueList.nbPairs; + + strncpy(transactionContext.feeBuffer, G_monero_vstate.ux_amount, + sizeof(transactionContext.feeBuffer)); + + transactionContext.tagValuePair[nbPairs].item = "Fee"; + transactionContext.tagValuePair[nbPairs].value = transactionContext.feeBuffer; + + transactionContext.tagValueList.pairs = transactionContext.tagValuePair; + transactionContext.tagValueList.nbPairs++; + + ui_menu_validation_action_confirm(); +} + +void ui_menu_change_validation_display(unsigned int value __attribute__((unused))) { + uint8_t nbPairs = transactionContext.tagValueList.nbPairs; + + strncpy(transactionContext.changeBuffer, G_monero_vstate.ux_amount, + sizeof(transactionContext.changeBuffer)); + + transactionContext.tagValuePair[nbPairs].item = "Change"; + transactionContext.tagValuePair[nbPairs].value = transactionContext.changeBuffer; + + transactionContext.tagValueList.pairs = transactionContext.tagValuePair; + transactionContext.tagValueList.nbPairs++; + + ui_menu_validation_action_confirm(); +} + +void ui_menu_change_validation_display_last(unsigned int value __attribute__((unused))) { + uint8_t nbPairs = transactionContext.tagValueList.nbPairs; + + strncpy(transactionContext.changeBuffer, G_monero_vstate.ux_amount, + sizeof(transactionContext.changeBuffer)); + + transactionContext.tagValuePair[nbPairs].item = "Change"; + transactionContext.tagValuePair[nbPairs].value = transactionContext.changeBuffer; + + transactionContext.tagValueList.pairs = transactionContext.tagValuePair; + transactionContext.tagValueList.nbPairs++; + + transactionContext.infoLongPress.icon = &C_Monero_64px; + transactionContext.infoLongPress.longPressText = "Approve"; + transactionContext.infoLongPress.longPressToken = 0; + transactionContext.infoLongPress.tuneId = TUNE_TAP_CASUAL; + transactionContext.infoLongPress.text = "Hold to confirm"; + + nbgl_useCaseStaticReview(&transactionContext.tagValueList, &transactionContext.infoLongPress, + "Cancel", ui_menu_validation_action); +} + +static void timelock_callback(void) { + uint8_t nbPairs = transactionContext.tagValueList.nbPairs; + + strncpy(transactionContext.timelockBuffer, G_monero_vstate.ux_amount, + sizeof(transactionContext.timelockBuffer)); + + transactionContext.tagValuePair[nbPairs].item = "Timelock"; + transactionContext.tagValuePair[nbPairs].value = transactionContext.timelockBuffer; + + transactionContext.tagValueList.pairs = transactionContext.tagValuePair; + transactionContext.tagValueList.nbPairs++; + + ui_menu_validation_action_confirm(); +} + +void ui_menu_timelock_validation_display(unsigned int value __attribute__((unused))) { + transactionContext.tagValueList.nbPairs = 0; + + nbgl_useCaseReviewStart(&C_Monero_64px, "Review Transaction\nto send Monero", NULL, + "Reject transaction", timelock_callback, + ui_menu_validation_action_cancel_prompt); +} + +/* ----------------------------- USER DEST/AMOUNT VALIDATION ----------------------------- */ +static void fill_amount_and_destination(void) { + transactionContext.tagValuePair[0].item = "Amount"; + transactionContext.tagValuePair[0].value = G_monero_vstate.ux_amount; + + transactionContext.tagValuePair[1].item = "Destination"; + transactionContext.tagValuePair[1].value = G_monero_vstate.ux_address; + + transactionContext.tagValueList.nbPairs = 2; + transactionContext.tagValueList.pairs = transactionContext.tagValuePair; +} + +static void page_callback(int token, unsigned char index) { + (void)index; + release_context(); + + ui_menu_validation_action(token); +} + +static void continue_display(int token, unsigned char index) { + (void)index; + + if (token == QUIT_TOKEN) { + ui_menu_validation_action_cancel_prompt(); + } + + fill_amount_and_destination(); + + nbgl_pageNavigationInfo_t info = {.activePage = 0, + .nbPages = 0, + .navType = NAV_WITH_TAP, + .progressIndicator = true, + .navWithTap.backButton = false, + .navWithTap.nextPageText = "Tap to continue", + .navWithTap.nextPageToken = CONTINUE_TOKEN, + .navWithTap.quitText = "Cancel", + .quitToken = QUIT_TOKEN, + .tuneId = TUNE_TAP_CASUAL}; + + nbgl_pageContent_t content = { + .type = TAG_VALUE_LIST, + .tagValueList.nbPairs = transactionContext.tagValueList.nbPairs, + .tagValueList.pairs = (nbgl_layoutTagValue_t*)transactionContext.tagValueList.pairs}; + + pageContext = nbgl_pageDrawGenericContent(page_callback, &info, &content); +} + +static void continue_display_last(int token, unsigned char index) { + (void)index; + + if (token == QUIT_TOKEN) { + ui_menu_validation_action_cancel_prompt(); + } + + fill_amount_and_destination(); + transactionContext.infoLongPress.icon = &C_Monero_64px; + transactionContext.infoLongPress.longPressText = "Approve"; + transactionContext.infoLongPress.longPressToken = 0; + transactionContext.infoLongPress.tuneId = TUNE_TAP_CASUAL; + transactionContext.infoLongPress.text = "Hold to confirm"; + + nbgl_useCaseStaticReview(&transactionContext.tagValueList, &transactionContext.infoLongPress, + "Cancel", ui_menu_validation_action); +} + +static void display_previous_infos(bool last) { + release_context(); + + nbgl_pageNavigationInfo_t info = {.activePage = 0, + .nbPages = 0, + .navType = NAV_WITH_TAP, + .progressIndicator = true, + .navWithTap.backButton = false, + .navWithTap.nextPageText = "Tap to continue", + .navWithTap.nextPageToken = CONTINUE_TOKEN, + .navWithTap.quitText = "Cancel", + .quitToken = QUIT_TOKEN, + .tuneId = TUNE_TAP_CASUAL}; + + nbgl_pageContent_t content = { + .type = TAG_VALUE_LIST, + .tagValueList.nbPairs = transactionContext.tagValueList.nbPairs, + .tagValueList.pairs = (nbgl_layoutTagValue_t*)transactionContext.tagValueList.pairs}; + + if (last) { + pageContext = nbgl_pageDrawGenericContent(continue_display_last, &info, &content); + } else { + pageContext = nbgl_pageDrawGenericContent(continue_display, &info, &content); + } +} + +void ui_menu_validation_display(unsigned int value __attribute__((unused))) { + const bool last = 0; + uint8_t nbPairs = transactionContext.tagValueList.nbPairs; + + if (nbPairs > 0) { + display_previous_infos(last); + } else { + continue_display(CONTINUE_TOKEN, 0); + } +} + +void ui_menu_validation_display_last(unsigned int value __attribute__((unused))) { + const bool last = 1; + uint8_t nbPairs = transactionContext.tagValueList.nbPairs; + + if (nbPairs > 0) { + display_previous_infos(last); + } else { + continue_display_last(CONTINUE_TOKEN, 0); + } +} +/* ---------------------------- PUBLIC ADDRESS UX ---------------------------- */ +#define ADDR_MAJOR G_monero_vstate.ux_address + 124 +#define ADDR_MINOR G_monero_vstate.ux_address + 140 +#define ADDR_ID G_monero_vstate.ux_address + 140 + +static void ui_menu_pubaddr_action_cancelled(void) { + if (G_monero_vstate.disp_addr_mode) { + monero_io_insert_u16(SW_OK); + monero_io_do(IO_RETURN_AFTER_TX); + } + G_monero_vstate.disp_addr_mode = 0; + nbgl_useCaseStatus("Address display\ncancelled", false, ui_menu_main_display); +} + +void ui_menu_pubaddr_action(bool confirm) { + if (confirm) { + if (G_monero_vstate.disp_addr_mode) { + monero_io_insert_u16(SW_OK); + monero_io_do(IO_RETURN_AFTER_TX); + } + G_monero_vstate.disp_addr_mode = 0; + nbgl_useCaseStatus("ADDRESS\nVERIFIED", true, ui_menu_main_display); + } else { + ui_menu_pubaddr_action_cancelled(); + } +} + +void display_account(void) { + switch (G_monero_vstate.disp_addr_mode) { + case 0: + case DISP_MAIN: + transactionContext.tagValuePair[0].item = "Type"; + transactionContext.tagValuePair[0].value = "Main address"; + + transactionContext.tagValueList.nbPairs = 1; + break; + + case DISP_SUB: + transactionContext.tagValuePair[0].item = "Type"; + transactionContext.tagValuePair[0].value = "Sub address"; + + snprintf(ADDR_MAJOR, 16, "%d", G_monero_vstate.disp_addr_M); + snprintf(ADDR_MINOR, 16, "%d", G_monero_vstate.disp_addr_m); + + transactionContext.tagValuePair[1].item = "Major"; + transactionContext.tagValuePair[1].value = ADDR_MAJOR; + + transactionContext.tagValuePair[2].item = "Minor"; + transactionContext.tagValuePair[2].value = ADDR_MINOR; + + transactionContext.tagValueList.nbPairs = 3; + break; + + case DISP_INTEGRATED: + transactionContext.tagValuePair[0].item = "Type"; + transactionContext.tagValuePair[0].value = "Integrated address"; + + memcpy(ADDR_ID, G_monero_vstate.payment_id, 16); + + transactionContext.tagValuePair[1].item = "Payment ID"; + transactionContext.tagValuePair[1].value = ADDR_ID; + + transactionContext.tagValueList.nbPairs = 2; + break; + } + + transactionContext.tagValueList.pairs = transactionContext.tagValuePair; + + nbgl_useCaseAddressConfirmationExt(G_monero_vstate.ux_address, ui_menu_pubaddr_action, + &transactionContext.tagValueList); +} + +void ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), + unsigned char* pub_view, unsigned char* pub_spend, + unsigned char is_subbadress, unsigned char* paymanetID) { + memset(G_monero_vstate.ux_address, 0, sizeof(G_monero_vstate.ux_address)); + + monero_base58_public_key(G_monero_vstate.ux_address, pub_view, pub_spend, is_subbadress, + paymanetID); + + nbgl_useCaseReviewStart(&C_Monero_64px, "Review Address", "", "Cancel", display_account, + ui_menu_pubaddr_action_cancelled); +} + +/* -------------------------------- EXPORT VIEW KEY UX --------------------------------- */ + +static void ui_menu_export_viewkey_action(bool value) { + unsigned int sw; + unsigned char x[32]; + + monero_io_discard(0); + memset(x, 0, 32); + sw = SW_OK; + + if (value) { + monero_io_insert(G_monero_vstate.a, 32); + G_monero_vstate.export_view_key = EXPORT_VIEW_KEY; + } else { + monero_io_insert(x, 32); + G_monero_vstate.export_view_key = 0; + } + monero_io_insert_u16(sw); + monero_io_do(IO_RETURN_AFTER_TX); + nbgl_useCaseStatus("VIEW KEY\nEXPORTED", true, ui_menu_main_display); +} + +void ui_export_viewkey_display(unsigned int value __attribute__((unused))) { + nbgl_useCaseChoice(&C_Monero_64px, "Export\nview key", "", "Accept", "Reject if not sure", + ui_menu_export_viewkey_action); +} + +#endif diff --git a/src/monero_ux_stax_menu.c b/src/monero_ux_stax_menu.c new file mode 100644 index 0000000..98d3f7a --- /dev/null +++ b/src/monero_ux_stax_menu.c @@ -0,0 +1,266 @@ +/***************************************************************************** + * Ledger Monero App. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ + +#if defined(UI_STAX) + +#include "os.h" +#include "ux.h" +#include "cx.h" +#include "monero_types.h" +#include "monero_api.h" +#include "monero_vars.h" + +#include "monero_ux_msg.h" +#include "os_io_seproxyhal.h" +#include "string.h" +#include "glyphs.h" + +#include "nbgl_use_case.h" + +#define STR(x) #x +#define XSTR(x) STR(x) + +#define PAGE_START 0 +#define NB_PAGE_SETTING 3 +#define IS_TOUCHABLE true + +/* ----------------------------------------------------------------------- */ +/* --- Stax UI layout --- */ +/* ----------------------------------------------------------------------- */ + +typedef struct { + char buffer[20]; + nbgl_pageContent_t content; + nbgl_pageNavigationInfo_t nav; +} TransactionContext_t; + +static TransactionContext_t transactionContext; + +ux_state_t G_ux; +bolos_ux_params_t G_ux_params; + +enum { + ACCOUNT_TOKEN = FIRST_USER_TOKEN, + NETWORK_TOKEN, + RESET_TOKEN, + ACCOUNT_CHOICE, + ACCOUNT_CHOICE_2, + NETWORK_CHOICE +}; + +enum { MAIN_NET, STAGE_NET, TEST_NET, MAX_NET }; + +static const char* const infoTypes[] = {"Spec", "Version", "Developer", "Copyright"}; +static const char* const infoContents[] = {XSTR(SPEC_VERSION), APPVERSION, "Ledger", + "(c) 2022 Ledger"}; + +static const char* const barTexts[] = {"Select Account", "Select Network", "Reset"}; +static const uint8_t tokens[] = {ACCOUNT_TOKEN, NETWORK_TOKEN, RESET_TOKEN}; + +static const char* const accountNames[] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}; +#ifdef MONERO_ALPHA +static const char* const networkNames[] = {"Unavailable", "Stage network", "Test network"}; +#else +static const char* const networkNames[] = {"Main network", "Stage network", "Test network"}; +#endif + +static void display_settings_menu(void); + +static void update_account(void) { + G_monero_vstate.disp_addr_mode = 0; + G_monero_vstate.disp_addr_M = 0; + G_monero_vstate.disp_addr_m = 0; +} + +static void exit(void) { + os_sched_exit(-1); +} + +static bool settings_navigation_cb(uint8_t page, nbgl_pageContent_t* content) { + if (page == 0) { + content->type = BARS_LIST; + content->barsList.barTexts = barTexts; + content->barsList.tokens = tokens; + content->barsList.nbBars = 3; + content->barsList.tuneId = TUNE_TAP_CASUAL; + } else if (page == 1) { + content->type = INFOS_LIST; + content->infosList.nbInfos = 3; + content->infosList.infoTypes = infoTypes; + content->infosList.infoContents = infoContents; + } else if (page == 2) { + content->type = INFOS_LIST; + content->infosList.nbInfos = 1; + content->infosList.infoTypes = infoTypes + 3; + content->infosList.infoContents = infoContents + 3; + } else { + return false; + } + return true; +} + +static bool account_settings_navigation_cb(uint8_t page, nbgl_pageContent_t* content) { + content->type = CHOICES_LIST; + content->choicesList.nbChoices = 5; + content->choicesList.localized = false; + content->choicesList.tuneId = TUNE_TAP_CASUAL; + + if (page == 0) { + content->choicesList.initChoice = N_monero_pstate->account_id; + content->choicesList.names = accountNames; + content->choicesList.token = ACCOUNT_CHOICE; + } else if (page == 1) { + if (N_monero_pstate->account_id > 4) { + content->choicesList.initChoice = N_monero_pstate->account_id - 5; + } else { + content->choicesList.initChoice = 5; + } + content->choicesList.names = accountNames + 5; + content->choicesList.token = ACCOUNT_CHOICE_2; + } else { + return false; + } + return true; +} + +static bool network_settings_navigation_cb(uint8_t page, nbgl_pageContent_t* content) { + if (page == 0) { + content->type = CHOICES_LIST; + content->choicesList.nbChoices = 3; + content->choicesList.localized = false; + content->choicesList.tuneId = TUNE_TAP_CASUAL; + + if (N_monero_pstate->network_id == MAINNET) { + content->choicesList.initChoice = MAIN_NET; + } else if (N_monero_pstate->network_id == TESTNET) { + content->choicesList.initChoice = TEST_NET; + } else if (N_monero_pstate->network_id == STAGENET) { + content->choicesList.initChoice = STAGE_NET; + } + content->choicesList.names = networkNames; + content->choicesList.token = NETWORK_CHOICE; + } else { + return false; + } + return true; +} + +static void resetCallback(void) { + unsigned char magic[4]; + magic[0] = 0; + magic[1] = 0; + magic[2] = 0; + magic[3] = 0; + monero_nvm_write((void*)N_monero_pstate->magic, magic, 4); + monero_init(); + nbgl_useCaseStatus("ACCOUNT INFOS\nRESETTED", true, ui_menu_main_display); +} + +static void account_settings_control_cb(int token, uint8_t index) { + UNUSED(index); + switch (token) { + case ACCOUNT_CHOICE_2: + index = index + 5; + __attribute__((fallthrough)); + case ACCOUNT_CHOICE: + if (index <= 9) { + monero_nvm_write((void*)&N_monero_pstate->account_id, &index, sizeof(uint8_t)); + monero_init(); + } + display_settings_menu(); + break; + default: + PRINTF("Should not happen !"); + break; + } +} + +static void network_settings_control_cb(int token, uint8_t index) { + UNUSED(index); + switch (token) { + case NETWORK_CHOICE: +#ifdef MONERO_ALPHA + if (index == 0) { + display_settings_menu(); + } else +#endif + if (index < MAX_NET) { + if (index == MAIN_NET) { + monero_install(MAINNET); + } else if (index == TEST_NET) { + monero_install(TESTNET); + } else if (index == STAGE_NET) { + monero_install(STAGENET); + } + monero_init(); + } + display_settings_menu(); + break; + default: + PRINTF("Should not happen !"); + break; + } +} + +static void settings_control_cb(int token, uint8_t index) { + UNUSED(index); + switch (token) { + case ACCOUNT_TOKEN: + nbgl_useCaseSettings("Select account", 0, 2, IS_TOUCHABLE, display_settings_menu, + account_settings_navigation_cb, account_settings_control_cb); + break; + case NETWORK_TOKEN: + nbgl_useCaseSettings("Select network", 0, 2, IS_TOUCHABLE, display_settings_menu, + network_settings_navigation_cb, network_settings_control_cb); + break; + case RESET_TOKEN: + nbgl_useCaseConfirm("Reset account\ninformations ?", "", "Yes, Reset", "Go back", + resetCallback); + break; + + default: + PRINTF("Should not happen !"); + break; + } +} + +static void display_settings_menu(void) { + nbgl_useCaseSettings("Monero settings", PAGE_START, NB_PAGE_SETTING, IS_TOUCHABLE, + ui_menu_main_display, settings_navigation_cb, settings_control_cb); +} + +void ui_menu_main_display(void) { + update_account(); + + memset(G_monero_vstate.ux_address, 0, sizeof(G_monero_vstate.ux_address)); + + snprintf(transactionContext.buffer, sizeof(transactionContext.buffer), "Show %s", + G_monero_vstate.ux_wallet_account_name); + + monero_base58_public_key(G_monero_vstate.ux_address, G_monero_vstate.A, G_monero_vstate.B, 0, + NULL); + + nbgl_useCaseHomeExt("Monero", &C_Monero_64px, NULL, true, transactionContext.buffer, + display_account, display_settings_menu, exit); +} + +/* --- INIT --- */ + +void ui_init(void) { + ui_menu_main_display(); +} + +#endif diff --git a/src/monero_vars.h b/src/monero_vars.h index 741e464..d46166e 100644 --- a/src/monero_vars.h +++ b/src/monero_vars.h @@ -28,7 +28,7 @@ extern monero_v_state_t G_monero_vstate; -#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) +#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) extern const monero_nv_state_t N_state_pic; #define N_monero_pstate ((volatile monero_nv_state_t *)PIC(&N_state_pic)) #else From d3553b78c9d8cc91e5d608bd0463fe8f8c17b553 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 11 May 2023 18:02:17 +0200 Subject: [PATCH 092/142] Stax: add snapshots --- .../stax/test_display_address/00000.png | Bin 0 -> 7134 bytes .../stax/test_display_address/00001.png | Bin 0 -> 23021 bytes .../stax/test_display_address/00002.png | Bin 0 -> 15238 bytes .../stax/test_display_address/00003.png | Bin 0 -> 23021 bytes .../stax/test_display_address/00004.png | Bin 0 -> 7169 bytes .../stax/test_display_address/00005.png | Bin 0 -> 4494 bytes .../stax/test_display_address/00006.png | Bin 0 -> 12223 bytes .../stax/test_display_subaddress/00000.png | Bin 0 -> 7134 bytes .../stax/test_display_subaddress/00001.png | Bin 0 -> 22542 bytes .../stax/test_display_subaddress/00002.png | Bin 0 -> 15226 bytes .../stax/test_display_subaddress/00003.png | Bin 0 -> 22542 bytes .../stax/test_display_subaddress/00004.png | Bin 0 -> 9078 bytes .../stax/test_display_subaddress/00005.png | Bin 0 -> 4494 bytes .../stax/test_display_subaddress/00006.png | Bin 0 -> 12223 bytes .../stax/test_prefix_hash_hash_init/00000.png | Bin 0 -> 9669 bytes .../stax/test_private_view_key/00000.png | Bin 0 -> 8022 bytes .../stax/test_private_view_key/00001.png | Bin 0 -> 4832 bytes .../stax/test_validate_prehash_update/00000.png | Bin 0 -> 8399 bytes .../stax/test_validate_prehash_update/00001.png | Bin 0 -> 23767 bytes .../stax/test_validate_prehash_update/00002.png | Bin 0 -> 7318 bytes 20 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/monero_client/snapshots/stax/test_display_address/00000.png create mode 100644 tests/monero_client/snapshots/stax/test_display_address/00001.png create mode 100644 tests/monero_client/snapshots/stax/test_display_address/00002.png create mode 100644 tests/monero_client/snapshots/stax/test_display_address/00003.png create mode 100644 tests/monero_client/snapshots/stax/test_display_address/00004.png create mode 100644 tests/monero_client/snapshots/stax/test_display_address/00005.png create mode 100644 tests/monero_client/snapshots/stax/test_display_address/00006.png create mode 100644 tests/monero_client/snapshots/stax/test_display_subaddress/00000.png create mode 100644 tests/monero_client/snapshots/stax/test_display_subaddress/00001.png create mode 100644 tests/monero_client/snapshots/stax/test_display_subaddress/00002.png create mode 100644 tests/monero_client/snapshots/stax/test_display_subaddress/00003.png create mode 100644 tests/monero_client/snapshots/stax/test_display_subaddress/00004.png create mode 100644 tests/monero_client/snapshots/stax/test_display_subaddress/00005.png create mode 100644 tests/monero_client/snapshots/stax/test_display_subaddress/00006.png create mode 100644 tests/monero_client/snapshots/stax/test_prefix_hash_hash_init/00000.png create mode 100644 tests/monero_client/snapshots/stax/test_private_view_key/00000.png create mode 100644 tests/monero_client/snapshots/stax/test_private_view_key/00001.png create mode 100644 tests/monero_client/snapshots/stax/test_validate_prehash_update/00000.png create mode 100644 tests/monero_client/snapshots/stax/test_validate_prehash_update/00001.png create mode 100644 tests/monero_client/snapshots/stax/test_validate_prehash_update/00002.png diff --git a/tests/monero_client/snapshots/stax/test_display_address/00000.png b/tests/monero_client/snapshots/stax/test_display_address/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..b4122df6d37a1f64715a7bcb0cd3b3fbd9aaa843 GIT binary patch literal 7134 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 bwe|cr?|Z%bi5c*}otmSq%lWE*_$L1oHV-Sl literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/stax/test_display_address/00001.png b/tests/monero_client/snapshots/stax/test_display_address/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..d27964b2982bd7b2d2ca5607cb50fc6d3cb99a44 GIT binary patch literal 23021 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

Z@cb-1u(swkcacpiuvE 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 IJ;%8J0N?{qX8-^I literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/stax/test_display_address/00002.png b/tests/monero_client/snapshots/stax/test_display_address/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..c3679693928987cb273020aed197240406fcd2f5 GIT binary patch literal 15238 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 literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/stax/test_display_address/00003.png b/tests/monero_client/snapshots/stax/test_display_address/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..d27964b2982bd7b2d2ca5607cb50fc6d3cb99a44 GIT binary patch literal 23021 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

Z@cb-1u(swkcacpiuvE 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 IJ;%8J0N?{qX8-^I diff --git a/tests/monero_client/snapshots/stax/test_display_address/00002.png b/tests/monero_client/snapshots/stax/test_display_address/00002.png index c3679693928987cb273020aed197240406fcd2f5..ec01c3d3c459dc65b5c0cc32483681e61fd98749 100644 GIT binary patch literal 15409 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 F{{fj&4=Mlv literal 15238 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 diff --git a/tests/monero_client/snapshots/stax/test_display_address/00003.png b/tests/monero_client/snapshots/stax/test_display_address/00003.png index d27964b2982bd7b2d2ca5607cb50fc6d3cb99a44..a793ded99c8bb7778f490bacf38948d03b737450 100644 GIT binary patch literal 23444 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 literal 23021 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

Z@cb-1u(swkcacpiuvE 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 IJ;%8J0N?{qX8-^I diff --git a/tests/monero_client/snapshots/stax/test_display_address/00004.png b/tests/monero_client/snapshots/stax/test_display_address/00004.png index 53a4fe3291ec4c7ed8c1d148cd68ac2287f085df..1d12a315df463ca97211a494a9a39d0097f4eee2 100644 GIT binary patch literal 7232 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 literal 7169 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 diff --git a/tests/monero_client/snapshots/stax/test_display_address/00005.png b/tests/monero_client/snapshots/stax/test_display_address/00005.png index 96678cba2c4f45dd73eec70f4e9ce696d7d5419c..f59899e9aa967b23177d83aef0c8c2c9041eab91 100644 GIT binary patch delta 2602 zcmV+_3f1+FBZnlABv;N!L_t(|obBE1b=pdxhEeCP+kj39N(s0GQUWdkmq1DgCD&pR_LAckN8F$4>UG1xJzF2|wZYkcIn zcB|uGA7O@*@c|?Z2751|_YXprF+69@lYs#je~jXs?p(Ip?RL9e`Eov=pS$E{vuT>< z`1^HTPp8uhH_?0GZnrx*upK*@OwJ8#nr5@vT)5_I?!$h+U$58YdZyFqWHPyMqaPp0 zz*ei(Z^o^z>+X;2_4W1KB`?QiI-S0}yxex+VzIdV3pSt6x7+RUz?YYoD}P0&)9Jfz ze|k2Xy}i9%cszR#WN?Btc5iQQ2hXd;VsY-mm%DRec<+IK3|8y-*X$#~dV702i1@LS zmFzu`k+38jyY+f~@SST`QtcY2eAzB4_xt_b-Q9Aztn2#Ry0Z7c$z*a+z5RY)7PAiz z53AK`Hk+Lsd%1eYiFtTr>Lvpj3p1>d zD^K$7v-;eHOER9Go{sFKHc+p4N=HL%>PbMwA(fx51{-|x<_&i!*vDtD%?>ys}rpN zeNbK3?eyo|wN+KsU59>rAmbref1}o2#oTqK22Im6P4mGg)o!=D=EcE}4=l^8em8eu zGMThjxL&W%y#jEu=Di0p9+rgT)xLVw{<);89E0z@DlB>*rg_)E?sVoR!77uW&1Uoc z`}gPP=khw{CkPN(hnH=E6cE$<_--|v6?_|g7(u~?j2e@K?g9Ggrg z2eY2ZWHOu0+6SR&n#ae-@>gZU`pNwhy$3QPwl$1adGd6(8oa)~mY?16kjuLhT4i{5 zBSPvO-@y$3P|mW1PVaKydU4Z+7(g}2rG zTl>v+)6>n54bA8Cx3{-;e>3XwvAm{f9v&W^pPz3ykTDRfkt#7do~_*KFjntl_U{_l zG|m0}{pHONujg&I+jFC;s+!GatJSJ~bLH#n>%nIF$H&K$yAyg3WN?mQjZ}$IRaNKy z!|%Php>^9}&FAxj)z)seTd&v4<+7c&TzG5FP4*D9WuMJvyWQ^ofBwGx=5o1QtyZ5j zkgq3LBUPp(yWOsPc)05$TcYl69jxQK(H_R$@AqwRm&@hH4{5L0>vrz*$9FZh#V-@3 z-UAsGOTsbg9s|1Uz5C9)uj0QeSiJ|9I@}}yyWMX2|1MnYxSqWSGAd?RW7Iu>b#hj+ z*=*Y9|9dw#oIH^Kf2jj+yJfsw+vT8_yq3%N9>}N&)) ze(~PbS?_^eA6dYbTQ3Xb=jZ2hvF<*A9~{W2SQ3uW$t|N@-S1zy)M~ePxATh&$8l~r z@H4b8@U?$_e0)59IihKrvJJI6KkYq`aj{KqY_2>}R9Ul}f876BbsYS}tExIa$#U<3 ze>@*n_l&9Cvru*anbn^hoS^w&z1E)eeL9^UeE;}&yZ1mw!jf=wu3VLrGdG;vjdkuV za&=w5yu4gEK+}8RN4)n9ecSE!@$s?DLyuphXg91MpGKzlKt{rnaCELbyj}kGns@NF zQ;Dair`OllICn*-_rOn8Rn=;>+HSYU4^ds$?Y%u2o!$c(iEkIS^Ff4i6t6u;`xgvk zD3*l8>pdqjnTlgc2$P`!Fn`1Ou!d1S1mXCE;^!_oo6Xvj%r#AO<%iU_=L;=g?smI# zA97XK^@Wo|?RL8>KkB0W@YM3iYkT+35; zKA(4Q<-)r1kMq0kS%1~P;1sb;G zrc7bZ9bGO5k0+DK*LNx@ArEP!vP7_V1LTG<6Ii9{D8vSDhs76 zU!?ncTzS}$PbFA`DKo70FxK$}uKWn-Px9VRWB$)8!D^bugEJJt8cbDHWs-Hgb*M~m zx)=KbC7m`OU10h-6u}zOg;hrR&R0&ax)TS%y5QXYTRxj@4MQrM8;)mK-6QT7uHnaz zALst+cxS+6`+xnuT-#!?xcOoJ3wQPI?rybOedR5__rYN#1ZzkK`+drn?XIZy&zEOd z7v6@l+wIOhCzs3R!JMu;Wmqg0pYdeA{yjQhaElinoNJh24Mng9Hl0q}=hb?>K7QTs z^ENb`d*9r4yZxFi6wrfU4Qw`>wZZC62g>y7j|Y;vn}16`u4$V4`}<$NetpJ)v&-)* z{ESN8_QC18{C;&lk6;a~B&qwt)AdK(`#p2!^ZCKMi+8)-dc9sQmrc_gzcuG3zVfxs z*5_qKu!iDQ!hzLwT_zW8v&uG~&)d*&Je_F|LYH^RwJ!y5j$jQ%u!dJM(N3%e+%H=0 ziG4=Lx_^5<1ZyaQHM|n0a`e6Z^1rl(`VSc7ol+bStl^a~wWl!|_8mEecb^<6%j98y zE`K?}8in$ocG>IrWoKyMk2agl_wV1^jUdj4H7u_ZjzZboaQ%jc)<6IJbNK?R)#~F* znCIu`bBEy{9v-@1mea6|;THQnI6r^>EGLjTm{Vp}RdxL-nE4EXH44X1n=Aht|FVVK zxxL*7-@oA&@Q>eOzX#{ssJgCSUS1sL8=Lc6)4JXNZy^28X4x~}WGp3P=ff@ARQ zGqwl;KwV-%m7(|wQ9dwCxs zT<;^#wJ|Wm0%8aj5JRwl7=sq+@eTKOn2LWQ>IbEh6cI2uHzKI!%wQ!>N1aB zu~_VD3DInt=2d)S@}*b(&t_ShUdBqzf(oYsHHXVM76T=m+Co)O4+Dh*IaSUAd%3tkyDVm zky*+{qg$`15L}H$126e$b)B^S>(qQYoJ>|})-t|5NFWf@4|&U^D7J865O#{vr?OIF z4!w_eb}?UBT3Qln8~S3CU9U8U65Zr)LH&c^929W$+Wt2!_Nz*Q`y z*0p>;w3xlRJ(a;Psi>hs;4qkl1`Zu4S&Zar17YQPzIzK-^Kx@@hvJ&~I8RScI>3|0 zHJAETDZ)A8#m!L7jlF8(z(VBKI+6bfPSZk*Nbs&|2Vww)mDmG_#bar|X zLB-T5Mk``2c{NXF8QG2pF#Gv@BXla_+U+B@V~Ex!p0tzz1RFg(sz)7oqrp^EH$Fl! zg~gwUY1wV~4=BnxB$Al+`Hw{N+RuB)_*Q028~$7V?vRS0ZIy!zN1Kpft%ij!TkGix z`*B{_((O|OaZ7sm}% zMw(oh$xP10qy(Q1OfnUTa~p0_>F?Q)ASBZ7EeG2qa;kj-jD2i*H8L`?U|7NxD<-+~ z>0vZ)S4Snt#$pm05pz$~9q(-CVh^g(MTu!__ZU@}2(=-b(Y>$0OQu>4}0gGTpJv+rvX9pX#UEWYCHt!v;t=VD6 zB`J=%pR8|v92M(cVF}xT@@plgafS2q4VuY8TptG_2uiA2P^nZBVyR3Iy2t?8@6Q@K zNdRQsZfBiYqMnxyR!!w=GYWjMm0v6VLwMi?W(X9_20YV#BD1<$w5Yn`TBCI}Gbp7k zgLHnmK|u|8+yO+mQ$QAHy_vGr^-}JoJv7Ue+JfSX0)dCki299S5gk~FrUe7zL%y5) zw_`&p5X%s*)xo%S$2o~bejT*d6PR9E(=DY!(3jIPMe7p+!F{%{M2PYC_vcBM<>0_Q z+@nWL+BPB2I9oCnmS{%RKx^rAy6gw>-OMUMev-*7Dj%knOFgfB z;W$T3>YAGGV;JUk_C!q{e`m2fM7qz)1W)q$OP;mE6ZBDabtu#XOv?nv%Ia#+yggAz z%(tU&V$?mn0$(jvwHZiQ_i`}z|)(M#ljgyj==3-{B3`ezxbzx=8=TR3Y zmE?J!f8vpYoho&|oQQhytjMY(u6cC<&e^*79ZjOFjqv~sJ2+T`=qja8^1>8IfApe~ z8a^ZQj8xIBaNF6!#<0V&hs-k6kCKk2>YoP?&u$}3O`ro*G)-A-zvaD?nZbQ_^tuAi zgnKH~RURH5MgKt}k-`fn*Wev-oZ{SuAG=AHf%=xF$fj|G{W(`Mmq)bG9_fhl?Roda ztAz#V%+~cmArF*Avty-%XWsRp10Ho5t`$$JtIe@+KwrW;;J+Ho_1PQe=Q-2{9LyT3 z4E(bb^BqmQc8OLsI5Rg_Xa0xyHm3PiV~#Tn1{;cS_xLp>qJDK<^Mtk2U^54S4X>`A z`P<%j=Q94J?cR@F|NVn=~0OUnJV^hNO@n_ z!{IqQRk41MZBh7`aB*>Mrz{_I8ko&8<7GUI>IPGHR@}lF5E@O@UafNBydDU|NvN z2sf*72#%llYkb#fFGmrhw15_-!T77tm?GRcJpM&ojX=LD9uV^XIh|Ar5YV( z>(~$8xIAo77@=#uFL|={I!C#WSghRrLJ00RDVhJb_uP;4m#h2fM;-s&mf*T3TF9=h Wo5qqm0rzykI(^dbMBQ;r)_(!=Y+#lE diff --git a/tests/monero_client/snapshots/stax/test_display_address/00006.png b/tests/monero_client/snapshots/stax/test_display_address/00006.png index b2ac4ba4748ef534d3348505851257fd18a33911..02f4af838dfe11018a753018b1c6ec0a5eb5ef3a 100644 GIT binary patch literal 12284 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 nBL<|AG}Ne4gTDM9U6oTG literal 12223 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 bwe|cr?|Z%bi5c*}otmSq%lWE*_$L1oHV-Sl diff --git a/tests/monero_client/snapshots/stax/test_display_subaddress/00001.png b/tests/monero_client/snapshots/stax/test_display_subaddress/00001.png index 7ab4ba3913520a1e331a12dc2fee825504170b01..50660621851adb0720ae8d242a4c23c0b9bafc12 100644 GIT binary patch literal 23242 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 literal 22542 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 literal 15226 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 literal 22542 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 Wo5qqm0rzykI(^dbMBQ;r)_(!=Y+#lE diff --git a/tests/monero_client/snapshots/stax/test_display_subaddress/00006.png b/tests/monero_client/snapshots/stax/test_display_subaddress/00006.png index b2ac4ba4748ef534d3348505851257fd18a33911..02f4af838dfe11018a753018b1c6ec0a5eb5ef3a 100644 GIT binary patch literal 12284 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 nBL<|AG}Ne4gTDM9U6oTG literal 12223 zcmdUVXH-+&`z0OeAc#m4kxu9xAru8fny7RQAib;fCQU(l?@f^+p(J!Mln4k?gCI4A z4iQ4A(%W2o=QnG<&AjuUwPsE7<>uU*bMHOpDSPkdiGHZBMMKF-NkBkAqkaG0BLV`# zBmx4W_g9F35k-TR3IYPLNbP%SPyF)m7+gLSe!TxO2#g>sCHdzI3KRS)sHVfBGkmq4 zL{RNP=+z*|ufXL(4qCEhFWlydvq;ok)z7->p=0we?vF|ngnl~-@w`qz5X4|g@RJKp z@JY>z@L>d!=sj5&sVWT-RVXV7Gl9$%5P>uO|Lz6bh0Rn1R+K%9+Z)pTA+5w=q%C}f zZ`KOz!j3eo2*pZ7%7R9EvL{Y`6?!j!FB}~wOU0VKKeeH#0e-Jd8Om5yW@+^9WYSxZ zFu$L?Z@8SqD|V~#3P`oYsi?2<&E#`-=J$yh4)9CoNtd8G^`+EL)`U5rrM~=fH@&B0 zMUkYRYLeHh!?SUhr(&dIv^;b)uFxoPQk%BN+$y6~idcYZEQTcsg z3AM|kSAq|OC44TA)b&*QoK$aLD?k!4>lyAnh%>h$qB7<7j#oqb(cA?N*~grCHTyvS ztPmU|_OSJ;&6C=H777{OqPzEi8q&-C&w}bmsO>qAJ#UerwfN6athnahTFvz6oOd;$ zuo(&SR*vp(=~5Kl2Z3=9#^!LKyvQL*jB>uCWiP|WoX1$4rGWPu@R;163r+v{fm!BB zMG}$-62mC5S6X>|r@bR;(gh_2q|$niy}Y!4myG9gG?n)<%ibQu#3? z(lknjIJ0Se`E+_Y;qqwWj4W*%cqy2oS0k0)kIJoiH;C>m4cG#heG+t7G9r!@FqnUS zLdrCZDyf}Kkrs|F3nEa1Gg08Ue~qQ`g|FuBrUvN^z%<@LBCaW}>>UM(N>hZHjN_c7 z;_E<^VWb1DadJFt9H`V)zv%%M-Wy99+Q9qCpbkEYdD0uJ0)|s6@|?46^o3#er4{uz z--IvvOWG4TbeGHv-P(GTrxUjKJK3Q4$HcygLs)0#j^R&u=n)Ni6KvH*-SFuH=cD^H zRDNpu$~brafJKs6s09V^a4u`FN%bv4#yc$Y?phJXig!C!HYOX}42)SLqsAHkdO&Ci zi}!cL=LQy!_|7)QcmKEw=sQVzr6A3DpT_?%h{wIGi}B`K&|rgNJ$BK)u2*~jM_69VT8V+L}#s)&fF z9)7hQC$i~Ja}L*+BcdAq+V!3 zQp>v-4%SFAGH_65DsBw@}O zWMQ{uo~Ac-6c4l=fDnKf!$>F8JD%VAhAg5tJ-itk6RmNLOh?sf{sJV<#cawm@DAA# zA|lJmY$2|jh*YPir+gTW3@2I=Bnczsc=^64iG}TNSjSP0odQ-pQ z&JTCZ=dDSYIS*9-BpLgWg}p8NL&-HlX}}HN0-;#AtG1MgsFdrU6(HC&-56iA(zVi? z{>Fw4a94>l5mB}7^?^nxiGgdcpe~1i@Jsh4*R1#&nU>Z3OO9*}b8Bi6=7JI7(EGwl z(a4TEC7XBk9lKX5`dQ~y>0vS8hf zkJb(5RqNlt8OHU8!;!4aWcKPYUx3+Zs5);$#jiU5&p8kb8u+!m)b3Nw8P3Y=MG_XH z{@nE+cPII}fD@w<;hS@XFs8_L>`K_ews@TAAS}qV&BqpY=&@=v*{1 z947HR_R~MBFVy%>NGTNAaho%6l;qZ1eg;!NW{Eew;+2H|2TA_!CFyG6gb=Y*+TaOo+$PkVd&O1qs|r1fv9#cjW*unD?>D03id~BM} z0AT=wX$<}#u&_6#NFe6n{@}vp1)H2wNxcGW&!VCEdqXBS*<3{H z$v*4yh(m^*n`gERpEmb|Vj_TA{3@YB{k771g;VSTFXY+XA3jH5`kI&{KitSkvNP)e ztt{0Wtki|JmZC-Vsb(O_Xot~b$x+tyqpKotlCoVxx&d=S~AEGx8R8&-gC;Y&LDqwK2 z`Og&`uEHjqUyhtggGPq|5$TP<=$;kfb)@%_rS*VEvS*}v-b%2{p#*I*NGmLXFu5mVGCB8e`ro0@+y>E2W}y4pMVb%((; zM?TC>zx_B`WWDA0mCDX}t8&wSY6Gw~+2yJys25^Us=!Qq;<|+r%>pf?ZOx2fG~ROhxY5bN*=LJVxe?1Y zrV;LF{5}pR{E4Pfu@F^y_Y3}cHvFW3O>8$>Ag1`@JP15-eNvY4!?tH&JoxSwu=RBJ z94!{PawEQR!@Xh`C-VXkm?3GOfi2<3Jx+`MH3OB)M~I+xnFrH8xHjX-nk`ylciPe} zIN6>qPxdy=zQ`S4Eh#@qnHay(%o@Fl2GgTKa6o z>VY(cWf(>2?$PPV32q7_x?Zr_sJ6QTQ9{`r!(ML9uZ()omfo{!B|@xXXEE+ssV#VY zr<0kS1RalaUFA>s>U`j@M@P*N*vU)_$3Trj7IoMj_W*rWg2Bd+g^|%&EoO6bbMDz; zNJz*|q7n-4AQxLCFpl#!WZL10Y@;fC?J0ia7!G+eS|7bQ*?vbMVG-0{Oqh;6a&AcJ z`SyKG({o-W!RCVgk0sy_r-z5)E(5#2+M=i1Q1&&s5xw-Lu+F>^wZgUZB%#FYRtOB3 z1sgMCo{l**!S$Rm@+@#CM3NIfzp~yw@&6 zcEKsOtxG=oCpUtkk~WI?`h&S7@@z8Y+>D4yz*xUVvFf%fuu$l!OJ|+yReY>YzTVSD zo%81Z7E$^4G43K8L2$;N*i$61q2D;=x^xqP5sfL5)r~c(vKv1cr4(Ey~Ld43HB@Mhweq+r- zqGp!iTb8yvibdppvn8k2D!pq)gWKGML4|f_ft^s|{3tN(-n4J~lKsGZ-3K8O!yQx9 zCbgif=YxD~26H*e9f z;??FJ><0A@WI7Zs#rG68gVXJ%d=N6&XcVW^E}wSolxr<0b$80_t%AGlympGMnZ5B+ zUUw_s23I*lq;-bfK5Y%cd+^JGyewkqUP>LglH7Qu`2tshjbNx?BId>{vnlv(I}NZz z186^F7L~stllHc)N)|rY>cEF217)&k$s+<$fv+)U%^EoL9a}R*eo+1xbT$;lf%6{X zRzR#peS}v~*qP-J<7%SO-#uOdw~VU2yN-88d%u#L@J&N?&zyhLJM$Dw&u@+o8>`qt z1^N17-KarF%y|ph{Xu)ko!Qp-JEt2htue*lEJ%#c6u$%|uhheCGH3SlIyylQnJPj3 z$KH;s%6g;qkdEUfE>cHohQesJ-sp+X2p%f^vedfj<7&^^nGhR~3!;jT4URq@%J5UF ziveG(f(M##bTTr1-JQA;foQr7-xxwy01NxNERZE~B?^;-T>Bl7Mlpn~lZwZx!o{fr zpG8$$E~inpd)cT+)#yb&mrX#Y&0-g~9YcOM67y65a~NsCWCYsnP$0DK=c= z)4rOG0b2yKwlkfA~FnLX{W3ooFp)gwO_6p9ZJ~6 zH{h!VdcDh#9q_IoFEQ;DyLir+|(UX{EoSmIv@(=u!&QDJ#%PRhy zO&B!3KbuQM<$JbGbkQEU*xXpBI9_Y0QNtSC*CGtKcAmYtQR8oiN7)X~F`E`+TVJPc z-N+p*1@+_h0_53?2Ww|H+uPc{V1dko+xr5Ag8D@>WBKJLo)>}0MCZNH#1TE22Fq{qOI z8CcRG&zbJC+vG+pk^2O(0x`CUV^K1P>obkkG~nHRp%i8kV_e!R*6;N5gZ4ILjPm@t z=ztQd+(G-gsqfjwDk6gc%k`Pb3z*v&W&RC;TxHXsx~Z%_!{E@YiyO;zHTIc(^di}9 zZp8?*~Y(BQd?W7Dc8dr2*al)PgbiwVUX4Rl?mSJ}`PY-U$LgRe^c(jp) z_Yp2}qpq~TGdCZXkGU+k53TRv*SwAW+}H7z%)icQgk@Mqjn{}I)nFa71t%LpEBHy3 zvQceK_3vVRRZib=X<^G|JR-&`idUwYGz^W5m^6YBC4={e8r!y@P%s!=Bp?}2o84Bk z**wt&=A5b4^p$I@A^7@n`2ch(g_i$$-n)AWWQv4Ea?y?i+c1rtF8Rt6PW?A+cabO6 zxcP7zNrcUMe6Z^bg|T)2Zc7{EQaBPGh@K^i{X<=Sm8kO&_#7X<5=~^*u#PNvRE#z3 zB#Nw=a(x{VGJ*4E(valQ>+U00ODc6*6p{2WEp{m1@S4yU4fNj+-p^sF`}|Z?|3o;Z z$lsublzH`r*B9c45#ax&x>s2u9J8>vxVXFPxe*S+xHsjl^tSgbzHCAtDZMu;u$(@8 zW2EG$5b*~#;c_s_WeHj26!-A_)L!{VS!Saoq3j;bkdoWVM%s$KGU{M+p}OQJd`Icx z^c3(S&+E3bZh=+^OsSJ|!P3zRvv=OFDn;e}tRSyBCmKq56t+wKG88mrpPirUn`Oz> zq_JkSOfGKVMq-K_gS69>HbyRJ^ue$|DD=UMrl+sug^{oBYBPC&NS!;9rm#{;_M&yk zEDlmqg+lvDQx?jN#?`$H(EURS1l3@>(HZaM7`_h3tk3<~bGS+77?cpbRz2u`-F&{fug>OiTm zdoz(Kc4lXL^tBS!V?9BV>%5REJalOY|Tmp_G)|z&Gs+iA?5~=(E<69$fn@vh|ID!%EHz(o@ldL!Mn5yZH!0fwS z=&kG#2b)1eNbzL+=DI{Ilzg1!q|Y-}aft6Cd{9TvN+!WipuhG!RRHn%JfpSyt-PhC zg~Xas0LsWWZ&w>2FSapDH%&SEy&x`%-H{XVh6S>8?EFLhFvXb{c2EtBop{(-Q1G!1EghlQ448@8P; z%0_!z8a`(x*!7h!Jk`7D(^)2nvI)unmAJKh;m@5@Iex;KCORRoj=Ezk(cQL&(1`C} zw}3bQW*L8Rfbr~Etbvp0T~7%rQd6W#=vl;K%Ub*%&8Qx2K?jL1Hmj!#L3P_SMDb;3 zENoyOf6meU3i}I_2Z-5CoWuLHIul3tCNu!eXJ;)}?dZbi{FIE1c%M1#t@ccs1UES* zg%4_ISv4qdCIUpzNA-RaPO6pC}(-IU?Z*;bQ}pJYrKA5e5|)i6*L zuz}6|HM!re%Bu&Y8;7q3flZ8fXKUBxumKfyTh<3-To%R4IzNB#xO#yLff!+AWR~$v z^tw}qC2S(0Ca6F*SI;bC0yoz3!KQsSBsdtjgTlM0Gw&3;Mh;aJyQ!~S(85lf+JiuO z_CDrd%Sh0mK(FA9DIUFV2@P}z7}*rJh-J|NQc}eZU>mPieJ7W-4AV->*~!0N(4u!O z8`wX0HeT3e$3GJ>XlsFZxgLU+Z)Bu33dF!QW=Z>CX@3YY!D_24C(cPCBRjmJ!temn zX5FVA-YTB`ZNDI!Or3vVxx3>bW2FU;EGG^Q4uB=E69pWvMpwa_(@(7w8);x%;Ep<- z^G%aQ?UKJX?-18bDTYE9w;G$$Fu;X#bmJ+aL=>(_a(^3E`V&~Xq?6-F6{paM9AOGO266fZfefUpHra4^#(6DYhY0ITcF97jH{+iA(nUPNr3q9$b0>HAk#1VIti3i zQek)x5pI9;MO+bJ{6O9l-I~&hxPW>z5O(c*Ue8N@dLH=RCVTJ42(i0gu0-Ex>E_Ev zbd>>4dV3%6#%vbKaQAU3hdjN{cSeGf{@xErL~wr*0bpGDvAvk@<^pbSO}eTHU3JQ* z#BK@z>xNlzYTU&c#(%=XRZAm}YWfocv3yV`SOO{#1BDg|tO@AO8ud$V>i=?~qn_bktDAqEQKmP$ zSo|ZE?c{Vi;=`q_)qhIxL0=`NB48E43Ed*_`nN@;bO6ywC1$*RM8f>#d)W~=siNhllDpA=(i!e_~lFi5{{qo{5%nwnt=(lbc^Pf5bTP*&~s_Z>G#uL(d zbs#CarRtDx`~8Nspo;cyWuSgg|I#x$d&yl+@}pm7uIP$T+h-gwzZ$CH!)cbOBpz)* zD|jo{ru$(#UBgcTcviUO9s3Z`O#@e@n*2=PvDs9=lY=j<0VM3SQSbLPLA#8mAvbgC zCc6)2dnJi+ZqjaS-Y%4&ku^Plkt6fadri+21-ZnytF(~#Sp|=Ym(xTQZKnS1*)8#7 zLkzuYcRHqL-UL*%7Bt#?%tLZl&5#G1!fsP{9_Qv4E888HDbAFL`p+w{j{3iC9pJ6H zj}X(HNfp&;q_PTme!o1=q(aU;&8-zuh{Ez{58R2_?l_n7B@|~VJQ&vQ*?-;c`|8$V zCb(c?eMEY2H>iD9hXWAoqO1ix;=zR|KzEzr;CHE+?Gzw=F*7NY=h}(@@Ke=}#Od40UeGmrVOaoSnkVm17PuA|NxYSMEFEh2tXMjZ^ z1H?)<1zqRc1wJO0Xd3dEumD!0jIIN8 z`2evI)zo({m;7f;wVf*V?vH6hWqribgU(M*ER536jxa>uSthzSsxXjN@JZ9EH5?MQOf3y4hoz4e-@MCKz7j5Wjj?pRX%dT;mZhBP-Eq6R}=9r|`>mCpI8pH`lB!zT!7s(wlL zPW?523u6lk$cg%&N{D~u&z)^_dgyS;xpK%Ncc}ahiRA-df2T$e%%FxjZiu1wP+P%D_|Bh>*k-Eyzu+NbA$0rL`q1yP}WXz z<}qP{ukwcCFMulu;=U4x@!cYjiKGTWO$gXKyNP4~zCq1w`UFNG%_`0g6eu6sWFd%g3e7=)J}*uoi`lL#CcZ36!TpjzA3HHQ{rBB7E_M9Z+n~Un+3|dawaNhnO_N8g5y$*qiZ%v?9Fi z_qnbB#fH;PNVv$Qd~gy8#0@}pxe^XQv$~jsXaJaVU(=|W-DGQGbu+FQtAka@v(q;5 zQ`g_}xTT#^3&Ndj0W3JNCAqZxbaivnqk806oZP@HW3Qc0`+4J!C4Kguf*u1Vjrhlk zIxn7zUau3qnLF4mIFE^M;GiYH@V<2={3LrM8kzI1_r2^s#YbK^5$+J}-ZWIGtBAIk z?}~rI!=|8RkG{IGG2jk>R_y(@r=o7S6iQYl%-O~l22)0fz;!Rhsj+z6o=~AB%tWfD z2w59pI^DdmxoH6Q60+3)<&}qb)5f{`no!$&}!#Y%an21K+JdgK+q}5k zZ=9|%0a@#?KEzdnakpDY2x_8wdQowdI!YByizy$8N9KfM&elC`bCH0$y7#!LjlL{o zdIb>svHOC~mXwZphwfp6*>VLftnk%0vj?4AWphNu z&EK9+Cm7u%8Navw5KueqZSUSLi+YW~0K2I^Z(Pxw_0|#q%?i`y*1l1>FmxWunq?X% zY3RtWGfPtmn}A<;p{wP08FX5RLgw6O z(%5_a1=J5DmH>}f4%2;0d``~MaNfSYf#+hE52mWEIyYT%<%#P+zG7L`#5f+mWVP6} zAGN3FNCi5fj5H`qnNq>f%xow=@jau8Hz)o^941qa_d&}u^&joY-g*SXWSQxb4tlYS zp#(gM(AeUj=lV_x1bww>%ULox-;U`Reou0DQh+=Uvni7)9+VT0)5#VB$_!rZvG-a* z9Fp}H1_lG>BzCIJmQtH^iwRKvF7EF@)F1T7fO&U$nm<=t!Yq8?{NTW0NI6^g93OJl zpLd~YGolb?=WC*nYjb^Zg#*B!$HnPpKQLslsi=4vy}D7ytH-#*rFyP_X<=BOSTEL!5+z8Jcg z`jm8+8)Z*tIAwYtY_gP&`zYqGLrw#vpfi~szO85serMwN>-c1p-9gt8)1+=llgEti z)TFRO+Z~iM2T{(O{)x#<+n<5j0i?#W;7X+PMlV#)=lj(cqr zY+_)=9;3y=HJukZ74|m4?sQu%xA_leD?SYw==T&3&qJ!cZox~fj(ykKM|=|Fjv6+v znYt}jvB9oVmYq~`rgb=|-n9tsOB;1!0bsc&{d7b6F<(7tMr*6@;>Q|Sx3#-RZ>Qpa z=}+poy!YdRm(Im`r*OKL&9-hs)C++^S_=fGo#GYO`6@$fy|MVL85K%aN1@M*R&$-$ zWF@XxWT4%nyVGsmz#H31y}84VccLRlJQa1y0i>7N*ITC8Mf5ArVmcxhZj6D8K>rBs z`?j!Um62zYgwx~jFaCK^`|Enm@ZK__(knL1H7g z0k3`Y*QrvzK+Ia8MR$VY<9(V+Swy#pQWQtSU*_NXYAAx9r^pfgd8@ab$rC`fUV1Vi&Jpi!EWlvi- zL6}AbJ@Q!u3F+S)#Ay1YmcWZei2H92f+LGkNZ_NVu(L{uiieCP54R=Uzc zK=WOB3h?z$<{cXZR#}e$`H8n{+%*iq9OmC|d;!48t-s&|82q^iUw2m;p?uf__AG0E zukwt>CCr4KK&ks@BVV<%-jhxMbxcSF8@a?>;tvy2t6EsGKL%?izKeJ zG;gy;5|aa%hl@p|4rreG4^)Yh5Hh>O9}=ckhOI<%EG;P-mxj^#7o5aLR@nl|>tB=F zqg0Ion)oiSRkQjK1%<{GWg(dSEKy|4_^+fwF$+ND6R43+-~jUZ;rI>;yW7*#129+= z3dKd$b;1HQ`uxsh%tpY-C^#ep>+c@&d3G~`YtmH~D0^qWMT?1EoSaCx09^@J!o{gO z#e?jRkk5buGC)~x-n^-AeglEoz~OM&%O0|9(LAZfwUfZazz5@gFwj8=B(&I1(7vIM zc%Q&lNPlh1Q&H`d?@|5*!1F|zFlZQ>Wi+AVISB^dA_EvoEd{ANYe90kdQ2MDEZr}I z6!U4LB2M@Glp2k`a^A+Po!l(&yrwZf8)9i>RDdn0_$?!m1~9KCEe_f!2m79feLz#f z@8wrcdEGzjfP{ZDhf8PlXZ8#T?)H4wGU{i?G(cnpV%Aqb3Ml654@vLGEXZ>@KOevy zb-j<=qXddkr?+FcPvRP~Ien$J|Ga+vdK}mAxCU6llM@8~_y<7OpYf(eqh&u#bPc~l z29U1gNsoO}yz`yxhE96vD$ufUX0|iizdYhoC64lJhTI_eI{yNYTmBO9)b0;g0r^fK zX3*ZV`RO`z3eb{L8Se@b;jU#7yfU|-W#qlPx7qd5bzC4F(RiF+8C*A2>=dAw50G?g zdO+KH1Z})kUN-84z;wUND_z|SkjWkPGpzmRQEu-hqymC80>eog)#z-ctl25<#Ww>` zvBUsI;F5-C?Jl!0q`Uy#FA^ zTr@e1zC-?bCEz`te}C$(Gb$a!-CSRYZ9e+-G^=hbij^92-!mG3uIFcG+S^|o%1v1G zmd1pmTlpd%0j45;aDYEJ0Wk2rIQsg&^?F#Gb@NI>y))%DGO)yS(m${=AqbUbNgYOFSyC#seYoxDnH{ zIDj^8?6&YBS|4CYhxDq>UYe5f?tntN;h)3C_<*h|rR~F!w^~*>>5%M_a}firU|xZQTMf)e|oC zBt}Nwmf>mFt^xI+bR}KxPYsW7wg6WNDqxs&dH(6HRV%10*b5;3wCPGHw6lOg^$$-9 zUol#+%7je?5@^8LPWuCL0yUbZ!EM)=L;tVhIlbqZmbJCBp6uqE1n)rZ)#H*&i;wb-<(`fDj zgA*)FK-2`zSH&RuaHIMg?O{M;&N%zY$gKtuRVqZJ z#Du~fv`gDN5!G0rEj8wf)F4eT?i2KIfAe? zkjT(3B80G5i7rS&SpvwH1V{-LAOT_w5CVh{ATN`A*{|Kd`+qyj`Qy%t=-$ob`G}d;8%|s!t}n4^WIdS=e33|3K-<&PgGQry z-i0M4kv8IMkw}Coy`PK6hc&#o(H9jFVV>HY-w_rTCMI%+ujr;v<`oti7~-|@gtkf3 zG}71icYszKC?sT6Wz(9PxP-_3{r$lvoleKX{=oYtpuH>-g}QvSZWAkAfg|}z(!1(` zExQZ69%k2xi3vlIG6nW}rlLZ3xUsP@TOR(IWNCVGa#DjvIkjfKg>06OKXZ3?$6Mpx z`1cJ(R_UBLzzLmlgsMX)CME*&KlJwX)winW=jXc}U^~gjN8HFob0Sse5>yEvx!OFT z(P+p{p$#u=HX9jtwBbcM2gA#V_<5X1RaRSOvqO0yt7>(oio(Vhmy}GyI!IaOZFP@yV&x$hYP&t5s+n4!AS%4Gp`h^h|xwii{Ft;L~dks!s{EAM0CKH=eqc*Y03qI)8$t=CF2EMd3ZiH*8t}ik!6n%Px zeBa_GH(I+Mm2#`w^yDK0C`f-gjr+S=OU^G0@O?#7!huSL}?)=dhKB(t;c#Xb&a zRxKo!n{TDv!3F+<*4P+WC(M7u20XPM29)3lmoO%t!;y-MBY=}4u~GS4eFR>(B$Po~l&-w1?yk&^YL@u}#YLOxYe;6PZa1@| zV^LTyO#tTh8wBhMo3g4|jJuq+VR;j#s9ty)1{S#BN|AizO-Rxw^Uv2MANd($aNcc$w#EkUyv!HQ3cBDfX6N54c_*=BCy0 zw|?}di~W-hq25)<1eLqS$O-r=t3e~1BIpgQ;D0vQpS{W!l=}9JRQX^eFYlUAl{QNL zC>scZ=`8I>gJRJiFV4cwKq5xSp{Od?`uAdxS;&{*D5+_q%HA7-pO%x?MX9`yLqsSd zAQ`48w03rO7W6bJz8sRqumxV={aKeaxx_W8qlHo zUgy_};UldmLDp7Kyr}>ExjB`&lOHoqpep{pk-Apn)a4qmYCAwsB`}M8*V8I((Qr*$ zWT!^joDI$Pvf^*=H7S)!CYHAb_V!_zBe>$2%QocLAKap0%qTanvSTsn=SquWp!>l7 z!Ilj0O)-hYwdFrl-Xw2U=IN*hlMYt9pRsRU%)9>b7oW}TAJMP)N3`9!{NHqM5c1LY X>(^x7I1bzvBhH>af2t!c<@SF8;`C+- literal 9669 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 F{{l-GJyQSx diff --git a/tests/monero_client/snapshots/stax/test_private_view_key/00001.png b/tests/monero_client/snapshots/stax/test_private_view_key/00001.png index 1023fdcc9e7e76668e5020f2c8fd34875b14243f..ebc5b36b084d1767697c5de3dd7acc951bc40f34 100644 GIT binary patch delta 2971 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 OS7*KO+;K}SODjtpB{g-@ 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 Jl7IDx{}20OyY2u0 literal 8399 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%0D&V{&uqFtK(P%Riz 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 diff --git a/tests/monero_client/snapshots/stax/test_validate_prehash_update/00002.png b/tests/monero_client/snapshots/stax/test_validate_prehash_update/00002.png index 2a78db9ca80426c1103699beba20c77143c4cd77..9c55ed6bcc6055b39132994d1e09bdfafa6a2257 100644 GIT binary patch literal 7514 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 From b7faa0df6759329f58e0be1c15601989aa1035cc Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 24 Oct 2023 16:56:20 +0200 Subject: [PATCH 107/142] icons: rename and relocate glyphs --- icons/app_monero_14px.gif | Bin 0 -> 63 bytes icons/app_monero_16px.gif | Bin 0 -> 74 bytes icons/app_monero_32px.gif | Bin 0 -> 181 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 icons/app_monero_14px.gif create mode 100644 icons/app_monero_16px.gif create mode 100644 icons/app_monero_32px.gif diff --git a/icons/app_monero_14px.gif b/icons/app_monero_14px.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe64cd2adf70cc43e88023b463a2c83455f2c055 GIT binary patch literal 63 zcmZ?wbhEHbj>wsvG2m_N`OaIF3gLO$xM4c~;!CfIJMOJm_~}U= d_u})PjjZ?Qe_>aOU=J35QOd!_5y-$`4FGx0NtOTr literal 0 HcmV?d00001 From 8775fa6ac6e27bae086526281ece1c5d508e5198 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Fri, 20 Oct 2023 11:40:29 +0200 Subject: [PATCH 108/142] clean: Add size as parameter in function call --- src/monero_api.h | 71 ++++++------ src/monero_blind.c | 28 ++--- src/monero_clsag.c | 34 +++--- src/monero_crypto.c | 258 ++++++++++++++++++++++++++++--------------- src/monero_init.c | 8 +- src/monero_io.c | 2 +- src/monero_key.c | 49 ++++---- src/monero_mlsag.c | 22 ++-- src/monero_open_tx.c | 4 +- src/monero_prehash.c | 10 +- src/monero_proof.c | 15 +-- src/monero_stealth.c | 2 +- 12 files changed, 293 insertions(+), 210 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index fd969cf..d105188 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -109,11 +109,11 @@ int monero_base58_public_key(char *str_b58, unsigned char *view, unsigned char * /** unsigned varint amount to uint64 */ uint64_t monero_vamount2uint64(unsigned char *binary); /** binary little endian unsigned int amount to uint64 */ -uint64_t monero_bamount2uint64(unsigned char *binary); +uint64_t monero_bamount2uint64(unsigned char *binary, size_t binary_len); /** unsigned varint amount to str */ int monero_vamount2str(unsigned char *binary, char *str, unsigned int str_len); /** binary little endian unsigned int amount to str */ -int monero_bamount2str(unsigned char *binary, char *str, unsigned int str_len); +int monero_bamount2str(unsigned char *binary, char *str, size_t binary_len, unsigned int str_len); /** uint64 amount to str */ int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len); @@ -122,7 +122,7 @@ void monero_uint642str(uint64_t val, char *str, unsigned int str_len); int monero_abort_tx(void); int monero_unblind(unsigned char *v, unsigned char *k, unsigned char *AKout, - unsigned int short_amount); + unsigned int short_amount, size_t v_len, size_t k_len, size_t AKout_len); void ui_menu_validation_display(unsigned int value); void ui_menu_validation_display_last(unsigned int value); void ui_menu_fee_validation_display(unsigned int value); @@ -142,11 +142,11 @@ extern const unsigned char C_FAKE_SEC_SPEND_KEY[32]; int is_fake_view_key(unsigned char *s); int is_fake_spend_key(unsigned char *s); -void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes); +void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t ge_len, size_t bytes_len); void monero_sc_add(unsigned char *r, unsigned char *s1, unsigned char *s2); -void monero_hash_to_scalar(unsigned char *scalar, unsigned char *raw, unsigned int len); -void monero_hash_to_ec(unsigned char *ec, unsigned char *ec_pub); -void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv); +void monero_hash_to_scalar(unsigned char *scalar, unsigned char *raw, size_t scalar_len, unsigned int len); +void monero_hash_to_ec(unsigned char *ec, unsigned char *ec_pub, size_t ec_len); +void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, size_t ec_priv_len); /* * compute s = 8 * (k*P) * @@ -155,9 +155,9 @@ void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv); * k [in] 32 bytes scalar */ void monero_generate_key_derivation(unsigned char *drv_data, unsigned char *P, - unsigned char *scalar); + unsigned char *scalar, size_t drv_data_len, size_t P_len, size_t scalar_len); void monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, - unsigned int out_idx); + unsigned int out_idx, size_t scalar_len, size_t drv_data_len); /* * compute x = Hps(drv_data,out_idx) + ec_pv * @@ -166,7 +166,7 @@ void monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, * ec_pv [in] 32 bytes private key */ void monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, - unsigned char *ec_priv); + unsigned char *ec_priv, size_t x_len, size_t drv_data_len, size_t ec_priv_len); /* * compute x = Hps(drv_data,out_idx)*G + ec_pub * @@ -175,17 +175,18 @@ void monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigne * ec_pub [in] 32 bytes public key */ void monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, - unsigned char *ec_pub); -void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv); -void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x); + unsigned char *ec_pub, size_t x_len, size_t drv_data_len, size_t ec_pub_len); +void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, size_t ec_priv_len); +void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x, size_t img_len, size_t x_len); void monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_data[static 32], unsigned int out_idx); void monero_derive_subaddress_public_key(unsigned char *x, unsigned char *pub, - unsigned char *drv_data, unsigned int index); -void monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *index); -void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *index); -void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, unsigned char *index); + unsigned char *drv_data, unsigned int index, + size_t x_len, size_t pub_len, size_t drv_data_len); +void monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *index, size_t x_len, size_t index_len); +void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *index, size_t C_len, size_t D_len, size_t index_len); +void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, unsigned char *index, size_t sub_s_len, size_t s_len, size_t index_len); void monero_clear_words(void); /* ----------------------------------------------------------------------- */ @@ -252,7 +253,7 @@ static inline int monero_sha256_outkeys_final(unsigned char *out) { /* * check 1= 0x80) { @@ -112,6 +113,7 @@ unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, u v = 0; len = 0; if (!varint) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); return 0; } while ((varint[len]) & 0x80) { @@ -130,10 +132,15 @@ unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, u /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_reverse32(unsigned char *rscal, unsigned char *scal) { +void monero_reverse32(unsigned char *rscal, unsigned char *scal, size_t rscal_len, size_t scal_len) { unsigned char x; unsigned int i; if (!rscal || !scal) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); + return; + } + if (rscal_len < 32 || scal_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); return; } for (i = 0; i < 16; i++) { @@ -294,7 +301,7 @@ const unsigned char C_fe_qm5div8[] = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd}; -void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { +void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t ge_len, size_t bytes_len) { #define MOD (unsigned char *)C_ED25519_FIELD, 32 #define fe_isnegative(f) (f[31] & 1) #if 0 @@ -344,9 +351,17 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { #endif unsigned char sign; + if (!ge) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); + return; + } + if (ge_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); + return; + } // cx works in BE - monero_reverse32(u, bytes); + monero_reverse32(u, bytes, 32, bytes_len); cx_math_modm_no_throw(u, 32, (unsigned char *)C_ED25519_FIELD, 32); // go on @@ -447,93 +462,98 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_hash_to_scalar(unsigned char *scalar, unsigned char *raw, unsigned int raw_len) { +void monero_hash_to_scalar(unsigned char *scalar, unsigned char *raw, size_t scalar_len, unsigned int raw_len) { monero_keccak_F(raw, raw_len, scalar); - monero_reduce(scalar, scalar); + monero_reduce(scalar, scalar, scalar_len, scalar_len); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_hash_to_ec(unsigned char *ec, unsigned char *ec_pub) { +void monero_hash_to_ec(unsigned char *ec, unsigned char *ec_pub, size_t ec_len) { monero_keccak_F(ec_pub, 32, ec); - monero_ge_fromfe_frombytes(ec, ec); - monero_ecmul_8(ec, ec); + monero_ge_fromfe_frombytes(ec, ec, ec_len, ec_len); + monero_ecmul_8(ec, ec, ec_len, ec_len); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv) { - monero_rng_mod_order(ec_priv); - monero_ecmul_G(ec_pub, ec_priv); +void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, size_t ec_priv_len) { + monero_rng_mod_order(ec_priv, ec_priv_len); + monero_ecmul_G(ec_pub, ec_priv, ec_pub_len, ec_priv_len); } /* ----------------------------------------------------------------------- */ /* --- ok --- */ /* ----------------------------------------------------------------------- */ void monero_generate_key_derivation(unsigned char *drv_data, unsigned char *P, - unsigned char *scalar) { - monero_ecmul_8k(drv_data, P, scalar); + unsigned char *scalar, size_t drv_data_len, size_t P_len, size_t scalar_len) { + monero_ecmul_8k(drv_data, P, scalar, drv_data_len, P_len, scalar_len); } /* ----------------------------------------------------------------------- */ /* --- ok --- */ /* ----------------------------------------------------------------------- */ void monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, - unsigned int out_idx) { + unsigned int out_idx, size_t scalar_len, size_t drv_data_len) { unsigned char varint[32 + 8]; unsigned int len_varint; + if (drv_data_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); + return; + } + memcpy(varint, drv_data, 32); len_varint = monero_encode_varint(varint + 32, 8, out_idx); len_varint += 32; monero_keccak_F(varint, len_varint, varint); - monero_reduce(scalar, varint); + monero_reduce(scalar, varint, scalar_len, sizeof(varint)); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ void monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, - unsigned char *ec_priv) { + unsigned char *ec_priv, size_t x_len, size_t drv_data_len, size_t ec_priv_len) { unsigned char tmp[32]; // derivation to scalar - monero_derivation_to_scalar(tmp, drv_data, out_idx); + monero_derivation_to_scalar(tmp, drv_data, out_idx, sizeof(tmp), drv_data_len); // generate - monero_addm(x, tmp, ec_priv); + monero_addm(x, tmp, ec_priv, x_len, sizeof(tmp), ec_priv_len); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ void monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, - unsigned char *ec_pub) { + unsigned char *ec_pub, size_t x_len, size_t drv_data_len, size_t ec_pub_len) { unsigned char tmp[32]; // derivation to scalar - monero_derivation_to_scalar(tmp, drv_data, out_idx); + monero_derivation_to_scalar(tmp, drv_data, out_idx, sizeof(tmp), drv_data_len); // generate - monero_ecmul_G(tmp, tmp); - monero_ecadd(x, tmp, ec_pub); + monero_ecmul_G(tmp, tmp, sizeof(tmp), sizeof(tmp)); + monero_ecadd(x, tmp, ec_pub, x_len, sizeof(tmp), ec_pub_len); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv) { - monero_ecmul_G(ec_pub, ec_priv); +void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, size_t ec_priv_len) { + monero_ecmul_G(ec_pub, ec_priv, ec_pub_len, ec_priv_len); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x) { +void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x, size_t img_len, size_t x_len) { unsigned char I[32]; - monero_hash_to_ec(I, P); - monero_ecmul_k(img, I, x); + monero_hash_to_ec(I, P, sizeof(I)); + monero_ecmul_k(img, I, x, img_len, sizeof(I), x_len); } /* ----------------------------------------------------------------------- */ @@ -560,34 +580,35 @@ void monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_dat /* --- ok --- */ /* ----------------------------------------------------------------------- */ void monero_derive_subaddress_public_key(unsigned char *x, unsigned char *pub, - unsigned char *drv_data, unsigned int index) { + unsigned char *drv_data, unsigned int index, + size_t x_len, size_t pub_len, size_t drv_data_len) { unsigned char scalarG[32]; - monero_derivation_to_scalar(scalarG, drv_data, index); - monero_ecmul_G(scalarG, scalarG); - monero_ecsub(x, pub, scalarG); + monero_derivation_to_scalar(scalarG, drv_data, index, sizeof(scalarG), drv_data_len); + monero_ecmul_G(scalarG, scalarG, sizeof(scalarG), sizeof(scalarG)); + monero_ecsub(x, pub, scalarG, x_len, pub_len, sizeof(scalarG)); } /* ----------------------------------------------------------------------- */ /* --- ok --- */ /* ----------------------------------------------------------------------- */ -void monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *index) { +void monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *index, size_t x_len, size_t index_len) { // m = Hs(a || index_major || index_minor) - monero_get_subaddress_secret_key(x, G_monero_vstate.a, index); + monero_get_subaddress_secret_key(x, G_monero_vstate.a, index, x_len, sizeof(G_monero_vstate.a), index_len); // M = m*G - monero_secret_key_to_public_key(x, x); + monero_secret_key_to_public_key(x, x, x_len, x_len); // D = B + M - monero_ecadd(x, x, G_monero_vstate.B); + monero_ecadd(x, x, G_monero_vstate.B, x_len, x_len, sizeof(G_monero_vstate.B)); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *index) { +void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *index, size_t C_len, size_t D_len, size_t index_len) { // retrieve D - monero_get_subaddress_spend_public_key(D, index); + monero_get_subaddress_spend_public_key(D, index, D_len, index_len); // C = a*D - monero_ecmul_k(C, D, G_monero_vstate.a); + monero_ecmul_k(C, D, G_monero_vstate.a, C_len, D_len, sizeof(G_monero_vstate.a)); } /* ----------------------------------------------------------------------- */ @@ -596,15 +617,25 @@ void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *in static const char C_sub_address_prefix[] = {'S', 'u', 'b', 'A', 'd', 'd', 'r', 0}; void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, - unsigned char *index) { + unsigned char *index, size_t sub_s_len, size_t s_len, size_t index_len) { unsigned char in[sizeof(C_sub_address_prefix) + 32 + 8]; + if (!s || s_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); + return; + } + + if (!index || index_len < 8) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); + return; + } + memcpy(in, C_sub_address_prefix, sizeof(C_sub_address_prefix)); memcpy(in + sizeof(C_sub_address_prefix), s, 32); memcpy(in + sizeof(C_sub_address_prefix) + 32, index, 8); // hash_to_scalar with more that 32bytes: monero_keccak_F(in, sizeof(in), sub_s); - monero_reduce(sub_s, sub_s); + monero_reduce(sub_s, sub_s, sub_s_len, sub_s_len); } /* ======================================================================= */ @@ -614,9 +645,9 @@ void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_check_scalar_range_1N(unsigned char *s) { +void monero_check_scalar_range_1N(unsigned char *s, size_t s_len) { unsigned char x[32]; - monero_reverse32(x, s); + monero_reverse32(x, s, sizeof(x), s_len); int diff; cx_math_cmp_no_throw(x, C_ED25519_ORDER, 32, &diff); if (cx_math_is_zero(x, 32) || diff >= 0) { @@ -635,13 +666,16 @@ void monero_check_scalar_not_null(unsigned char *s) { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecmul_G(unsigned char *W, unsigned char *scalar32) { +void monero_ecmul_G(unsigned char *W, unsigned char *scalar32, size_t W_len, size_t scalar32_len) { unsigned char Pxy[PXY_SIZE]; unsigned char s[32]; - if (!W) { + + if (!W || W_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); return; } - monero_reverse32(s, scalar32); + + monero_reverse32(s, scalar32, sizeof(s), scalar32_len); memcpy(Pxy, C_ED25519_G, PXY_SIZE); cx_ecfp_scalar_mult_no_throw(CX_CURVE_Ed25519, Pxy, s, 32); cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); @@ -651,14 +685,15 @@ void monero_ecmul_G(unsigned char *W, unsigned char *scalar32) { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecmul_H(unsigned char *W, unsigned char *scalar32) { +void monero_ecmul_H(unsigned char *W, unsigned char *scalar32, size_t W_len, size_t scalar32_len) { unsigned char Pxy[PXY_SIZE]; unsigned char s[32]; - if (!W) { + if (!W || W_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); return; } - monero_reverse32(s, scalar32); + monero_reverse32(s, scalar32, sizeof(s), scalar32_len); Pxy[0] = 0x02; memcpy(&Pxy[1], C_ED25519_Hy, 32); @@ -673,14 +708,20 @@ void monero_ecmul_H(unsigned char *W, unsigned char *scalar32) { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32) { +void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, size_t P_len, size_t scalar32_len) { unsigned char Pxy[PXY_SIZE]; unsigned char s[32]; - if (!W || !P) { + if (!W || W_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); return; } - monero_reverse32(s, scalar32); + + if (!P || P_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); + return; + } + monero_reverse32(s, scalar32, sizeof(s), scalar32_len); Pxy[0] = 0x02; memcpy(&Pxy[1], P, 32); @@ -695,21 +736,28 @@ void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32) /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecmul_8k(unsigned char *W, unsigned char *P, unsigned char *scalar32) { +void monero_ecmul_8k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, size_t P_len, size_t scalar32_len) { unsigned char s[32]; - monero_multm_8(s, scalar32); - monero_ecmul_k(W, P, s); + monero_multm_8(s, scalar32, sizeof(s), scalar32_len); + monero_ecmul_k(W, P, s, W_len, P_len, sizeof(s)); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecmul_8(unsigned char *W, unsigned char *P) { +void monero_ecmul_8(unsigned char *W, unsigned char *P, size_t W_len, size_t P_len) { unsigned char Pxy[PXY_SIZE]; - if (!W || !P) { + if (!W || W_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); return; } + + if (!P || P_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); + return; + } + Pxy[0] = 0x02; memcpy(&Pxy[1], P, 32); cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); @@ -723,11 +771,22 @@ void monero_ecmul_8(unsigned char *W, unsigned char *P) { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q) { +void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, size_t Q_len) { unsigned char Pxy[PXY_SIZE]; unsigned char Qxy[PXY_SIZE]; - if (!W || !P || !Q) { + if (!W || W_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); + return; + } + + if (!P || P_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); + return; + } + + if (!Q || Q_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); return; } @@ -748,11 +807,22 @@ void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q) { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q) { +void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, size_t Q_len) { unsigned char Pxy[PXY_SIZE]; unsigned char Qxy[PXY_SIZE]; - if (!W || !P || !Q) { + if (!W || W_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); + return; + } + + if (!P || P_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); + return; + } + + if (!Q || Q_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); return; } @@ -785,11 +855,14 @@ void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q) { return hash; } */ -void monero_ecdhHash(unsigned char *x, unsigned char *k) { +void monero_ecdhHash(unsigned char *x, unsigned char *k, size_t k_len) { unsigned char data[38]; - if (!k) { + + if (!k || k_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); return; } + memcpy(data, "amount", 6); memcpy(data + 6, k, 32); monero_keccak_F(data, 38, x); @@ -809,86 +882,90 @@ void monero_ecdhHash(unsigned char *x, unsigned char *k) { return scalar; } */ -void monero_genCommitmentMask(unsigned char *c, unsigned char *sk) { +void monero_genCommitmentMask(unsigned char *c, unsigned char *sk, size_t c_len, size_t sk_len) { unsigned char data[15 + 32]; - if (!sk) { + + if (!sk || sk_len < 32) { + PRINTF("Buffer Error: %s:%d \n", __LINE__); return; } + memcpy(data, "commitment_mask", 15); memcpy(data + 15, sk, 32); - monero_hash_to_scalar(c, data, 15 + 32); + monero_hash_to_scalar(c, data, c_len, 15 + 32); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_addm(unsigned char *r, unsigned char *a, unsigned char *b) { +void monero_addm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, size_t b_len) { unsigned char ra[32]; unsigned char rb[32]; - monero_reverse32(ra, a); - monero_reverse32(rb, b); + monero_reverse32(ra, a, sizeof(ra), a_len); + monero_reverse32(rb, b, sizeof(rb), b_len); cx_math_addm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); - monero_reverse32(r, r); + monero_reverse32(r, r, r_len, r_len); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_subm(unsigned char *r, unsigned char *a, unsigned char *b) { +void monero_subm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, size_t b_len) { unsigned char ra[32]; unsigned char rb[32]; - monero_reverse32(ra, a); - monero_reverse32(rb, b); + monero_reverse32(ra, a, sizeof(ra), a_len); + monero_reverse32(rb, b, sizeof(rb), b_len); cx_math_subm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); - monero_reverse32(r, r); + monero_reverse32(r, r, r_len, r_len); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_multm(unsigned char *r, unsigned char *a, unsigned char *b) { +void monero_multm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, size_t b_len) { unsigned char ra[32]; unsigned char rb[32]; - monero_reverse32(ra, a); - monero_reverse32(rb, b); + monero_reverse32(ra, a, sizeof(ra), a_len); + monero_reverse32(rb, b, sizeof(rb), b_len); cx_math_multm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); - monero_reverse32(r, r); + monero_reverse32(r, r, r_len, r_len); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_multm_8(unsigned char *r, unsigned char *a) { +void monero_multm_8(unsigned char *r, unsigned char *a, size_t r_len, size_t a_len) { unsigned char ra[32]; unsigned char rb[32]; - monero_reverse32(ra, a); + monero_reverse32(ra, a, sizeof(ra), a_len); memset(rb, 0, 32); rb[31] = 8; cx_math_multm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); - monero_reverse32(r, r); + monero_reverse32(r, r, r_len, r_len); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_reduce(unsigned char *r, unsigned char *a) { +void monero_reduce(unsigned char *r, unsigned char *a, size_t r_len, size_t a_len) { unsigned char ra[32]; - monero_reverse32(ra, a); + + monero_reverse32(ra, a, sizeof(ra), a_len); cx_math_modm_no_throw(ra, 32, (unsigned char *)C_ED25519_ORDER, 32); - monero_reverse32(r, ra); + monero_reverse32(r, ra, r_len, sizeof(ra)); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_rng_mod_order(unsigned char *r) { +void monero_rng_mod_order(unsigned char *r, size_t r_len) { unsigned char rnd[32 + 8]; cx_rng(rnd, 32 + 8); cx_math_modm_no_throw(rnd, 32 + 8, (unsigned char *)C_ED25519_ORDER, 32); - monero_reverse32(r, rnd + 8); + monero_reverse32(r, rnd + 8, r_len, 32); } /* ----------------------------------------------------------------------- */ @@ -900,6 +977,7 @@ void monero_uint642str(uint64_t val, char *str, unsigned int str_len) { unsigned int offset, len; if (!str) { + PRINTF("%d \n\n", __LINE__); return; } memset(str, 0, str_len); @@ -927,6 +1005,7 @@ int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { unsigned int offset, len, ov; if (!str) { + PRINTF("%d \n\n", __LINE__); return -1; } memset(str, 0, str_len); @@ -979,10 +1058,11 @@ int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -uint64_t monero_bamount2uint64(unsigned char *binary) { +uint64_t monero_bamount2uint64(unsigned char *binary, size_t binary_len) { uint64_t xmr; int i; - if (!binary) { + if (!binary || binary_len < 8) { + PRINTF("%d \n\n", __LINE__); return 0; } xmr = 0; @@ -995,8 +1075,8 @@ uint64_t monero_bamount2uint64(unsigned char *binary) { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -int monero_bamount2str(unsigned char *binary, char *str, unsigned int str_len) { - return monero_amount2str(monero_bamount2uint64(binary), str, str_len); +int monero_bamount2str(unsigned char *binary, char *str, size_t binary_len, unsigned int str_len) { + return monero_amount2str(monero_bamount2uint64(binary, binary_len), str, str_len); } /* ----------------------------------------------------------------------- */ diff --git a/src/monero_init.c b/src/monero_init.c index 1f657c5..f6c8704 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -95,9 +95,9 @@ int monero_init_private_key(void) { case KEY_MODE_SEED: monero_keccak_F(seed, 32, G_monero_vstate.b); - monero_reduce(G_monero_vstate.b, G_monero_vstate.b); + monero_reduce(G_monero_vstate.b, G_monero_vstate.b, sizeof(G_monero_vstate.b), sizeof(G_monero_vstate.b)); monero_keccak_F(G_monero_vstate.b, 32, G_monero_vstate.a); - monero_reduce(G_monero_vstate.a, G_monero_vstate.a); + monero_reduce(G_monero_vstate.a, G_monero_vstate.a, sizeof(G_monero_vstate.a), sizeof(G_monero_vstate.a)); break; case KEY_MODE_EXTERNAL: @@ -109,8 +109,8 @@ int monero_init_private_key(void) { THROW(SW_SECURITY_LOAD_KEY); return 1; } - monero_ecmul_G(G_monero_vstate.A, G_monero_vstate.a); - monero_ecmul_G(G_monero_vstate.B, G_monero_vstate.b); + monero_ecmul_G(G_monero_vstate.A, G_monero_vstate.a, sizeof(G_monero_vstate.A), sizeof(G_monero_vstate.a)); + monero_ecmul_G(G_monero_vstate.B, G_monero_vstate.b, sizeof(G_monero_vstate.B), sizeof(G_monero_vstate.b)); // generate key protection int err = monero_aes_derive(&G_monero_vstate.spk, chain, G_monero_vstate.a, G_monero_vstate.b); diff --git a/src/monero_io.c b/src/monero_io.c index 30a5b13..f7ec4f4 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -300,7 +300,7 @@ int monero_io_fetch_decrypt(unsigned char* buffer, int len, int type) { if (buffer) { switch (type) { case TYPE_SCALAR: - monero_check_scalar_range_1N(buffer); + monero_check_scalar_range_1N(buffer, len); break; case TYPE_AMOUNT_KEY: case TYPE_DERIVATION: diff --git a/src/monero_key.c b/src/monero_key.c index 28cca7a..1eddc95 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -213,7 +213,7 @@ int monero_apdu_display_address() { // retrieve pub keys if (minor | major) { - monero_get_subaddress(C, D, index); + monero_get_subaddress(C, D, index, sizeof(C), sizeof(D), sizeof(index)); } else { memcpy(C, G_monero_vstate.A, 32); memcpy(D, G_monero_vstate.B, 32); @@ -266,7 +266,7 @@ int monero_apdu_put_key() { // view key monero_io_fetch(sec, 32); monero_io_fetch(pub, 32); - monero_ecmul_G(raw, sec); + monero_ecmul_G(raw, sec, sizeof(raw), sizeof(sec)); if (memcmp(pub, raw, 32) != 0) { THROW(SW_WRONG_DATA); return SW_WRONG_DATA; @@ -276,7 +276,7 @@ int monero_apdu_put_key() { // spend key monero_io_fetch(sec, 32); monero_io_fetch(pub, 32); - monero_ecmul_G(raw, sec); + monero_ecmul_G(raw, sec, sizeof(raw), sizeof(sec)); if (memcmp(pub, raw, 32) != 0) { THROW(SW_WRONG_DATA); return SW_WRONG_DATA; @@ -371,7 +371,7 @@ int monero_apdu_verify_key() { monero_io_fetch(pub, 32); switch (G_monero_vstate.io_p1) { case 0: - monero_secret_key_to_public_key(computed_pub, priv); + monero_secret_key_to_public_key(computed_pub, priv, sizeof(computed_pub), sizeof(priv)); break; case 1: memcpy(computed_pub, G_monero_vstate.A, 32); @@ -431,7 +431,7 @@ int monero_apdu_sc_add(/*unsigned char *r, unsigned char *s1, unsigned char *s2* monero_lock_and_throw(SW_WRONG_DATA); } } - monero_addm(r, s1, s2); + monero_addm(r, s1, s2, sizeof(r), sizeof(s1), sizeof(s2)); monero_io_insert_encrypt(r, 32, TYPE_SCALAR); return SW_OK; } @@ -448,7 +448,7 @@ int monero_apdu_scal_mul_key(/*const rct::key &pub, const rct::key &sec, rct::ke monero_io_fetch_decrypt_key(sec, sizeof(sec)); monero_io_discard(0); - monero_ecmul_k(r, pub, sec); + monero_ecmul_k(r, pub, sec, sizeof(r), sizeof(pub), sizeof(sec)); monero_io_insert(r, 32); return SW_OK; } @@ -463,7 +463,7 @@ int monero_apdu_scal_mul_base(/*const rct::key &sec, rct::key mulkey*/) { monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); monero_io_discard(0); - monero_ecmul_G(r, sec); + monero_ecmul_G(r, sec, sizeof(r), sizeof(sec)); monero_io_insert(r, 32); return SW_OK; } @@ -476,7 +476,7 @@ int monero_apdu_generate_keypair(/*crypto::public_key &pub, crypto::secret_key & unsigned char pub[32]; monero_io_discard(0); - monero_generate_keypair(pub, sec); + monero_generate_keypair(pub, sec, sizeof(pub), sizeof(sec)); monero_io_insert(pub, 32); monero_io_insert_encrypt(sec, 32, TYPE_SCALAR); return SW_OK; @@ -493,7 +493,7 @@ int monero_apdu_secret_key_to_public_key( monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); monero_io_discard(0); // pub - monero_ecmul_G(pub, sec); + monero_ecmul_G(pub, sec, sizeof(pub), sizeof(sec)); // pub key monero_io_insert(pub, 32); return SW_OK; @@ -513,7 +513,7 @@ int monero_apdu_generate_key_derivation(/*const crypto::public_key &pub, const c monero_io_discard(0); // Derive and keep - monero_generate_key_derivation(drv, pub, sec); + monero_generate_key_derivation(drv, pub, sec, sizeof(drv), sizeof(pub), sizeof(sec)); monero_io_insert_encrypt(drv, 32, TYPE_DERIVATION); return SW_OK; @@ -534,7 +534,7 @@ int monero_apdu_derivation_to_scalar( monero_io_discard(0); // pub - monero_derivation_to_scalar(res, derivation, output_index); + monero_derivation_to_scalar(res, derivation, output_index, sizeof(res), sizeof(derivation)); // pub key monero_io_insert_encrypt(res, 32, TYPE_SCALAR); @@ -557,7 +557,7 @@ int monero_apdu_derive_public_key(/*const crypto::key_derivation &derivation, co monero_io_discard(0); // pub - monero_derive_public_key(drvpub, derivation, output_index, pub); + monero_derive_public_key(drvpub, derivation, output_index, pub, sizeof(drvpub), sizeof(derivation), sizeof(pub)); // pub key monero_io_insert(drvpub, 32); @@ -580,7 +580,7 @@ int monero_apdu_derive_secret_key(/*const crypto::key_derivation &derivation, co monero_io_discard(0); // pub - monero_derive_secret_key(drvsec, derivation, output_index, sec); + monero_derive_secret_key(drvsec, derivation, output_index, sec, sizeof(drvsec), sizeof(derivation), sizeof(sec)); // sec key memcpy(G_monero_vstate.last_derive_secret_key, drvsec, 32); @@ -603,7 +603,7 @@ int monero_apdu_generate_key_image( monero_io_discard(0); // pub - monero_generate_key_image(image, pub, sec); + monero_generate_key_image(image, pub, sec, sizeof(image), sizeof(sec)); // pub key monero_io_insert(image, 32); @@ -647,7 +647,7 @@ int monero_apdu_derive_subaddress_public_key(/*const crypto::public_key &pub, co monero_io_discard(0); // pub - monero_derive_subaddress_public_key(sub_pub, pub, derivation, output_index); + monero_derive_subaddress_public_key(sub_pub, pub, derivation, output_index, sizeof(sub_pub), sizeof(pub), sizeof(derivation)); // pub key monero_io_insert(sub_pub, 32); return SW_OK; @@ -667,7 +667,7 @@ int monero_apdu_get_subaddress( monero_io_discard(0); // pub - monero_get_subaddress(C, D, index); + monero_get_subaddress(C, D, index, sizeof(C), sizeof(D), sizeof(index)); // pub key monero_io_insert(C, 32); @@ -688,7 +688,7 @@ int monero_apdu_get_subaddress_spend_public_key( monero_io_discard(1); // pub - monero_get_subaddress_spend_public_key(D, index); + monero_get_subaddress_spend_public_key(D, index, sizeof(D), sizeof(index)); // pub key monero_io_insert(D, 32); @@ -708,7 +708,7 @@ int monero_apdu_get_subaddress_secret_key(/*const crypto::secret_key& sec, const monero_io_fetch(index, 8); monero_io_discard(0); - monero_get_subaddress_secret_key(sub_sec, sec, index); + monero_get_subaddress_secret_key(sub_sec, sec, index, sizeof(sub_sec), sizeof(sec), sizeof(index)); memcpy(G_monero_vstate.last_get_subaddress_secret_key, sub_sec, 32); monero_io_insert_encrypt(sub_sec, 32, TYPE_SCALAR); @@ -770,9 +770,9 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se // make additional tx pubkey if necessary if (need_additional_txkeys) { if (is_subaddress) { - monero_ecmul_k(additional_txkey_pub, Bout, additional_txkey_sec); + monero_ecmul_k(additional_txkey_pub, Bout, additional_txkey_sec, sizeof(additional_txkey_pub), 32, sizeof(additional_txkey_sec)); } else { - monero_ecmul_G(additional_txkey_pub, additional_txkey_sec); + monero_ecmul_G(additional_txkey_pub, additional_txkey_sec, sizeof(additional_txkey_pub), sizeof(additional_txkey_sec)); } } else { memset(additional_txkey_pub, 0, 32); @@ -780,15 +780,16 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se // derivation if (is_change) { - monero_generate_key_derivation(derivation, txkey_pub, G_monero_vstate.a); + monero_generate_key_derivation(derivation, txkey_pub, G_monero_vstate.a, sizeof(derivation), 32, sizeof(G_monero_vstate.a)); } else { monero_generate_key_derivation( derivation, Aout, - (is_subaddress && need_additional_txkeys) ? additional_txkey_sec : tx_key); + (is_subaddress && need_additional_txkeys) ? additional_txkey_sec : tx_key, + sizeof(derivation), 32, 32); } // compute amount key AKout (scalar1), version is always greater than 1 - monero_derivation_to_scalar(amount_key, derivation, output_index); + monero_derivation_to_scalar(amount_key, derivation, output_index, sizeof(amount_key), sizeof(derivation)); if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { if (G_monero_vstate.io_protocol_version >= 2) { monero_sha256_outkeys_update(amount_key, 32); @@ -796,7 +797,7 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se } // compute ephemeral output key - monero_derive_public_key(out_eph_public_key, derivation, output_index, Bout); + monero_derive_public_key(out_eph_public_key, derivation, output_index, Bout, sizeof(out_eph_public_key), sizeof(derivation), 32); // compute view tag if (use_view_tags) { diff --git a/src/monero_mlsag.c b/src/monero_mlsag.c index f5a0850..ae19dcb 100644 --- a/src/monero_mlsag.c +++ b/src/monero_mlsag.c @@ -52,20 +52,20 @@ int monero_apdu_mlsag_prepare() { monero_io_discard(1); // ai - monero_rng_mod_order(alpha); - monero_reduce(alpha, alpha); + monero_rng_mod_order(alpha, sizeof(alpha)); + monero_reduce(alpha, alpha, sizeof(alpha), sizeof(alpha)); monero_io_insert_encrypt(alpha, 32, TYPE_ALPHA); // ai.G - monero_ecmul_G(mul, alpha); + monero_ecmul_G(mul, alpha, sizeof(mul), sizeof(alpha)); monero_io_insert(mul, 32); if (options) { // ai.Hi - monero_ecmul_k(mul, Hi, alpha); + monero_ecmul_k(mul, Hi, alpha, sizeof(mul), sizeof(Hi), sizeof(alpha)); monero_io_insert(mul, 32); // IIi = xin.Hi - monero_ecmul_k(mul, Hi, xin); + monero_ecmul_k(mul, Hi, xin, sizeof(mul), sizeof(Hi), sizeof(xin)); monero_io_insert(mul, 32); } return SW_OK; @@ -91,7 +91,7 @@ int monero_apdu_mlsag_hash() { monero_keccak_update_H(msg, 32); if ((G_monero_vstate.options & 0x80) == 0) { monero_keccak_final_H(c); - monero_reduce(c, c); + monero_reduce(c, c, sizeof(c), sizeof(c)); monero_io_insert(c, 32); memcpy(G_monero_vstate.c, c, 32); } @@ -123,12 +123,12 @@ int monero_apdu_mlsag_sign() { monero_lock_and_throw(SW_SECURITY_RANGE_VALUE); } - monero_reduce(ss, G_monero_vstate.c); - monero_reduce(xin, xin); - monero_multm(ss, ss, xin); + monero_reduce(ss, G_monero_vstate.c, sizeof(ss), sizeof(G_monero_vstate.c)); + monero_reduce(xin, xin, sizeof(xin), sizeof(xin)); + monero_multm(ss, ss, xin, sizeof(ss), sizeof(ss), sizeof(xin)); - monero_reduce(alpha, alpha); - monero_subm(ss2, alpha, ss); + monero_reduce(alpha, alpha, sizeof(alpha), sizeof(alpha)); + monero_subm(ss2, alpha, ss, sizeof(ss2), sizeof(alpha), sizeof(ss)); monero_io_insert(ss2, 32); monero_io_insert_u32(G_monero_vstate.tx_sig_mode); diff --git a/src/monero_open_tx.c b/src/monero_open_tx.c index b799781..6b63235 100644 --- a/src/monero_open_tx.c +++ b/src/monero_open_tx.c @@ -66,8 +66,8 @@ int monero_apdu_open_tx_cont() { cx_rng(G_monero_vstate.hmac_key, 32); #endif - monero_rng_mod_order(G_monero_vstate.r); - monero_ecmul_G(G_monero_vstate.R, G_monero_vstate.r); + monero_rng_mod_order(G_monero_vstate.r, sizeof(G_monero_vstate.r)); + monero_ecmul_G(G_monero_vstate.R, G_monero_vstate.r, sizeof(G_monero_vstate.R), sizeof(G_monero_vstate.r)); monero_io_insert(G_monero_vstate.R, 32); monero_io_insert_encrypt(G_monero_vstate.r, 32, TYPE_SCALAR); diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 0d6e0e4..058f757 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -113,11 +113,11 @@ int monero_apdu_mlsag_prehash_update() { } // check C = aH+kG - monero_unblind(v, k, AKout, G_monero_vstate.options & 0x03); - monero_ecmul_G(kG, k); + monero_unblind(v, k, AKout, G_monero_vstate.options & 0x03, sizeof(v), sizeof(k), sizeof(AKout)); + monero_ecmul_G(kG, k, sizeof(kG), sizeof(k)); if (!cx_math_is_zero(v, 32)) { - monero_ecmul_H(aH, v); - monero_ecadd(aH, kG, aH); + monero_ecmul_H(aH, v, sizeof(aH), sizeof(v)); + monero_ecadd(aH, kG, aH, sizeof(aH), sizeof(kG), sizeof(aH)); } else { memcpy(aH, kG, 32); } @@ -144,7 +144,7 @@ int monero_apdu_mlsag_prehash_update() { // ask user uint64_t amount; - amount = monero_bamount2uint64(v); + amount = monero_bamount2uint64(v, sizeof(v)); if (amount) { monero_amount2str(amount, G_monero_vstate.ux_amount, 15); diff --git a/src/monero_proof.c b/src/monero_proof.c index b6c82de..b413f86 100644 --- a/src/monero_proof.c +++ b/src/monero_proof.c @@ -37,6 +37,7 @@ int monero_apdu_get_tx_proof() { unsigned char sig_r[32]; unsigned char sep[32]; #define k (G_monero_vstate.tmp + 256) +#define k_len (sizeof(G_monero_vstate.tmp) - 256) msg = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; monero_io_skip(32); @@ -53,7 +54,7 @@ int monero_apdu_get_tx_proof() { monero_io_discard(0); // Generate random k - monero_rng_mod_order(k); + monero_rng_mod_order(k, k_len); // tmp = msg memcpy(G_monero_vstate.tmp + 32 * 0, msg, 32); // tmp = msg || D @@ -61,16 +62,16 @@ int monero_apdu_get_tx_proof() { if (G_monero_vstate.options & 1) { // X = kB - monero_ecmul_k(XY, B, k); + monero_ecmul_k(XY, B, k, sizeof(XY), 32, k_len); } else { // X = kG - monero_ecmul_G(XY, k); + monero_ecmul_G(XY, k, sizeof(XY), k_len); } // tmp = msg || D || X memcpy(G_monero_vstate.tmp + 32 * 2, XY, 32); // Y = kA - monero_ecmul_k(XY, A, k); + monero_ecmul_k(XY, A, k, sizeof(XY), 32, k_len); // tmp = msg || D || X || Y memcpy(G_monero_vstate.tmp + 32 * 3, XY, 32); monero_keccak_H((unsigned char *)"TXPROOF_V2", 10, sep); @@ -84,12 +85,12 @@ int monero_apdu_get_tx_proof() { memcpy(G_monero_vstate.tmp + 32 * 7, B, 32); // sig_c = H_n(tmp) - monero_hash_to_scalar(sig_c, &G_monero_vstate.tmp[0], 32 * 8); + monero_hash_to_scalar(sig_c, &G_monero_vstate.tmp[0], sizeof(sig_c), 32 * 8); // sig_c*r - monero_multm(XY, sig_c, r); + monero_multm(XY, sig_c, r, sizeof(XY), sizeof(sig_c), sizeof(r)); // sig_r = k - sig_c*r - monero_subm(sig_r, k, XY); + monero_subm(sig_r, k, XY, sizeof(sig_r), k_len, sizeof(r)); monero_io_insert(sig_c, 32); monero_io_insert(sig_r, 32); diff --git a/src/monero_stealth.c b/src/monero_stealth.c index a53d7ff..0ab5df0 100644 --- a/src/monero_stealth.c +++ b/src/monero_stealth.c @@ -42,7 +42,7 @@ int monero_apdu_stealth() { monero_io_discard(0); // Compute Dout - monero_generate_key_derivation(drv, pub, sec); + monero_generate_key_derivation(drv, pub, sec, sizeof(drv), sizeof(pub), sizeof(sec)); // compute mask drv[32] = ENCRYPTED_PAYMENT_ID_TAIL; From 988ad2dae6e24b2c3fc936fa2b28ca6dfbf0b1dd Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Mon, 23 Oct 2023 09:33:22 +0200 Subject: [PATCH 109/142] clean: remove THROWs --- src/monero_api.h | 30 ++++----- src/monero_blind.c | 19 +++++- src/monero_clsag.c | 25 ++++++-- src/monero_crypto.c | 105 +++++++++++++++++++------------ src/monero_dispatch.c | 108 +++++++++++++++++++------------ src/monero_init.c | 26 ++++---- src/monero_io.c | 89 +++++++++++++------------- src/monero_key.c | 143 ++++++++++++++++++++++++++++++++---------- src/monero_main.c | 61 +++++++----------- src/monero_mlsag.c | 26 ++++++-- src/monero_monero.c | 6 +- src/monero_open_tx.c | 3 +- src/monero_prefix.c | 20 ++++-- src/monero_prehash.c | 18 ++++-- src/monero_proof.c | 6 +- src/monero_stealth.c | 6 +- src/monero_ux_nano.c | 8 ++- src/monero_ux_stax.c | 9 ++- 18 files changed, 458 insertions(+), 250 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index d105188..9ab8d1a 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -21,12 +21,13 @@ #include "monero_vars.h" +void send_error_and_kill_app(int sw); int monero_apdu_reset(void); int monero_apdu_lock(void); -void monero_lock_and_throw(int sw) __attribute__((noreturn)); +void monero_lock(int sw); void monero_install(unsigned char netId); -void monero_init(void); +unsigned int monero_init(void); int monero_init_private_key(void); void monero_wipe_private_key(void); @@ -91,7 +92,7 @@ void ui_menu_main_display(void); void ui_menu_show_security_error(void); void ui_menu_show_tx_aborted(void); void ui_export_viewkey_display(unsigned int value); -void ui_menu_any_pubaddr_display(unsigned int value, unsigned char *pub_view, +int ui_menu_any_pubaddr_display(unsigned int value, unsigned char *pub_view, unsigned char *pub_spend, unsigned char is_subbadress, unsigned char *paymanetID); void ui_menu_pubaddr_display(unsigned int value); @@ -118,7 +119,7 @@ int monero_bamount2str(unsigned char *binary, char *str, size_t binary_len, unsi int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len); /** uint64 amount to str */ -void monero_uint642str(uint64_t val, char *str, unsigned int str_len); +unsigned int monero_uint642str(uint64_t val, char *str, unsigned int str_len); int monero_abort_tx(void); int monero_unblind(unsigned char *v, unsigned char *k, unsigned char *AKout, @@ -156,7 +157,7 @@ void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size */ void monero_generate_key_derivation(unsigned char *drv_data, unsigned char *P, unsigned char *scalar, size_t drv_data_len, size_t P_len, size_t scalar_len); -void monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, +int monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, unsigned int out_idx, size_t scalar_len, size_t drv_data_len); /* * compute x = Hps(drv_data,out_idx) + ec_pv @@ -165,7 +166,7 @@ void monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, * drv_data [in] 32 bytes derivation data (point) * ec_pv [in] 32 bytes private key */ -void monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, +int monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, unsigned char *ec_priv, size_t x_len, size_t drv_data_len, size_t ec_priv_len); /* * compute x = Hps(drv_data,out_idx)*G + ec_pub @@ -174,11 +175,11 @@ void monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigne * drv_data [in] 32 bytes derivation data (point) * ec_pub [in] 32 bytes public key */ -void monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, +int monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, unsigned char *ec_pub, size_t x_len, size_t drv_data_len, size_t ec_pub_len); void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, size_t ec_priv_len); void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x, size_t img_len, size_t x_len); -void monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_data[static 32], +int monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_data[static 32], unsigned int out_idx); void monero_derive_subaddress_public_key(unsigned char *x, unsigned char *pub, @@ -253,22 +254,22 @@ static inline int monero_sha256_outkeys_final(unsigned char *out) { /* * check 10 --- */ /* ----------------------------------------------------------------------- */ -unsigned int monero_encode_varint(unsigned char *varint, unsigned int max_len, uint64_t value) { - unsigned int len; - len = 0; - if (!varint) { +unsigned int monero_encode_varint(unsigned char *varint, unsigned int max_len, uint64_t value, unsigned int* out_len) { + if (!varint || !out_len) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return 0; + return SW_WRONG_DATA; } + + *out_len = 0; while (value >= 0x80) { - if (len == (max_len - 1)) { - THROW(SW_WRONG_DATA_RANGE); + if (*out_len == (max_len - 1)) { + return SW_WRONG_DATA_RANGE; } - varint[len] = (value & 0x7F) | 0x80; + varint[*out_len] = (value & 0x7F) | 0x80; value = value >> 7; - len++; + *out_len = *out_len + 1; } - varint[len] = value; - return len + 1; + varint[*out_len] = value; + *out_len = *out_len + 1; + return 0; + } /* ----------------------------------------------------------------------- */ /* --- assert: max_len>0 --- */ /* ----------------------------------------------------------------------- */ -unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, uint64_t *value) { +unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, uint64_t *value, unsigned int* out_len) { uint64_t v; size_t len; v = 0; len = 0; - if (!varint) { + if (!varint || !out_len) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return 0; + return SW_WRONG_DATA; } while ((varint[len]) & 0x80) { if (len == (max_len - 1)) { - THROW(SW_WRONG_DATA_RANGE); + return SW_WRONG_DATA_RANGE; } v = v + ((uint64_t)((varint[len]) & 0x7f) << (len * 7)); len++; @@ -126,7 +128,8 @@ unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, u v = v + ((uint64_t)((varint[len]) & 0x7f) << (len * 7)); *value = v; - return len + 1; + *out_len = len + 1; + return 0; } /* ----------------------------------------------------------------------- */ @@ -495,49 +498,63 @@ void monero_generate_key_derivation(unsigned char *drv_data, unsigned char *P, /* ----------------------------------------------------------------------- */ /* --- ok --- */ /* ----------------------------------------------------------------------- */ -void monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, +int monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, unsigned int out_idx, size_t scalar_len, size_t drv_data_len) { unsigned char varint[32 + 8]; unsigned int len_varint; + int error = 0; if (drv_data_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } memcpy(varint, drv_data, 32); - len_varint = monero_encode_varint(varint + 32, 8, out_idx); + error = monero_encode_varint(varint + 32, 8, out_idx, &len_varint); + if (error) { + return error; + } len_varint += 32; monero_keccak_F(varint, len_varint, varint); monero_reduce(scalar, varint, scalar_len, sizeof(varint)); + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, +int monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, unsigned char *ec_priv, size_t x_len, size_t drv_data_len, size_t ec_priv_len) { unsigned char tmp[32]; + int error; // derivation to scalar - monero_derivation_to_scalar(tmp, drv_data, out_idx, sizeof(tmp), drv_data_len); + error = monero_derivation_to_scalar(tmp, drv_data, out_idx, sizeof(tmp), drv_data_len); + if (error) { + return error; + } // generate monero_addm(x, tmp, ec_priv, x_len, sizeof(tmp), ec_priv_len); + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, +int monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, unsigned char *ec_pub, size_t x_len, size_t drv_data_len, size_t ec_pub_len) { unsigned char tmp[32]; // derivation to scalar - monero_derivation_to_scalar(tmp, drv_data, out_idx, sizeof(tmp), drv_data_len); + int error = monero_derivation_to_scalar(tmp, drv_data, out_idx, sizeof(tmp), drv_data_len); + if (error) { + return error; + } // generate monero_ecmul_G(tmp, tmp, sizeof(tmp), sizeof(tmp)); monero_ecadd(x, tmp, ec_pub, x_len, sizeof(tmp), ec_pub_len); + return 0; } /* ----------------------------------------------------------------------- */ @@ -559,17 +576,22 @@ void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned ch /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_data[static 32], +int monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_data[static 32], unsigned int out_idx) { unsigned char varint[8 + 32 + 8]; unsigned int len_varint; + int error = 0; memcpy(varint, "view_tag", 8); memcpy(varint + 8, drv_data, 32); - len_varint = monero_encode_varint(varint + 8 + 32, 8, out_idx); + error = monero_encode_varint(varint + 8 + 32, 8, out_idx, &len_varint); + if (error) { + return error; + } len_varint += 8 + 32; monero_keccak_F(varint, len_varint, varint); *view_tag = varint[0]; + return 0; } /* ======================================================================= */ @@ -645,23 +667,25 @@ void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_check_scalar_range_1N(unsigned char *s, size_t s_len) { +unsigned int monero_check_scalar_range_1N(unsigned char *s, size_t s_len) { unsigned char x[32]; monero_reverse32(x, s, sizeof(x), s_len); int diff; cx_math_cmp_no_throw(x, C_ED25519_ORDER, 32, &diff); if (cx_math_is_zero(x, 32) || diff >= 0) { - THROW(SW_WRONG_DATA_RANGE); + return SW_WRONG_DATA_RANGE; } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_check_scalar_not_null(unsigned char *s) { +unsigned int monero_check_scalar_not_null(unsigned char *s) { if (cx_math_is_zero(s, 32)) { - THROW(SW_WRONG_DATA_RANGE); + return SW_WRONG_DATA_RANGE; } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ @@ -972,13 +996,13 @@ void monero_rng_mod_order(unsigned char *r, size_t r_len) { /* --- --- */ /* ----------------------------------------------------------------------- */ /* return 0 if ok, 1 if missing decimal */ -void monero_uint642str(uint64_t val, char *str, unsigned int str_len) { +unsigned int monero_uint642str(uint64_t val, char *str, unsigned int str_len) { char stramount[22]; unsigned int offset, len; if (!str) { PRINTF("%d \n\n", __LINE__); - return; + return SW_WRONG_DATA; } memset(str, 0, str_len); @@ -990,9 +1014,10 @@ void monero_uint642str(uint64_t val, char *str, unsigned int str_len) { } len = sizeof(stramount) - offset; if (len > str_len) { - THROW(SW_WRONG_DATA_RANGE); + return SW_WRONG_DATA_RANGE; } memcpy(str, stramount + offset, len); + return 0; } /* ----------------------------------------------------------------------- */ @@ -1002,11 +1027,11 @@ void monero_uint642str(uint64_t val, char *str, unsigned int str_len) { int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { // max uint64 is 18446744073709551616, aka 20 char, plus dot char stramount[22]; - unsigned int offset, len, ov; + unsigned int offset, len; if (!str) { PRINTF("%d \n\n", __LINE__); - return -1; + return SW_WRONG_DATA; } memset(str, 0, str_len); @@ -1015,7 +1040,7 @@ int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { // special case if (xmr == 0) { str[0] = '0'; - return 1; + return 0; } // uint64 units to str @@ -1046,13 +1071,11 @@ int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { len--; } len = len - offset + 1; - ov = 0; if (len > (str_len - 1)) { len = str_len - 1; - ov = 1; } memcpy(str, stramount + offset, len); - return ov; + return 0; } /* ----------------------------------------------------------------------- */ @@ -1084,6 +1107,10 @@ int monero_bamount2str(unsigned char *binary, char *str, size_t binary_len, unsi /* ----------------------------------------------------------------------- */ int monero_vamount2str(unsigned char *binary, char *str, unsigned int str_len) { uint64_t amount; - monero_decode_varint(binary, 8, &amount); + unsigned int out_len; + unsigned int error = monero_decode_varint(binary, 8, &amount, &out_len); + if (error) { + return error; + } return monero_amount2str(amount, str, str_len); } diff --git a/src/monero_dispatch.c b/src/monero_dispatch.c index 4280260..6ecc8e1 100644 --- a/src/monero_dispatch.c +++ b/src/monero_dispatch.c @@ -238,10 +238,13 @@ int monero_dispatch() { case INS_OPEN_TX: // state machine check if (G_monero_vstate.tx_state_ins != 0) { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } // 2. command process sw = monero_apdu_open_tx(); + if (sw != 0 && sw != SW_OK) { + return sw; + } update_protocol(); break; @@ -255,7 +258,7 @@ int monero_dispatch() { // 1. state machine check if (G_monero_vstate.tx_in_progress != 0) { // Change sig mode during transacation is not allowed - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } // 2. command process sw = monero_apdu_set_signature_mode(); @@ -267,14 +270,17 @@ int monero_dispatch() { if (G_monero_vstate.tx_in_progress == 1) { if ((G_monero_vstate.tx_state_ins != INS_OPEN_TX) && (G_monero_vstate.tx_state_ins != INS_STEALTH)) { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } if ((G_monero_vstate.io_p1 != 0) || (G_monero_vstate.io_p2 != 0)) { - THROW(SW_WRONG_P1P2); + return SW_WRONG_P1P2; } } // 2. command process sw = monero_apdu_stealth(); + if (sw != 0 && sw != SW_OK) { + return sw; + } if (G_monero_vstate.tx_in_progress == 1) { update_protocol(); } @@ -286,20 +292,23 @@ int monero_dispatch() { if ((G_monero_vstate.tx_state_ins != INS_OPEN_TX) && (G_monero_vstate.tx_state_ins != INS_GEN_TXOUT_KEYS) && (G_monero_vstate.tx_state_ins != INS_STEALTH)) { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } if (G_monero_vstate.protocol == 3) { if ((G_monero_vstate.tx_state_ins != INS_OPEN_TX) && (G_monero_vstate.tx_state_ins != INS_GEN_TXOUT_KEYS) && (G_monero_vstate.tx_state_ins != INS_STEALTH)) { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } } if ((G_monero_vstate.io_p1 != 0) || (G_monero_vstate.io_p2 != 0)) { - THROW(SW_WRONG_P1P2); + return SW_WRONG_P1P2; } // 2. command process sw = monero_apu_generate_txout_keys(); + if (sw != 0 && sw != SW_OK) { + return sw; + } update_protocol(); break; @@ -308,7 +317,7 @@ int monero_dispatch() { // 1. state machine check if ((G_monero_vstate.tx_state_ins != INS_GEN_TXOUT_KEYS) && (G_monero_vstate.tx_state_ins != INS_PREFIX_HASH)) { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } // init prefixhash state machine if (G_monero_vstate.tx_state_ins == INS_GEN_TXOUT_KEYS) { @@ -319,19 +328,19 @@ int monero_dispatch() { // check new state is allowed if (G_monero_vstate.tx_state_p1 == 0) { if (1 != G_monero_vstate.io_p1) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } else if (G_monero_vstate.tx_state_p1 == 1) { if ((G_monero_vstate.io_p1 != 2) || (G_monero_vstate.io_p2 != 1)) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } else if (G_monero_vstate.tx_state_p1 == 2) { if ((G_monero_vstate.io_p1 != 2) || (G_monero_vstate.io_p2 - 1 != G_monero_vstate.tx_state_p2)) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } else { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } // 2. command process if (G_monero_vstate.io_p1 == 1) { @@ -339,7 +348,10 @@ int monero_dispatch() { } else if (G_monero_vstate.io_p1 == 2) { sw = monero_apdu_prefix_hash_update(); } else { - THROW(SW_WRONG_P1P2); + return SW_WRONG_P1P2; + } + if (sw != 0 && sw != SW_OK) { + return sw; } update_protocol(); break; @@ -350,15 +362,18 @@ int monero_dispatch() { if (G_monero_vstate.protocol == 3) { if ((G_monero_vstate.tx_state_ins != INS_PREFIX_HASH) && (G_monero_vstate.tx_state_ins != INS_GEN_COMMITMENT_MASK)) { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } } if ((G_monero_vstate.io_p1 != 0) || (G_monero_vstate.io_p2 != 0)) { - THROW(SW_WRONG_P1P2); + return SW_WRONG_P1P2; } // 2. command process sw = monero_apdu_gen_commitment_mask(); + if (sw != 0 && sw != SW_OK) { + return sw; + } update_protocol(); break; @@ -369,22 +384,25 @@ int monero_dispatch() { if (G_monero_vstate.protocol == 3) { if ((G_monero_vstate.tx_state_ins != INS_PREFIX_HASH) && (G_monero_vstate.tx_state_ins != INS_BLIND)) { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } } } else if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { if ((G_monero_vstate.tx_state_ins != INS_GEN_COMMITMENT_MASK) && (G_monero_vstate.tx_state_ins != INS_BLIND)) { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } } else { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } // 2. command process if ((G_monero_vstate.io_p1 != 0) || (G_monero_vstate.io_p2 != 0)) { - THROW(SW_WRONG_P1P2); + return SW_WRONG_P1P2; } sw = monero_apdu_blind(); + if (sw != 0 && sw != SW_OK) { + return sw; + } update_protocol(); break; @@ -393,7 +411,7 @@ int monero_dispatch() { // 1. state machine check if ((G_monero_vstate.tx_state_ins != INS_BLIND) && (G_monero_vstate.tx_state_ins != INS_VALIDATE)) { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } // init PREHASH state machine if (G_monero_vstate.tx_state_ins == INS_BLIND) { @@ -401,20 +419,20 @@ int monero_dispatch() { G_monero_vstate.tx_state_p1 = 1; G_monero_vstate.tx_state_p2 = 0; if ((G_monero_vstate.io_p1 != 1) || (G_monero_vstate.io_p2 != 1)) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } // check new state is allowed if (G_monero_vstate.tx_state_p1 == G_monero_vstate.io_p1) { if (G_monero_vstate.tx_state_p2 != G_monero_vstate.io_p2 - 1) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } else if (G_monero_vstate.tx_state_p1 == G_monero_vstate.io_p1 - 1) { if (1 != G_monero_vstate.io_p2) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } else { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } // 2. command process if (G_monero_vstate.io_p1 == 1) { @@ -424,7 +442,10 @@ int monero_dispatch() { } else if (G_monero_vstate.io_p1 == 3) { sw = monero_apdu_mlsag_prehash_finalize(); } else { - THROW(SW_WRONG_P1P2); + return SW_WRONG_P1P2; + } + if (sw != 0 && sw != SW_OK) { + return sw; } update_protocol(); break; @@ -435,28 +456,28 @@ int monero_dispatch() { if ((G_monero_vstate.tx_state_ins != INS_VALIDATE) && // (G_monero_vstate.tx_state_ins != INS_MLSAG) && // (G_monero_vstate.protocol != 3 && G_monero_vstate.protocol != 4)) { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } if (G_monero_vstate.tx_state_ins == INS_VALIDATE) { if ((G_monero_vstate.tx_state_p1 != 3) || (G_monero_vstate.io_p1 != 1) || (G_monero_vstate.io_p2 != 0)) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } else { if (G_monero_vstate.tx_state_p1 == 1) { if (2 != G_monero_vstate.io_p1) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } else if (G_monero_vstate.tx_state_p1 == 2) { if ((2 != G_monero_vstate.io_p1) && (3 != G_monero_vstate.io_p1)) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } else if (G_monero_vstate.tx_state_p1 == 3) { if (1 != G_monero_vstate.io_p1) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } else { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } } @@ -468,7 +489,10 @@ int monero_dispatch() { } else if (G_monero_vstate.io_p1 == 3) { sw = monero_apdu_mlsag_sign(); } else { - THROW(SW_WRONG_P1P2); + return SW_WRONG_P1P2; + } + if (sw != 0 && sw != SW_OK) { + return sw; } update_protocol(); break; @@ -479,28 +503,28 @@ int monero_dispatch() { if ((G_monero_vstate.tx_state_ins != INS_VALIDATE) && // (G_monero_vstate.tx_state_ins != INS_CLSAG) && // (G_monero_vstate.protocol != 4)) { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } if (G_monero_vstate.tx_state_ins == INS_VALIDATE) { if ((G_monero_vstate.tx_state_p1 != 3) || (G_monero_vstate.io_p1 != 1) || (G_monero_vstate.io_p2 != 0)) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } else { if (G_monero_vstate.tx_state_p1 == 1) { if (2 != G_monero_vstate.io_p1) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } else if (G_monero_vstate.tx_state_p1 == 2) { if ((2 != G_monero_vstate.io_p1) && (3 != G_monero_vstate.io_p1)) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } else if (G_monero_vstate.tx_state_p1 == 3) { if (1 != G_monero_vstate.io_p1) { - THROW(SW_SUBCOMMAND_NOT_ALLOWED); + return SW_SUBCOMMAND_NOT_ALLOWED; } } else { - THROW(SW_COMMAND_NOT_ALLOWED); + return SW_COMMAND_NOT_ALLOWED; } } @@ -512,7 +536,10 @@ int monero_dispatch() { } else if (G_monero_vstate.io_p1 == 3) { sw = monero_apdu_clsag_sign(); } else { - THROW(SW_WRONG_P1P2); + return SW_WRONG_P1P2; + } + if (sw != 0 && sw != SW_OK) { + return sw; } update_protocol(); break; @@ -520,8 +547,7 @@ int monero_dispatch() { /* --- KEYS --- */ default: - THROW(SW_INS_NOT_SUPPORTED); - break; + return SW_INS_NOT_SUPPORTED; } return sw; } diff --git a/src/monero_init.c b/src/monero_init.c index f6c8704..cbb4562 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -37,7 +37,7 @@ const unsigned char C_FAKE_SEC_SPEND_KEY[32] = { /* ----------------------------------------------------------------------- */ /* --- Boot --- */ /* ----------------------------------------------------------------------- */ -void monero_init() { +unsigned int monero_init() { memset(&G_monero_vstate, 0, sizeof(monero_v_state_t)); // first init ? @@ -53,12 +53,15 @@ void monero_init() { G_monero_vstate.protocol_barrier = PROTOCOL_UNLOCKED; // load key - if (!monero_init_private_key()) { + unsigned error = monero_init_private_key(); + if (error) { + return error; } // ux conf monero_init_ux(); // Let's go! G_monero_vstate.state = STATE_IDLE; + return 0; } /* ----------------------------------------------------------------------- */ @@ -88,7 +91,7 @@ int monero_init_private_key(void) { path[3] = 0x00000000; path[4] = 0x00000000; if (os_derive_bip32_no_throw(CX_CURVE_SECP256K1, path, 5, seed, chain)) { - return -1; + return SW_SECURITY_INTERNAL; } switch (N_monero_pstate->key_mode) { @@ -106,8 +109,7 @@ int monero_init_private_key(void) { break; default: - THROW(SW_SECURITY_LOAD_KEY); - return 1; + return SW_SECURITY_LOAD_KEY; } monero_ecmul_G(G_monero_vstate.A, G_monero_vstate.a, sizeof(G_monero_vstate.A), sizeof(G_monero_vstate.a)); monero_ecmul_G(G_monero_vstate.B, G_monero_vstate.b, sizeof(G_monero_vstate.B), sizeof(G_monero_vstate.b)); @@ -213,18 +215,21 @@ int monero_apdu_reset() { memset(client_version, '\0', 16); client_version_len = G_monero_vstate.io_length - G_monero_vstate.io_offset; if (client_version_len > 14) { - THROW(SW_CLIENT_NOT_SUPPORTED + 1); + return SW_CLIENT_NOT_SUPPORTED + 1; } monero_io_fetch((unsigned char*)&client_version[0], client_version_len); // Add '.' suffix to avoid 'X.1' prefixing 'X.10' client_version[client_version_len] = '.'; if (!is_client_version_valid(client_version)) { - THROW(SW_CLIENT_NOT_SUPPORTED); + return SW_CLIENT_NOT_SUPPORTED; } monero_io_discard(0); - monero_init(); + unsigned int error = monero_init(); + if (error) { + return error; + } monero_io_insert_u8(MONERO_VERSION_MAJOR); monero_io_insert_u8(MONERO_VERSION_MINOR); monero_io_insert_u8(MONERO_VERSION_MICRO); @@ -236,14 +241,13 @@ int monero_apdu_reset() { /* ----------------------------------------------------------------------- */ int monero_apdu_lock() { monero_io_discard(0); - monero_lock_and_throw(SW_SECURITY_LOCKED); + monero_lock(SW_SECURITY_LOCKED); return SW_SECURITY_LOCKED; } -void monero_lock_and_throw(int sw) { +void monero_lock(int sw) { G_monero_vstate.protocol_barrier = PROTOCOL_LOCKED; snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "Security Err"); snprintf(G_monero_vstate.ux_info2, sizeof(G_monero_vstate.ux_info2), "%x", sw); ui_menu_show_security_error(); - THROW(sw); } diff --git a/src/monero_io.c b/src/monero_io.c index f7ec4f4..5d428db 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -38,18 +38,6 @@ /* ----------------------------------------------------------------------- */ /* MISC */ /* ----------------------------------------------------------------------- */ -void monero_io_set_offset(unsigned int offset) { - if (offset == IO_OFFSET_END) { - G_monero_vstate.io_offset = G_monero_vstate.io_length; - } else if (offset == IO_OFFSET_MARK) { - G_monero_vstate.io_offset = G_monero_vstate.io_mark; - } else if (offset < G_monero_vstate.io_length) { - G_monero_vstate.io_offset = offset; - } else { - THROW(ERROR_IO_OFFSET); - } -} - void monero_io_mark(void) { G_monero_vstate.io_mark = G_monero_vstate.io_offset; } @@ -88,7 +76,7 @@ void monero_io_hole(unsigned int sz) { void monero_io_insert(unsigned char const* buff, unsigned int len) { if (!buff) { - return; + THROW(SW_WRONG_DATA); } monero_io_hole(len); memcpy(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, buff, len); @@ -97,7 +85,7 @@ void monero_io_insert(unsigned char const* buff, unsigned int len) { void monero_io_insert_hmac_for(unsigned char* buffer, int len, int type) { if (!buffer) { - return; + THROW(SW_WRONG_DATA); } // for now, only 32bytes block are allowed if (len != 32) { @@ -125,7 +113,7 @@ void monero_io_insert_hmac_for(unsigned char* buffer, int len, int type) { void monero_io_insert_encrypt(unsigned char* buffer, size_t len, int type) { if (!buffer) { - return; + THROW(SW_WRONG_DATA); } // for now, only 32bytes block are allowed @@ -229,21 +217,21 @@ void monero_io_skip(int len) { int monero_io_fetch(unsigned char* buffer, int len) { monero_io_assert_available(len); if (!buffer) { - return 0; + THROW(SW_WRONG_DATA); } memcpy(buffer, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len); G_monero_vstate.io_offset += len; return len; } -static void monero_io_verify_hmac_for(const unsigned char* buffer, int len, +static int monero_io_verify_hmac_for(const unsigned char* buffer, int len, unsigned char* expected_hmac, int type) { if (!buffer || !expected_hmac) { - return; + return SW_WRONG_DATA; } // for now, only 32bytes block allowed if (len != 32) { - THROW(SW_WRONG_DATA); + return SW_WRONG_DATA; } unsigned char hmac[37]; @@ -262,21 +250,27 @@ static void monero_io_verify_hmac_for(const unsigned char* buffer, int len, } cx_hmac_sha256(G_monero_vstate.hmac_key, 32, hmac, 37, hmac, 32); if (memcmp(hmac, expected_hmac, 32) != 0) { - monero_lock_and_throw(SW_SECURITY_HMAC); + monero_lock(SW_SECURITY_HMAC); + return SW_SECURITY_HMAC; } + return 0; } -int monero_io_fetch_decrypt(unsigned char* buffer, int len, int type) { +int monero_io_fetch_decrypt(unsigned char* buffer, size_t len, int type) { + int error = 0; // for now, only 32bytes block allowed if (len != 32) { - THROW(SW_WRONG_LENGTH); + return SW_WRONG_LENGTH; } if (G_monero_vstate.tx_in_progress) { monero_io_assert_available(len + 32); - monero_io_verify_hmac_for(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len, + error = monero_io_verify_hmac_for(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len, G_monero_vstate.io_buffer + G_monero_vstate.io_offset + len, type); + if (error) { + return error; + } } else { monero_io_assert_available(len); } @@ -300,27 +294,26 @@ int monero_io_fetch_decrypt(unsigned char* buffer, int len, int type) { if (buffer) { switch (type) { case TYPE_SCALAR: - monero_check_scalar_range_1N(buffer, len); - break; + return monero_check_scalar_range_1N(buffer, len); case TYPE_AMOUNT_KEY: case TYPE_DERIVATION: case TYPE_ALPHA: - monero_check_scalar_not_null(buffer); - break; + return monero_check_scalar_not_null(buffer); default: - THROW(SW_SECURITY_INTERNAL); + return SW_SECURITY_INTERNAL; } } - return len; + return error; } int monero_io_fetch_decrypt_key(unsigned char* buffer, size_t buffer_size) { unsigned char* k; + int error = 0; if (!buffer) { - return -1; + return SW_WRONG_DATA; } if (buffer_size > 32) { - return -1; + return SW_WRONG_DATA_RANGE; } monero_io_assert_available(32); @@ -330,13 +323,16 @@ int monero_io_fetch_decrypt_key(unsigned char* buffer, size_t buffer_size) { G_monero_vstate.io_offset += 32; if (G_monero_vstate.tx_in_progress) { monero_io_assert_available(32); - monero_io_verify_hmac_for(C_FAKE_SEC_VIEW_KEY, 32, + error = monero_io_verify_hmac_for(C_FAKE_SEC_VIEW_KEY, 32, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, TYPE_SCALAR); + if (error) { + return error; + } G_monero_vstate.io_offset += 32; } memcpy(buffer, G_monero_vstate.a, 32); - return 32; + return 0; } // spend? else if (memcmp(k, C_FAKE_SEC_SPEND_KEY, 32) == 0) { @@ -346,17 +342,20 @@ int monero_io_fetch_decrypt_key(unsigned char* buffer, size_t buffer_size) { // case INS_GET_SUBADDRESS_SPEND_PUBLIC_KEY: break; default: - THROW(SW_WRONG_DATA); + return SW_WRONG_DATA; } G_monero_vstate.io_offset += 32; if (G_monero_vstate.tx_in_progress) { monero_io_assert_available(32); - monero_io_verify_hmac_for(C_FAKE_SEC_SPEND_KEY, 32, + error = monero_io_verify_hmac_for(C_FAKE_SEC_SPEND_KEY, 32, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, TYPE_SCALAR); + if (error) { + return error; + } } memcpy(buffer, G_monero_vstate.b, 32); - return 32; + return 0; } // else else { @@ -364,12 +363,16 @@ int monero_io_fetch_decrypt_key(unsigned char* buffer, size_t buffer_size) { } } -uint64_t monero_io_fetch_varint(void) { - uint64_t v64; - G_monero_vstate.io_offset += - monero_decode_varint(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, - MIN(8, G_monero_vstate.io_length - G_monero_vstate.io_offset), &v64); - return v64; +int monero_io_fetch_varint(uint64_t* out_v64) { + // COUOCU + if (!out_v64) { + return SW_WRONG_DATA; + } + unsigned int out_len = 0; + unsigned int error = monero_decode_varint(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, + MIN(8, G_monero_vstate.io_length - G_monero_vstate.io_offset), out_v64, &out_len); + G_monero_vstate.io_offset += out_len; + return error; } unsigned int monero_io_fetch_u32(void) { @@ -463,7 +466,7 @@ int monero_io_do(unsigned int io_flags) { else { G_monero_vstate.io_offset = 0; if (G_monero_vstate.io_length > MAX_OUT) { - THROW(SW_IO_FULL); + return SW_IO_FULL; } memcpy(G_io_apdu_buffer, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, G_monero_vstate.io_length); diff --git a/src/monero_key.c b/src/monero_key.c index 1eddc95..8551a2f 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -85,13 +85,13 @@ void monero_clear_words(void) { * word_list * len : word_list length */ -static void monero_set_word(unsigned int n, unsigned int idx, unsigned int w_start, +static int monero_set_word(unsigned int n, unsigned int idx, unsigned int w_start, unsigned char *word_list, int len) { while (w_start < idx) { len -= 1 + word_list[0]; if (len < 0) { monero_clear_words(); - THROW(SW_WRONG_DATA + 1); + return SW_WRONG_DATA + 1; } word_list += 1 + word_list[0]; w_start++; @@ -99,11 +99,12 @@ static void monero_set_word(unsigned int n, unsigned int idx, unsigned int w_sta if ((w_start != idx) || (word_list[0] > (len - 1)) || (word_list[0] > 19)) { monero_clear_words(); - THROW(SW_WRONG_DATA + 2); + return SW_WRONG_DATA + 2; } len = word_list[0]; word_list++; monero_nvm_write((void *)N_monero_pstate->words[n], word_list, len); + return 0; } #define word_list_length 1626 @@ -112,6 +113,7 @@ static void monero_set_word(unsigned int n, unsigned int idx, unsigned int w_sta int monero_apdu_manage_seedwords(void) { unsigned int w_start, w_end; unsigned short wc[4]; + int err = 0; switch (G_monero_vstate.io_p1) { // SETUP @@ -119,7 +121,7 @@ int monero_apdu_manage_seedwords(void) { w_start = monero_io_fetch_u32(); w_end = w_start + monero_io_fetch_u32(); if ((w_start >= word_list_length) || (w_end > word_list_length) || (w_start > w_end)) { - THROW(SW_WRONG_DATA); + return SW_WRONG_DATA; } for (int i = 0; i < 8; i++) { unsigned int val = (seed[i * 4 + 0] << 0) | (seed[i * 4 + 1] << 8) | @@ -130,9 +132,12 @@ int monero_apdu_manage_seedwords(void) { for (int wi = 0; wi < 3; wi++) { if ((wc[wi] >= w_start) && (wc[wi] < w_end)) { - monero_set_word(i * 3 + wi, wc[wi], w_start, + err = monero_set_word(i * 3 + wi, wc[wi], w_start, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, MONERO_IO_BUFFER_LENGTH - G_monero_vstate.io_offset); + if (err) { + return err; + } } } } @@ -208,7 +213,7 @@ int monero_apdu_display_address() { major = (index[0] << 0) | (index[1] << 8) | (index[2] << 16) | (index[3] << 24); minor = (index[4] << 0) | (index[5] << 8) | (index[6] << 16) | (index[7] << 24); if ((minor | major) && (G_monero_vstate.io_p1 == 1)) { - THROW(SW_WRONG_DATA); + return SW_WRONG_DATA; } // retrieve pub keys @@ -259,7 +264,6 @@ int monero_apdu_put_key() { // option + priv/pub view key + priv/pub spend key + base58 address if (G_monero_vstate.io_length != (1 + 32 * 2 + 32 * 2 + 95)) { - THROW(SW_WRONG_LENGTH); return SW_WRONG_LENGTH; } @@ -268,7 +272,6 @@ int monero_apdu_put_key() { monero_io_fetch(pub, 32); monero_ecmul_G(raw, sec, sizeof(raw), sizeof(sec)); if (memcmp(pub, raw, 32) != 0) { - THROW(SW_WRONG_DATA); return SW_WRONG_DATA; } nvm_write((void *)N_monero_pstate->a, sec, 32); @@ -278,7 +281,6 @@ int monero_apdu_put_key() { monero_io_fetch(pub, 32); monero_ecmul_G(raw, sec, sizeof(raw), sizeof(sec)); if (memcmp(pub, raw, 32) != 0) { - THROW(SW_WRONG_DATA); return SW_WRONG_DATA; } nvm_write((void *)N_monero_pstate->b, sec, 32); @@ -353,7 +355,7 @@ int monero_apdu_get_key() { #endif default: - THROW(SW_WRONG_P1P2); + return SW_WRONG_P1P2; } return SW_OK; } @@ -366,8 +368,12 @@ int monero_apdu_verify_key() { unsigned char priv[32]; unsigned char computed_pub[32]; unsigned int verified = 0; + int err = 0; - monero_io_fetch_decrypt_key(priv, sizeof(priv)); + err = monero_io_fetch_decrypt_key(priv, sizeof(priv)); + if (err) { + return err; + } monero_io_fetch(pub, 32); switch (G_monero_vstate.io_p1) { case 0: @@ -380,7 +386,7 @@ int monero_apdu_verify_key() { memcpy(computed_pub, G_monero_vstate.B, 32); break; default: - THROW(SW_WRONG_P1P2); + return SW_WRONG_P1P2; } if (memcmp(computed_pub, pub, 32) == 0) { verified = 1; @@ -416,9 +422,16 @@ int monero_apdu_sc_add(/*unsigned char *r, unsigned char *s1, unsigned char *s2* unsigned char s1[32]; unsigned char s2[32]; unsigned char r[32]; + int err; // fetch - monero_io_fetch_decrypt(s1, 32, TYPE_SCALAR); - monero_io_fetch_decrypt(s2, 32, TYPE_SCALAR); + err = monero_io_fetch_decrypt(s1, 32, TYPE_SCALAR); + if (err) { + return err; + } + err = monero_io_fetch_decrypt(s2, 32, TYPE_SCALAR); + if (err) { + return err; + } monero_io_discard(0); if (G_monero_vstate.tx_in_progress) { // During a transaction, only "last_derive_secret_key+last_get_subaddress_secret_key" @@ -428,7 +441,8 @@ int monero_apdu_sc_add(/*unsigned char *r, unsigned char *s1, unsigned char *s2* // hwdev.sc_secret_add(scalar_step2, scalar_step1,subaddr_sk); if ((memcmp(s1, G_monero_vstate.last_derive_secret_key, 32) != 0) || (memcmp(s2, G_monero_vstate.last_get_subaddress_secret_key, 32) != 0)) { - monero_lock_and_throw(SW_WRONG_DATA); + monero_lock(SW_WRONG_DATA); + return SW_WRONG_DATA; } } monero_addm(r, s1, s2, sizeof(r), sizeof(s1), sizeof(s2)); @@ -443,9 +457,14 @@ int monero_apdu_scal_mul_key(/*const rct::key &pub, const rct::key &sec, rct::ke unsigned char pub[32]; unsigned char sec[32]; unsigned char r[32]; + int err = 0; + // fetch monero_io_fetch(pub, 32); - monero_io_fetch_decrypt_key(sec, sizeof(sec)); + err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); + if (err) { + return err; + } monero_io_discard(0); monero_ecmul_k(r, pub, sec, sizeof(r), sizeof(pub), sizeof(sec)); @@ -459,8 +478,12 @@ int monero_apdu_scal_mul_key(/*const rct::key &pub, const rct::key &sec, rct::ke int monero_apdu_scal_mul_base(/*const rct::key &sec, rct::key mulkey*/) { unsigned char sec[32]; unsigned char r[32]; + int err; // fetch - monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); + err = monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); + if (err) { + return err; + } monero_io_discard(0); monero_ecmul_G(r, sec, sizeof(r), sizeof(sec)); @@ -490,7 +513,10 @@ int monero_apdu_secret_key_to_public_key( unsigned char sec[32]; unsigned char pub[32]; // fetch - monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); + int err = monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); + if (err) { + return err; + } monero_io_discard(0); // pub monero_ecmul_G(pub, sec, sizeof(pub), sizeof(sec)); @@ -506,9 +532,14 @@ int monero_apdu_generate_key_derivation(/*const crypto::public_key &pub, const c unsigned char pub[32]; unsigned char sec[32]; unsigned char drv[32]; + int err = 0; + // fetch monero_io_fetch(pub, 32); - monero_io_fetch_decrypt_key(sec, sizeof(sec)); + err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); + if (err) { + return err; + } monero_io_discard(0); @@ -529,7 +560,10 @@ int monero_apdu_derivation_to_scalar( unsigned char res[32]; // fetch - monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + int err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + if (err) { + return err; + } output_index = monero_io_fetch_u32(); monero_io_discard(0); @@ -551,13 +585,19 @@ int monero_apdu_derive_public_key(/*const crypto::key_derivation &derivation, co unsigned char drvpub[32]; // fetch - monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + int err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + if (err) { + return err; + } output_index = monero_io_fetch_u32(); monero_io_fetch(pub, 32); monero_io_discard(0); // pub - monero_derive_public_key(drvpub, derivation, output_index, pub, sizeof(drvpub), sizeof(derivation), sizeof(pub)); + int error = monero_derive_public_key(drvpub, derivation, output_index, pub, sizeof(drvpub), sizeof(derivation), sizeof(pub)); + if (error) { + return error; + } // pub key monero_io_insert(drvpub, 32); @@ -572,15 +612,25 @@ int monero_apdu_derive_secret_key(/*const crypto::key_derivation &derivation, co unsigned int output_index; unsigned char sec[32]; unsigned char drvsec[32]; + int err = 0; // fetch - monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + if (err) { + return err; + } output_index = monero_io_fetch_u32(); - monero_io_fetch_decrypt_key(sec, sizeof(sec)); + err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); + if (err) { + return err; + } monero_io_discard(0); // pub - monero_derive_secret_key(drvsec, derivation, output_index, sec, sizeof(drvsec), sizeof(derivation), sizeof(sec)); + err = monero_derive_secret_key(drvsec, derivation, output_index, sec, sizeof(drvsec), sizeof(derivation), sizeof(sec)); + if (err) { + return err; + } // sec key memcpy(G_monero_vstate.last_derive_secret_key, drvsec, 32); @@ -599,7 +649,10 @@ int monero_apdu_generate_key_image( // fetch monero_io_fetch(pub, 32); - monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); + int err = monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); + if (err) { + return err; + } monero_io_discard(0); // pub @@ -618,14 +671,21 @@ int monero_apdu_derive_view_tag( unsigned char derivation[32]; unsigned int output_index; unsigned char res[1]; + int err; // fetch - monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + if (err) { + return err; + } output_index = monero_io_fetch_u32(); monero_io_discard(0); // derive and keep - monero_derive_view_tag(res, derivation, output_index); + err = monero_derive_view_tag(res, derivation, output_index); + if (err) { + return err; + } monero_io_insert(res, 1); return SW_OK; @@ -642,7 +702,10 @@ int monero_apdu_derive_subaddress_public_key(/*const crypto::public_key &pub, co // fetch monero_io_fetch(pub, 32); - monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + int err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + if (err) { + return err; + } output_index = monero_io_fetch_u32(); monero_io_discard(0); @@ -703,8 +766,12 @@ int monero_apdu_get_subaddress_secret_key(/*const crypto::secret_key& sec, const unsigned char sec[32]; unsigned char index[8]; unsigned char sub_sec[32]; + int err = 0; - monero_io_fetch_decrypt_key(sec, sizeof(sec)); + err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); + if (err) { + return err; + } monero_io_fetch(index, 8); monero_io_discard(0); @@ -738,9 +805,13 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se unsigned char view_tag[1]; // TMP unsigned char derivation[32]; + int err = 0; monero_io_fetch_u32(); // skip tx_version - monero_io_fetch_decrypt_key(tx_key, sizeof(tx_key)); + err = monero_io_fetch_decrypt_key(tx_key, sizeof(tx_key)); + if (err) { + return err; + } txkey_pub = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; monero_io_skip(32); Aout = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; @@ -752,7 +823,10 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se is_subaddress = monero_io_fetch_u8(); need_additional_txkeys = monero_io_fetch_u8(); if (need_additional_txkeys) { - monero_io_fetch_decrypt_key(additional_txkey_sec, sizeof(additional_txkey_sec)); + err = monero_io_fetch_decrypt_key(additional_txkey_sec, sizeof(additional_txkey_sec)); + if (err) { + return err; + } } else { monero_io_skip(32); } @@ -801,7 +875,10 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se // compute view tag if (use_view_tags) { - monero_derive_view_tag(view_tag, derivation, output_index); + err = monero_derive_view_tag(view_tag, derivation, output_index); + if (err) { + return err; + } } // send all diff --git a/src/monero_main.c b/src/monero_main.c index c80966c..5629daa 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -36,53 +36,38 @@ /* --- Application Entry --- */ /* ----------------------------------------------------------------------- */ extern uint8_t G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; +void __attribute__((noreturn)) app_exit(void); void app_main(void) { - unsigned int io_flags, cont; + unsigned int io_flags; + unsigned int error; io_flags = 0; - cont = 1; - monero_init(); + error = monero_init(); + if (error) { + memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); + app_exit(); + } // set up initial screen ui_init(); - while (cont) { + for (;;) { volatile unsigned short sw = 0; - BEGIN_TRY { - TRY { - monero_io_do(io_flags); - sw = monero_dispatch(); - } - CATCH(EXCEPTION_IO_RESET) { - sw = 0; - cont = 0; - monero_io_discard(1); - } - CATCH_OTHER(e) { - monero_reset_tx(1); - if (((e & 0xF000) == 0x9000) || ((e & 0xFF00) == 0x6400)) { - sw = e; - } else { - monero_io_discard(1); - if ((e & 0xFFFF0000) || ((e & 0xF000) != 0x6000)) { - monero_io_insert_u32(e); - sw = 0x6f42; - } else { - sw = e; - } - } - } - FINALLY { - if (sw) { - monero_io_insert_u16(sw); - io_flags = 0; - } else { - io_flags = IO_ASYNCH_REPLY; - } - } + monero_io_do(io_flags); + sw = monero_dispatch(); + if (sw) { + monero_io_insert_u16(sw); + io_flags = 0; + } else { + io_flags = IO_ASYNCH_REPLY; + } + + if (sw != 0 && sw != SW_OK) { + monero_io_do(io_flags); + memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); + app_exit(); } - END_TRY; } } @@ -141,6 +126,8 @@ unsigned char io_event(unsigned char channel __attribute__((unused))) { if (s_before != s_after) { if (s_after == PIN_VERIFIED) { if (!monero_init_private_key()) { + memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); + app_exit(); } } else { ; // do nothing, allowing TX parsing in lock mode diff --git a/src/monero_mlsag.c b/src/monero_mlsag.c index ae19dcb..a3d4884 100644 --- a/src/monero_mlsag.c +++ b/src/monero_mlsag.c @@ -31,10 +31,12 @@ int monero_apdu_mlsag_prepare() { unsigned char xin[32]; unsigned char alpha[32]; unsigned char mul[32]; + int err; G_monero_vstate.tx_sign_cnt++; if (G_monero_vstate.tx_sign_cnt == 0) { - monero_lock_and_throw(SW_SECURITY_MAX_SIGNATURE_REACHED); + monero_lock(SW_SECURITY_MAX_SIGNATURE_REACHED); + return SW_SECURITY_MAX_SIGNATURE_REACHED; } if (G_monero_vstate.io_length > 1) { @@ -42,7 +44,10 @@ int monero_apdu_mlsag_prepare() { if (G_monero_vstate.options & 0x40) { monero_io_fetch(xin, 32); } else { - monero_io_fetch_decrypt(xin, 32, TYPE_SCALAR); + err = monero_io_fetch_decrypt(xin, 32, TYPE_SCALAR); + if (err) { + return err; + } } options = 1; } else { @@ -106,21 +111,30 @@ int monero_apdu_mlsag_sign() { unsigned char alpha[32]; unsigned char ss[32]; unsigned char ss2[32]; + int err; if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_FAKE) { monero_io_fetch(xin, 32); monero_io_fetch(alpha, 32); } else if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { - monero_io_fetch_decrypt(xin, 32, TYPE_SCALAR); - monero_io_fetch_decrypt(alpha, 32, TYPE_ALPHA); + err = monero_io_fetch_decrypt(xin, 32, TYPE_SCALAR); + if (err) { + return err; + } + err = monero_io_fetch_decrypt(alpha, 32, TYPE_ALPHA); + if (err) { + return err; + } } else { - monero_lock_and_throw(SW_SECURITY_INTERNAL); + monero_lock(SW_SECURITY_INTERNAL); + return SW_SECURITY_INTERNAL; } monero_io_discard(1); // check xin and alpha are not null if (cx_math_is_zero(xin, 32) || cx_math_is_zero(alpha, 32)) { - monero_lock_and_throw(SW_SECURITY_RANGE_VALUE); + monero_lock(SW_SECURITY_RANGE_VALUE); + return SW_SECURITY_RANGE_VALUE; } monero_reduce(ss, G_monero_vstate.c, sizeof(ss), sizeof(G_monero_vstate.c)); diff --git a/src/monero_monero.c b/src/monero_monero.c index 598a82b..52e0ed2 100644 --- a/src/monero_monero.c +++ b/src/monero_monero.c @@ -122,6 +122,7 @@ int monero_base58_public_key(char* str_b58, unsigned char* view, unsigned char* unsigned char data[72 + 8]; unsigned int offset; unsigned int prefix; + int error = 0; switch (N_monero_pstate->network_id) { case TESTNET: @@ -157,7 +158,10 @@ int monero_base58_public_key(char* str_b58, unsigned char* view, unsigned char* str_b58[0] = 0; return 0; } - offset = monero_encode_varint(data, 8, prefix); + error = monero_encode_varint(data, 8, prefix, &offset); + if (error) { + return error; + } memcpy(data + offset, spend, 32); memcpy(data + offset + 32, view, 32); diff --git a/src/monero_open_tx.c b/src/monero_open_tx.c index 6b63235..13d8857 100644 --- a/src/monero_open_tx.c +++ b/src/monero_open_tx.c @@ -114,7 +114,8 @@ int monero_apdu_set_signature_mode() { case TRANSACTION_CREATE_FAKE: break; default: - monero_lock_and_throw(SW_WRONG_DATA); + monero_lock(SW_WRONG_DATA); + return SW_WRONG_DATA; } G_monero_vstate.tx_sig_mode = sig_mode; diff --git a/src/monero_prefix.c b/src/monero_prefix.c index 54d5ed6..ddf9574 100644 --- a/src/monero_prefix.c +++ b/src/monero_prefix.c @@ -31,20 +31,32 @@ /* ----------------------------------------------------------------------- */ int monero_apdu_prefix_hash_init(void) { uint64_t timelock; + int error = 0; monero_keccak_update_H(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, G_monero_vstate.io_length - G_monero_vstate.io_offset); if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { - monero_io_fetch_varint(); - timelock = monero_io_fetch_varint(); + error = monero_io_fetch_varint(&timelock); // DUmmy call TODO + if (error) { + return error; + } + + error = monero_io_fetch_varint(&timelock); + if (error) { + return error; + } + if (monero_io_fetch_available() != 0) { - THROW(SW_WRONG_DATA); + return SW_WRONG_DATA; } // ask user monero_io_discard(1); if (timelock != 0) { - monero_uint642str(timelock, G_monero_vstate.ux_amount, 15); + error = monero_uint642str(timelock, G_monero_vstate.ux_amount, 15); + if (error) { + return error; + } ui_menu_timelock_validation_display(0); return 0; } else { diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 058f757..8f61dd2 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -71,6 +71,7 @@ int monero_apdu_mlsag_prehash_update() { #define aH AKout unsigned char kG[32]; + int err = 0; // fetch destination is_subaddress = monero_io_fetch_u8(); @@ -83,7 +84,10 @@ int monero_apdu_mlsag_prehash_update() { monero_io_skip(32); Bout = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; monero_io_skip(32); - monero_io_fetch_decrypt(AKout, 32, TYPE_AMOUNT_KEY); + err = monero_io_fetch_decrypt(AKout, 32, TYPE_AMOUNT_KEY); + if (err) { + return err; + } monero_io_fetch(C, 32); monero_io_fetch(k, 32); monero_io_fetch(v, 32); @@ -123,7 +127,8 @@ int monero_apdu_mlsag_prehash_update() { } if (memcmp(C, aH, 32) != 0) { #ifndef BYPASS_COMMITMENT_FOR_TESTS - monero_lock_and_throw(SW_SECURITY_COMMITMENT_CONTROL); + monero_lock(SW_SECURITY_COMMITMENT_CONTROL); + return SW_SECURITY_COMMITMENT_CHAIN_CONTROL; #endif } // update commitment hash control @@ -134,7 +139,8 @@ int monero_apdu_mlsag_prehash_update() { // finalize and check destination hash_control monero_sha256_outkeys_final(k); if (memcmp(k, G_monero_vstate.OUTK, 32) != 0) { - monero_lock_and_throw(SW_SECURITY_OUTKEYS_CHAIN_CONTROL); + monero_lock(SW_SECURITY_OUTKEYS_CHAIN_CONTROL); + return SW_SECURITY_COMMITMENT_CHAIN_CONTROL; } } // finalize commitment hash control @@ -189,7 +195,8 @@ int monero_apdu_mlsag_prehash_finalize() { monero_sha256_commitment_final(H); if (memcmp(H, G_monero_vstate.C, 32) != 0) { #ifndef BYPASS_COMMITMENT_FOR_TESTS - monero_lock_and_throw(SW_SECURITY_COMMITMENT_CHAIN_CONTROL); + monero_lock(SW_SECURITY_COMMITMENT_CHAIN_CONTROL); + return SW_SECURITY_COMMITMENT_CHAIN_CONTROL; #endif } } @@ -203,7 +210,8 @@ int monero_apdu_mlsag_prehash_finalize() { if (G_monero_vstate.io_protocol_version >= 3) { if (memcmp(message, G_monero_vstate.prefixH, 32) != 0) { #ifndef BYPASS_COMMITMENT_FOR_TESTS - monero_lock_and_throw(SW_SECURITY_PREFIX_HASH); + monero_lock(SW_SECURITY_PREFIX_HASH); + return SW_SECURITY_PREFIX_HASH; #endif } } diff --git a/src/monero_proof.c b/src/monero_proof.c index b413f86..a8d8b7f 100644 --- a/src/monero_proof.c +++ b/src/monero_proof.c @@ -36,6 +36,7 @@ int monero_apdu_get_tx_proof() { unsigned char sig_c[32]; unsigned char sig_r[32]; unsigned char sep[32]; + int err = 0; #define k (G_monero_vstate.tmp + 256) #define k_len (sizeof(G_monero_vstate.tmp) - 256) @@ -49,7 +50,10 @@ int monero_apdu_get_tx_proof() { monero_io_skip(32); D = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; monero_io_skip(32); - monero_io_fetch_decrypt_key(r, sizeof(r)); + err = monero_io_fetch_decrypt_key(r, sizeof(r)); + if (err) { + return err; + } monero_io_discard(0); diff --git a/src/monero_stealth.c b/src/monero_stealth.c index 0ab5df0..317f4cd 100644 --- a/src/monero_stealth.c +++ b/src/monero_stealth.c @@ -31,11 +31,15 @@ int monero_apdu_stealth() { unsigned char sec[32]; unsigned char drv[33]; unsigned char payID[8]; + int err = 0; // fetch pub monero_io_fetch(pub, 32); // fetch sec - monero_io_fetch_decrypt_key(sec, sizeof(sec)); + err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); + if (err) { + return err; + } // fetch paymentID monero_io_fetch(payID, 8); diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 132bfcb..5a88c04 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -647,7 +647,7 @@ void ui_menu_pubaddr_action(unsigned int value __attribute__((unused))) { /** * */ -void ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), +int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), unsigned char* pub_view, unsigned char* pub_spend, unsigned char is_subbadress, unsigned char* paymanetID) { memset(G_monero_vstate.ux_address, 0, sizeof(G_monero_vstate.ux_address)); @@ -673,10 +673,14 @@ void ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), break; } - monero_base58_public_key(G_monero_vstate.ux_address, pub_view, pub_spend, is_subbadress, + int error = monero_base58_public_key(G_monero_vstate.ux_address, pub_view, pub_spend, is_subbadress, paymanetID); + if (error) { + return error; + } ux_layout_bnnn_paging_reset(); ux_flow_init(0, ux_flow_pubaddr, NULL); + return 0; } void ui_menu_pubaddr_display(unsigned int value) { diff --git a/src/monero_ux_stax.c b/src/monero_ux_stax.c index 3a1d54d..5c768ad 100644 --- a/src/monero_ux_stax.c +++ b/src/monero_ux_stax.c @@ -409,16 +409,21 @@ void display_account(void) { &transactionContext.tagValueList); } -void ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), +int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), unsigned char* pub_view, unsigned char* pub_spend, unsigned char is_subbadress, unsigned char* paymanetID) { + int error; memset(G_monero_vstate.ux_address, 0, sizeof(G_monero_vstate.ux_address)); - monero_base58_public_key(G_monero_vstate.ux_address, pub_view, pub_spend, is_subbadress, + error = monero_base58_public_key(G_monero_vstate.ux_address, pub_view, pub_spend, is_subbadress, paymanetID); + if (error) { + return error; + } nbgl_useCaseReviewStart(&C_Monero_64px, "Review Address", "", "Cancel", display_account, ui_menu_pubaddr_action_cancelled); + return 0; } /* -------------------------------- EXPORT VIEW KEY UX --------------------------------- */ From 548a1e26e44276f75f7cd0ec535ebbe163940ccf Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Mon, 23 Oct 2023 17:22:36 +0200 Subject: [PATCH 110/142] clean: remove unused lock instruction --- src/monero_api.h | 1 - src/monero_clsag.c | 2 -- src/monero_dispatch.c | 43 ++++++++--------------- src/monero_init.c | 17 --------- src/monero_io.c | 1 - src/monero_key.c | 1 - src/monero_main.c | 82 ++++--------------------------------------- src/monero_mlsag.c | 3 -- src/monero_open_tx.c | 1 - src/monero_prehash.c | 4 --- src/monero_types.h | 8 ----- src/monero_ux_nano.c | 29 +-------------- src/monero_ux_stax.c | 30 +--------------- 13 files changed, 23 insertions(+), 199 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index 9ab8d1a..1951b09 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -29,7 +29,6 @@ void monero_lock(int sw); void monero_install(unsigned char netId); unsigned int monero_init(void); int monero_init_private_key(void); -void monero_wipe_private_key(void); void monero_init_ux(void); int monero_dispatch(void); diff --git a/src/monero_clsag.c b/src/monero_clsag.c index 6aa73ef..0e6894c 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -49,7 +49,6 @@ int monero_apdu_clsag_prepare() { G_monero_vstate.tx_sign_cnt++; if (G_monero_vstate.tx_sign_cnt == 0) { - monero_lock(SW_SECURITY_MAX_SIGNATURE_REACHED); return SW_SECURITY_MAX_SIGNATURE_REACHED; } @@ -165,7 +164,6 @@ int monero_apdu_clsag_sign() { monero_io_fetch(mu_P, 32); monero_io_fetch(mu_C, 32); } else { - monero_lock(SW_SECURITY_INTERNAL); return SW_SECURITY_INTERNAL; } diff --git a/src/monero_dispatch.c b/src/monero_dispatch.c index 6ecc8e1..0766560 100644 --- a/src/monero_dispatch.c +++ b/src/monero_dispatch.c @@ -22,30 +22,19 @@ #include "monero_api.h" #include "monero_vars.h" -void update_protocol() { +static void update_protocol(void) { G_monero_vstate.tx_state_ins = G_monero_vstate.io_ins; G_monero_vstate.tx_state_p1 = G_monero_vstate.io_p1; G_monero_vstate.tx_state_p2 = G_monero_vstate.io_p2; } -void clear_protocol() { +static void clear_protocol(void) { G_monero_vstate.tx_state_ins = 0; G_monero_vstate.tx_state_p1 = 0; G_monero_vstate.tx_state_p2 = 0; } -int check_potocol() { - /* if locked and pin is veririfed, unlock */ - if ((G_monero_vstate.protocol_barrier == PROTOCOL_LOCKED_UNLOCKABLE) && - (os_global_pin_is_validated() == PIN_VERIFIED)) { - G_monero_vstate.protocol_barrier = PROTOCOL_UNLOCKED; - } - - /* if we are locked, deny all command! */ - if (G_monero_vstate.protocol_barrier != PROTOCOL_UNLOCKED) { - return SW_SECURITY_LOCKED; - } - +static int check_protocol(void) { /* the first command enforce the protocol version until application quits */ switch (G_monero_vstate.io_protocol_version) { case 0x00: /* the first one: PCSC epoch */ @@ -72,7 +61,6 @@ int check_ins_access() { } switch (G_monero_vstate.io_ins) { - case INS_LOCK_DISPLAY: case INS_RESET: case INS_PUT_KEY: case INS_GET_KEY: @@ -103,9 +91,6 @@ int check_ins_access() { case INS_OPEN_TX: case INS_SET_SIGNATURE_MODE: - if (os_global_pin_is_validated() != PIN_VERIFIED) { - return SW_SECURITY_PIN_LOCKED; - } return SW_OK; case INS_GEN_TXOUT_KEYS: @@ -115,13 +100,13 @@ int check_ins_access() { case INS_MLSAG: case INS_CLSAG: case INS_GEN_COMMITMENT_MASK: - if (os_global_pin_is_validated() != PIN_VERIFIED) { - return SW_SECURITY_PIN_LOCKED; - } if (G_monero_vstate.tx_in_progress != 1) { return SW_COMMAND_NOT_ALLOWED; } return SW_OK; + case INS_LOCK_DISPLAY: + // Deprecated command + return SW_INS_NOT_SUPPORTED; } return SW_INS_NOT_SUPPORTED; @@ -130,7 +115,14 @@ int check_ins_access() { int monero_dispatch() { int sw; - if (((sw = check_potocol()) != SW_OK) || ((sw = check_ins_access() != SW_OK))) { + sw = check_protocol(); + if (sw != SW_OK) { + monero_io_discard(0); + return sw; + } + + sw = check_ins_access(); + if (sw != SW_OK) { monero_io_discard(0); return sw; } @@ -142,13 +134,6 @@ int monero_dispatch() { return sw; } - if (G_monero_vstate.io_ins == INS_LOCK_DISPLAY) { - sw = monero_apdu_lock(); - return sw; - } - - sw = 0x6F01; - switch (G_monero_vstate.io_ins) { /* --- KEYS --- */ case INS_PUT_KEY: diff --git a/src/monero_init.c b/src/monero_init.c index cbb4562..c12216f 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -50,7 +50,6 @@ unsigned int monero_init() { } G_monero_vstate.protocol = 0xff; - G_monero_vstate.protocol_barrier = PROTOCOL_UNLOCKED; // load key unsigned error = monero_init_private_key(); @@ -67,15 +66,6 @@ unsigned int monero_init() { /* ----------------------------------------------------------------------- */ /* --- init private keys --- */ /* ----------------------------------------------------------------------- */ -void monero_wipe_private_key() { - memset(G_monero_vstate.a, 0, 32); - memset(G_monero_vstate.b, 0, 32); - memset(G_monero_vstate.A, 0, 32); - memset(G_monero_vstate.B, 0, 32); - memset(&G_monero_vstate.spk, 0, sizeof(G_monero_vstate.spk)); - G_monero_vstate.key_set = 0; -} - int monero_init_private_key(void) { unsigned int path[5]; unsigned char seed[64]; @@ -239,14 +229,7 @@ int monero_apdu_reset() { /* ----------------------------------------------------------------------- */ /* --- LOCK --- */ /* ----------------------------------------------------------------------- */ -int monero_apdu_lock() { - monero_io_discard(0); - monero_lock(SW_SECURITY_LOCKED); - return SW_SECURITY_LOCKED; -} - void monero_lock(int sw) { - G_monero_vstate.protocol_barrier = PROTOCOL_LOCKED; snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "Security Err"); snprintf(G_monero_vstate.ux_info2, sizeof(G_monero_vstate.ux_info2), "%x", sw); ui_menu_show_security_error(); diff --git a/src/monero_io.c b/src/monero_io.c index 5d428db..2ea0f00 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -250,7 +250,6 @@ static int monero_io_verify_hmac_for(const unsigned char* buffer, int len, } cx_hmac_sha256(G_monero_vstate.hmac_key, 32, hmac, 37, hmac, 32); if (memcmp(hmac, expected_hmac, 32) != 0) { - monero_lock(SW_SECURITY_HMAC); return SW_SECURITY_HMAC; } return 0; diff --git a/src/monero_key.c b/src/monero_key.c index 8551a2f..875097b 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -441,7 +441,6 @@ int monero_apdu_sc_add(/*unsigned char *r, unsigned char *s1, unsigned char *s2* // hwdev.sc_secret_add(scalar_step2, scalar_step1,subaddr_sk); if ((memcmp(s1, G_monero_vstate.last_derive_secret_key, 32) != 0) || (memcmp(s2, G_monero_vstate.last_get_subaddress_secret_key, 32) != 0)) { - monero_lock(SW_WRONG_DATA); return SW_WRONG_DATA; } } diff --git a/src/monero_main.c b/src/monero_main.c index 5629daa..01d72c9 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -27,6 +27,7 @@ #include "os_io_seproxyhal.h" #include "string.h" #include "glyphs.h" +#include "io.h" #ifdef HAVE_UX_FLOW #include "ux.h" @@ -35,7 +36,6 @@ /* ----------------------------------------------------------------------- */ /* --- Application Entry --- */ /* ----------------------------------------------------------------------- */ -extern uint8_t G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; void __attribute__((noreturn)) app_exit(void); void app_main(void) { @@ -56,87 +56,19 @@ void app_main(void) { volatile unsigned short sw = 0; monero_io_do(io_flags); sw = monero_dispatch(); - if (sw) { + if (sw == 0) { + io_flags = IO_ASYNCH_REPLY; + } else if (sw == SW_OK) { monero_io_insert_u16(sw); io_flags = 0; - } else { - io_flags = IO_ASYNCH_REPLY; } - - if (sw != 0 && sw != SW_OK) { - monero_io_do(io_flags); + else { + monero_io_insert_u16(sw); + monero_io_do(IO_RETURN_AFTER_TX); memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); app_exit(); } } } -unsigned char io_event(unsigned char channel __attribute__((unused))) { - unsigned int s_before; - unsigned int s_after; - - s_before = os_global_pin_is_validated(); - - // nothing done with the event, throw an error on the transport layer if - // needed - // can't have more than one tag in the reply, not supported yet. - switch (G_io_seproxyhal_spi_buffer[0]) { - case SEPROXYHAL_TAG_FINGER_EVENT: - UX_FINGER_EVENT(G_io_seproxyhal_spi_buffer); - break; - // power off if long push, else pass to the application callback if any - case SEPROXYHAL_TAG_BUTTON_PUSH_EVENT: // for Nano S -#ifdef HAVE_BAGL - UX_BUTTON_PUSH_EVENT(G_io_seproxyhal_spi_buffer); -#endif - break; - - // other events are propagated to the UX just in case - default: - UX_DEFAULT_EVENT(); - break; - - case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: -#ifdef HAVE_BAGL - UX_DISPLAYED_EVENT({}); -#endif // HAVE_BAGL -#ifdef HAVE_NBGL - UX_DEFAULT_EVENT(); -#endif // HAVE_NBGL - break; - case SEPROXYHAL_TAG_TICKER_EVENT: - UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, { -#ifdef HAVE_BAGL - // only allow display when not locked of overlayed by an OS UX. - if (UX_ALLOWED) { - UX_REDISPLAY(); - } -#endif - }); - break; - } - - // close the event if not done previously (by a display or whatever) - if (!io_seproxyhal_spi_is_status_sent()) { - io_seproxyhal_general_status(); - } - - s_after = os_global_pin_is_validated(); - - if (s_before != s_after) { - if (s_after == PIN_VERIFIED) { - if (!monero_init_private_key()) { - memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); - app_exit(); - } - } else { - ; // do nothing, allowing TX parsing in lock mode - // monero_wipe_private_key(); - } - } - - // command has been processed, DO NOT reset the current APDU transport - return 1; -} - #endif diff --git a/src/monero_mlsag.c b/src/monero_mlsag.c index a3d4884..170ef6a 100644 --- a/src/monero_mlsag.c +++ b/src/monero_mlsag.c @@ -35,7 +35,6 @@ int monero_apdu_mlsag_prepare() { G_monero_vstate.tx_sign_cnt++; if (G_monero_vstate.tx_sign_cnt == 0) { - monero_lock(SW_SECURITY_MAX_SIGNATURE_REACHED); return SW_SECURITY_MAX_SIGNATURE_REACHED; } @@ -126,14 +125,12 @@ int monero_apdu_mlsag_sign() { return err; } } else { - monero_lock(SW_SECURITY_INTERNAL); return SW_SECURITY_INTERNAL; } monero_io_discard(1); // check xin and alpha are not null if (cx_math_is_zero(xin, 32) || cx_math_is_zero(alpha, 32)) { - monero_lock(SW_SECURITY_RANGE_VALUE); return SW_SECURITY_RANGE_VALUE; } diff --git a/src/monero_open_tx.c b/src/monero_open_tx.c index 13d8857..7265188 100644 --- a/src/monero_open_tx.c +++ b/src/monero_open_tx.c @@ -114,7 +114,6 @@ int monero_apdu_set_signature_mode() { case TRANSACTION_CREATE_FAKE: break; default: - monero_lock(SW_WRONG_DATA); return SW_WRONG_DATA; } G_monero_vstate.tx_sig_mode = sig_mode; diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 8f61dd2..9156846 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -127,7 +127,6 @@ int monero_apdu_mlsag_prehash_update() { } if (memcmp(C, aH, 32) != 0) { #ifndef BYPASS_COMMITMENT_FOR_TESTS - monero_lock(SW_SECURITY_COMMITMENT_CONTROL); return SW_SECURITY_COMMITMENT_CHAIN_CONTROL; #endif } @@ -139,7 +138,6 @@ int monero_apdu_mlsag_prehash_update() { // finalize and check destination hash_control monero_sha256_outkeys_final(k); if (memcmp(k, G_monero_vstate.OUTK, 32) != 0) { - monero_lock(SW_SECURITY_OUTKEYS_CHAIN_CONTROL); return SW_SECURITY_COMMITMENT_CHAIN_CONTROL; } } @@ -195,7 +193,6 @@ int monero_apdu_mlsag_prehash_finalize() { monero_sha256_commitment_final(H); if (memcmp(H, G_monero_vstate.C, 32) != 0) { #ifndef BYPASS_COMMITMENT_FOR_TESTS - monero_lock(SW_SECURITY_COMMITMENT_CHAIN_CONTROL); return SW_SECURITY_COMMITMENT_CHAIN_CONTROL; #endif } @@ -210,7 +207,6 @@ int monero_apdu_mlsag_prehash_finalize() { if (G_monero_vstate.io_protocol_version >= 3) { if (memcmp(message, G_monero_vstate.prefixH, 32) != 0) { #ifndef BYPASS_COMMITMENT_FOR_TESTS - monero_lock(SW_SECURITY_PREFIX_HASH); return SW_SECURITY_PREFIX_HASH; #endif } diff --git a/src/monero_types.h b/src/monero_types.h index 183e216..13eba01 100644 --- a/src/monero_types.h +++ b/src/monero_types.h @@ -21,14 +21,6 @@ #include "os_io_seproxyhal.h" -#if CX_APILEVEL == 8 -#define PIN_VERIFIED (!0) -#elif CX_APILEVEL >= 9 -#define PIN_VERIFIED BOLOS_UX_OK -#else -#error CX_APILEVEL not supported -#endif - /* cannot send more that F0 bytes in CCID, why? do not know for now * So set up length to F0 */ diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 5a88c04..6626577 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -38,29 +38,6 @@ void ui_menu_main_display(); -/* -------------------------------------- LOCK--------------------------------------- */ - -void ui_menu_pinlock_display() { - struct { - bolos_ux_t ux_id; - // length of parameters in the u union to be copied during the syscall - unsigned int len; - union { - struct { - unsigned int cancellable; - } validate_pin; - } u; - - } ux_params; - - os_global_pin_invalidate(); - G_monero_vstate.protocol_barrier = PROTOCOL_LOCKED_UNLOCKABLE; - ux_params.ux_id = BOLOS_UX_VALIDATE_PIN; - ux_params.len = sizeof(ux_params.u.validate_pin); - ux_params.u.validate_pin.cancellable = 0; - os_ux((bolos_ux_params_t*)&ux_params); - ui_menu_main_display(); -} /* -------------------------------------- 25 WORDS --------------------------------------- */ void ui_menu_words_display(unsigned int value); @@ -113,11 +90,7 @@ UX_STEP_CB(ux_menu_info_1_step, nn, ui_menu_info_action(0), UX_FLOW(ux_flow_info, &ux_menu_info_1_step); unsigned int ui_menu_info_action(unsigned int value __attribute__((unused))) { - if (G_monero_vstate.protocol_barrier == PROTOCOL_LOCKED) { - ui_menu_pinlock_display(); - } else { - ui_menu_main_display(); - } + ui_menu_main_display(); return 0; } diff --git a/src/monero_ux_stax.c b/src/monero_ux_stax.c index 5c768ad..40b1718 100644 --- a/src/monero_ux_stax.c +++ b/src/monero_ux_stax.c @@ -57,38 +57,10 @@ static void release_context(void) { } } -/* -------------------------------------- LOCK--------------------------------------- */ - -void ui_menu_pinlock_display() { - struct { - bolos_ux_t ux_id; - // length of parameters in the u union to be copied during the syscall - unsigned int len; - union { - struct { - unsigned int cancellable; - } validate_pin; - } u; - - } ux_params; - - os_global_pin_invalidate(); - G_monero_vstate.protocol_barrier = PROTOCOL_LOCKED_UNLOCKABLE; - ux_params.ux_id = BOLOS_UX_VALIDATE_PIN; - ux_params.len = sizeof(ux_params.u.validate_pin); - ux_params.u.validate_pin.cancellable = 0; - os_ux((bolos_ux_params_t*)&ux_params); - ui_menu_main_display(); -} - /* -------------------------------- INFO UX --------------------------------- */ static void ui_menu_info_action(void) { - if (G_monero_vstate.protocol_barrier == PROTOCOL_LOCKED) { - ui_menu_pinlock_display(); - } else { - ui_menu_main_display(); - } + ui_menu_main_display(); } void ui_menu_show_tx_aborted(void) { From ab0c15fb4e8020e2fa6f33eae2f3f0ef70298d96 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 24 Oct 2023 12:20:02 +0200 Subject: [PATCH 111/142] clean: replace last Throw by app exit --- src/monero_api.h | 2 +- src/monero_io.c | 16 ++++++++-------- src/monero_main.c | 12 ++++++++---- src/monero_ux_nano.c | 8 +++++++- src/monero_ux_stax_menu.c | 5 ++++- 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index 1951b09..6f01834 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -21,7 +21,7 @@ #include "monero_vars.h" -void send_error_and_kill_app(int sw); +void __attribute__((noreturn)) send_error_and_kill_app(int sw); int monero_apdu_reset(void); int monero_apdu_lock(void); void monero_lock(int sw); diff --git a/src/monero_io.c b/src/monero_io.c index 2ea0f00..7b247af 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -66,7 +66,7 @@ void monero_io_clear(void) { void monero_io_hole(unsigned int sz) { if ((G_monero_vstate.io_length + sz) > MONERO_IO_BUFFER_LENGTH) { - THROW(ERROR_IO_FULL); + send_error_and_kill_app(ERROR_IO_FULL); } memmove(G_monero_vstate.io_buffer + G_monero_vstate.io_offset + sz, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, @@ -76,7 +76,7 @@ void monero_io_hole(unsigned int sz) { void monero_io_insert(unsigned char const* buff, unsigned int len) { if (!buff) { - THROW(SW_WRONG_DATA); + send_error_and_kill_app(ERROR_IO_FULL); } monero_io_hole(len); memcpy(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, buff, len); @@ -85,11 +85,11 @@ void monero_io_insert(unsigned char const* buff, unsigned int len) { void monero_io_insert_hmac_for(unsigned char* buffer, int len, int type) { if (!buffer) { - THROW(SW_WRONG_DATA); + send_error_and_kill_app(ERROR_IO_FULL); } // for now, only 32bytes block are allowed if (len != 32) { - THROW(SW_WRONG_DATA); + send_error_and_kill_app(ERROR_IO_FULL); } unsigned char hmac[32 + 1 + 4]; @@ -113,12 +113,12 @@ void monero_io_insert_hmac_for(unsigned char* buffer, int len, int type) { void monero_io_insert_encrypt(unsigned char* buffer, size_t len, int type) { if (!buffer) { - THROW(SW_WRONG_DATA); + send_error_and_kill_app(ERROR_IO_FULL); } // for now, only 32bytes block are allowed if (len != 32) { - THROW(SW_WRONG_DATA); + send_error_and_kill_app(ERROR_IO_FULL); } monero_io_hole(len); @@ -205,7 +205,7 @@ int monero_io_fetch_available(void) { } void monero_io_assert_available(int sz) { if ((G_monero_vstate.io_length - G_monero_vstate.io_offset) < sz) { - THROW(SW_WRONG_LENGTH + (sz & 0xFF)); + send_error_and_kill_app(ERROR_IO_FULL); } } @@ -217,7 +217,7 @@ void monero_io_skip(int len) { int monero_io_fetch(unsigned char* buffer, int len) { monero_io_assert_available(len); if (!buffer) { - THROW(SW_WRONG_DATA); + send_error_and_kill_app(ERROR_IO_FULL); } memcpy(buffer, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len); G_monero_vstate.io_offset += len; diff --git a/src/monero_main.c b/src/monero_main.c index 01d72c9..722616a 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -38,6 +38,13 @@ /* ----------------------------------------------------------------------- */ void __attribute__((noreturn)) app_exit(void); +void __attribute__((noreturn)) send_error_and_kill_app(int sw) { + monero_io_insert_u16(sw); + monero_io_do(IO_RETURN_AFTER_TX); + memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); + app_exit(); +} + void app_main(void) { unsigned int io_flags; unsigned int error; @@ -63,10 +70,7 @@ void app_main(void) { io_flags = 0; } else { - monero_io_insert_u16(sw); - monero_io_do(IO_RETURN_AFTER_TX); - memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); - app_exit(); + send_error_and_kill_app(sw); } } } diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 6626577..bc8f993 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -36,6 +36,7 @@ #define ACCEPT 0xACCE #define REJECT ~ACCEPT +void __attribute__((noreturn)) app_exit(void); void ui_menu_main_display(); @@ -663,6 +664,11 @@ void ui_menu_pubaddr_display(unsigned int value) { ui_menu_any_pubaddr_display(value, G_monero_vstate.A, G_monero_vstate.B, 0, NULL); } +static void exit(void) { + memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); + app_exit(); +} + #undef ADDR_TYPE #undef ADDR_MAJOR #undef ADDR_MINOR @@ -682,7 +688,7 @@ UX_STEP_CB(ux_menu_main_2_step, pb, UX_STEP_CB(ux_menu_main_3_step, pb, ui_menu_about_display(), {&C_icon_certificate, "About"}); -UX_STEP_CB(ux_menu_main_4_step, pb, os_sched_exit(0), {&C_icon_dashboard_x, "Quit app"}); +UX_STEP_CB(ux_menu_main_4_step, pb, exit(), {&C_icon_dashboard_x, "Quit app"}); UX_FLOW(ux_flow_main, &ux_menu_main_1_step, &ux_menu_main_2_step, &ux_menu_main_3_step, &ux_menu_main_4_step); diff --git a/src/monero_ux_stax_menu.c b/src/monero_ux_stax_menu.c index 283f6dc..75c6a59 100644 --- a/src/monero_ux_stax_menu.c +++ b/src/monero_ux_stax_menu.c @@ -37,6 +37,8 @@ #define NB_PAGE_SETTING 3 #define IS_TOUCHABLE true +void __attribute__((noreturn)) app_exit(void); + /* ----------------------------------------------------------------------- */ /* --- Stax UI layout --- */ /* ----------------------------------------------------------------------- */ @@ -83,7 +85,8 @@ static void update_account(void) { } static void exit(void) { - os_sched_exit(-1); + memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); + app_exit(); } static bool settings_navigation_cb(uint8_t page, nbgl_pageContent_t* content) { From 19f96a445ab47105a726e12f8aaf2a4fafb67b45 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 24 Oct 2023 17:53:11 +0200 Subject: [PATCH 112/142] Lint: Apply formatting --- src/monero_api.h | 76 +++++++++++++++++++++++++--------------- src/monero_blind.c | 3 +- src/monero_clsag.c | 6 ++-- src/monero_crypto.c | 83 +++++++++++++++++++++++++++----------------- src/monero_init.c | 12 ++++--- src/monero_io.c | 30 ++++++++-------- src/monero_key.c | 35 ++++++++++++------- src/monero_main.c | 3 +- src/monero_mlsag.c | 3 +- src/monero_open_tx.c | 3 +- src/monero_prefix.c | 2 +- src/monero_prehash.c | 3 +- src/monero_proof.c | 2 +- src/monero_ux_nano.c | 11 +++--- src/monero_ux_stax.c | 8 ++--- 15 files changed, 167 insertions(+), 113 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index 6f01834..c8a22d5 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -92,8 +92,8 @@ void ui_menu_show_security_error(void); void ui_menu_show_tx_aborted(void); void ui_export_viewkey_display(unsigned int value); int ui_menu_any_pubaddr_display(unsigned int value, unsigned char *pub_view, - unsigned char *pub_spend, unsigned char is_subbadress, - unsigned char *paymanetID); + unsigned char *pub_spend, unsigned char is_subbadress, + unsigned char *paymanetID); void ui_menu_pubaddr_display(unsigned int value); unsigned int ui_menu_transaction_start(void); @@ -142,11 +142,14 @@ extern const unsigned char C_FAKE_SEC_SPEND_KEY[32]; int is_fake_view_key(unsigned char *s); int is_fake_spend_key(unsigned char *s); -void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t ge_len, size_t bytes_len); +void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t ge_len, + size_t bytes_len); void monero_sc_add(unsigned char *r, unsigned char *s1, unsigned char *s2); -void monero_hash_to_scalar(unsigned char *scalar, unsigned char *raw, size_t scalar_len, unsigned int len); +void monero_hash_to_scalar(unsigned char *scalar, unsigned char *raw, size_t scalar_len, + unsigned int len); void monero_hash_to_ec(unsigned char *ec, unsigned char *ec_pub, size_t ec_len); -void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, size_t ec_priv_len); +void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, + size_t ec_priv_len); /* * compute s = 8 * (k*P) * @@ -155,9 +158,10 @@ void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size * k [in] 32 bytes scalar */ void monero_generate_key_derivation(unsigned char *drv_data, unsigned char *P, - unsigned char *scalar, size_t drv_data_len, size_t P_len, size_t scalar_len); + unsigned char *scalar, size_t drv_data_len, size_t P_len, + size_t scalar_len); int monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, - unsigned int out_idx, size_t scalar_len, size_t drv_data_len); + unsigned int out_idx, size_t scalar_len, size_t drv_data_len); /* * compute x = Hps(drv_data,out_idx) + ec_pv * @@ -166,7 +170,8 @@ int monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, * ec_pv [in] 32 bytes private key */ int monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, - unsigned char *ec_priv, size_t x_len, size_t drv_data_len, size_t ec_priv_len); + unsigned char *ec_priv, size_t x_len, size_t drv_data_len, + size_t ec_priv_len); /* * compute x = Hps(drv_data,out_idx)*G + ec_pub * @@ -175,18 +180,24 @@ int monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigned * ec_pub [in] 32 bytes public key */ int monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, - unsigned char *ec_pub, size_t x_len, size_t drv_data_len, size_t ec_pub_len); -void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, size_t ec_priv_len); -void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x, size_t img_len, size_t x_len); + unsigned char *ec_pub, size_t x_len, size_t drv_data_len, + size_t ec_pub_len); +void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv, + size_t ec_pub_len, size_t ec_priv_len); +void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x, + size_t img_len, size_t x_len); int monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_data[static 32], - unsigned int out_idx); + unsigned int out_idx); void monero_derive_subaddress_public_key(unsigned char *x, unsigned char *pub, - unsigned char *drv_data, unsigned int index, - size_t x_len, size_t pub_len, size_t drv_data_len); -void monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *index, size_t x_len, size_t index_len); -void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *index, size_t C_len, size_t D_len, size_t index_len); -void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, unsigned char *index, size_t sub_s_len, size_t s_len, size_t index_len); + unsigned char *drv_data, unsigned int index, size_t x_len, + size_t pub_len, size_t drv_data_len); +void monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *index, size_t x_len, + size_t index_len); +void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *index, size_t C_len, + size_t D_len, size_t index_len); +void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, unsigned char *index, + size_t sub_s_len, size_t s_len, size_t index_len); void monero_clear_words(void); /* ----------------------------------------------------------------------- */ @@ -263,12 +274,14 @@ unsigned int monero_check_scalar_not_null(unsigned char *s); /** * LE-7-bits encoding. High bit set says one more byte to decode. */ -unsigned int monero_encode_varint(unsigned char *varint, unsigned int max_len, uint64_t v, unsigned int *out_len); +unsigned int monero_encode_varint(unsigned char *varint, unsigned int max_len, uint64_t v, + unsigned int *out_len); /** * LE-7-bits decoding. High bit set says one more byte to decode. */ -unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, uint64_t *value, unsigned int *out_len); +unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, uint64_t *value, + unsigned int *out_len); /** */ void monero_reverse32(unsigned char *rscal, unsigned char *scal, size_t rscal_len, size_t scal_len); @@ -277,16 +290,18 @@ void monero_reverse32(unsigned char *rscal, unsigned char *scal, size_t rscal_le * Hps: keccak(drv_data|varint(out_idx)) */ int monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, - unsigned int out_idx, size_t scalar_len, size_t drv_data_len); + unsigned int out_idx, size_t scalar_len, size_t drv_data_len); /* * W = k.P */ -void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, size_t P_len, size_t scalar32_len); +void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, + size_t P_len, size_t scalar32_len); /* * W = 8k.P */ -void monero_ecmul_8k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, size_t P_len, size_t scalar32_len); +void monero_ecmul_8k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, + size_t P_len, size_t scalar32_len); /* * W = 8.P @@ -316,20 +331,25 @@ void monero_genCommitmentMask(unsigned char *c, unsigned char *sk, size_t c_len, /* * W = P+Q */ -void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, size_t Q_len); +void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, + size_t Q_len); /* * W = P-Q */ -void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, size_t Q_len); +void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, + size_t Q_len); /* r = (a+b) %order */ -void monero_addm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, size_t b_len); +void monero_addm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, + size_t b_len); /* r = (a-b) %order */ -void monero_subm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, size_t b_len); +void monero_subm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, + size_t b_len); /* r = (a*b) %order */ -void monero_multm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, size_t b_len); +void monero_multm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, + size_t b_len); /* r = (a*8) %order */ void monero_multm_8(unsigned char *r, unsigned char *a, size_t r_len, size_t a_len); @@ -362,7 +382,7 @@ void monero_io_insert_tlv(unsigned int T, unsigned int L, unsigned char const *V int monero_io_fetch_available(void); void monero_io_fetch_buffer(unsigned char *buffer, unsigned int len); -int monero_io_fetch_varint(uint64_t* out_v64); +int monero_io_fetch_varint(uint64_t *out_v64); unsigned int monero_io_fetch_u32(void); unsigned int monero_io_fetch_u24(void); unsigned int monero_io_fetch_u16(void); diff --git a/src/monero_blind.c b/src/monero_blind.c index c1fcfc0..cd8b56b 100644 --- a/src/monero_blind.c +++ b/src/monero_blind.c @@ -101,7 +101,8 @@ int monero_apdu_unblind() { monero_io_discard(1); - monero_unblind(v, k, AKout, G_monero_vstate.options & 0x03, sizeof(v), sizeof(k), sizeof(AKout)); + monero_unblind(v, k, AKout, G_monero_vstate.options & 0x03, sizeof(v), sizeof(k), + sizeof(AKout)); // ret all monero_io_insert(v, 32); diff --git a/src/monero_clsag.c b/src/monero_clsag.c index 0e6894c..e9bcb5f 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -96,8 +96,7 @@ int monero_apdu_clsag_hash() { unsigned char c[32]; if (G_monero_vstate.io_p2 == 1) { - if (monero_keccak_init_H()) - { + if (monero_keccak_init_H()) { return SW_WRONG_DATA; } } @@ -178,7 +177,8 @@ int monero_apdu_clsag_sign() { monero_reduce(z, z, sizeof(z), sizeof(z)); monero_reduce(mu_P, mu_P, sizeof(mu_P), sizeof(mu_P)); monero_reduce(mu_C, mu_C, sizeof(mu_C), sizeof(mu_C)); - monero_reduce(G_monero_vstate.c, G_monero_vstate.c, sizeof(G_monero_vstate.c), sizeof(G_monero_vstate.c)); + monero_reduce(G_monero_vstate.c, G_monero_vstate.c, sizeof(G_monero_vstate.c), + sizeof(G_monero_vstate.c)); // s0_p_mu_P = mu_P*p // s0_add_z_mu_C = mu_C*z + s0_p_mu_P diff --git a/src/monero_crypto.c b/src/monero_crypto.c index 89cd4df..56faffe 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -58,8 +58,7 @@ unsigned char const C_EIGHT[32] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0 /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -int monero_aes_derive(cx_aes_key_t *sk, unsigned char *seed32, unsigned char *a, - unsigned char *b) { +int monero_aes_derive(cx_aes_key_t *sk, unsigned char *seed32, unsigned char *a, unsigned char *b) { unsigned char h1[32]; monero_keccak_init_H(); @@ -85,7 +84,8 @@ void monero_aes_generate(cx_aes_key_t *sk) { /* ----------------------------------------------------------------------- */ /* --- assert: max_len>0 --- */ /* ----------------------------------------------------------------------- */ -unsigned int monero_encode_varint(unsigned char *varint, unsigned int max_len, uint64_t value, unsigned int* out_len) { +unsigned int monero_encode_varint(unsigned char *varint, unsigned int max_len, uint64_t value, + unsigned int *out_len) { if (!varint || !out_len) { PRINTF("Buffer Error: %s:%d \n", __LINE__); return SW_WRONG_DATA; @@ -103,13 +103,13 @@ unsigned int monero_encode_varint(unsigned char *varint, unsigned int max_len, u varint[*out_len] = value; *out_len = *out_len + 1; return 0; - } /* ----------------------------------------------------------------------- */ /* --- assert: max_len>0 --- */ /* ----------------------------------------------------------------------- */ -unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, uint64_t *value, unsigned int* out_len) { +unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, uint64_t *value, + unsigned int *out_len) { uint64_t v; size_t len; v = 0; @@ -135,7 +135,8 @@ unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, u /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_reverse32(unsigned char *rscal, unsigned char *scal, size_t rscal_len, size_t scal_len) { +void monero_reverse32(unsigned char *rscal, unsigned char *scal, size_t rscal_len, + size_t scal_len) { unsigned char x; unsigned int i; if (!rscal || !scal) { @@ -304,7 +305,8 @@ const unsigned char C_fe_qm5div8[] = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd}; -void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t ge_len, size_t bytes_len) { +void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t ge_len, + size_t bytes_len) { #define MOD (unsigned char *)C_ED25519_FIELD, 32 #define fe_isnegative(f) (f[31] & 1) #if 0 @@ -372,7 +374,7 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t cx_math_addm_no_throw(v, v, v, MOD); memset(w, 0, 32); - w[31] = 1; /* w = 1 */ + w[31] = 1; /* w = 1 */ cx_math_addm_no_throw(w, v, w, MOD); /* w = 2 * u^2 + 1 */ cx_math_multm_no_throw(x, w, w, MOD); /* w^2 */ cx_math_multm_no_throw(y, (unsigned char *)C_fe_ma2, v, MOD); /* -2 * A^2 * u^2 */ @@ -465,7 +467,8 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_hash_to_scalar(unsigned char *scalar, unsigned char *raw, size_t scalar_len, unsigned int raw_len) { +void monero_hash_to_scalar(unsigned char *scalar, unsigned char *raw, size_t scalar_len, + unsigned int raw_len) { monero_keccak_F(raw, raw_len, scalar); monero_reduce(scalar, scalar, scalar_len, scalar_len); } @@ -482,7 +485,8 @@ void monero_hash_to_ec(unsigned char *ec, unsigned char *ec_pub, size_t ec_len) /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, size_t ec_priv_len) { +void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, + size_t ec_priv_len) { monero_rng_mod_order(ec_priv, ec_priv_len); monero_ecmul_G(ec_pub, ec_priv, ec_pub_len, ec_priv_len); } @@ -491,7 +495,8 @@ void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size /* --- ok --- */ /* ----------------------------------------------------------------------- */ void monero_generate_key_derivation(unsigned char *drv_data, unsigned char *P, - unsigned char *scalar, size_t drv_data_len, size_t P_len, size_t scalar_len) { + unsigned char *scalar, size_t drv_data_len, size_t P_len, + size_t scalar_len) { monero_ecmul_8k(drv_data, P, scalar, drv_data_len, P_len, scalar_len); } @@ -499,7 +504,7 @@ void monero_generate_key_derivation(unsigned char *drv_data, unsigned char *P, /* --- ok --- */ /* ----------------------------------------------------------------------- */ int monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, - unsigned int out_idx, size_t scalar_len, size_t drv_data_len) { + unsigned int out_idx, size_t scalar_len, size_t drv_data_len) { unsigned char varint[32 + 8]; unsigned int len_varint; int error = 0; @@ -524,7 +529,8 @@ int monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, - unsigned char *ec_priv, size_t x_len, size_t drv_data_len, size_t ec_priv_len) { + unsigned char *ec_priv, size_t x_len, size_t drv_data_len, + size_t ec_priv_len) { unsigned char tmp[32]; int error; @@ -543,7 +549,8 @@ int monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigned /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, - unsigned char *ec_pub, size_t x_len, size_t drv_data_len, size_t ec_pub_len) { + unsigned char *ec_pub, size_t x_len, size_t drv_data_len, + size_t ec_pub_len) { unsigned char tmp[32]; // derivation to scalar @@ -560,14 +567,16 @@ int monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigned /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, size_t ec_priv_len) { +void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv, + size_t ec_pub_len, size_t ec_priv_len) { monero_ecmul_G(ec_pub, ec_priv, ec_pub_len, ec_priv_len); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x, size_t img_len, size_t x_len) { +void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x, + size_t img_len, size_t x_len) { unsigned char I[32]; monero_hash_to_ec(I, P, sizeof(I)); monero_ecmul_k(img, I, x, img_len, sizeof(I), x_len); @@ -577,7 +586,7 @@ void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned ch /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_data[static 32], - unsigned int out_idx) { + unsigned int out_idx) { unsigned char varint[8 + 32 + 8]; unsigned int len_varint; int error = 0; @@ -602,8 +611,8 @@ int monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_data /* --- ok --- */ /* ----------------------------------------------------------------------- */ void monero_derive_subaddress_public_key(unsigned char *x, unsigned char *pub, - unsigned char *drv_data, unsigned int index, - size_t x_len, size_t pub_len, size_t drv_data_len) { + unsigned char *drv_data, unsigned int index, size_t x_len, + size_t pub_len, size_t drv_data_len) { unsigned char scalarG[32]; monero_derivation_to_scalar(scalarG, drv_data, index, sizeof(scalarG), drv_data_len); @@ -614,9 +623,11 @@ void monero_derive_subaddress_public_key(unsigned char *x, unsigned char *pub, /* ----------------------------------------------------------------------- */ /* --- ok --- */ /* ----------------------------------------------------------------------- */ -void monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *index, size_t x_len, size_t index_len) { +void monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *index, size_t x_len, + size_t index_len) { // m = Hs(a || index_major || index_minor) - monero_get_subaddress_secret_key(x, G_monero_vstate.a, index, x_len, sizeof(G_monero_vstate.a), index_len); + monero_get_subaddress_secret_key(x, G_monero_vstate.a, index, x_len, sizeof(G_monero_vstate.a), + index_len); // M = m*G monero_secret_key_to_public_key(x, x, x_len, x_len); // D = B + M @@ -626,7 +637,8 @@ void monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *ind /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *index, size_t C_len, size_t D_len, size_t index_len) { +void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *index, size_t C_len, + size_t D_len, size_t index_len) { // retrieve D monero_get_subaddress_spend_public_key(D, index, D_len, index_len); // C = a*D @@ -638,8 +650,8 @@ void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *in /* ----------------------------------------------------------------------- */ static const char C_sub_address_prefix[] = {'S', 'u', 'b', 'A', 'd', 'd', 'r', 0}; -void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, - unsigned char *index, size_t sub_s_len, size_t s_len, size_t index_len) { +void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, unsigned char *index, + size_t sub_s_len, size_t s_len, size_t index_len) { unsigned char in[sizeof(C_sub_address_prefix) + 32 + 8]; if (!s || s_len < 32) { @@ -732,7 +744,8 @@ void monero_ecmul_H(unsigned char *W, unsigned char *scalar32, size_t W_len, siz /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, size_t P_len, size_t scalar32_len) { +void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, + size_t P_len, size_t scalar32_len) { unsigned char Pxy[PXY_SIZE]; unsigned char s[32]; @@ -760,7 +773,8 @@ void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32, /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecmul_8k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, size_t P_len, size_t scalar32_len) { +void monero_ecmul_8k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, + size_t P_len, size_t scalar32_len) { unsigned char s[32]; monero_multm_8(s, scalar32, sizeof(s), scalar32_len); monero_ecmul_k(W, P, s, W_len, P_len, sizeof(s)); @@ -795,7 +809,8 @@ void monero_ecmul_8(unsigned char *W, unsigned char *P, size_t W_len, size_t P_l /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, size_t Q_len) { +void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, + size_t Q_len) { unsigned char Pxy[PXY_SIZE]; unsigned char Qxy[PXY_SIZE]; @@ -831,7 +846,8 @@ void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, size_t Q_len) { +void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, + size_t Q_len) { unsigned char Pxy[PXY_SIZE]; unsigned char Qxy[PXY_SIZE]; @@ -922,7 +938,8 @@ void monero_genCommitmentMask(unsigned char *c, unsigned char *sk, size_t c_len, /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_addm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, size_t b_len) { +void monero_addm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, + size_t b_len) { unsigned char ra[32]; unsigned char rb[32]; @@ -935,7 +952,8 @@ void monero_addm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_ /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_subm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, size_t b_len) { +void monero_subm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, + size_t b_len) { unsigned char ra[32]; unsigned char rb[32]; @@ -947,7 +965,8 @@ void monero_subm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_ /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_multm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, size_t b_len) { +void monero_multm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, + size_t b_len) { unsigned char ra[32]; unsigned char rb[32]; @@ -1031,7 +1050,7 @@ int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { if (!str) { PRINTF("%d \n\n", __LINE__); - return SW_WRONG_DATA; + return SW_WRONG_DATA; } memset(str, 0, str_len); diff --git a/src/monero_init.c b/src/monero_init.c index c12216f..7d9abc3 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -88,9 +88,11 @@ int monero_init_private_key(void) { case KEY_MODE_SEED: monero_keccak_F(seed, 32, G_monero_vstate.b); - monero_reduce(G_monero_vstate.b, G_monero_vstate.b, sizeof(G_monero_vstate.b), sizeof(G_monero_vstate.b)); + monero_reduce(G_monero_vstate.b, G_monero_vstate.b, sizeof(G_monero_vstate.b), + sizeof(G_monero_vstate.b)); monero_keccak_F(G_monero_vstate.b, 32, G_monero_vstate.a); - monero_reduce(G_monero_vstate.a, G_monero_vstate.a, sizeof(G_monero_vstate.a), sizeof(G_monero_vstate.a)); + monero_reduce(G_monero_vstate.a, G_monero_vstate.a, sizeof(G_monero_vstate.a), + sizeof(G_monero_vstate.a)); break; case KEY_MODE_EXTERNAL: @@ -101,8 +103,10 @@ int monero_init_private_key(void) { default: return SW_SECURITY_LOAD_KEY; } - monero_ecmul_G(G_monero_vstate.A, G_monero_vstate.a, sizeof(G_monero_vstate.A), sizeof(G_monero_vstate.a)); - monero_ecmul_G(G_monero_vstate.B, G_monero_vstate.b, sizeof(G_monero_vstate.B), sizeof(G_monero_vstate.b)); + monero_ecmul_G(G_monero_vstate.A, G_monero_vstate.a, sizeof(G_monero_vstate.A), + sizeof(G_monero_vstate.a)); + monero_ecmul_G(G_monero_vstate.B, G_monero_vstate.b, sizeof(G_monero_vstate.B), + sizeof(G_monero_vstate.b)); // generate key protection int err = monero_aes_derive(&G_monero_vstate.spk, chain, G_monero_vstate.a, G_monero_vstate.b); diff --git a/src/monero_io.c b/src/monero_io.c index 7b247af..ebfd89b 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -130,8 +130,8 @@ void monero_io_insert_encrypt(unsigned char* buffer, size_t len, int type) { #elif defined(IONOCRYPT) memcpy(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, buffer, len); #else - if (cx_aes_no_throw(&G_monero_vstate.spk, CX_ENCRYPT | CX_CHAIN_CBC | CX_LAST | CX_PAD_NONE, buffer, len, - G_monero_vstate.io_buffer + G_monero_vstate.io_offset, &len)) { + if (cx_aes_no_throw(&G_monero_vstate.spk, CX_ENCRYPT | CX_CHAIN_CBC | CX_LAST | CX_PAD_NONE, + buffer, len, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, &len)) { send_error_and_kill_app(SW_SECURITY_INTERNAL); } #endif @@ -225,7 +225,7 @@ int monero_io_fetch(unsigned char* buffer, int len) { } static int monero_io_verify_hmac_for(const unsigned char* buffer, int len, - unsigned char* expected_hmac, int type) { + unsigned char* expected_hmac, int type) { if (!buffer || !expected_hmac) { return SW_WRONG_DATA; } @@ -264,9 +264,9 @@ int monero_io_fetch_decrypt(unsigned char* buffer, size_t len, int type) { if (G_monero_vstate.tx_in_progress) { monero_io_assert_available(len + 32); - error = monero_io_verify_hmac_for(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len, - G_monero_vstate.io_buffer + G_monero_vstate.io_offset + len, - type); + error = monero_io_verify_hmac_for( + G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len, + G_monero_vstate.io_buffer + G_monero_vstate.io_offset + len, type); if (error) { return error; } @@ -282,8 +282,9 @@ int monero_io_fetch_decrypt(unsigned char* buffer, size_t len, int type) { #elif defined(IONOCRYPT) memcpy(buffer, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len); #else // IOCRYPT - error = cx_aes_no_throw(&G_monero_vstate.spk, CX_DECRYPT | CX_CHAIN_CBC | CX_LAST | CX_PAD_NONE, - G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len, buffer, &len); + error = cx_aes_no_throw( + &G_monero_vstate.spk, CX_DECRYPT | CX_CHAIN_CBC | CX_LAST | CX_PAD_NONE, + G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len, buffer, &len); #endif } G_monero_vstate.io_offset += len; @@ -323,8 +324,8 @@ int monero_io_fetch_decrypt_key(unsigned char* buffer, size_t buffer_size) { if (G_monero_vstate.tx_in_progress) { monero_io_assert_available(32); error = monero_io_verify_hmac_for(C_FAKE_SEC_VIEW_KEY, 32, - G_monero_vstate.io_buffer + G_monero_vstate.io_offset, - TYPE_SCALAR); + G_monero_vstate.io_buffer + G_monero_vstate.io_offset, + TYPE_SCALAR); if (error) { return error; } @@ -347,8 +348,8 @@ int monero_io_fetch_decrypt_key(unsigned char* buffer, size_t buffer_size) { if (G_monero_vstate.tx_in_progress) { monero_io_assert_available(32); error = monero_io_verify_hmac_for(C_FAKE_SEC_SPEND_KEY, 32, - G_monero_vstate.io_buffer + G_monero_vstate.io_offset, - TYPE_SCALAR); + G_monero_vstate.io_buffer + G_monero_vstate.io_offset, + TYPE_SCALAR); if (error) { return error; } @@ -368,8 +369,9 @@ int monero_io_fetch_varint(uint64_t* out_v64) { return SW_WRONG_DATA; } unsigned int out_len = 0; - unsigned int error = monero_decode_varint(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, - MIN(8, G_monero_vstate.io_length - G_monero_vstate.io_offset), out_v64, &out_len); + unsigned int error = monero_decode_varint( + G_monero_vstate.io_buffer + G_monero_vstate.io_offset, + MIN(8, G_monero_vstate.io_length - G_monero_vstate.io_offset), out_v64, &out_len); G_monero_vstate.io_offset += out_len; return error; } diff --git a/src/monero_key.c b/src/monero_key.c index 875097b..94b3aa4 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -86,7 +86,7 @@ void monero_clear_words(void) { * len : word_list length */ static int monero_set_word(unsigned int n, unsigned int idx, unsigned int w_start, - unsigned char *word_list, int len) { + unsigned char *word_list, int len) { while (w_start < idx) { len -= 1 + word_list[0]; if (len < 0) { @@ -133,8 +133,8 @@ int monero_apdu_manage_seedwords(void) { for (int wi = 0; wi < 3; wi++) { if ((wc[wi] >= w_start) && (wc[wi] < w_end)) { err = monero_set_word(i * 3 + wi, wc[wi], w_start, - G_monero_vstate.io_buffer + G_monero_vstate.io_offset, - MONERO_IO_BUFFER_LENGTH - G_monero_vstate.io_offset); + G_monero_vstate.io_buffer + G_monero_vstate.io_offset, + MONERO_IO_BUFFER_LENGTH - G_monero_vstate.io_offset); if (err) { return err; } @@ -457,7 +457,7 @@ int monero_apdu_scal_mul_key(/*const rct::key &pub, const rct::key &sec, rct::ke unsigned char sec[32]; unsigned char r[32]; int err = 0; - + // fetch monero_io_fetch(pub, 32); err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); @@ -593,7 +593,8 @@ int monero_apdu_derive_public_key(/*const crypto::key_derivation &derivation, co monero_io_discard(0); // pub - int error = monero_derive_public_key(drvpub, derivation, output_index, pub, sizeof(drvpub), sizeof(derivation), sizeof(pub)); + int error = monero_derive_public_key(drvpub, derivation, output_index, pub, sizeof(drvpub), + sizeof(derivation), sizeof(pub)); if (error) { return error; } @@ -626,7 +627,8 @@ int monero_apdu_derive_secret_key(/*const crypto::key_derivation &derivation, co monero_io_discard(0); // pub - err = monero_derive_secret_key(drvsec, derivation, output_index, sec, sizeof(drvsec), sizeof(derivation), sizeof(sec)); + err = monero_derive_secret_key(drvsec, derivation, output_index, sec, sizeof(drvsec), + sizeof(derivation), sizeof(sec)); if (err) { return err; } @@ -709,7 +711,8 @@ int monero_apdu_derive_subaddress_public_key(/*const crypto::public_key &pub, co monero_io_discard(0); // pub - monero_derive_subaddress_public_key(sub_pub, pub, derivation, output_index, sizeof(sub_pub), sizeof(pub), sizeof(derivation)); + monero_derive_subaddress_public_key(sub_pub, pub, derivation, output_index, sizeof(sub_pub), + sizeof(pub), sizeof(derivation)); // pub key monero_io_insert(sub_pub, 32); return SW_OK; @@ -774,7 +777,8 @@ int monero_apdu_get_subaddress_secret_key(/*const crypto::secret_key& sec, const monero_io_fetch(index, 8); monero_io_discard(0); - monero_get_subaddress_secret_key(sub_sec, sec, index, sizeof(sub_sec), sizeof(sec), sizeof(index)); + monero_get_subaddress_secret_key(sub_sec, sec, index, sizeof(sub_sec), sizeof(sec), + sizeof(index)); memcpy(G_monero_vstate.last_get_subaddress_secret_key, sub_sec, 32); monero_io_insert_encrypt(sub_sec, 32, TYPE_SCALAR); @@ -843,9 +847,11 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se // make additional tx pubkey if necessary if (need_additional_txkeys) { if (is_subaddress) { - monero_ecmul_k(additional_txkey_pub, Bout, additional_txkey_sec, sizeof(additional_txkey_pub), 32, sizeof(additional_txkey_sec)); + monero_ecmul_k(additional_txkey_pub, Bout, additional_txkey_sec, + sizeof(additional_txkey_pub), 32, sizeof(additional_txkey_sec)); } else { - monero_ecmul_G(additional_txkey_pub, additional_txkey_sec, sizeof(additional_txkey_pub), sizeof(additional_txkey_sec)); + monero_ecmul_G(additional_txkey_pub, additional_txkey_sec, sizeof(additional_txkey_pub), + sizeof(additional_txkey_sec)); } } else { memset(additional_txkey_pub, 0, 32); @@ -853,7 +859,8 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se // derivation if (is_change) { - monero_generate_key_derivation(derivation, txkey_pub, G_monero_vstate.a, sizeof(derivation), 32, sizeof(G_monero_vstate.a)); + monero_generate_key_derivation(derivation, txkey_pub, G_monero_vstate.a, sizeof(derivation), + 32, sizeof(G_monero_vstate.a)); } else { monero_generate_key_derivation( derivation, Aout, @@ -862,7 +869,8 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se } // compute amount key AKout (scalar1), version is always greater than 1 - monero_derivation_to_scalar(amount_key, derivation, output_index, sizeof(amount_key), sizeof(derivation)); + monero_derivation_to_scalar(amount_key, derivation, output_index, sizeof(amount_key), + sizeof(derivation)); if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { if (G_monero_vstate.io_protocol_version >= 2) { monero_sha256_outkeys_update(amount_key, 32); @@ -870,7 +878,8 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se } // compute ephemeral output key - monero_derive_public_key(out_eph_public_key, derivation, output_index, Bout, sizeof(out_eph_public_key), sizeof(derivation), 32); + monero_derive_public_key(out_eph_public_key, derivation, output_index, Bout, + sizeof(out_eph_public_key), sizeof(derivation), 32); // compute view tag if (use_view_tags) { diff --git a/src/monero_main.c b/src/monero_main.c index 722616a..7f0bda6 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -68,8 +68,7 @@ void app_main(void) { } else if (sw == SW_OK) { monero_io_insert_u16(sw); io_flags = 0; - } - else { + } else { send_error_and_kill_app(sw); } } diff --git a/src/monero_mlsag.c b/src/monero_mlsag.c index 170ef6a..930c104 100644 --- a/src/monero_mlsag.c +++ b/src/monero_mlsag.c @@ -82,8 +82,7 @@ int monero_apdu_mlsag_hash() { unsigned char msg[32]; unsigned char c[32]; if (G_monero_vstate.io_p2 == 1) { - if (monero_keccak_init_H()) - { + if (monero_keccak_init_H()) { return SW_WRONG_DATA; } memcpy(msg, G_monero_vstate.mlsagH, 32); diff --git a/src/monero_open_tx.c b/src/monero_open_tx.c index 7265188..a279623 100644 --- a/src/monero_open_tx.c +++ b/src/monero_open_tx.c @@ -67,7 +67,8 @@ int monero_apdu_open_tx_cont() { #endif monero_rng_mod_order(G_monero_vstate.r, sizeof(G_monero_vstate.r)); - monero_ecmul_G(G_monero_vstate.R, G_monero_vstate.r, sizeof(G_monero_vstate.R), sizeof(G_monero_vstate.r)); + monero_ecmul_G(G_monero_vstate.R, G_monero_vstate.r, sizeof(G_monero_vstate.R), + sizeof(G_monero_vstate.r)); monero_io_insert(G_monero_vstate.R, 32); monero_io_insert_encrypt(G_monero_vstate.r, 32, TYPE_SCALAR); diff --git a/src/monero_prefix.c b/src/monero_prefix.c index ddf9574..7c59f02 100644 --- a/src/monero_prefix.c +++ b/src/monero_prefix.c @@ -37,7 +37,7 @@ int monero_apdu_prefix_hash_init(void) { G_monero_vstate.io_length - G_monero_vstate.io_offset); if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { - error = monero_io_fetch_varint(&timelock); // DUmmy call TODO + error = monero_io_fetch_varint(&timelock); // DUmmy call TODO if (error) { return error; } diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 9156846..ed7ebd1 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -117,7 +117,8 @@ int monero_apdu_mlsag_prehash_update() { } // check C = aH+kG - monero_unblind(v, k, AKout, G_monero_vstate.options & 0x03, sizeof(v), sizeof(k), sizeof(AKout)); + monero_unblind(v, k, AKout, G_monero_vstate.options & 0x03, sizeof(v), sizeof(k), + sizeof(AKout)); monero_ecmul_G(kG, k, sizeof(kG), sizeof(k)); if (!cx_math_is_zero(v, 32)) { monero_ecmul_H(aH, v, sizeof(aH), sizeof(v)); diff --git a/src/monero_proof.c b/src/monero_proof.c index a8d8b7f..7f5587e 100644 --- a/src/monero_proof.c +++ b/src/monero_proof.c @@ -37,7 +37,7 @@ int monero_apdu_get_tx_proof() { unsigned char sig_r[32]; unsigned char sep[32]; int err = 0; -#define k (G_monero_vstate.tmp + 256) +#define k (G_monero_vstate.tmp + 256) #define k_len (sizeof(G_monero_vstate.tmp) - 256) msg = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index bc8f993..1a552e0 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -39,7 +39,6 @@ void __attribute__((noreturn)) app_exit(void); void ui_menu_main_display(); - /* -------------------------------------- 25 WORDS --------------------------------------- */ void ui_menu_words_display(unsigned int value); void ui_menu_words_clear(unsigned int value); @@ -621,9 +620,9 @@ void ui_menu_pubaddr_action(unsigned int value __attribute__((unused))) { /** * */ -int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), - unsigned char* pub_view, unsigned char* pub_spend, - unsigned char is_subbadress, unsigned char* paymanetID) { +int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), unsigned char* pub_view, + unsigned char* pub_spend, unsigned char is_subbadress, + unsigned char* paymanetID) { memset(G_monero_vstate.ux_address, 0, sizeof(G_monero_vstate.ux_address)); switch (G_monero_vstate.disp_addr_mode) { @@ -647,8 +646,8 @@ int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), break; } - int error = monero_base58_public_key(G_monero_vstate.ux_address, pub_view, pub_spend, is_subbadress, - paymanetID); + int error = monero_base58_public_key(G_monero_vstate.ux_address, pub_view, pub_spend, + is_subbadress, paymanetID); if (error) { return error; } diff --git a/src/monero_ux_stax.c b/src/monero_ux_stax.c index 40b1718..3d8abe9 100644 --- a/src/monero_ux_stax.c +++ b/src/monero_ux_stax.c @@ -381,14 +381,14 @@ void display_account(void) { &transactionContext.tagValueList); } -int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), - unsigned char* pub_view, unsigned char* pub_spend, - unsigned char is_subbadress, unsigned char* paymanetID) { +int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), unsigned char* pub_view, + unsigned char* pub_spend, unsigned char is_subbadress, + unsigned char* paymanetID) { int error; memset(G_monero_vstate.ux_address, 0, sizeof(G_monero_vstate.ux_address)); error = monero_base58_public_key(G_monero_vstate.ux_address, pub_view, pub_spend, is_subbadress, - paymanetID); + paymanetID); if (error) { return error; } From 1f947eb2122398aac2f44556256d366aa8c3efbc Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Mon, 13 Nov 2023 17:08:01 +0100 Subject: [PATCH 113/142] some more error mgmt --- src/monero_api.h | 95 +++--- src/monero_blind.c | 77 ++++- src/monero_clsag.c | 126 ++++++-- src/monero_crypto.c | 696 ++++++++++++++++++++++++++++++------------- src/monero_init.c | 65 +++- src/monero_io.c | 1 - src/monero_key.c | 165 +++++++--- src/monero_mlsag.c | 73 ++++- src/monero_monero.c | 5 +- src/monero_open_tx.c | 35 ++- src/monero_prefix.c | 21 +- src/monero_prehash.c | 153 ++++++++-- src/monero_proof.c | 42 ++- src/monero_stealth.c | 10 +- 14 files changed, 1156 insertions(+), 408 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index c8a22d5..0765759 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -30,7 +30,7 @@ void monero_install(unsigned char netId); unsigned int monero_init(void); int monero_init_private_key(void); -void monero_init_ux(void); +int monero_init_ux(void); int monero_dispatch(void); int monero_apdu_put_key(void); @@ -59,7 +59,7 @@ int monero_apdu_get_tx_proof(void); int monero_apdu_open_tx(void); int monero_apdu_open_tx_cont(void); -void monero_reset_tx(int reset_tx_cnt); +int monero_reset_tx(int reset_tx_cnt); int monero_apdu_open_subtx(void); int monero_apdu_set_signature_mode(void); int monero_apdu_stealth(void); @@ -142,14 +142,14 @@ extern const unsigned char C_FAKE_SEC_SPEND_KEY[32]; int is_fake_view_key(unsigned char *s); int is_fake_spend_key(unsigned char *s); -void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t ge_len, - size_t bytes_len); +int monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t ge_len, + size_t bytes_len); void monero_sc_add(unsigned char *r, unsigned char *s1, unsigned char *s2); -void monero_hash_to_scalar(unsigned char *scalar, unsigned char *raw, size_t scalar_len, - unsigned int len); -void monero_hash_to_ec(unsigned char *ec, unsigned char *ec_pub, size_t ec_len); -void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, - size_t ec_priv_len); +int monero_hash_to_scalar(unsigned char *scalar, unsigned char *raw, size_t scalar_len, + unsigned int len); +int monero_hash_to_ec(unsigned char *ec, unsigned char *ec_pub, size_t ec_len); +int monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, + size_t ec_priv_len); /* * compute s = 8 * (k*P) * @@ -157,9 +157,8 @@ void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size * P [in] point in 02 y or 04 x y format * k [in] 32 bytes scalar */ -void monero_generate_key_derivation(unsigned char *drv_data, unsigned char *P, - unsigned char *scalar, size_t drv_data_len, size_t P_len, - size_t scalar_len); +int monero_generate_key_derivation(unsigned char *drv_data, unsigned char *P, unsigned char *scalar, + size_t drv_data_len, size_t P_len, size_t scalar_len); int monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, unsigned int out_idx, size_t scalar_len, size_t drv_data_len); /* @@ -182,22 +181,22 @@ int monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigned int monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigned int out_idx, unsigned char *ec_pub, size_t x_len, size_t drv_data_len, size_t ec_pub_len); -void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv, - size_t ec_pub_len, size_t ec_priv_len); -void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x, - size_t img_len, size_t x_len); +int monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv, + size_t ec_pub_len, size_t ec_priv_len); +int monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x, + size_t img_len, size_t x_len); int monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_data[static 32], unsigned int out_idx); -void monero_derive_subaddress_public_key(unsigned char *x, unsigned char *pub, - unsigned char *drv_data, unsigned int index, size_t x_len, - size_t pub_len, size_t drv_data_len); -void monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *index, size_t x_len, - size_t index_len); -void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *index, size_t C_len, - size_t D_len, size_t index_len); -void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, unsigned char *index, - size_t sub_s_len, size_t s_len, size_t index_len); +int monero_derive_subaddress_public_key(unsigned char *x, unsigned char *pub, + unsigned char *drv_data, unsigned int index, size_t x_len, + size_t pub_len, size_t drv_data_len); +int monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *index, size_t x_len, + size_t index_len); +int monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *index, size_t C_len, + size_t D_len, size_t index_len); +int monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, unsigned char *index, + size_t sub_s_len, size_t s_len, size_t index_len); void monero_clear_words(void); /* ----------------------------------------------------------------------- */ @@ -284,7 +283,7 @@ unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, u unsigned int *out_len); /** */ -void monero_reverse32(unsigned char *rscal, unsigned char *scal, size_t rscal_len, size_t scal_len); +int monero_reverse32(unsigned char *rscal, unsigned char *scal, size_t rscal_len, size_t scal_len); /** * Hps: keccak(drv_data|varint(out_idx)) @@ -295,69 +294,69 @@ int monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, /* * W = k.P */ -void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, - size_t P_len, size_t scalar32_len); +int monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, + size_t P_len, size_t scalar32_len); /* * W = 8k.P */ -void monero_ecmul_8k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, - size_t P_len, size_t scalar32_len); +int monero_ecmul_8k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, + size_t P_len, size_t scalar32_len); /* * W = 8.P */ -void monero_ecmul_8(unsigned char *W, unsigned char *P, size_t W_len, size_t P_len); +int monero_ecmul_8(unsigned char *W, unsigned char *P, size_t W_len, size_t P_len); /* * W = k.G */ -void monero_ecmul_G(unsigned char *W, unsigned char *scalar32, size_t W_len, size_t scalar32_len); +int monero_ecmul_G(unsigned char *W, unsigned char *scalar32, size_t W_len, size_t scalar32_len); /* * W = k.H */ -void monero_ecmul_H(unsigned char *W, unsigned char *scalar32, size_t W_len, size_t scalar32_len); +int monero_ecmul_H(unsigned char *W, unsigned char *scalar32, size_t W_len, size_t scalar32_len); /** * keccak("amount"|sk) */ -void monero_ecdhHash(unsigned char *x, unsigned char *k, size_t k_len); +int monero_ecdhHash(unsigned char *x, unsigned char *k, size_t k_len); /** * keccak("commitment_mask"|sk) %order */ -void monero_genCommitmentMask(unsigned char *c, unsigned char *sk, size_t c_len, size_t sk_len); +int monero_genCommitmentMask(unsigned char *c, unsigned char *sk, size_t c_len, size_t sk_len); /* * W = P+Q */ -void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, - size_t Q_len); +int monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, + size_t Q_len); /* * W = P-Q */ -void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, - size_t Q_len); +int monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, + size_t Q_len); /* r = (a+b) %order */ -void monero_addm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, - size_t b_len); +int monero_addm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, + size_t b_len); /* r = (a-b) %order */ -void monero_subm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, - size_t b_len); +int monero_subm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, + size_t b_len); /* r = (a*b) %order */ -void monero_multm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, - size_t b_len); +int monero_multm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, + size_t b_len); /* r = (a*8) %order */ -void monero_multm_8(unsigned char *r, unsigned char *a, size_t r_len, size_t a_len); +int monero_multm_8(unsigned char *r, unsigned char *a, size_t r_len, size_t a_len); /* */ -void monero_reduce(unsigned char *r, unsigned char *a, size_t r_len, size_t a_len); +int monero_reduce(unsigned char *r, unsigned char *a, size_t r_len, size_t a_len); -void monero_rng_mod_order(unsigned char *r, size_t r_len); +int monero_rng_mod_order(unsigned char *r, size_t r_len); /* ----------------------------------------------------------------------- */ /* --- IO ---- */ /* ----------------------------------------------------------------------- */ diff --git a/src/monero_blind.c b/src/monero_blind.c index cd8b56b..c4e3172 100644 --- a/src/monero_blind.c +++ b/src/monero_blind.c @@ -42,17 +42,36 @@ int monero_apdu_blind() { if ((G_monero_vstate.options & 0x03) == 2) { memset(k, 0, 32); - monero_ecdhHash(AKout, AKout, sizeof(AKout)); + + err = monero_ecdhHash(AKout, AKout, sizeof(AKout)); + if (err) { + return err; + } for (int i = 0; i < 8; i++) { v[i] = v[i] ^ AKout[i]; } } else { // blind mask - monero_hash_to_scalar(AKout, AKout, sizeof(AKout), sizeof(AKout)); - monero_addm(k, k, AKout, sizeof(k), sizeof(k), sizeof(AKout)); + err = monero_hash_to_scalar(AKout, AKout, sizeof(AKout), sizeof(AKout)); + if (err) { + return err; + } + + err = monero_addm(k, k, AKout, sizeof(k), sizeof(k), sizeof(AKout)); + if (err) { + return err; + } + // blind value - monero_hash_to_scalar(AKout, AKout, sizeof(AKout), sizeof(AKout)); - monero_addm(v, v, AKout, sizeof(v), sizeof(v), sizeof(AKout)); + err = monero_hash_to_scalar(AKout, AKout, sizeof(AKout), sizeof(AKout)); + if (err) { + return err; + } + + err = monero_addm(v, v, AKout, sizeof(v), sizeof(v), sizeof(AKout)); + if (err) { + return err; + } } // ret all monero_io_insert(v, 32); @@ -66,19 +85,43 @@ int monero_apdu_blind() { /* ----------------------------------------------------------------------- */ int monero_unblind(unsigned char *v, unsigned char *k, unsigned char *AKout, unsigned int short_amount, size_t v_len, size_t k_len, size_t AKout_len) { + int error; if (short_amount == 2) { - monero_genCommitmentMask(k, AKout, k_len, AKout_len); - monero_ecdhHash(AKout, AKout, AKout_len); + error = monero_genCommitmentMask(k, AKout, k_len, AKout_len); + if (error) { + return error; + } + + error = monero_ecdhHash(AKout, AKout, AKout_len); + if (error) { + return error; + } + for (int i = 0; i < 8; i++) { v[i] = v[i] ^ AKout[i]; } } else { // unblind mask - monero_hash_to_scalar(AKout, AKout, AKout_len, AKout_len); - monero_subm(k, k, AKout, k_len, k_len, AKout_len); + error = monero_hash_to_scalar(AKout, AKout, AKout_len, AKout_len); + if (error) { + return error; + } + + error = monero_subm(k, k, AKout, k_len, k_len, AKout_len); + if (error) { + return error; + } + // unblind value - monero_hash_to_scalar(AKout, AKout, AKout_len, AKout_len); - monero_subm(v, v, AKout, v_len, v_len, AKout_len); + error = monero_hash_to_scalar(AKout, AKout, AKout_len, AKout_len); + if (error) { + return error; + } + + error = monero_subm(v, v, AKout, v_len, v_len, AKout_len); + if (error) { + return error; + } } return 0; } @@ -101,8 +144,11 @@ int monero_apdu_unblind() { monero_io_discard(1); - monero_unblind(v, k, AKout, G_monero_vstate.options & 0x03, sizeof(v), sizeof(k), - sizeof(AKout)); + err = monero_unblind(v, k, AKout, G_monero_vstate.options & 0x03, sizeof(v), sizeof(k), + sizeof(AKout)); + if (err) { + return err; + } // ret all monero_io_insert(v, 32); @@ -125,7 +171,10 @@ int monero_apdu_gen_commitment_mask() { } monero_io_discard(1); - monero_genCommitmentMask(k, AKout, sizeof(k), sizeof(AKout)); + err = monero_genCommitmentMask(k, AKout, sizeof(k), sizeof(AKout)); + if (err) { + return err; + } // ret all monero_io_insert(k, 32); diff --git a/src/monero_clsag.c b/src/monero_clsag.c index e9bcb5f..f81c227 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -62,20 +62,38 @@ int monero_apdu_clsag_prepare() { monero_io_discard(1); // a - monero_rng_mod_order(a, sizeof(a)); + err = monero_rng_mod_order(a, sizeof(a)); + if (err) { + return err; + } + monero_io_insert_encrypt(a, 32, TYPE_ALPHA); // a.G - monero_ecmul_G(W, a, sizeof(W), sizeof(a)); + err = monero_ecmul_G(W, a, sizeof(W), sizeof(a)); + if (err) { + return err; + } + monero_io_insert(W, 32); // a.H - monero_ecmul_k(W, H, a, sizeof(W), sizeof(H), sizeof(a)); + err = monero_ecmul_k(W, H, a, sizeof(W), sizeof(H), sizeof(a)); + if (err) { + return err; + } + monero_io_insert(W, 32); // I = p.H - monero_ecmul_k(W, H, p, sizeof(W), sizeof(H), sizeof(p)); + err = monero_ecmul_k(W, H, p, sizeof(W), sizeof(H), sizeof(p)); + if (err) { + return err; + } monero_io_insert(W, 32); // D = z.H - monero_ecmul_k(W, H, z, sizeof(W), sizeof(H), sizeof(z)); + err = monero_ecmul_k(W, H, z, sizeof(W), sizeof(H), sizeof(z)); + if (err) { + return err; + } monero_io_insert(W, 32); return SW_OK; @@ -94,6 +112,7 @@ int monero_apdu_clsag_prepare() { int monero_apdu_clsag_hash() { unsigned char msg[32]; unsigned char c[32]; + int err; if (G_monero_vstate.io_p2 == 1) { if (monero_keccak_init_H()) { @@ -104,10 +123,21 @@ int monero_apdu_clsag_hash() { monero_io_fetch(msg, 32); monero_io_discard(1); - monero_keccak_update_H(msg, 32); + err = monero_keccak_update_H(msg, 32); + if (err) { + return err; + } + if ((G_monero_vstate.options & 0x80) == 0) { - monero_keccak_final_H(c); - monero_reduce(c, c, sizeof(c), sizeof(c)); + err = monero_keccak_final_H(c); + if (err) { + return err; + } + + err = monero_reduce(c, c, sizeof(c), sizeof(c)); + if (err) { + return err; + } monero_io_insert(c, 32); memcpy(G_monero_vstate.c, c, 32); } @@ -168,17 +198,51 @@ int monero_apdu_clsag_sign() { monero_io_discard(1); - monero_check_scalar_not_null(a); - monero_check_scalar_not_null(p); - monero_check_scalar_not_null(z); + err = monero_check_scalar_not_null(a); + if (err) { + return err; + } + + err = monero_check_scalar_not_null(p); + if (err) { + return err; + } + + err = monero_check_scalar_not_null(z); + if (err) { + return err; + } + + err = monero_reduce(a, a, sizeof(a), sizeof(a)); + if (err) { + return err; + } + + err = monero_reduce(p, p, sizeof(p), sizeof(p)); + if (err) { + return err; + } + + err = monero_reduce(z, z, sizeof(z), sizeof(z)); + if (err) { + return err; + } + + err = monero_reduce(mu_P, mu_P, sizeof(mu_P), sizeof(mu_P)); + if (err) { + return err; + } - monero_reduce(a, a, sizeof(a), sizeof(a)); - monero_reduce(p, p, sizeof(p), sizeof(p)); - monero_reduce(z, z, sizeof(z), sizeof(z)); - monero_reduce(mu_P, mu_P, sizeof(mu_P), sizeof(mu_P)); - monero_reduce(mu_C, mu_C, sizeof(mu_C), sizeof(mu_C)); - monero_reduce(G_monero_vstate.c, G_monero_vstate.c, sizeof(G_monero_vstate.c), - sizeof(G_monero_vstate.c)); + err = monero_reduce(mu_C, mu_C, sizeof(mu_C), sizeof(mu_C)); + if (err) { + return err; + } + + err = monero_reduce(G_monero_vstate.c, G_monero_vstate.c, sizeof(G_monero_vstate.c), + sizeof(G_monero_vstate.c)); + if (err) { + return err; + } // s0_p_mu_P = mu_P*p // s0_add_z_mu_C = mu_C*z + s0_p_mu_P @@ -187,15 +251,31 @@ int monero_apdu_clsag_sign() { // = a - c*(mu_C*z + mu_P*p) // s = p*mu_P - monero_multm(s, p, mu_P, sizeof(s), sizeof(p), sizeof(mu_P)); + err = monero_multm(s, p, mu_P, sizeof(s), sizeof(p), sizeof(mu_P)); + if (err) { + return err; + } // mu_P = mu_C*z - monero_multm(mu_P, mu_C, z, sizeof(mu_P), sizeof(mu_C), sizeof(z)); + err = monero_multm(mu_P, mu_C, z, sizeof(mu_P), sizeof(mu_C), sizeof(z)); + if (err) { + return err; + } // s = p*mu_P + mu_C*z - monero_addm(s, s, mu_P, sizeof(s), sizeof(s), sizeof(mu_P)); + err = monero_addm(s, s, mu_P, sizeof(s), sizeof(s), sizeof(mu_P)); + if (err) { + return err; + } // mu_P = c * (p*mu_P + mu_C*z) - monero_multm(mu_P, G_monero_vstate.c, s, sizeof(mu_P), sizeof(G_monero_vstate.c), sizeof(s)); + err = monero_multm(mu_P, G_monero_vstate.c, s, sizeof(mu_P), sizeof(G_monero_vstate.c), + sizeof(s)); + if (err) { + return err; + } // s = a - c*(p*mu_P + mu_C*z) - monero_subm(s, a, mu_P, sizeof(s), sizeof(a), sizeof(mu_P)); + err = monero_subm(s, a, mu_P, sizeof(s), sizeof(a), sizeof(mu_P)); + if (err) { + return err; + } monero_io_insert(s, 32); diff --git a/src/monero_crypto.c b/src/monero_crypto.c index 56faffe..3fa7e44 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -60,25 +60,43 @@ unsigned char const C_EIGHT[32] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0 /* ----------------------------------------------------------------------- */ int monero_aes_derive(cx_aes_key_t *sk, unsigned char *seed32, unsigned char *a, unsigned char *b) { unsigned char h1[32]; + int error; - monero_keccak_init_H(); - monero_keccak_update_H(seed32, 32); - monero_keccak_update_H(a, 32); - monero_keccak_update_H(b, 32); - monero_keccak_final_H(h1); + error = monero_keccak_init_H(); + if (error) { + return error; + } - monero_keccak_H(h1, 32, h1); + error = monero_keccak_update_H(seed32, 32); + if (error) { + return error; + } - return cx_aes_init_key_no_throw(h1, 16, sk); -} + error = monero_keccak_update_H(a, 32); + if (error) { + return error; + } -/* ----------------------------------------------------------------------- */ -/* --- --- */ -/* ----------------------------------------------------------------------- */ -void monero_aes_generate(cx_aes_key_t *sk) { - unsigned char h1[16]; - cx_rng(h1, 16); - cx_aes_init_key_no_throw(h1, 16, sk); + error = monero_keccak_update_H(b, 32); + if (error) { + return error; + } + + error = monero_keccak_final_H(h1); + if (error) { + return error; + } + + error = monero_keccak_H(h1, 32, h1); + if (error) { + return error; + } + + error = cx_aes_init_key_no_throw(h1, 16, sk); + if (error) { + return SW_SECURITY_INTERNAL; + } + return 0; } /* ----------------------------------------------------------------------- */ @@ -135,23 +153,23 @@ unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, u /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_reverse32(unsigned char *rscal, unsigned char *scal, size_t rscal_len, - size_t scal_len) { +int monero_reverse32(unsigned char *rscal, unsigned char *scal, size_t rscal_len, size_t scal_len) { unsigned char x; unsigned int i; if (!rscal || !scal) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA; } if (rscal_len < 32 || scal_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } for (i = 0; i < 16; i++) { x = scal[i]; rscal[i] = scal[31 - i]; rscal[31 - i] = x; } + return 0; } /* ----------------------------------------------------------------------- */ @@ -162,21 +180,33 @@ void monero_hash_init_sha256(cx_hash_t *hasher) { } int monero_hash_init_keccak(cx_hash_t *hasher) { - return cx_keccak_init_no_throw((cx_sha3_t *)hasher, 256); + int error = cx_keccak_init_no_throw((cx_sha3_t *)hasher, 256); + if (error) { + return SW_SECURITY_INTERNAL; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_hash_update(cx_hash_t *hasher, const unsigned char *buf, unsigned int len) { - return cx_hash_no_throw(hasher, 0, buf, len, NULL, 0); + int error = cx_hash_no_throw(hasher, 0, buf, len, NULL, 0); + if (error) { + return SW_SECURITY_INTERNAL; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_hash_final(cx_hash_t *hasher, unsigned char *out) { - return cx_hash_no_throw(hasher, CX_LAST, NULL, 0, out, 32); + int error = cx_hash_no_throw(hasher, CX_LAST, NULL, 0, out, 32); + if (error) { + return SW_SECURITY_INTERNAL; + } + return 0; } /* ----------------------------------------------------------------------- */ @@ -190,11 +220,14 @@ int monero_hash(unsigned int algo, cx_hash_t *hasher, const unsigned char *buf, } else { err = cx_keccak_init_no_throw((cx_sha3_t *)hasher, 256); if (err) { - return err; + return SW_SECURITY_INTERNAL; } } err = cx_hash_no_throw(hasher, CX_LAST, buf, len, out, 32); - return err; + if (err) { + return SW_SECURITY_INTERNAL; + } + return 0; } /* ----------------------------------------------------------------------- */ @@ -305,8 +338,9 @@ const unsigned char C_fe_qm5div8[] = { 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd}; -void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t ge_len, - size_t bytes_len) { +int monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t ge_len, + size_t bytes_len) { + int error = 0; #define MOD (unsigned char *)C_ED25519_FIELD, 32 #define fe_isnegative(f) (f[31] & 1) #if 0 @@ -358,71 +392,72 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t unsigned char sign; if (!ge) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA; } if (ge_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } // cx works in BE - monero_reverse32(u, bytes, 32, bytes_len); - cx_math_modm_no_throw(u, 32, (unsigned char *)C_ED25519_FIELD, 32); + error |= monero_reverse32(u, bytes, 32, bytes_len); + error |= cx_math_modm_no_throw(u, 32, (unsigned char *)C_ED25519_FIELD, 32); // go on - cx_math_multm_no_throw(v, u, u, MOD); /* 2 * u^2 */ - cx_math_addm_no_throw(v, v, v, MOD); + error |= cx_math_multm_no_throw(v, u, u, MOD); /* 2 * u^2 */ + error |= cx_math_addm_no_throw(v, v, v, MOD); memset(w, 0, 32); - w[31] = 1; /* w = 1 */ - cx_math_addm_no_throw(w, v, w, MOD); /* w = 2 * u^2 + 1 */ - cx_math_multm_no_throw(x, w, w, MOD); /* w^2 */ - cx_math_multm_no_throw(y, (unsigned char *)C_fe_ma2, v, MOD); /* -2 * A^2 * u^2 */ - cx_math_addm_no_throw(x, x, y, MOD); /* x = w^2 - 2 * A^2 * u^2 */ + w[31] = 1; /* w = 1 */ + error |= cx_math_addm_no_throw(w, v, w, MOD); /* w = 2 * u^2 + 1 */ + error |= cx_math_multm_no_throw(x, w, w, MOD); /* w^2 */ + error |= cx_math_multm_no_throw(y, (unsigned char *)C_fe_ma2, v, MOD); /* -2 * A^2 * u^2 */ + error |= cx_math_addm_no_throw(x, x, y, MOD); /* x = w^2 - 2 * A^2 * u^2 */ // inline fe_divpowm1(r->X, w, x); // (w / x)^(m + 1) => fe_divpowm1(r,u,v) #define _u w #define _v x - cx_math_multm_no_throw(v3, _v, _v, MOD); - cx_math_multm_no_throw(v3, v3, _v, MOD); /* v3 = v^3 */ - cx_math_multm_no_throw(uv7, v3, v3, MOD); - cx_math_multm_no_throw(uv7, uv7, _v, MOD); - cx_math_multm_no_throw(uv7, uv7, _u, MOD); /* uv7 = uv^7 */ - cx_math_powm_no_throw(uv7, uv7, (unsigned char *)C_fe_qm5div8, 32, MOD); /* (uv^7)^((q-5)/8)*/ - cx_math_multm_no_throw(uv7, uv7, v3, MOD); - cx_math_multm_no_throw(rX, uv7, w, MOD); /* u^(m+1)v^(-(m+1)) */ + error |= cx_math_multm_no_throw(v3, _v, _v, MOD); + error |= cx_math_multm_no_throw(v3, v3, _v, MOD); /* v3 = v^3 */ + error |= cx_math_multm_no_throw(uv7, v3, v3, MOD); + error |= cx_math_multm_no_throw(uv7, uv7, _v, MOD); + error |= cx_math_multm_no_throw(uv7, uv7, _u, MOD); /* uv7 = uv^7 */ + error |= cx_math_powm_no_throw(uv7, uv7, (unsigned char *)C_fe_qm5div8, 32, + MOD); /* (uv^7)^((q-5)/8)*/ + error |= cx_math_multm_no_throw(uv7, uv7, v3, MOD); + error |= cx_math_multm_no_throw(rX, uv7, w, MOD); /* u^(m+1)v^(-(m+1)) */ #undef _u #undef _v - cx_math_multm_no_throw(y, rX, rX, MOD); - cx_math_multm_no_throw(x, y, x, MOD); - cx_math_subm_no_throw(y, w, x, MOD); + error |= cx_math_multm_no_throw(y, rX, rX, MOD); + error |= cx_math_multm_no_throw(x, y, x, MOD); + error |= cx_math_subm_no_throw(y, w, x, MOD); memcpy(z, C_fe_ma, 32); if (!cx_math_is_zero(y, 32)) { - cx_math_addm_no_throw(y, w, x, MOD); + error |= cx_math_addm_no_throw(y, w, x, MOD); if (!cx_math_is_zero(y, 32)) { goto negative; } else { - cx_math_multm_no_throw(rX, rX, (unsigned char *)C_fe_fffb1, MOD); + error |= cx_math_multm_no_throw(rX, rX, (unsigned char *)C_fe_fffb1, MOD); } } else { - cx_math_multm_no_throw(rX, rX, (unsigned char *)C_fe_fffb2, MOD); + error |= cx_math_multm_no_throw(rX, rX, (unsigned char *)C_fe_fffb2, MOD); } - cx_math_multm_no_throw(rX, rX, u, MOD); // u * sqrt(2 * A * (A + 2) * w / x) - cx_math_multm_no_throw(z, z, v, MOD); // -2 * A * u^2 + error |= cx_math_multm_no_throw(rX, rX, u, MOD); // u * sqrt(2 * A * (A + 2) * w / x) + error |= cx_math_multm_no_throw(z, z, v, MOD); // -2 * A * u^2 sign = 0; goto setsign; negative: - cx_math_multm_no_throw(x, x, (unsigned char *)C_fe_sqrtm1, MOD); - cx_math_subm_no_throw(y, w, x, MOD); + error |= cx_math_multm_no_throw(x, x, (unsigned char *)C_fe_sqrtm1, MOD); + error |= cx_math_subm_no_throw(y, w, x, MOD); if (!cx_math_is_zero(y, 32)) { - cx_math_addm_no_throw(y, w, x, MOD); - cx_math_multm_no_throw(rX, rX, (unsigned char *)C_fe_fffb3, MOD); + error |= cx_math_addm_no_throw(y, w, x, MOD); + error |= cx_math_multm_no_throw(rX, rX, (unsigned char *)C_fe_fffb3, MOD); } else { - cx_math_multm_no_throw(rX, rX, (unsigned char *)C_fe_fffb4, MOD); + error |= cx_math_multm_no_throw(rX, rX, (unsigned char *)C_fe_fffb4, MOD); } // r->X = sqrt(A * (A + 2) * w / x) // z = -A @@ -430,20 +465,25 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t setsign: if (fe_isnegative(rX) != sign) { - cx_math_sub(rX, (unsigned char *)C_ED25519_FIELD, rX, 32); + error |= cx_math_sub(rX, (unsigned char *)C_ED25519_FIELD, rX, 32); } - cx_math_addm_no_throw(rZ, z, w, MOD); - cx_math_subm_no_throw(rY, z, w, MOD); - cx_math_multm_no_throw(rX, rX, rZ, MOD); + error |= cx_math_addm_no_throw(rZ, z, w, MOD); + error |= cx_math_subm_no_throw(rY, z, w, MOD); + error |= cx_math_multm_no_throw(rX, rX, rZ, MOD); // back to monero y-affine - cx_math_invprimem_no_throw(u, rZ, MOD); + error |= cx_math_invprimem_no_throw(u, rZ, MOD); Pxy[0] = 0x04; - cx_math_multm_no_throw(&Pxy[1], rX, u, MOD); - cx_math_multm_no_throw(&Pxy[1 + 32], rY, u, MOD); - cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + error |= cx_math_multm_no_throw(&Pxy[1], rX, u, MOD); + error |= cx_math_multm_no_throw(&Pxy[1 + 32], rY, u, MOD); + error |= cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); memcpy(ge, &Pxy[1], 32); + if (error) { + return SW_SECURITY_INTERNAL; + } + return 0; + #undef u #undef v #undef w @@ -467,37 +507,68 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_hash_to_scalar(unsigned char *scalar, unsigned char *raw, size_t scalar_len, - unsigned int raw_len) { - monero_keccak_F(raw, raw_len, scalar); - monero_reduce(scalar, scalar, scalar_len, scalar_len); +int monero_hash_to_scalar(unsigned char *scalar, unsigned char *raw, size_t scalar_len, + unsigned int raw_len) { + int error; + + error = monero_keccak_F(raw, raw_len, scalar); + if (error) { + return error; + } + + error = monero_reduce(scalar, scalar, scalar_len, scalar_len); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_hash_to_ec(unsigned char *ec, unsigned char *ec_pub, size_t ec_len) { - monero_keccak_F(ec_pub, 32, ec); - monero_ge_fromfe_frombytes(ec, ec, ec_len, ec_len); - monero_ecmul_8(ec, ec, ec_len, ec_len); +int monero_hash_to_ec(unsigned char *ec, unsigned char *ec_pub, size_t ec_len) { + int error; + error = monero_keccak_F(ec_pub, 32, ec); + if (error) { + return error; + } + + error = monero_ge_fromfe_frombytes(ec, ec, ec_len, ec_len); + if (error) { + return error; + } + + error = monero_ecmul_8(ec, ec, ec_len, ec_len); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, - size_t ec_priv_len) { - monero_rng_mod_order(ec_priv, ec_priv_len); - monero_ecmul_G(ec_pub, ec_priv, ec_pub_len, ec_priv_len); +int monero_generate_keypair(unsigned char *ec_pub, unsigned char *ec_priv, size_t ec_pub_len, + size_t ec_priv_len) { + int error; + error = monero_rng_mod_order(ec_priv, ec_priv_len); + if (error) { + return error; + } + + error = monero_ecmul_G(ec_pub, ec_priv, ec_pub_len, ec_priv_len); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- ok --- */ /* ----------------------------------------------------------------------- */ -void monero_generate_key_derivation(unsigned char *drv_data, unsigned char *P, - unsigned char *scalar, size_t drv_data_len, size_t P_len, - size_t scalar_len) { - monero_ecmul_8k(drv_data, P, scalar, drv_data_len, P_len, scalar_len); +int monero_generate_key_derivation(unsigned char *drv_data, unsigned char *P, unsigned char *scalar, + size_t drv_data_len, size_t P_len, size_t scalar_len) { + return monero_ecmul_8k(drv_data, P, scalar, drv_data_len, P_len, scalar_len); } /* ----------------------------------------------------------------------- */ @@ -520,8 +591,16 @@ int monero_derivation_to_scalar(unsigned char *scalar, unsigned char *drv_data, return error; } len_varint += 32; - monero_keccak_F(varint, len_varint, varint); - monero_reduce(scalar, varint, scalar_len, sizeof(varint)); + + error = monero_keccak_F(varint, len_varint, varint); + if (error) { + return error; + } + + error = monero_reduce(scalar, varint, scalar_len, sizeof(varint)); + if (error) { + return error; + } return 0; } @@ -541,7 +620,10 @@ int monero_derive_secret_key(unsigned char *x, unsigned char *drv_data, unsigned } // generate - monero_addm(x, tmp, ec_priv, x_len, sizeof(tmp), ec_priv_len); + error = monero_addm(x, tmp, ec_priv, x_len, sizeof(tmp), ec_priv_len); + if (error) { + return error; + } return 0; } @@ -559,27 +641,43 @@ int monero_derive_public_key(unsigned char *x, unsigned char *drv_data, unsigned return error; } // generate - monero_ecmul_G(tmp, tmp, sizeof(tmp), sizeof(tmp)); - monero_ecadd(x, tmp, ec_pub, x_len, sizeof(tmp), ec_pub_len); + error = monero_ecmul_G(tmp, tmp, sizeof(tmp), sizeof(tmp)); + if (error) { + return error; + } + + error = monero_ecadd(x, tmp, ec_pub, x_len, sizeof(tmp), ec_pub_len); + if (error) { + return error; + } return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv, - size_t ec_pub_len, size_t ec_priv_len) { - monero_ecmul_G(ec_pub, ec_priv, ec_pub_len, ec_priv_len); +int monero_secret_key_to_public_key(unsigned char *ec_pub, unsigned char *ec_priv, + size_t ec_pub_len, size_t ec_priv_len) { + return monero_ecmul_G(ec_pub, ec_priv, ec_pub_len, ec_priv_len); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x, - size_t img_len, size_t x_len) { +int monero_generate_key_image(unsigned char *img, unsigned char *P, unsigned char *x, + size_t img_len, size_t x_len) { unsigned char I[32]; - monero_hash_to_ec(I, P, sizeof(I)); - monero_ecmul_k(img, I, x, img_len, sizeof(I), x_len); + int error; + error = monero_hash_to_ec(I, P, sizeof(I)); + if (error) { + return error; + } + + error = monero_ecmul_k(img, I, x, img_len, sizeof(I), x_len); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ @@ -598,7 +696,12 @@ int monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_data return error; } len_varint += 8 + 32; - monero_keccak_F(varint, len_varint, varint); + + error = monero_keccak_F(varint, len_varint, varint); + if (error) { + return error; + } + *view_tag = varint[0]; return 0; } @@ -610,39 +713,70 @@ int monero_derive_view_tag(unsigned char *view_tag, const unsigned char drv_data /* ----------------------------------------------------------------------- */ /* --- ok --- */ /* ----------------------------------------------------------------------- */ -void monero_derive_subaddress_public_key(unsigned char *x, unsigned char *pub, - unsigned char *drv_data, unsigned int index, size_t x_len, - size_t pub_len, size_t drv_data_len) { +int monero_derive_subaddress_public_key(unsigned char *x, unsigned char *pub, + unsigned char *drv_data, unsigned int index, size_t x_len, + size_t pub_len, size_t drv_data_len) { unsigned char scalarG[32]; + int error; - monero_derivation_to_scalar(scalarG, drv_data, index, sizeof(scalarG), drv_data_len); - monero_ecmul_G(scalarG, scalarG, sizeof(scalarG), sizeof(scalarG)); - monero_ecsub(x, pub, scalarG, x_len, pub_len, sizeof(scalarG)); + error = monero_derivation_to_scalar(scalarG, drv_data, index, sizeof(scalarG), drv_data_len); + if (error) { + return error; + } + error = monero_ecmul_G(scalarG, scalarG, sizeof(scalarG), sizeof(scalarG)); + if (error) { + return error; + } + error = monero_ecsub(x, pub, scalarG, x_len, pub_len, sizeof(scalarG)); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- ok --- */ /* ----------------------------------------------------------------------- */ -void monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *index, size_t x_len, - size_t index_len) { +int monero_get_subaddress_spend_public_key(unsigned char *x, unsigned char *index, size_t x_len, + size_t index_len) { + int error; // m = Hs(a || index_major || index_minor) - monero_get_subaddress_secret_key(x, G_monero_vstate.a, index, x_len, sizeof(G_monero_vstate.a), - index_len); + error = monero_get_subaddress_secret_key(x, G_monero_vstate.a, index, x_len, + sizeof(G_monero_vstate.a), index_len); + if (error) { + return error; + } + // M = m*G - monero_secret_key_to_public_key(x, x, x_len, x_len); + error = monero_secret_key_to_public_key(x, x, x_len, x_len); + if (error) { + return error; + } + // D = B + M - monero_ecadd(x, x, G_monero_vstate.B, x_len, x_len, sizeof(G_monero_vstate.B)); + error = monero_ecadd(x, x, G_monero_vstate.B, x_len, x_len, sizeof(G_monero_vstate.B)); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *index, size_t C_len, - size_t D_len, size_t index_len) { +int monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *index, size_t C_len, + size_t D_len, size_t index_len) { // retrieve D - monero_get_subaddress_spend_public_key(D, index, D_len, index_len); + int error = monero_get_subaddress_spend_public_key(D, index, D_len, index_len); + if (error) { + return error; + } // C = a*D - monero_ecmul_k(C, D, G_monero_vstate.a, C_len, D_len, sizeof(G_monero_vstate.a)); + error = monero_ecmul_k(C, D, G_monero_vstate.a, C_len, D_len, sizeof(G_monero_vstate.a)); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ @@ -650,26 +784,36 @@ void monero_get_subaddress(unsigned char *C, unsigned char *D, unsigned char *in /* ----------------------------------------------------------------------- */ static const char C_sub_address_prefix[] = {'S', 'u', 'b', 'A', 'd', 'd', 'r', 0}; -void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, unsigned char *index, - size_t sub_s_len, size_t s_len, size_t index_len) { +int monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, unsigned char *index, + size_t sub_s_len, size_t s_len, size_t index_len) { unsigned char in[sizeof(C_sub_address_prefix) + 32 + 8]; + int error; if (!s || s_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } if (!index || index_len < 8) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } memcpy(in, C_sub_address_prefix, sizeof(C_sub_address_prefix)); memcpy(in + sizeof(C_sub_address_prefix), s, 32); memcpy(in + sizeof(C_sub_address_prefix) + 32, index, 8); // hash_to_scalar with more that 32bytes: - monero_keccak_F(in, sizeof(in), sub_s); - monero_reduce(sub_s, sub_s, sub_s_len, sub_s_len); + + error = monero_keccak_F(in, sizeof(in), sub_s); + if (error) { + return error; + } + + error = monero_reduce(sub_s, sub_s, sub_s_len, sub_s_len); + if (error) { + return error; + } + return 0; } /* ======================================================================= */ @@ -681,9 +825,14 @@ void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, un /* ----------------------------------------------------------------------- */ unsigned int monero_check_scalar_range_1N(unsigned char *s, size_t s_len) { unsigned char x[32]; - monero_reverse32(x, s, sizeof(x), s_len); int diff; - cx_math_cmp_no_throw(x, C_ED25519_ORDER, 32, &diff); + int error = monero_reverse32(x, s, sizeof(x), s_len); + if (error) { + return error; + } + if (cx_math_cmp_no_throw(x, C_ED25519_ORDER, 32, &diff)) { + return SW_SECURITY_INTERNAL; + } if (cx_math_is_zero(x, 32) || diff >= 0) { return SW_WRONG_DATA_RANGE; } @@ -702,183 +851,239 @@ unsigned int monero_check_scalar_not_null(unsigned char *s) { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecmul_G(unsigned char *W, unsigned char *scalar32, size_t W_len, size_t scalar32_len) { +int monero_ecmul_G(unsigned char *W, unsigned char *scalar32, size_t W_len, size_t scalar32_len) { unsigned char Pxy[PXY_SIZE]; unsigned char s[32]; + int error; if (!W || W_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } - monero_reverse32(s, scalar32, sizeof(s), scalar32_len); + error = monero_reverse32(s, scalar32, sizeof(s), scalar32_len); + if (error) { + return error; + } memcpy(Pxy, C_ED25519_G, PXY_SIZE); - cx_ecfp_scalar_mult_no_throw(CX_CURVE_Ed25519, Pxy, s, 32); - cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + error = cx_ecfp_scalar_mult_no_throw(CX_CURVE_Ed25519, Pxy, s, 32); + if (error) { + return SW_SECURITY_INTERNAL; + } + error = cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + if (error) { + return SW_SECURITY_INTERNAL; + } memcpy(W, &Pxy[1], 32); + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecmul_H(unsigned char *W, unsigned char *scalar32, size_t W_len, size_t scalar32_len) { +int monero_ecmul_H(unsigned char *W, unsigned char *scalar32, size_t W_len, size_t scalar32_len) { unsigned char Pxy[PXY_SIZE]; unsigned char s[32]; + int error = 0; + if (!W || W_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; + } + error = monero_reverse32(s, scalar32, sizeof(s), scalar32_len); + if (error) { + return error; } - monero_reverse32(s, scalar32, sizeof(s), scalar32_len); Pxy[0] = 0x02; memcpy(&Pxy[1], C_ED25519_Hy, 32); - cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + error |= cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); - cx_ecfp_scalar_mult_no_throw(CX_CURVE_Ed25519, Pxy, s, 32); - cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + error |= cx_ecfp_scalar_mult_no_throw(CX_CURVE_Ed25519, Pxy, s, 32); + + error |= cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + + if (error) { + return SW_SECURITY_INTERNAL; + } memcpy(W, &Pxy[1], 32); + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, - size_t P_len, size_t scalar32_len) { +int monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, + size_t P_len, size_t scalar32_len) { unsigned char Pxy[PXY_SIZE]; unsigned char s[32]; + int error = 0; if (!W || W_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } if (!P || P_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; + } + error = monero_reverse32(s, scalar32, sizeof(s), scalar32_len); + if (error) { + return error; } - monero_reverse32(s, scalar32, sizeof(s), scalar32_len); Pxy[0] = 0x02; memcpy(&Pxy[1], P, 32); - cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + error |= cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); - cx_ecfp_scalar_mult_no_throw(CX_CURVE_Ed25519, Pxy, s, 32); - cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + error |= cx_ecfp_scalar_mult_no_throw(CX_CURVE_Ed25519, Pxy, s, 32); + error |= cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + if (error) { + return SW_SECURITY_INTERNAL; + } memcpy(W, &Pxy[1], 32); + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecmul_8k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, - size_t P_len, size_t scalar32_len) { +int monero_ecmul_8k(unsigned char *W, unsigned char *P, unsigned char *scalar32, size_t W_len, + size_t P_len, size_t scalar32_len) { unsigned char s[32]; - monero_multm_8(s, scalar32, sizeof(s), scalar32_len); - monero_ecmul_k(W, P, s, W_len, P_len, sizeof(s)); + int error = 0; + error = monero_multm_8(s, scalar32, sizeof(s), scalar32_len); + if (error) { + return error; + } + + error = monero_ecmul_k(W, P, s, W_len, P_len, sizeof(s)); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecmul_8(unsigned char *W, unsigned char *P, size_t W_len, size_t P_len) { +int monero_ecmul_8(unsigned char *W, unsigned char *P, size_t W_len, size_t P_len) { unsigned char Pxy[PXY_SIZE]; + int error = 0; if (!W || W_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } if (!P || P_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } Pxy[0] = 0x02; memcpy(&Pxy[1], P, 32); - cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); - cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Pxy); - cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Pxy); - cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Pxy); - cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + error |= cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + error |= cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Pxy); + error |= cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Pxy); + error |= cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Pxy); + error |= cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + if (error) { + return SW_SECURITY_INTERNAL; + } memcpy(W, &Pxy[1], 32); + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, - size_t Q_len) { +int monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, + size_t Q_len) { unsigned char Pxy[PXY_SIZE]; unsigned char Qxy[PXY_SIZE]; + int error = 0; if (!W || W_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } if (!P || P_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } if (!Q || Q_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } Pxy[0] = 0x02; memcpy(&Pxy[1], P, 32); - cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + error |= cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); Qxy[0] = 0x02; memcpy(&Qxy[1], Q, 32); - cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Qxy, sizeof(Qxy)); + error |= cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Qxy, sizeof(Qxy)); - cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Qxy); + error |= cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Qxy); - cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + error |= cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); memcpy(W, &Pxy[1], 32); + + if (error) { + return SW_SECURITY_INTERNAL; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, - size_t Q_len) { +int monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W_len, size_t P_len, + size_t Q_len) { unsigned char Pxy[PXY_SIZE]; unsigned char Qxy[PXY_SIZE]; + int error = 0; if (!W || W_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } if (!P || P_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } if (!Q || Q_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } Pxy[0] = 0x02; memcpy(&Pxy[1], P, 32); - cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + error |= cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); Qxy[0] = 0x02; memcpy(&Qxy[1], Q, 32); - cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Qxy, sizeof(Qxy)); + error |= cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Qxy, sizeof(Qxy)); - cx_math_sub(Qxy + 1, (unsigned char *)C_ED25519_FIELD, Qxy + 1, 32); - cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Qxy); + error |= cx_math_sub(Qxy + 1, (unsigned char *)C_ED25519_FIELD, Qxy + 1, 32); + error |= cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Qxy); - cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + error |= cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); memcpy(W, &Pxy[1], 32); + + if (error) { + return SW_SECURITY_INTERNAL; + } + return 0; } /* ----------------------------------------------------------------------- */ @@ -895,17 +1100,19 @@ void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q, size_t W return hash; } */ -void monero_ecdhHash(unsigned char *x, unsigned char *k, size_t k_len) { +int monero_ecdhHash(unsigned char *x, unsigned char *k, size_t k_len) { unsigned char data[38]; + int error; if (!k || k_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA; } memcpy(data, "amount", 6); memcpy(data + 6, k, 32); - monero_keccak_F(data, 38, x); + error = monero_keccak_F(data, 38, x); + return error; } /* ----------------------------------------------------------------------- */ @@ -922,93 +1129,174 @@ void monero_ecdhHash(unsigned char *x, unsigned char *k, size_t k_len) { return scalar; } */ -void monero_genCommitmentMask(unsigned char *c, unsigned char *sk, size_t c_len, size_t sk_len) { +int monero_genCommitmentMask(unsigned char *c, unsigned char *sk, size_t c_len, size_t sk_len) { unsigned char data[15 + 32]; + int error; if (!sk || sk_len < 32) { PRINTF("Buffer Error: %s:%d \n", __LINE__); - return; + return SW_WRONG_DATA_RANGE; } memcpy(data, "commitment_mask", 15); memcpy(data + 15, sk, 32); - monero_hash_to_scalar(c, data, c_len, 15 + 32); + error = monero_hash_to_scalar(c, data, c_len, 15 + 32); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_addm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, - size_t b_len) { +int monero_addm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, + size_t b_len) { unsigned char ra[32]; unsigned char rb[32]; + int error; - monero_reverse32(ra, a, sizeof(ra), a_len); - monero_reverse32(rb, b, sizeof(rb), b_len); - cx_math_addm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); - monero_reverse32(r, r, r_len, r_len); + error = monero_reverse32(ra, a, sizeof(ra), a_len); + if (error) { + return error; + } + error = monero_reverse32(rb, b, sizeof(rb), b_len); + if (error) { + return error; + } + error = cx_math_addm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); + if (error) { + return SW_SECURITY_INTERNAL; + } + + error = monero_reverse32(r, r, r_len, r_len); + if (error) { + return error; + } + + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_subm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, - size_t b_len) { +int monero_subm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, + size_t b_len) { unsigned char ra[32]; unsigned char rb[32]; + int error; - monero_reverse32(ra, a, sizeof(ra), a_len); - monero_reverse32(rb, b, sizeof(rb), b_len); - cx_math_subm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); - monero_reverse32(r, r, r_len, r_len); + error = monero_reverse32(ra, a, sizeof(ra), a_len); + if (error) { + return error; + } + error = monero_reverse32(rb, b, sizeof(rb), b_len); + if (error) { + return error; + } + error = cx_math_subm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); + if (error) { + return SW_SECURITY_INTERNAL; + } + + error = monero_reverse32(r, r, r_len, r_len); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_multm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, - size_t b_len) { +int monero_multm(unsigned char *r, unsigned char *a, unsigned char *b, size_t r_len, size_t a_len, + size_t b_len) { unsigned char ra[32]; unsigned char rb[32]; + int error; + + error = monero_reverse32(ra, a, sizeof(ra), a_len); + if (error) { + return error; + } + error = monero_reverse32(rb, b, sizeof(rb), b_len); + if (error) { + return error; + } + error = cx_math_multm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); + if (error) { + return SW_SECURITY_INTERNAL; + } - monero_reverse32(ra, a, sizeof(ra), a_len); - monero_reverse32(rb, b, sizeof(rb), b_len); - cx_math_multm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); - monero_reverse32(r, r, r_len, r_len); + error = monero_reverse32(r, r, r_len, r_len); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_multm_8(unsigned char *r, unsigned char *a, size_t r_len, size_t a_len) { +int monero_multm_8(unsigned char *r, unsigned char *a, size_t r_len, size_t a_len) { unsigned char ra[32]; unsigned char rb[32]; + int error; - monero_reverse32(ra, a, sizeof(ra), a_len); + error = monero_reverse32(ra, a, sizeof(ra), a_len); + if (error) { + return error; + } memset(rb, 0, 32); rb[31] = 8; - cx_math_multm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); - monero_reverse32(r, r, r_len, r_len); + error = cx_math_multm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); + if (error) { + return SW_SECURITY_INTERNAL; + } + error = monero_reverse32(r, r, r_len, r_len); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_reduce(unsigned char *r, unsigned char *a, size_t r_len, size_t a_len) { +int monero_reduce(unsigned char *r, unsigned char *a, size_t r_len, size_t a_len) { unsigned char ra[32]; + int error; - monero_reverse32(ra, a, sizeof(ra), a_len); - cx_math_modm_no_throw(ra, 32, (unsigned char *)C_ED25519_ORDER, 32); - monero_reverse32(r, ra, r_len, sizeof(ra)); + error = monero_reverse32(ra, a, sizeof(ra), a_len); + if (error) { + return error; + } + error = cx_math_modm_no_throw(ra, 32, (unsigned char *)C_ED25519_ORDER, 32); + if (error) { + return SW_SECURITY_INTERNAL; + } + error = monero_reverse32(r, ra, r_len, sizeof(ra)); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_rng_mod_order(unsigned char *r, size_t r_len) { +int monero_rng_mod_order(unsigned char *r, size_t r_len) { unsigned char rnd[32 + 8]; + int error; cx_rng(rnd, 32 + 8); - cx_math_modm_no_throw(rnd, 32 + 8, (unsigned char *)C_ED25519_ORDER, 32); - monero_reverse32(r, rnd + 8, r_len, 32); + error = cx_math_modm_no_throw(rnd, 32 + 8, (unsigned char *)C_ED25519_ORDER, 32); + if (error) { + return SW_SECURITY_INTERNAL; + } + error = monero_reverse32(r, rnd + 8, r_len, 32); + if (error) { + return error; + } + return 0; } /* ----------------------------------------------------------------------- */ diff --git a/src/monero_init.c b/src/monero_init.c index 7d9abc3..9871109 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -57,7 +57,10 @@ unsigned int monero_init() { return error; } // ux conf - monero_init_ux(); + error = monero_init_ux(); + if (error) { + return error; + } // Let's go! G_monero_vstate.state = STATE_IDLE; return 0; @@ -70,6 +73,7 @@ int monero_init_private_key(void) { unsigned int path[5]; unsigned char seed[64]; unsigned char chain[32]; + int error; // generate account keys @@ -87,12 +91,27 @@ int monero_init_private_key(void) { switch (N_monero_pstate->key_mode) { case KEY_MODE_SEED: - monero_keccak_F(seed, 32, G_monero_vstate.b); - monero_reduce(G_monero_vstate.b, G_monero_vstate.b, sizeof(G_monero_vstate.b), - sizeof(G_monero_vstate.b)); - monero_keccak_F(G_monero_vstate.b, 32, G_monero_vstate.a); - monero_reduce(G_monero_vstate.a, G_monero_vstate.a, sizeof(G_monero_vstate.a), - sizeof(G_monero_vstate.a)); + error = monero_keccak_F(seed, 32, G_monero_vstate.b); + if (error) { + return error; + } + + error = monero_reduce(G_monero_vstate.b, G_monero_vstate.b, sizeof(G_monero_vstate.b), + sizeof(G_monero_vstate.b)); + if (error) { + return error; + } + + error = monero_keccak_F(G_monero_vstate.b, 32, G_monero_vstate.a); + if (error) { + return error; + } + + error = monero_reduce(G_monero_vstate.a, G_monero_vstate.a, sizeof(G_monero_vstate.a), + sizeof(G_monero_vstate.a)); + if (error) { + return error; + } break; case KEY_MODE_EXTERNAL: @@ -103,24 +122,37 @@ int monero_init_private_key(void) { default: return SW_SECURITY_LOAD_KEY; } - monero_ecmul_G(G_monero_vstate.A, G_monero_vstate.a, sizeof(G_monero_vstate.A), - sizeof(G_monero_vstate.a)); - monero_ecmul_G(G_monero_vstate.B, G_monero_vstate.b, sizeof(G_monero_vstate.B), - sizeof(G_monero_vstate.b)); + error = monero_ecmul_G(G_monero_vstate.A, G_monero_vstate.a, sizeof(G_monero_vstate.A), + sizeof(G_monero_vstate.a)); + if (error) { + return error; + } + error = monero_ecmul_G(G_monero_vstate.B, G_monero_vstate.b, sizeof(G_monero_vstate.B), + sizeof(G_monero_vstate.b)); + if (error) { + return error; + } // generate key protection - int err = monero_aes_derive(&G_monero_vstate.spk, chain, G_monero_vstate.a, G_monero_vstate.b); + error = monero_aes_derive(&G_monero_vstate.spk, chain, G_monero_vstate.a, G_monero_vstate.b); + if (error) { + return error; + } G_monero_vstate.key_set = 1; - return err; + return 0; } /* ----------------------------------------------------------------------- */ /* --- Set up ui/ux --- */ /* ----------------------------------------------------------------------- */ -void monero_init_ux() { - monero_base58_public_key(G_monero_vstate.ux_address, G_monero_vstate.A, G_monero_vstate.B, 0, - NULL); +int monero_init_ux() { + int error = monero_base58_public_key(G_monero_vstate.ux_address, G_monero_vstate.A, + G_monero_vstate.B, 0, NULL); + if (error) { + return error; + } + memset(G_monero_vstate.ux_wallet_public_short_address, '.', sizeof(G_monero_vstate.ux_wallet_public_short_address)); @@ -152,6 +184,7 @@ void monero_init_ux() { G_monero_vstate.ux_wallet_public_short_address[12] = 0; #endif + return 0; } /* ----------------------------------------------------------------------- */ diff --git a/src/monero_io.c b/src/monero_io.c index ebfd89b..688183e 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -364,7 +364,6 @@ int monero_io_fetch_decrypt_key(unsigned char* buffer, size_t buffer_size) { } int monero_io_fetch_varint(uint64_t* out_v64) { - // COUOCU if (!out_v64) { return SW_WRONG_DATA; } diff --git a/src/monero_key.c b/src/monero_key.c index 94b3aa4..85bd73f 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -204,6 +204,7 @@ int monero_apdu_display_address() { unsigned char payment_id[8]; unsigned char C[32]; unsigned char D[32]; + int error; // fetch monero_io_fetch(index, 8); @@ -218,7 +219,10 @@ int monero_apdu_display_address() { // retrieve pub keys if (minor | major) { - monero_get_subaddress(C, D, index, sizeof(C), sizeof(D), sizeof(index)); + error = monero_get_subaddress(C, D, index, sizeof(C), sizeof(D), sizeof(index)); + if (error) { + return error; + } } else { memcpy(C, G_monero_vstate.A, 32); memcpy(D, G_monero_vstate.B, 32); @@ -261,6 +265,7 @@ int monero_apdu_put_key() { unsigned char raw[32]; unsigned char pub[32]; unsigned char sec[32]; + int err; // option + priv/pub view key + priv/pub spend key + base58 address if (G_monero_vstate.io_length != (1 + 32 * 2 + 32 * 2 + 95)) { @@ -270,7 +275,11 @@ int monero_apdu_put_key() { // view key monero_io_fetch(sec, 32); monero_io_fetch(pub, 32); - monero_ecmul_G(raw, sec, sizeof(raw), sizeof(sec)); + err = monero_ecmul_G(raw, sec, sizeof(raw), sizeof(sec)); + if (err) { + return err; + } + if (memcmp(pub, raw, 32) != 0) { return SW_WRONG_DATA; } @@ -279,7 +288,11 @@ int monero_apdu_put_key() { // spend key monero_io_fetch(sec, 32); monero_io_fetch(pub, 32); - monero_ecmul_G(raw, sec, sizeof(raw), sizeof(sec)); + err = monero_ecmul_G(raw, sec, sizeof(raw), sizeof(sec)); + if (err) { + return err; + } + if (memcmp(pub, raw, 32) != 0) { return SW_WRONG_DATA; } @@ -307,8 +320,12 @@ int monero_apdu_get_key() { // spend key monero_io_insert(G_monero_vstate.B, 32); // public base address - monero_base58_public_key((char *)G_monero_vstate.io_buffer + G_monero_vstate.io_offset, - G_monero_vstate.A, G_monero_vstate.B, 0, NULL); + int error = monero_base58_public_key( + (char *)G_monero_vstate.io_buffer + G_monero_vstate.io_offset, G_monero_vstate.A, + G_monero_vstate.B, 0, NULL); + if (error) { + return 0; + } monero_io_inserted(95); break; @@ -377,7 +394,11 @@ int monero_apdu_verify_key() { monero_io_fetch(pub, 32); switch (G_monero_vstate.io_p1) { case 0: - monero_secret_key_to_public_key(computed_pub, priv, sizeof(computed_pub), sizeof(priv)); + err = monero_secret_key_to_public_key(computed_pub, priv, sizeof(computed_pub), + sizeof(priv)); + if (err) { + return err; + } break; case 1: memcpy(computed_pub, G_monero_vstate.A, 32); @@ -409,7 +430,10 @@ int monero_apdu_get_chacha8_prekey(/*char *prekey*/) { memcpy(abt, G_monero_vstate.a, 32); memcpy(abt + 32, G_monero_vstate.b, 32); abt[64] = CHACHA8_KEY_TAIL; - monero_keccak_F(abt, 65, pre); + int error = monero_keccak_F(abt, 65, pre); + if (error) { + return error; + } monero_io_insert((unsigned char *)G_monero_vstate.keccakF.acc, 200); return SW_OK; } @@ -444,7 +468,10 @@ int monero_apdu_sc_add(/*unsigned char *r, unsigned char *s1, unsigned char *s2* return SW_WRONG_DATA; } } - monero_addm(r, s1, s2, sizeof(r), sizeof(s1), sizeof(s2)); + err = monero_addm(r, s1, s2, sizeof(r), sizeof(s1), sizeof(s2)); + if (err) { + return err; + } monero_io_insert_encrypt(r, 32, TYPE_SCALAR); return SW_OK; } @@ -466,7 +493,10 @@ int monero_apdu_scal_mul_key(/*const rct::key &pub, const rct::key &sec, rct::ke } monero_io_discard(0); - monero_ecmul_k(r, pub, sec, sizeof(r), sizeof(pub), sizeof(sec)); + err = monero_ecmul_k(r, pub, sec, sizeof(r), sizeof(pub), sizeof(sec)); + if (err) { + return err; + } monero_io_insert(r, 32); return SW_OK; } @@ -485,7 +515,11 @@ int monero_apdu_scal_mul_base(/*const rct::key &sec, rct::key mulkey*/) { } monero_io_discard(0); - monero_ecmul_G(r, sec, sizeof(r), sizeof(sec)); + err = monero_ecmul_G(r, sec, sizeof(r), sizeof(sec)); + if (err) { + return err; + } + monero_io_insert(r, 32); return SW_OK; } @@ -498,7 +532,10 @@ int monero_apdu_generate_keypair(/*crypto::public_key &pub, crypto::secret_key & unsigned char pub[32]; monero_io_discard(0); - monero_generate_keypair(pub, sec, sizeof(pub), sizeof(sec)); + int error = monero_generate_keypair(pub, sec, sizeof(pub), sizeof(sec)); + if (error) { + return error; + } monero_io_insert(pub, 32); monero_io_insert_encrypt(sec, 32, TYPE_SCALAR); return SW_OK; @@ -518,7 +555,11 @@ int monero_apdu_secret_key_to_public_key( } monero_io_discard(0); // pub - monero_ecmul_G(pub, sec, sizeof(pub), sizeof(sec)); + err = monero_ecmul_G(pub, sec, sizeof(pub), sizeof(sec)); + if (err) { + return err; + } + // pub key monero_io_insert(pub, 32); return SW_OK; @@ -543,7 +584,10 @@ int monero_apdu_generate_key_derivation(/*const crypto::public_key &pub, const c monero_io_discard(0); // Derive and keep - monero_generate_key_derivation(drv, pub, sec, sizeof(drv), sizeof(pub), sizeof(sec)); + err = monero_generate_key_derivation(drv, pub, sec, sizeof(drv), sizeof(pub), sizeof(sec)); + if (err) { + return err; + } monero_io_insert_encrypt(drv, 32, TYPE_DERIVATION); return SW_OK; @@ -567,7 +611,11 @@ int monero_apdu_derivation_to_scalar( monero_io_discard(0); // pub - monero_derivation_to_scalar(res, derivation, output_index, sizeof(res), sizeof(derivation)); + err = + monero_derivation_to_scalar(res, derivation, output_index, sizeof(res), sizeof(derivation)); + if (err) { + return err; + } // pub key monero_io_insert_encrypt(res, 32, TYPE_SCALAR); @@ -657,7 +705,10 @@ int monero_apdu_generate_key_image( monero_io_discard(0); // pub - monero_generate_key_image(image, pub, sec, sizeof(image), sizeof(sec)); + err = monero_generate_key_image(image, pub, sec, sizeof(image), sizeof(sec)); + if (err) { + return err; + } // pub key monero_io_insert(image, 32); @@ -711,8 +762,11 @@ int monero_apdu_derive_subaddress_public_key(/*const crypto::public_key &pub, co monero_io_discard(0); // pub - monero_derive_subaddress_public_key(sub_pub, pub, derivation, output_index, sizeof(sub_pub), - sizeof(pub), sizeof(derivation)); + err = monero_derive_subaddress_public_key(sub_pub, pub, derivation, output_index, + sizeof(sub_pub), sizeof(pub), sizeof(derivation)); + if (err) { + return err; + } // pub key monero_io_insert(sub_pub, 32); return SW_OK; @@ -732,7 +786,10 @@ int monero_apdu_get_subaddress( monero_io_discard(0); // pub - monero_get_subaddress(C, D, index, sizeof(C), sizeof(D), sizeof(index)); + int error = monero_get_subaddress(C, D, index, sizeof(C), sizeof(D), sizeof(index)); + if (error) { + return error; + } // pub key monero_io_insert(C, 32); @@ -753,7 +810,10 @@ int monero_apdu_get_subaddress_spend_public_key( monero_io_discard(1); // pub - monero_get_subaddress_spend_public_key(D, index, sizeof(D), sizeof(index)); + int error = monero_get_subaddress_spend_public_key(D, index, sizeof(D), sizeof(index)); + if (error) { + return error; + } // pub key monero_io_insert(D, 32); @@ -777,8 +837,11 @@ int monero_apdu_get_subaddress_secret_key(/*const crypto::secret_key& sec, const monero_io_fetch(index, 8); monero_io_discard(0); - monero_get_subaddress_secret_key(sub_sec, sec, index, sizeof(sub_sec), sizeof(sec), - sizeof(index)); + err = monero_get_subaddress_secret_key(sub_sec, sec, index, sizeof(sub_sec), sizeof(sec), + sizeof(index)); + if (err) { + return err; + } memcpy(G_monero_vstate.last_get_subaddress_secret_key, sub_sec, 32); monero_io_insert_encrypt(sub_sec, 32, TYPE_SCALAR); @@ -838,20 +901,35 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se // update outkeys hash control if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { if (G_monero_vstate.io_protocol_version >= 2) { - monero_sha256_outkeys_update(Aout, 32); - monero_sha256_outkeys_update(Bout, 32); - monero_sha256_outkeys_update(&is_change, 1); + err = monero_sha256_outkeys_update(Aout, 32); + if (err) { + return err; + } + err = monero_sha256_outkeys_update(Bout, 32); + if (err) { + return err; + } + err = monero_sha256_outkeys_update(&is_change, 1); + if (err) { + return err; + } } } // make additional tx pubkey if necessary if (need_additional_txkeys) { if (is_subaddress) { - monero_ecmul_k(additional_txkey_pub, Bout, additional_txkey_sec, - sizeof(additional_txkey_pub), 32, sizeof(additional_txkey_sec)); + err = monero_ecmul_k(additional_txkey_pub, Bout, additional_txkey_sec, + sizeof(additional_txkey_pub), 32, sizeof(additional_txkey_sec)); + if (err) { + return err; + } } else { - monero_ecmul_G(additional_txkey_pub, additional_txkey_sec, sizeof(additional_txkey_pub), - sizeof(additional_txkey_sec)); + err = monero_ecmul_G(additional_txkey_pub, additional_txkey_sec, + sizeof(additional_txkey_pub), sizeof(additional_txkey_sec)); + if (err) { + return err; + } } } else { memset(additional_txkey_pub, 0, 32); @@ -859,27 +937,42 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se // derivation if (is_change) { - monero_generate_key_derivation(derivation, txkey_pub, G_monero_vstate.a, sizeof(derivation), - 32, sizeof(G_monero_vstate.a)); + err = monero_generate_key_derivation(derivation, txkey_pub, G_monero_vstate.a, + sizeof(derivation), 32, sizeof(G_monero_vstate.a)); + if (err) { + return err; + } } else { - monero_generate_key_derivation( + err = monero_generate_key_derivation( derivation, Aout, (is_subaddress && need_additional_txkeys) ? additional_txkey_sec : tx_key, sizeof(derivation), 32, 32); + if (err) { + return err; + } } // compute amount key AKout (scalar1), version is always greater than 1 - monero_derivation_to_scalar(amount_key, derivation, output_index, sizeof(amount_key), - sizeof(derivation)); + err = monero_derivation_to_scalar(amount_key, derivation, output_index, sizeof(amount_key), + sizeof(derivation)); + if (err) { + return err; + } if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { if (G_monero_vstate.io_protocol_version >= 2) { - monero_sha256_outkeys_update(amount_key, 32); + err = monero_sha256_outkeys_update(amount_key, 32); + if (err) { + return err; + } } } // compute ephemeral output key - monero_derive_public_key(out_eph_public_key, derivation, output_index, Bout, - sizeof(out_eph_public_key), sizeof(derivation), 32); + err = monero_derive_public_key(out_eph_public_key, derivation, output_index, Bout, + sizeof(out_eph_public_key), sizeof(derivation), 32); + if (err) { + return err; + } // compute view tag if (use_view_tags) { diff --git a/src/monero_mlsag.c b/src/monero_mlsag.c index 930c104..d9eecec 100644 --- a/src/monero_mlsag.c +++ b/src/monero_mlsag.c @@ -56,20 +56,38 @@ int monero_apdu_mlsag_prepare() { monero_io_discard(1); // ai - monero_rng_mod_order(alpha, sizeof(alpha)); - monero_reduce(alpha, alpha, sizeof(alpha), sizeof(alpha)); + err = monero_rng_mod_order(alpha, sizeof(alpha)); + if (err) { + return err; + } + + err = monero_reduce(alpha, alpha, sizeof(alpha), sizeof(alpha)); + if (err) { + return err; + } + monero_io_insert_encrypt(alpha, 32, TYPE_ALPHA); // ai.G - monero_ecmul_G(mul, alpha, sizeof(mul), sizeof(alpha)); + err = monero_ecmul_G(mul, alpha, sizeof(mul), sizeof(alpha)); + if (err) { + return err; + } + monero_io_insert(mul, 32); if (options) { // ai.Hi - monero_ecmul_k(mul, Hi, alpha, sizeof(mul), sizeof(Hi), sizeof(alpha)); + err = monero_ecmul_k(mul, Hi, alpha, sizeof(mul), sizeof(Hi), sizeof(alpha)); + if (err) { + return err; + } monero_io_insert(mul, 32); // IIi = xin.Hi - monero_ecmul_k(mul, Hi, xin, sizeof(mul), sizeof(Hi), sizeof(xin)); + err = monero_ecmul_k(mul, Hi, xin, sizeof(mul), sizeof(Hi), sizeof(xin)); + if (err) { + return err; + } monero_io_insert(mul, 32); } return SW_OK; @@ -81,6 +99,7 @@ int monero_apdu_mlsag_prepare() { int monero_apdu_mlsag_hash() { unsigned char msg[32]; unsigned char c[32]; + int err; if (G_monero_vstate.io_p2 == 1) { if (monero_keccak_init_H()) { return SW_WRONG_DATA; @@ -91,10 +110,21 @@ int monero_apdu_mlsag_hash() { } monero_io_discard(1); - monero_keccak_update_H(msg, 32); + err = monero_keccak_update_H(msg, 32); + if (err) { + return err; + } + if ((G_monero_vstate.options & 0x80) == 0) { - monero_keccak_final_H(c); - monero_reduce(c, c, sizeof(c), sizeof(c)); + err = monero_keccak_final_H(c); + if (err) { + return err; + } + + err = monero_reduce(c, c, sizeof(c), sizeof(c)); + if (err) { + return err; + } monero_io_insert(c, 32); memcpy(G_monero_vstate.c, c, 32); } @@ -133,12 +163,29 @@ int monero_apdu_mlsag_sign() { return SW_SECURITY_RANGE_VALUE; } - monero_reduce(ss, G_monero_vstate.c, sizeof(ss), sizeof(G_monero_vstate.c)); - monero_reduce(xin, xin, sizeof(xin), sizeof(xin)); - monero_multm(ss, ss, xin, sizeof(ss), sizeof(ss), sizeof(xin)); + err = monero_reduce(ss, G_monero_vstate.c, sizeof(ss), sizeof(G_monero_vstate.c)); + if (err) { + return err; + } + + err = monero_reduce(xin, xin, sizeof(xin), sizeof(xin)); + if (err) { + return err; + } - monero_reduce(alpha, alpha, sizeof(alpha), sizeof(alpha)); - monero_subm(ss2, alpha, ss, sizeof(ss2), sizeof(alpha), sizeof(ss)); + err = monero_multm(ss, ss, xin, sizeof(ss), sizeof(ss), sizeof(xin)); + if (err) { + return err; + } + + err = monero_reduce(alpha, alpha, sizeof(alpha), sizeof(alpha)); + if (err) { + return err; + } + err = monero_subm(ss2, alpha, ss, sizeof(ss2), sizeof(alpha), sizeof(ss)); + if (err) { + return err; + } monero_io_insert(ss2, 32); monero_io_insert_u32(G_monero_vstate.tx_sig_mode); diff --git a/src/monero_monero.c b/src/monero_monero.c index 52e0ed2..297465d 100644 --- a/src/monero_monero.c +++ b/src/monero_monero.c @@ -170,7 +170,10 @@ int monero_base58_public_key(char* str_b58, unsigned char* view, unsigned char* memcpy(data + offset, paymanetID, 8); offset += 8; } - monero_keccak_F(data, offset, G_monero_vstate.mlsagH); + error = monero_keccak_F(data, offset, G_monero_vstate.mlsagH); + if (error) { + return error; + } memcpy(data + offset, G_monero_vstate.mlsagH, 4); offset += 4; diff --git a/src/monero_open_tx.c b/src/monero_open_tx.c index a279623..8e8183d 100644 --- a/src/monero_open_tx.c +++ b/src/monero_open_tx.c @@ -25,12 +25,16 @@ /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_reset_tx(int reset_tx_cnt) { +int monero_reset_tx(int reset_tx_cnt) { + int error; memset(G_monero_vstate.r, 0, 32); memset(G_monero_vstate.R, 0, 32); cx_rng(G_monero_vstate.hmac_key, 32); - monero_keccak_init_H(); + error = monero_keccak_init_H(); + if (error) { + return error; + } monero_sha256_commitment_init(); monero_sha256_outkeys_init(); G_monero_vstate.tx_in_progress = 0; @@ -38,6 +42,7 @@ void monero_reset_tx(int reset_tx_cnt) { if (reset_tx_cnt) { G_monero_vstate.tx_cnt = 0; } + return 0; } /* ----------------------------------------------------------------------- */ @@ -47,17 +52,22 @@ void monero_reset_tx(int reset_tx_cnt) { * HD wallet not yet supported : account is assumed to be zero */ int monero_apdu_open_tx() { + int error; monero_io_fetch_u32(); // skip account monero_io_discard(1); - monero_reset_tx(0); + error = monero_reset_tx(0); + if (error) { + return error; + } G_monero_vstate.tx_cnt++; ui_menu_opentx_display(0); return monero_apdu_open_tx_cont(); } int monero_apdu_open_tx_cont() { + int error; G_monero_vstate.tx_in_progress = 1; #ifdef DEBUG_HWDEVICE @@ -66,9 +76,16 @@ int monero_apdu_open_tx_cont() { cx_rng(G_monero_vstate.hmac_key, 32); #endif - monero_rng_mod_order(G_monero_vstate.r, sizeof(G_monero_vstate.r)); - monero_ecmul_G(G_monero_vstate.R, G_monero_vstate.r, sizeof(G_monero_vstate.R), - sizeof(G_monero_vstate.r)); + error = monero_rng_mod_order(G_monero_vstate.r, sizeof(G_monero_vstate.r)); + if (error) { + return error; + } + + error = monero_ecmul_G(G_monero_vstate.R, G_monero_vstate.r, sizeof(G_monero_vstate.R), + sizeof(G_monero_vstate.r)); + if (error) { + return error; + } monero_io_insert(G_monero_vstate.R, 32); monero_io_insert_encrypt(G_monero_vstate.r, 32, TYPE_SCALAR); @@ -83,8 +100,12 @@ int monero_apdu_open_tx_cont() { /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_close_tx() { + int error; monero_io_discard(1); - monero_reset_tx(G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL); + error = monero_reset_tx(G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL); + if (error) { + return error; + } #ifdef HAVE_BAGL ui_menu_main_display(); #endif diff --git a/src/monero_prefix.c b/src/monero_prefix.c index 7c59f02..0d81100 100644 --- a/src/monero_prefix.c +++ b/src/monero_prefix.c @@ -33,8 +33,11 @@ int monero_apdu_prefix_hash_init(void) { uint64_t timelock; int error = 0; - monero_keccak_update_H(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, - G_monero_vstate.io_length - G_monero_vstate.io_offset); + error = monero_keccak_update_H(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, + G_monero_vstate.io_length - G_monero_vstate.io_offset); + if (error) { + return error; + } if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { error = monero_io_fetch_varint(&timelock); // DUmmy call TODO @@ -72,11 +75,19 @@ int monero_apdu_prefix_hash_init(void) { /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_prefix_hash_update(void) { - monero_keccak_update_H(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, - G_monero_vstate.io_length - G_monero_vstate.io_offset); + int error; + error = monero_keccak_update_H(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, + G_monero_vstate.io_length - G_monero_vstate.io_offset); + if (error) { + return error; + } + monero_io_discard(0); if ((G_monero_vstate.options & 0x80) == 0x00) { - monero_keccak_final_H(G_monero_vstate.prefixH); + error = monero_keccak_final_H(G_monero_vstate.prefixH); + if (error) { + return error; + } monero_io_insert(G_monero_vstate.prefixH, 32); } diff --git a/src/monero_prehash.c b/src/monero_prehash.c index ed7ebd1..1405f8b 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -30,16 +30,26 @@ /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_mlsag_prehash_init() { + int error = 0; if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { if (G_monero_vstate.io_p2 == 1) { - monero_sha256_outkeys_final(G_monero_vstate.OUTK); + error = monero_sha256_outkeys_final(G_monero_vstate.OUTK); + if (error) { + return error; + } monero_sha256_outkeys_init(); monero_sha256_commitment_init(); - monero_keccak_init_H(); + error = monero_keccak_init_H(); + if (error) { + return error; + } } } - monero_keccak_update_H(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, - G_monero_vstate.io_length - G_monero_vstate.io_offset); + error = monero_keccak_update_H(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, + G_monero_vstate.io_length - G_monero_vstate.io_offset); + if (error) { + return error; + } if ((G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) && (G_monero_vstate.io_p2 == 1)) { // skip type monero_io_fetch_u8(); @@ -96,33 +106,74 @@ int monero_apdu_mlsag_prehash_update() { // update MLSAG prehash if ((G_monero_vstate.options & 0x03) == 0x02) { - monero_keccak_update_H(v, 8); + err = monero_keccak_update_H(v, 8); + if (err) { + return err; + } + } else { - monero_keccak_update_H(k, 32); - monero_keccak_update_H(v, 32); + err = monero_keccak_update_H(k, 32); + if (err) { + return err; + } + + err = monero_keccak_update_H(v, 32); + if (err) { + return err; + } } if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { if (is_change == 0) { // encode dest adress - monero_base58_public_key(&G_monero_vstate.ux_address[0], Aout, Bout, is_subaddress, - NULL); + err = monero_base58_public_key(&G_monero_vstate.ux_address[0], Aout, Bout, + is_subaddress, NULL); + if (err) { + return err; + } } // update destination hash control if (G_monero_vstate.io_protocol_version >= 2) { - monero_sha256_outkeys_update(Aout, 32); - monero_sha256_outkeys_update(Bout, 32); - monero_sha256_outkeys_update(&is_change, 1); - monero_sha256_outkeys_update(AKout, 32); + err = monero_sha256_outkeys_update(Aout, 32); + if (err) { + return err; + } + err = monero_sha256_outkeys_update(Bout, 32); + if (err) { + return err; + } + err = monero_sha256_outkeys_update(&is_change, 1); + if (err) { + return err; + } + err = monero_sha256_outkeys_update(AKout, 32); + if (err) { + return err; + } } // check C = aH+kG - monero_unblind(v, k, AKout, G_monero_vstate.options & 0x03, sizeof(v), sizeof(k), - sizeof(AKout)); - monero_ecmul_G(kG, k, sizeof(kG), sizeof(k)); + err = monero_unblind(v, k, AKout, G_monero_vstate.options & 0x03, sizeof(v), sizeof(k), + sizeof(AKout)); + if (err) { + return err; + } + + err = monero_ecmul_G(kG, k, sizeof(kG), sizeof(k)); + if (err) { + return err; + } + if (!cx_math_is_zero(v, 32)) { - monero_ecmul_H(aH, v, sizeof(aH), sizeof(v)); - monero_ecadd(aH, kG, aH, sizeof(aH), sizeof(kG), sizeof(aH)); + err = monero_ecmul_H(aH, v, sizeof(aH), sizeof(v)); + if (err) { + return err; + } + + err = monero_ecadd(aH, kG, aH, sizeof(aH), sizeof(kG), sizeof(aH)); + if (err) { + return err; + } } else { memcpy(aH, kG, 32); } @@ -132,18 +183,27 @@ int monero_apdu_mlsag_prehash_update() { #endif } // update commitment hash control - monero_sha256_commitment_update(C, 32); + err = monero_sha256_commitment_update(C, 32); + if (err) { + return err; + } if ((G_monero_vstate.options & IN_OPTION_MORE_COMMAND) == 0) { if (G_monero_vstate.io_protocol_version >= 2) { // finalize and check destination hash_control - monero_sha256_outkeys_final(k); + err = monero_sha256_outkeys_final(k); + if (err) { + return err; + } if (memcmp(k, G_monero_vstate.OUTK, 32) != 0) { return SW_SECURITY_COMMITMENT_CHAIN_CONTROL; } } // finalize commitment hash control - monero_sha256_commitment_final(NULL); + err = monero_sha256_commitment_final(NULL); + if (err) { + return err; + } monero_sha256_commitment_init(); } @@ -181,17 +241,28 @@ int monero_apdu_mlsag_prehash_finalize() { unsigned char message[32]; unsigned char proof[32]; unsigned char H[32]; + int error; if (G_monero_vstate.options & IN_OPTION_MORE_COMMAND) { // accumulate monero_io_fetch(H, 32); monero_io_discard(1); - monero_keccak_update_H(H, 32); - monero_sha256_commitment_update(H, 32); + error = monero_keccak_update_H(H, 32); + if (error) { + return error; + } + + error = monero_sha256_commitment_update(H, 32); + if (error) { + return error; + } } else { // Finalize and check commitment hash control if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { - monero_sha256_commitment_final(H); + error = monero_sha256_commitment_final(H); + if (error) { + return error; + } if (memcmp(H, G_monero_vstate.C, 32) != 0) { #ifndef BYPASS_COMMITMENT_FOR_TESTS return SW_SECURITY_COMMITMENT_CHAIN_CONTROL; @@ -199,12 +270,19 @@ int monero_apdu_mlsag_prehash_finalize() { } } // compute last H - monero_keccak_final_H(H); + error = monero_keccak_final_H(H); + if (error) { + return error; + } // compute last prehash monero_io_fetch(message, 32); monero_io_fetch(proof, 32); monero_io_discard(1); - monero_keccak_init_H(); + error = monero_keccak_init_H(); + if (error) { + return error; + } + if (G_monero_vstate.io_protocol_version >= 3) { if (memcmp(message, G_monero_vstate.prefixH, 32) != 0) { #ifndef BYPASS_COMMITMENT_FOR_TESTS @@ -212,10 +290,25 @@ int monero_apdu_mlsag_prehash_finalize() { #endif } } - monero_keccak_update_H(message, 32); - monero_keccak_update_H(H, 32); - monero_keccak_update_H(proof, 32); - monero_keccak_final_H(G_monero_vstate.mlsagH); + error = monero_keccak_update_H(message, 32); + if (error) { + return error; + } + + error = monero_keccak_update_H(H, 32); + if (error) { + return error; + } + + error = monero_keccak_update_H(proof, 32); + if (error) { + return error; + } + + error = monero_keccak_final_H(G_monero_vstate.mlsagH); + if (error) { + return error; + } monero_io_insert(G_monero_vstate.mlsagH, 32); diff --git a/src/monero_proof.c b/src/monero_proof.c index 7f5587e..cfc013f 100644 --- a/src/monero_proof.c +++ b/src/monero_proof.c @@ -58,7 +58,11 @@ int monero_apdu_get_tx_proof() { monero_io_discard(0); // Generate random k - monero_rng_mod_order(k, k_len); + err = monero_rng_mod_order(k, k_len); + if (err) { + return err; + } + // tmp = msg memcpy(G_monero_vstate.tmp + 32 * 0, msg, 32); // tmp = msg || D @@ -66,19 +70,31 @@ int monero_apdu_get_tx_proof() { if (G_monero_vstate.options & 1) { // X = kB - monero_ecmul_k(XY, B, k, sizeof(XY), 32, k_len); + err = monero_ecmul_k(XY, B, k, sizeof(XY), 32, k_len); + if (err) { + return err; + } } else { // X = kG - monero_ecmul_G(XY, k, sizeof(XY), k_len); + err = monero_ecmul_G(XY, k, sizeof(XY), k_len); + if (err) { + return err; + } } // tmp = msg || D || X memcpy(G_monero_vstate.tmp + 32 * 2, XY, 32); // Y = kA - monero_ecmul_k(XY, A, k, sizeof(XY), 32, k_len); + err = monero_ecmul_k(XY, A, k, sizeof(XY), 32, k_len); + if (err) { + return err; + } // tmp = msg || D || X || Y memcpy(G_monero_vstate.tmp + 32 * 3, XY, 32); - monero_keccak_H((unsigned char *)"TXPROOF_V2", 10, sep); + err = monero_keccak_H((unsigned char *)"TXPROOF_V2", 10, sep); + if (err) { + return err; + } // tmp = msg || D || X || Y || sep memcpy(G_monero_vstate.tmp + 32 * 4, sep, 32); // tmp = msg || D || X || Y || sep || R @@ -89,12 +105,22 @@ int monero_apdu_get_tx_proof() { memcpy(G_monero_vstate.tmp + 32 * 7, B, 32); // sig_c = H_n(tmp) - monero_hash_to_scalar(sig_c, &G_monero_vstate.tmp[0], sizeof(sig_c), 32 * 8); + err = monero_hash_to_scalar(sig_c, &G_monero_vstate.tmp[0], sizeof(sig_c), 32 * 8); + if (err) { + return err; + } // sig_c*r - monero_multm(XY, sig_c, r, sizeof(XY), sizeof(sig_c), sizeof(r)); + err = monero_multm(XY, sig_c, r, sizeof(XY), sizeof(sig_c), sizeof(r)); + if (err) { + return err; + } + // sig_r = k - sig_c*r - monero_subm(sig_r, k, XY, sizeof(sig_r), k_len, sizeof(r)); + err = monero_subm(sig_r, k, XY, sizeof(sig_r), k_len, sizeof(r)); + if (err) { + return err; + } monero_io_insert(sig_c, 32); monero_io_insert(sig_r, 32); diff --git a/src/monero_stealth.c b/src/monero_stealth.c index 317f4cd..97ea397 100644 --- a/src/monero_stealth.c +++ b/src/monero_stealth.c @@ -46,11 +46,17 @@ int monero_apdu_stealth() { monero_io_discard(0); // Compute Dout - monero_generate_key_derivation(drv, pub, sec, sizeof(drv), sizeof(pub), sizeof(sec)); + err = monero_generate_key_derivation(drv, pub, sec, sizeof(drv), sizeof(pub), sizeof(sec)); + if (err) { + return err; + } // compute mask drv[32] = ENCRYPTED_PAYMENT_ID_TAIL; - monero_keccak_F(drv, 33, sec); + err = monero_keccak_F(drv, 33, sec); + if (err) { + return err; + } // stealth! for (i = 0; i < 8; i++) { From 22911a2056a512a22ee17058a4bb809306e4b7c3 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 21 Nov 2023 15:42:14 +0100 Subject: [PATCH 114/142] Makefile: Bump version --- Makefile | 4 ++-- tests/test_version.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 007dd6c..f33a669 100644 --- a/Makefile +++ b/Makefile @@ -28,8 +28,8 @@ APPNAME = "Monero" # Application version APPVERSION_M = 1 -APPVERSION_N = 8 -APPVERSION_P = 2 +APPVERSION_N = 9 +APPVERSION_P = 0 APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" SPECVERSION = "1.0" diff --git a/tests/test_version.py b/tests/test_version.py index f074088..e17d544 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -8,7 +8,7 @@ def check_accepted_version(monero, valid_version: bytes): major, minor, patch = monero.reset_and_get_version( monero_client_version=valid_version ) # type: int, int, int - assert (major, minor, patch) == (1, 8, 2) # version of the Monero app + assert (major, minor, patch) == (1, 9, 0) # version of the Monero app def check_refused_version(monero, invalid_version: bytes): From e081b2d16ce7e4829f09a770e55a0989f43efa0a Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 21 Nov 2023 16:57:43 +0100 Subject: [PATCH 115/142] Makefile: Remove useless UI_NANO_SX define --- Makefile | 4 +--- src/monero_ux_nano.c | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index f33a669..cd673cc 100644 --- a/Makefile +++ b/Makefile @@ -68,9 +68,7 @@ DEFINES += SPEC_VERSION=$(SPECVERSION) #DEFINES += MONERO_BETA -ifeq ($(TARGET_NAME),$(filter $(TARGET_NAME),TARGET_NANOS TARGET_NANOS2)) -DEFINES += UI_NANO_SX -else ifeq ($(TARGET_NAME),TARGET_NANOX) +ifeq ($(TARGET_NAME),TARGET_NANOX) DEFINES += UI_NANO_X else ifeq ($(TARGET_NAME),TARGET_STAX) DEFINES += UI_STAX diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 1a552e0..85ce48c 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -16,7 +16,7 @@ * limitations under the License. *****************************************************************************/ -#if defined(UI_NANO_X) || defined(UI_NANO_SX) +#ifdef HAVE_BAGL #include "os.h" #include "cx.h" From faf0356377797910a1783b779b7810ee31aada75 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 23 Nov 2023 17:56:36 +0100 Subject: [PATCH 116/142] ui: remove HAVE_UX_FLOW macros --- Makefile | 6 ------ src/monero_init.c | 14 +------------- src/monero_key.c | 2 -- src/monero_main.c | 2 -- src/monero_ram.c | 10 ---------- src/monero_ux_nano.c | 8 ++++---- src/monero_ux_stax.c | 2 +- src/monero_ux_stax_menu.c | 2 +- .../nanosp/test_display_address/00005.png | Bin 510 -> 546 bytes .../nanosp/test_display_subaddress/00005.png | Bin 510 -> 546 bytes .../nanosp/test_private_view_key/00002.png | Bin 510 -> 546 bytes 11 files changed, 7 insertions(+), 39 deletions(-) diff --git a/Makefile b/Makefile index cd673cc..9cc1f5d 100644 --- a/Makefile +++ b/Makefile @@ -68,12 +68,6 @@ DEFINES += SPEC_VERSION=$(SPECVERSION) #DEFINES += MONERO_BETA -ifeq ($(TARGET_NAME),TARGET_NANOX) -DEFINES += UI_NANO_X -else ifeq ($(TARGET_NAME),TARGET_STAX) -DEFINES += UI_STAX -endif - #DEFINES += IOCRYPT ############ diff --git a/src/monero_init.c b/src/monero_init.c index 9871109..8ec3dc2 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -156,9 +156,7 @@ int monero_init_ux() { memset(G_monero_vstate.ux_wallet_public_short_address, '.', sizeof(G_monero_vstate.ux_wallet_public_short_address)); -#ifdef HAVE_UX_FLOW - -#ifdef UI_NANO_X +#ifndef TARGET_NANOS snprintf(G_monero_vstate.ux_wallet_account_name, sizeof(G_monero_vstate.ux_wallet_account_name), "XMR / %d", N_monero_pstate->account_id); memcpy(G_monero_vstate.ux_wallet_public_short_address, G_monero_vstate.ux_address, 5); @@ -174,16 +172,6 @@ int monero_init_ux() { G_monero_vstate.ux_wallet_public_short_address[10] = 0; #endif -#else - - snprintf(G_monero_vstate.ux_wallet_account_name, sizeof(G_monero_vstate.ux_wallet_account_name), - "XMR / %d", N_monero_pstate->account_id); - memcpy(G_monero_vstate.ux_wallet_public_short_address, G_monero_vstate.ux_address, 5); - memcpy(G_monero_vstate.ux_wallet_public_short_address + 7, G_monero_vstate.ux_address + 95 - 5, - 5); - G_monero_vstate.ux_wallet_public_short_address[12] = 0; - -#endif return 0; } diff --git a/src/monero_key.c b/src/monero_key.c index 85bd73f..d4937f0 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -155,7 +155,6 @@ int monero_apdu_manage_seedwords(void) { monero_nvm_write((void *)N_monero_pstate->words[24], (void *)N_monero_pstate->words[w_start], WORDS_MAX_LENGTH); -#ifdef HAVE_UX_FLOW // transform to list ready to display unsigned char word[21]; w_start = 0; @@ -167,7 +166,6 @@ int monero_apdu_manage_seedwords(void) { monero_nvm_write((char *)N_monero_pstate->words_list + w_start, word, w_end); w_start += w_end; } -#endif } break; diff --git a/src/monero_main.c b/src/monero_main.c index 7f0bda6..e1aeeac 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -29,9 +29,7 @@ #include "glyphs.h" #include "io.h" -#ifdef HAVE_UX_FLOW #include "ux.h" -#endif /* ----------------------------------------------------------------------- */ /* --- Application Entry --- */ diff --git a/src/monero_ram.c b/src/monero_ram.c index 553cf7a..542fe72 100644 --- a/src/monero_ram.c +++ b/src/monero_ram.c @@ -26,18 +26,8 @@ extern unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; -#ifdef HAVE_UX_FLOW -/* --- "NANO-X" and "NANO-S flow" config --- */ - #include "ux.h" extern ux_state_t G_ux; extern bolos_ux_params_t G_ux_params; -#else -/* --- "NANO-S legacy" config --- */ - -ux_state_t ux; - -#endif - monero_v_state_t G_monero_vstate; diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 85ce48c..485232a 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -45,7 +45,7 @@ void ui_menu_words_clear(unsigned int value); void ui_menu_words_back(unsigned int value); UX_STEP_NOCB(ux_menu_words_1_step, -#ifdef UI_NANO_X +#ifndef TARGET_NANOS bnnn_paging, #else bn_paging, @@ -255,7 +255,7 @@ void ui_menu_validation_action(unsigned int value); UX_STEP_NOCB(ux_menu_validation_1_step, bn, {"Amount", G_monero_vstate.ux_amount}); UX_STEP_NOCB(ux_menu_validation_2_step, -#ifdef UI_NANO_X +#ifndef TARGET_NANOS bnnn_paging, #else bn_paging, @@ -535,7 +535,7 @@ void settings_submenu_selector(unsigned int idx) { #define STR(x) #x #define XSTR(x) STR(x) -#ifdef UI_NANO_X +#ifndef TARGET_NANOS UX_STEP_NOCB(ux_menu_about_1_step, bnnn, { "Monero", @@ -565,7 +565,7 @@ UX_STEP_CB(ux_menu_about_2_step, pb, ui_menu_main_display(), }); UX_FLOW(ux_flow_about, -#ifdef UI_NANO_X +#ifndef TARGET_NANOS &ux_menu_about_1_step, #else &ux_menu_about_1a_step, &ux_menu_about_1b_step, diff --git a/src/monero_ux_stax.c b/src/monero_ux_stax.c index 3d8abe9..e703c95 100644 --- a/src/monero_ux_stax.c +++ b/src/monero_ux_stax.c @@ -14,7 +14,7 @@ * limitations under the License. *****************************************************************************/ -#if defined(UI_STAX) +#ifdef HAVE_NBGL #include "os.h" #include "ux.h" diff --git a/src/monero_ux_stax_menu.c b/src/monero_ux_stax_menu.c index 75c6a59..ca694f8 100644 --- a/src/monero_ux_stax_menu.c +++ b/src/monero_ux_stax_menu.c @@ -14,7 +14,7 @@ * limitations under the License. *****************************************************************************/ -#if defined(UI_STAX) +#ifdef HAVE_NBGL #include "os.h" #include "ux.h" diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00005.png b/tests/monero_client/snapshots/nanosp/test_display_address/00005.png index b26ed0cf8cd249df5bf6fb849fdd332874f2fe46..960d4c51d4d333c8c9525a85215778294ea14093 100644 GIT binary patch delta 521 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 afMdV504dhdSotFW0000 Date: Thu, 23 Nov 2023 17:57:44 +0100 Subject: [PATCH 117/142] Clean: remove useless functions --- src/monero_api.h | 3 --- src/monero_init.c | 9 --------- src/monero_io.c | 18 ------------------ src/monero_ux_nano.c | 9 +-------- src/monero_ux_stax.c | 8 ++------ 5 files changed, 3 insertions(+), 44 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index 0765759..2524099 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -24,7 +24,6 @@ void __attribute__((noreturn)) send_error_and_kill_app(int sw); int monero_apdu_reset(void); int monero_apdu_lock(void); -void monero_lock(int sw); void monero_install(unsigned char netId); unsigned int monero_init(void); @@ -372,7 +371,6 @@ void monero_io_insert_encrypt(unsigned char *buffer, size_t len, int type); void monero_io_insert_hmac_for(unsigned char *buffer, int len, int type); void monero_io_insert_u32(unsigned int v32); -void monero_io_insert_u24(unsigned int v24); void monero_io_insert_u16(unsigned int v16); void monero_io_insert_u8(unsigned int v8); void monero_io_insert_t(unsigned int T); @@ -383,7 +381,6 @@ int monero_io_fetch_available(void); void monero_io_fetch_buffer(unsigned char *buffer, unsigned int len); int monero_io_fetch_varint(uint64_t *out_v64); unsigned int monero_io_fetch_u32(void); -unsigned int monero_io_fetch_u24(void); unsigned int monero_io_fetch_u16(void); unsigned int monero_io_fetch_u8(void); int monero_io_fetch_t(unsigned int *T); diff --git a/src/monero_init.c b/src/monero_init.c index 8ec3dc2..69472ee 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -250,12 +250,3 @@ int monero_apdu_reset() { monero_io_insert_u8(MONERO_VERSION_MICRO); return SW_OK; } - -/* ----------------------------------------------------------------------- */ -/* --- LOCK --- */ -/* ----------------------------------------------------------------------- */ -void monero_lock(int sw) { - snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "Security Err"); - snprintf(G_monero_vstate.ux_info2, sizeof(G_monero_vstate.ux_info2), "%x", sw); - ui_menu_show_security_error(); -} diff --git a/src/monero_io.c b/src/monero_io.c index 688183e..43db8e2 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -151,14 +151,6 @@ void monero_io_insert_u32(unsigned int v32) { G_monero_vstate.io_offset += 4; } -void monero_io_insert_u24(unsigned int v24) { - monero_io_hole(3); - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] = (unsigned char)(v24 >> 16) & 0xFF; - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 1] = (unsigned char)(v24 >> 8) & 0xFF; - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 2] = (unsigned char)(v24 >> 0) & 0xFF; - G_monero_vstate.io_offset += 3; -} - void monero_io_insert_u16(unsigned int v16) { monero_io_hole(2); G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] = (unsigned char)(v16 >> 8) & 0xFF; @@ -386,16 +378,6 @@ unsigned int monero_io_fetch_u32(void) { return v32; } -unsigned int monero_io_fetch_u24(void) { - unsigned int v24; - monero_io_assert_available(3); - v24 = ((G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] << 16) | - (G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 1] << 8) | - (G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 2] << 0)); - G_monero_vstate.io_offset += 3; - return v24; -} - unsigned int monero_io_fetch_u16(void) { unsigned int v16; monero_io_assert_available(2); diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 485232a..9c32a4a 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -79,9 +79,7 @@ void settings_show_25_words(void) { ui_menu_words_display(0); } /* -------------------------------- INFO UX --------------------------------- */ -unsigned int ui_menu_info_action(unsigned int value); - -UX_STEP_CB(ux_menu_info_1_step, nn, ui_menu_info_action(0), +UX_STEP_CB(ux_menu_info_1_step, nn, (void)ui_menu_main_display(), { G_monero_vstate.ux_info1, G_monero_vstate.ux_info2, @@ -89,11 +87,6 @@ UX_STEP_CB(ux_menu_info_1_step, nn, ui_menu_info_action(0), UX_FLOW(ux_flow_info, &ux_menu_info_1_step); -unsigned int ui_menu_info_action(unsigned int value __attribute__((unused))) { - ui_menu_main_display(); - return 0; -} - static void ui_menu_info_display2(unsigned int value __attribute__((unused)), const char* line1, const char* line2) { snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "%s", line1); diff --git a/src/monero_ux_stax.c b/src/monero_ux_stax.c index e703c95..d2c82ba 100644 --- a/src/monero_ux_stax.c +++ b/src/monero_ux_stax.c @@ -59,16 +59,12 @@ static void release_context(void) { /* -------------------------------- INFO UX --------------------------------- */ -static void ui_menu_info_action(void) { - ui_menu_main_display(); -} - void ui_menu_show_tx_aborted(void) { - nbgl_useCaseStatus("Transaction\ncancelled", false, ui_menu_info_action); + nbgl_useCaseStatus("Transaction\ncancelled", false, ui_menu_main_display); } void ui_menu_show_security_error(void) { - nbgl_useCaseStatus("Security Error", false, ui_menu_info_action); + nbgl_useCaseStatus("Security Error", false, ui_menu_main_display); } /* -------------------------------- OPEN TX UX --------------------------------- */ From d47c109967ca2062548a18571db516f01ac43107 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 23 Nov 2023 17:58:08 +0100 Subject: [PATCH 118/142] monero_io: use functions from the SDK --- src/monero_io.c | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/monero_io.c b/src/monero_io.c index 43db8e2..84f1d39 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -21,6 +21,8 @@ #include "monero_types.h" #include "monero_api.h" #include "monero_vars.h" +#include "os_utils.h" +#include "read.h" #if defined(IODUMMYCRYPT) #warning IODUMMYCRYPT activated @@ -144,17 +146,13 @@ void monero_io_insert_encrypt(unsigned char* buffer, size_t len, int type) { void monero_io_insert_u32(unsigned int v32) { monero_io_hole(4); - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] = (unsigned char)(v32 >> 24) & 0xFF; - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 1] = (unsigned char)(v32 >> 16) & 0xFF; - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 2] = (unsigned char)(v32 >> 8) & 0xFF; - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 3] = (unsigned char)(v32 >> 0) & 0xFF; + U4BE_ENCODE(G_monero_vstate.io_buffer, G_monero_vstate.io_offset, v32); G_monero_vstate.io_offset += 4; } void monero_io_insert_u16(unsigned int v16) { monero_io_hole(2); - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] = (unsigned char)(v16 >> 8) & 0xFF; - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 1] = (unsigned char)(v16 >> 0) & 0xFF; + U2BE_ENCODE(G_monero_vstate.io_buffer, G_monero_vstate.io_offset, v16); G_monero_vstate.io_offset += 2; } @@ -370,10 +368,7 @@ int monero_io_fetch_varint(uint64_t* out_v64) { unsigned int monero_io_fetch_u32(void) { unsigned int v32; monero_io_assert_available(4); - v32 = ((G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] << 24) | - (G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 1] << 16) | - (G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 2] << 8) | - (G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 3] << 0)); + v32 = read_u32_be(G_monero_vstate.io_buffer, G_monero_vstate.io_offset); G_monero_vstate.io_offset += 4; return v32; } @@ -381,8 +376,7 @@ unsigned int monero_io_fetch_u32(void) { unsigned int monero_io_fetch_u16(void) { unsigned int v16; monero_io_assert_available(2); - v16 = ((G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] << 8) | - (G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 1] << 0)); + v16 = read_u16_be(G_monero_vstate.io_buffer, G_monero_vstate.io_offset); G_monero_vstate.io_offset += 2; return v16; } From c49a608d7a59efce215d224fd2b535e8b0f50177 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 23 Nov 2023 18:00:25 +0100 Subject: [PATCH 119/142] ui: better error handling for ui_menu_any_pubaddr_display --- src/monero_key.c | 8 ++++---- src/monero_ux_nano.c | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/monero_key.c b/src/monero_key.c index d4937f0..2170e05 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -202,7 +202,7 @@ int monero_apdu_display_address() { unsigned char payment_id[8]; unsigned char C[32]; unsigned char D[32]; - int error; + int error = 0; // fetch monero_io_fetch(index, 8); @@ -240,9 +240,9 @@ int monero_apdu_display_address() { } } - ui_menu_any_pubaddr_display(0, C, D, (minor | major) ? 1 : 0, - (G_monero_vstate.io_p1 == 1) ? payment_id : NULL); - return 0; + error = ui_menu_any_pubaddr_display(0, C, D, (minor | major) ? 1 : 0, + (G_monero_vstate.io_p1 == 1) ? payment_id : NULL); + return error; } /* ----------------------------------------------------------------------- */ diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 9c32a4a..b0abff4 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -653,7 +653,10 @@ void ui_menu_pubaddr_display(unsigned int value) { G_monero_vstate.disp_addr_mode = 0; G_monero_vstate.disp_addr_M = 0; G_monero_vstate.disp_addr_m = 0; - ui_menu_any_pubaddr_display(value, G_monero_vstate.A, G_monero_vstate.B, 0, NULL); + int error = ui_menu_any_pubaddr_display(value, G_monero_vstate.A, G_monero_vstate.B, 0, NULL); + if (error) { + app_exit(); + } } static void exit(void) { From 268ee178fd6708cd61fc9ac5742486bca5786cee Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 23 Nov 2023 18:00:50 +0100 Subject: [PATCH 120/142] misc: minor cleanings --- Makefile | 1 - src/monero_api.h | 1 - src/monero_main.c | 1 + src/monero_ux_nano.c | 1 - src/monero_ux_stax_menu.c | 1 - 5 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 9cc1f5d..5240eb1 100644 --- a/Makefile +++ b/Makefile @@ -81,7 +81,6 @@ DEFINES += U2F_PROXY_MAGIC=\"MOON\" DEFINES += HAVE_IO_U2F HAVE_U2F # Enabling debug PRINTF -#DEBUG = 0 ifneq ($(DEBUG),0) # Debug options DEFINES += DEBUG_HWDEVICE diff --git a/src/monero_api.h b/src/monero_api.h index 2524099..e2584c4 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -23,7 +23,6 @@ void __attribute__((noreturn)) send_error_and_kill_app(int sw); int monero_apdu_reset(void); -int monero_apdu_lock(void); void monero_install(unsigned char netId); unsigned int monero_init(void); diff --git a/src/monero_main.c b/src/monero_main.c index e1aeeac..9a26165 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -37,6 +37,7 @@ void __attribute__((noreturn)) app_exit(void); void __attribute__((noreturn)) send_error_and_kill_app(int sw) { + monero_io_discard(1); monero_io_insert_u16(sw); monero_io_do(IO_RETURN_AFTER_TX); memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index b0abff4..140522b 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -660,7 +660,6 @@ void ui_menu_pubaddr_display(unsigned int value) { } static void exit(void) { - memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); app_exit(); } diff --git a/src/monero_ux_stax_menu.c b/src/monero_ux_stax_menu.c index ca694f8..431df51 100644 --- a/src/monero_ux_stax_menu.c +++ b/src/monero_ux_stax_menu.c @@ -85,7 +85,6 @@ static void update_account(void) { } static void exit(void) { - memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); app_exit(); } From 151c6f95407241914a106047e13f447c7f375a10 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Fri, 24 Nov 2023 09:56:27 +0100 Subject: [PATCH 121/142] ux: remove useless wrapper --- src/monero_ux_nano.c | 6 +----- src/monero_ux_stax_menu.c | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 140522b..1b4523b 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -659,10 +659,6 @@ void ui_menu_pubaddr_display(unsigned int value) { } } -static void exit(void) { - app_exit(); -} - #undef ADDR_TYPE #undef ADDR_MAJOR #undef ADDR_MINOR @@ -682,7 +678,7 @@ UX_STEP_CB(ux_menu_main_2_step, pb, UX_STEP_CB(ux_menu_main_3_step, pb, ui_menu_about_display(), {&C_icon_certificate, "About"}); -UX_STEP_CB(ux_menu_main_4_step, pb, exit(), {&C_icon_dashboard_x, "Quit app"}); +UX_STEP_CB(ux_menu_main_4_step, pb, app_exit(), {&C_icon_dashboard_x, "Quit app"}); UX_FLOW(ux_flow_main, &ux_menu_main_1_step, &ux_menu_main_2_step, &ux_menu_main_3_step, &ux_menu_main_4_step); diff --git a/src/monero_ux_stax_menu.c b/src/monero_ux_stax_menu.c index 431df51..b3bba36 100644 --- a/src/monero_ux_stax_menu.c +++ b/src/monero_ux_stax_menu.c @@ -84,10 +84,6 @@ static void update_account(void) { G_monero_vstate.disp_addr_m = 0; } -static void exit(void) { - app_exit(); -} - static bool settings_navigation_cb(uint8_t page, nbgl_pageContent_t* content) { if (page == 0) { content->type = BARS_LIST; @@ -253,7 +249,7 @@ void ui_menu_main_display(void) { NULL); nbgl_useCaseHomeExt("Monero", &C_Monero_64px, NULL, true, transactionContext.buffer, - display_account, display_settings_menu, exit); + display_account, display_settings_menu, app_exit); } /* --- INIT --- */ From bd1f9da25f7a6ae99522ef2ac4528d144b876c5b Mon Sep 17 00:00:00 2001 From: Sarah Gliner <105934250+sgliner-ledger@users.noreply.github.com> Date: Wed, 29 Nov 2023 11:45:39 +0100 Subject: [PATCH 122/142] [auto]: add PR template --- .github/PULL_REQUEST_TEMPLATE.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..98b720f --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +# Checklist + +- [ ] App update process has been followed +- [ ] Target branch is `develop` +- [ ] Application version has been bumped + + From 47cae00109693c9e617fa815cd6f4665ace5f164 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Wed, 10 Jan 2024 14:25:42 +0100 Subject: [PATCH 123/142] tests: move snapshots folder --- tests/monero_client/monero_cmd.py | 2 +- tests/monero_client/monero_crypto_cmd.py | 2 +- .../snapshots/nanos/test_display_address/00000.png | Bin .../snapshots/nanos/test_display_address/00001.png | Bin .../snapshots/nanos/test_display_address/00002.png | Bin .../snapshots/nanos/test_display_address/00003.png | Bin .../snapshots/nanos/test_display_address/00004.png | Bin .../snapshots/nanos/test_display_address/00005.png | Bin .../snapshots/nanos/test_display_address/00006.png | Bin .../snapshots/nanos/test_display_address/00007.png | Bin .../snapshots/nanos/test_display_address/00008.png | Bin .../snapshots/nanos/test_display_address/00009.png | Bin .../nanos/test_display_subaddress/00000.png | Bin .../nanos/test_display_subaddress/00001.png | Bin .../nanos/test_display_subaddress/00002.png | Bin .../nanos/test_display_subaddress/00003.png | Bin .../nanos/test_display_subaddress/00004.png | Bin .../nanos/test_display_subaddress/00005.png | Bin .../nanos/test_display_subaddress/00006.png | Bin .../nanos/test_display_subaddress/00007.png | Bin .../nanos/test_display_subaddress/00008.png | Bin .../nanos/test_display_subaddress/00009.png | Bin .../nanos/test_prefix_hash_hash_init/00000.png | Bin .../nanos/test_prefix_hash_hash_init/00001.png | Bin .../nanos/test_prefix_hash_hash_init/00002.png | Bin .../nanos/test_prefix_hashhash_init/00000.png | Bin .../nanos/test_prefix_hashhash_init/00001.png | Bin .../nanos/test_prefix_hashhash_init/00002.png | Bin .../nanos/test_prefix_hashhash_init/00003.png | Bin .../snapshots/nanos/test_private_view_key/00000.png | Bin .../snapshots/nanos/test_private_view_key/00001.png | Bin .../snapshots/nanos/test_private_view_key/00002.png | Bin .../nanos/test_validate_prehash_init/00000.png | Bin .../nanos/test_validate_prehash_init/00001.png | Bin .../nanos/test_validate_prehash_init/00002.png | Bin .../nanos/test_validate_prehash_update/00000.png | Bin .../nanos/test_validate_prehash_update/00001.png | Bin .../nanos/test_validate_prehash_update/00002.png | Bin .../nanos/test_validate_prehash_update/00003.png | Bin .../nanos/test_validate_prehash_update/00004.png | Bin .../nanos/test_validate_prehash_update/00005.png | Bin .../nanos/test_validate_prehash_update/00006.png | Bin .../nanos/test_validate_prehash_update/00007.png | Bin .../nanos/test_validateprehash_init/00000.png | Bin .../nanos/test_validateprehash_init/00001.png | Bin .../nanos/test_validateprehash_init/00002.png | Bin .../nanos/test_validateprehash_init/00003.png | Bin .../snapshots/nanosp/test_display_address/00000.png | Bin .../snapshots/nanosp/test_display_address/00001.png | Bin .../snapshots/nanosp/test_display_address/00002.png | Bin .../snapshots/nanosp/test_display_address/00003.png | Bin .../snapshots/nanosp/test_display_address/00004.png | Bin .../snapshots/nanosp/test_display_address/00005.png | Bin .../nanosp/test_display_subaddress/00000.png | Bin .../nanosp/test_display_subaddress/00001.png | Bin .../nanosp/test_display_subaddress/00002.png | Bin .../nanosp/test_display_subaddress/00003.png | Bin .../nanosp/test_display_subaddress/00004.png | Bin .../nanosp/test_display_subaddress/00005.png | Bin .../nanosp/test_prefix_hash_hash_init/00000.png | Bin .../nanosp/test_prefix_hash_hash_init/00001.png | Bin .../nanosp/test_prefix_hashhash_init/00000.png | Bin .../nanosp/test_prefix_hashhash_init/00001.png | Bin .../nanosp/test_prefix_hashhash_init/00002.png | Bin .../nanosp/test_private_view_key/00000.png | Bin .../nanosp/test_private_view_key/00001.png | Bin .../nanosp/test_private_view_key/00002.png | Bin .../nanosp/test_validate_prehash_init/00000.png | Bin .../nanosp/test_validate_prehash_init/00001.png | Bin .../nanosp/test_validate_prehash_update/00000.png | Bin .../nanosp/test_validate_prehash_update/00001.png | Bin .../nanosp/test_validate_prehash_update/00002.png | Bin .../nanosp/test_validate_prehash_update/00003.png | Bin .../nanosp/test_validateprehash_init/00000.png | Bin .../nanosp/test_validateprehash_init/00001.png | Bin .../nanosp/test_validateprehash_init/00002.png | Bin .../snapshots/nanox/test_display_address/00000.png | Bin .../snapshots/nanox/test_display_address/00001.png | Bin .../snapshots/nanox/test_display_address/00002.png | Bin .../snapshots/nanox/test_display_address/00003.png | Bin .../snapshots/nanox/test_display_address/00004.png | Bin .../snapshots/nanox/test_display_address/00005.png | Bin .../nanox/test_display_subaddress/00000.png | Bin .../nanox/test_display_subaddress/00001.png | Bin .../nanox/test_display_subaddress/00002.png | Bin .../nanox/test_display_subaddress/00003.png | Bin .../nanox/test_display_subaddress/00004.png | Bin .../nanox/test_display_subaddress/00005.png | Bin .../nanox/test_prefix_hash_hash_init/00000.png | Bin .../nanox/test_prefix_hash_hash_init/00001.png | Bin .../nanox/test_prefix_hashhash_init/00000.png | Bin .../nanox/test_prefix_hashhash_init/00001.png | Bin .../nanox/test_prefix_hashhash_init/00002.png | Bin .../snapshots/nanox/test_private_view_key/00000.png | Bin .../snapshots/nanox/test_private_view_key/00001.png | Bin .../snapshots/nanox/test_private_view_key/00002.png | Bin .../nanox/test_validate_prehash_init/00000.png | Bin .../nanox/test_validate_prehash_init/00001.png | Bin .../nanox/test_validate_prehash_update/00000.png | Bin .../nanox/test_validate_prehash_update/00001.png | Bin .../nanox/test_validate_prehash_update/00002.png | Bin .../nanox/test_validate_prehash_update/00003.png | Bin .../nanox/test_validateprehash_init/00000.png | Bin .../nanox/test_validateprehash_init/00001.png | Bin .../nanox/test_validateprehash_init/00002.png | Bin .../snapshots/stax/test_display_address/00000.png | Bin .../snapshots/stax/test_display_address/00001.png | Bin .../snapshots/stax/test_display_address/00002.png | Bin .../snapshots/stax/test_display_address/00003.png | Bin .../snapshots/stax/test_display_address/00004.png | Bin .../snapshots/stax/test_display_address/00005.png | Bin .../snapshots/stax/test_display_address/00006.png | Bin .../stax/test_display_subaddress/00000.png | Bin .../stax/test_display_subaddress/00001.png | Bin .../stax/test_display_subaddress/00002.png | Bin .../stax/test_display_subaddress/00003.png | Bin .../stax/test_display_subaddress/00004.png | Bin .../stax/test_display_subaddress/00005.png | Bin .../stax/test_display_subaddress/00006.png | Bin .../stax/test_prefix_hash_hash_init/00000.png | Bin .../snapshots/stax/test_private_view_key/00000.png | Bin .../snapshots/stax/test_private_view_key/00001.png | Bin .../stax/test_validate_prehash_update/00000.png | Bin .../stax/test_validate_prehash_update/00001.png | Bin .../stax/test_validate_prehash_update/00002.png | Bin 125 files changed, 2 insertions(+), 2 deletions(-) rename tests/{monero_client => }/snapshots/nanos/test_display_address/00000.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_address/00001.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_address/00002.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_address/00003.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_address/00004.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_address/00005.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_address/00006.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_address/00007.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_address/00008.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_address/00009.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_subaddress/00000.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_subaddress/00001.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_subaddress/00002.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_subaddress/00003.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_subaddress/00004.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_subaddress/00005.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_subaddress/00006.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_subaddress/00007.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_subaddress/00008.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_display_subaddress/00009.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_prefix_hash_hash_init/00000.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_prefix_hash_hash_init/00001.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_prefix_hash_hash_init/00002.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_prefix_hashhash_init/00000.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_prefix_hashhash_init/00001.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_prefix_hashhash_init/00002.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_prefix_hashhash_init/00003.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_private_view_key/00000.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_private_view_key/00001.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_private_view_key/00002.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validate_prehash_init/00000.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validate_prehash_init/00001.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validate_prehash_init/00002.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validate_prehash_update/00000.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validate_prehash_update/00001.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validate_prehash_update/00002.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validate_prehash_update/00003.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validate_prehash_update/00004.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validate_prehash_update/00005.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validate_prehash_update/00006.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validate_prehash_update/00007.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validateprehash_init/00000.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validateprehash_init/00001.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validateprehash_init/00002.png (100%) rename tests/{monero_client => }/snapshots/nanos/test_validateprehash_init/00003.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_display_address/00000.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_display_address/00001.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_display_address/00002.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_display_address/00003.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_display_address/00004.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_display_address/00005.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_display_subaddress/00000.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_display_subaddress/00001.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_display_subaddress/00002.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_display_subaddress/00003.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_display_subaddress/00004.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_display_subaddress/00005.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_prefix_hash_hash_init/00000.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_prefix_hash_hash_init/00001.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_prefix_hashhash_init/00000.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_prefix_hashhash_init/00001.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_prefix_hashhash_init/00002.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_private_view_key/00000.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_private_view_key/00001.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_private_view_key/00002.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_validate_prehash_init/00000.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_validate_prehash_init/00001.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_validate_prehash_update/00000.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_validate_prehash_update/00001.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_validate_prehash_update/00002.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_validate_prehash_update/00003.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_validateprehash_init/00000.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_validateprehash_init/00001.png (100%) rename tests/{monero_client => }/snapshots/nanosp/test_validateprehash_init/00002.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_display_address/00000.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_display_address/00001.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_display_address/00002.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_display_address/00003.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_display_address/00004.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_display_address/00005.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_display_subaddress/00000.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_display_subaddress/00001.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_display_subaddress/00002.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_display_subaddress/00003.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_display_subaddress/00004.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_display_subaddress/00005.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_prefix_hash_hash_init/00000.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_prefix_hash_hash_init/00001.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_prefix_hashhash_init/00000.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_prefix_hashhash_init/00001.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_prefix_hashhash_init/00002.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_private_view_key/00000.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_private_view_key/00001.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_private_view_key/00002.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_validate_prehash_init/00000.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_validate_prehash_init/00001.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_validate_prehash_update/00000.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_validate_prehash_update/00001.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_validate_prehash_update/00002.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_validate_prehash_update/00003.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_validateprehash_init/00000.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_validateprehash_init/00001.png (100%) rename tests/{monero_client => }/snapshots/nanox/test_validateprehash_init/00002.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_address/00000.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_address/00001.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_address/00002.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_address/00003.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_address/00004.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_address/00005.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_address/00006.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_subaddress/00000.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_subaddress/00001.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_subaddress/00002.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_subaddress/00003.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_subaddress/00004.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_subaddress/00005.png (100%) rename tests/{monero_client => }/snapshots/stax/test_display_subaddress/00006.png (100%) rename tests/{monero_client => }/snapshots/stax/test_prefix_hash_hash_init/00000.png (100%) rename tests/{monero_client => }/snapshots/stax/test_private_view_key/00000.png (100%) rename tests/{monero_client => }/snapshots/stax/test_private_view_key/00001.png (100%) rename tests/{monero_client => }/snapshots/stax/test_validate_prehash_update/00000.png (100%) rename tests/{monero_client => }/snapshots/stax/test_validate_prehash_update/00001.png (100%) rename tests/{monero_client => }/snapshots/stax/test_validate_prehash_update/00002.png (100%) diff --git a/tests/monero_client/monero_cmd.py b/tests/monero_client/monero_cmd.py index f35228d..ea16c87 100644 --- a/tests/monero_client/monero_cmd.py +++ b/tests/monero_client/monero_cmd.py @@ -30,7 +30,7 @@ from ragger.navigator import NavInsID, NavIns PROTOCOL_VERSION: int = 3 -TESTS_ROOT_DIR = Path(__file__).parent +TESTS_ROOT_DIR = Path(__file__).parent.parent class MoneroCmd(MoneroCryptoCmd): diff --git a/tests/monero_client/monero_crypto_cmd.py b/tests/monero_client/monero_crypto_cmd.py index eb12aea..8a8c56c 100644 --- a/tests/monero_client/monero_crypto_cmd.py +++ b/tests/monero_client/monero_crypto_cmd.py @@ -11,7 +11,7 @@ from .utils.utils import get_nano_review_instructions PROTOCOL_VERSION: int = 3 -TESTS_ROOT_DIR = Path(__file__).parent +TESTS_ROOT_DIR = Path(__file__).parent.parent class MoneroCryptoCmd: diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00000.png b/tests/snapshots/nanos/test_display_address/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_address/00000.png rename to tests/snapshots/nanos/test_display_address/00000.png diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00001.png b/tests/snapshots/nanos/test_display_address/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_address/00001.png rename to tests/snapshots/nanos/test_display_address/00001.png diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00002.png b/tests/snapshots/nanos/test_display_address/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_address/00002.png rename to tests/snapshots/nanos/test_display_address/00002.png diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00003.png b/tests/snapshots/nanos/test_display_address/00003.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_address/00003.png rename to tests/snapshots/nanos/test_display_address/00003.png diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00004.png b/tests/snapshots/nanos/test_display_address/00004.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_address/00004.png rename to tests/snapshots/nanos/test_display_address/00004.png diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00005.png b/tests/snapshots/nanos/test_display_address/00005.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_address/00005.png rename to tests/snapshots/nanos/test_display_address/00005.png diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00006.png b/tests/snapshots/nanos/test_display_address/00006.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_address/00006.png rename to tests/snapshots/nanos/test_display_address/00006.png diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00007.png b/tests/snapshots/nanos/test_display_address/00007.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_address/00007.png rename to tests/snapshots/nanos/test_display_address/00007.png diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00008.png b/tests/snapshots/nanos/test_display_address/00008.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_address/00008.png rename to tests/snapshots/nanos/test_display_address/00008.png diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00009.png b/tests/snapshots/nanos/test_display_address/00009.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_address/00009.png rename to tests/snapshots/nanos/test_display_address/00009.png diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00000.png b/tests/snapshots/nanos/test_display_subaddress/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_subaddress/00000.png rename to tests/snapshots/nanos/test_display_subaddress/00000.png diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00001.png b/tests/snapshots/nanos/test_display_subaddress/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_subaddress/00001.png rename to tests/snapshots/nanos/test_display_subaddress/00001.png diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00002.png b/tests/snapshots/nanos/test_display_subaddress/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_subaddress/00002.png rename to tests/snapshots/nanos/test_display_subaddress/00002.png diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00003.png b/tests/snapshots/nanos/test_display_subaddress/00003.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_subaddress/00003.png rename to tests/snapshots/nanos/test_display_subaddress/00003.png diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00004.png b/tests/snapshots/nanos/test_display_subaddress/00004.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_subaddress/00004.png rename to tests/snapshots/nanos/test_display_subaddress/00004.png diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00005.png b/tests/snapshots/nanos/test_display_subaddress/00005.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_subaddress/00005.png rename to tests/snapshots/nanos/test_display_subaddress/00005.png diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00006.png b/tests/snapshots/nanos/test_display_subaddress/00006.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_subaddress/00006.png rename to tests/snapshots/nanos/test_display_subaddress/00006.png diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00007.png b/tests/snapshots/nanos/test_display_subaddress/00007.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_subaddress/00007.png rename to tests/snapshots/nanos/test_display_subaddress/00007.png diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00008.png b/tests/snapshots/nanos/test_display_subaddress/00008.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_subaddress/00008.png rename to tests/snapshots/nanos/test_display_subaddress/00008.png diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00009.png b/tests/snapshots/nanos/test_display_subaddress/00009.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_display_subaddress/00009.png rename to tests/snapshots/nanos/test_display_subaddress/00009.png diff --git a/tests/monero_client/snapshots/nanos/test_prefix_hash_hash_init/00000.png b/tests/snapshots/nanos/test_prefix_hash_hash_init/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_prefix_hash_hash_init/00000.png rename to tests/snapshots/nanos/test_prefix_hash_hash_init/00000.png diff --git a/tests/monero_client/snapshots/nanos/test_prefix_hash_hash_init/00001.png b/tests/snapshots/nanos/test_prefix_hash_hash_init/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_prefix_hash_hash_init/00001.png rename to tests/snapshots/nanos/test_prefix_hash_hash_init/00001.png diff --git a/tests/monero_client/snapshots/nanos/test_prefix_hash_hash_init/00002.png b/tests/snapshots/nanos/test_prefix_hash_hash_init/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_prefix_hash_hash_init/00002.png rename to tests/snapshots/nanos/test_prefix_hash_hash_init/00002.png diff --git a/tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00000.png b/tests/snapshots/nanos/test_prefix_hashhash_init/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00000.png rename to tests/snapshots/nanos/test_prefix_hashhash_init/00000.png diff --git a/tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00001.png b/tests/snapshots/nanos/test_prefix_hashhash_init/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00001.png rename to tests/snapshots/nanos/test_prefix_hashhash_init/00001.png diff --git a/tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00002.png b/tests/snapshots/nanos/test_prefix_hashhash_init/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00002.png rename to tests/snapshots/nanos/test_prefix_hashhash_init/00002.png diff --git a/tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00003.png b/tests/snapshots/nanos/test_prefix_hashhash_init/00003.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_prefix_hashhash_init/00003.png rename to tests/snapshots/nanos/test_prefix_hashhash_init/00003.png diff --git a/tests/monero_client/snapshots/nanos/test_private_view_key/00000.png b/tests/snapshots/nanos/test_private_view_key/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_private_view_key/00000.png rename to tests/snapshots/nanos/test_private_view_key/00000.png diff --git a/tests/monero_client/snapshots/nanos/test_private_view_key/00001.png b/tests/snapshots/nanos/test_private_view_key/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_private_view_key/00001.png rename to tests/snapshots/nanos/test_private_view_key/00001.png diff --git a/tests/monero_client/snapshots/nanos/test_private_view_key/00002.png b/tests/snapshots/nanos/test_private_view_key/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_private_view_key/00002.png rename to tests/snapshots/nanos/test_private_view_key/00002.png diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_init/00000.png b/tests/snapshots/nanos/test_validate_prehash_init/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validate_prehash_init/00000.png rename to tests/snapshots/nanos/test_validate_prehash_init/00000.png diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_init/00001.png b/tests/snapshots/nanos/test_validate_prehash_init/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validate_prehash_init/00001.png rename to tests/snapshots/nanos/test_validate_prehash_init/00001.png diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_init/00002.png b/tests/snapshots/nanos/test_validate_prehash_init/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validate_prehash_init/00002.png rename to tests/snapshots/nanos/test_validate_prehash_init/00002.png diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00000.png b/tests/snapshots/nanos/test_validate_prehash_update/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validate_prehash_update/00000.png rename to tests/snapshots/nanos/test_validate_prehash_update/00000.png diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00001.png b/tests/snapshots/nanos/test_validate_prehash_update/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validate_prehash_update/00001.png rename to tests/snapshots/nanos/test_validate_prehash_update/00001.png diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00002.png b/tests/snapshots/nanos/test_validate_prehash_update/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validate_prehash_update/00002.png rename to tests/snapshots/nanos/test_validate_prehash_update/00002.png diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00003.png b/tests/snapshots/nanos/test_validate_prehash_update/00003.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validate_prehash_update/00003.png rename to tests/snapshots/nanos/test_validate_prehash_update/00003.png diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00004.png b/tests/snapshots/nanos/test_validate_prehash_update/00004.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validate_prehash_update/00004.png rename to tests/snapshots/nanos/test_validate_prehash_update/00004.png diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00005.png b/tests/snapshots/nanos/test_validate_prehash_update/00005.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validate_prehash_update/00005.png rename to tests/snapshots/nanos/test_validate_prehash_update/00005.png diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00006.png b/tests/snapshots/nanos/test_validate_prehash_update/00006.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validate_prehash_update/00006.png rename to tests/snapshots/nanos/test_validate_prehash_update/00006.png diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00007.png b/tests/snapshots/nanos/test_validate_prehash_update/00007.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validate_prehash_update/00007.png rename to tests/snapshots/nanos/test_validate_prehash_update/00007.png diff --git a/tests/monero_client/snapshots/nanos/test_validateprehash_init/00000.png b/tests/snapshots/nanos/test_validateprehash_init/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validateprehash_init/00000.png rename to tests/snapshots/nanos/test_validateprehash_init/00000.png diff --git a/tests/monero_client/snapshots/nanos/test_validateprehash_init/00001.png b/tests/snapshots/nanos/test_validateprehash_init/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validateprehash_init/00001.png rename to tests/snapshots/nanos/test_validateprehash_init/00001.png diff --git a/tests/monero_client/snapshots/nanos/test_validateprehash_init/00002.png b/tests/snapshots/nanos/test_validateprehash_init/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validateprehash_init/00002.png rename to tests/snapshots/nanos/test_validateprehash_init/00002.png diff --git a/tests/monero_client/snapshots/nanos/test_validateprehash_init/00003.png b/tests/snapshots/nanos/test_validateprehash_init/00003.png similarity index 100% rename from tests/monero_client/snapshots/nanos/test_validateprehash_init/00003.png rename to tests/snapshots/nanos/test_validateprehash_init/00003.png diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00000.png b/tests/snapshots/nanosp/test_display_address/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_display_address/00000.png rename to tests/snapshots/nanosp/test_display_address/00000.png diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00001.png b/tests/snapshots/nanosp/test_display_address/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_display_address/00001.png rename to tests/snapshots/nanosp/test_display_address/00001.png diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00002.png b/tests/snapshots/nanosp/test_display_address/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_display_address/00002.png rename to tests/snapshots/nanosp/test_display_address/00002.png diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00003.png b/tests/snapshots/nanosp/test_display_address/00003.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_display_address/00003.png rename to tests/snapshots/nanosp/test_display_address/00003.png diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00004.png b/tests/snapshots/nanosp/test_display_address/00004.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_display_address/00004.png rename to tests/snapshots/nanosp/test_display_address/00004.png diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00005.png b/tests/snapshots/nanosp/test_display_address/00005.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_display_address/00005.png rename to tests/snapshots/nanosp/test_display_address/00005.png diff --git a/tests/monero_client/snapshots/nanosp/test_display_subaddress/00000.png b/tests/snapshots/nanosp/test_display_subaddress/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_display_subaddress/00000.png rename to tests/snapshots/nanosp/test_display_subaddress/00000.png diff --git a/tests/monero_client/snapshots/nanosp/test_display_subaddress/00001.png b/tests/snapshots/nanosp/test_display_subaddress/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_display_subaddress/00001.png rename to tests/snapshots/nanosp/test_display_subaddress/00001.png diff --git a/tests/monero_client/snapshots/nanosp/test_display_subaddress/00002.png b/tests/snapshots/nanosp/test_display_subaddress/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_display_subaddress/00002.png rename to tests/snapshots/nanosp/test_display_subaddress/00002.png diff --git a/tests/monero_client/snapshots/nanosp/test_display_subaddress/00003.png b/tests/snapshots/nanosp/test_display_subaddress/00003.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_display_subaddress/00003.png rename to tests/snapshots/nanosp/test_display_subaddress/00003.png diff --git a/tests/monero_client/snapshots/nanosp/test_display_subaddress/00004.png b/tests/snapshots/nanosp/test_display_subaddress/00004.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_display_subaddress/00004.png rename to tests/snapshots/nanosp/test_display_subaddress/00004.png diff --git a/tests/monero_client/snapshots/nanosp/test_display_subaddress/00005.png b/tests/snapshots/nanosp/test_display_subaddress/00005.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_display_subaddress/00005.png rename to tests/snapshots/nanosp/test_display_subaddress/00005.png diff --git a/tests/monero_client/snapshots/nanosp/test_prefix_hash_hash_init/00000.png b/tests/snapshots/nanosp/test_prefix_hash_hash_init/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_prefix_hash_hash_init/00000.png rename to tests/snapshots/nanosp/test_prefix_hash_hash_init/00000.png diff --git a/tests/monero_client/snapshots/nanosp/test_prefix_hash_hash_init/00001.png b/tests/snapshots/nanosp/test_prefix_hash_hash_init/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_prefix_hash_hash_init/00001.png rename to tests/snapshots/nanosp/test_prefix_hash_hash_init/00001.png diff --git a/tests/monero_client/snapshots/nanosp/test_prefix_hashhash_init/00000.png b/tests/snapshots/nanosp/test_prefix_hashhash_init/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_prefix_hashhash_init/00000.png rename to tests/snapshots/nanosp/test_prefix_hashhash_init/00000.png diff --git a/tests/monero_client/snapshots/nanosp/test_prefix_hashhash_init/00001.png b/tests/snapshots/nanosp/test_prefix_hashhash_init/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_prefix_hashhash_init/00001.png rename to tests/snapshots/nanosp/test_prefix_hashhash_init/00001.png diff --git a/tests/monero_client/snapshots/nanosp/test_prefix_hashhash_init/00002.png b/tests/snapshots/nanosp/test_prefix_hashhash_init/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_prefix_hashhash_init/00002.png rename to tests/snapshots/nanosp/test_prefix_hashhash_init/00002.png diff --git a/tests/monero_client/snapshots/nanosp/test_private_view_key/00000.png b/tests/snapshots/nanosp/test_private_view_key/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_private_view_key/00000.png rename to tests/snapshots/nanosp/test_private_view_key/00000.png diff --git a/tests/monero_client/snapshots/nanosp/test_private_view_key/00001.png b/tests/snapshots/nanosp/test_private_view_key/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_private_view_key/00001.png rename to tests/snapshots/nanosp/test_private_view_key/00001.png diff --git a/tests/monero_client/snapshots/nanosp/test_private_view_key/00002.png b/tests/snapshots/nanosp/test_private_view_key/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_private_view_key/00002.png rename to tests/snapshots/nanosp/test_private_view_key/00002.png diff --git a/tests/monero_client/snapshots/nanosp/test_validate_prehash_init/00000.png b/tests/snapshots/nanosp/test_validate_prehash_init/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_validate_prehash_init/00000.png rename to tests/snapshots/nanosp/test_validate_prehash_init/00000.png diff --git a/tests/monero_client/snapshots/nanosp/test_validate_prehash_init/00001.png b/tests/snapshots/nanosp/test_validate_prehash_init/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_validate_prehash_init/00001.png rename to tests/snapshots/nanosp/test_validate_prehash_init/00001.png diff --git a/tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00000.png b/tests/snapshots/nanosp/test_validate_prehash_update/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00000.png rename to tests/snapshots/nanosp/test_validate_prehash_update/00000.png diff --git a/tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00001.png b/tests/snapshots/nanosp/test_validate_prehash_update/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00001.png rename to tests/snapshots/nanosp/test_validate_prehash_update/00001.png diff --git a/tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00002.png b/tests/snapshots/nanosp/test_validate_prehash_update/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00002.png rename to tests/snapshots/nanosp/test_validate_prehash_update/00002.png diff --git a/tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00003.png b/tests/snapshots/nanosp/test_validate_prehash_update/00003.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_validate_prehash_update/00003.png rename to tests/snapshots/nanosp/test_validate_prehash_update/00003.png diff --git a/tests/monero_client/snapshots/nanosp/test_validateprehash_init/00000.png b/tests/snapshots/nanosp/test_validateprehash_init/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_validateprehash_init/00000.png rename to tests/snapshots/nanosp/test_validateprehash_init/00000.png diff --git a/tests/monero_client/snapshots/nanosp/test_validateprehash_init/00001.png b/tests/snapshots/nanosp/test_validateprehash_init/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_validateprehash_init/00001.png rename to tests/snapshots/nanosp/test_validateprehash_init/00001.png diff --git a/tests/monero_client/snapshots/nanosp/test_validateprehash_init/00002.png b/tests/snapshots/nanosp/test_validateprehash_init/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanosp/test_validateprehash_init/00002.png rename to tests/snapshots/nanosp/test_validateprehash_init/00002.png diff --git a/tests/monero_client/snapshots/nanox/test_display_address/00000.png b/tests/snapshots/nanox/test_display_address/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_display_address/00000.png rename to tests/snapshots/nanox/test_display_address/00000.png diff --git a/tests/monero_client/snapshots/nanox/test_display_address/00001.png b/tests/snapshots/nanox/test_display_address/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_display_address/00001.png rename to tests/snapshots/nanox/test_display_address/00001.png diff --git a/tests/monero_client/snapshots/nanox/test_display_address/00002.png b/tests/snapshots/nanox/test_display_address/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_display_address/00002.png rename to tests/snapshots/nanox/test_display_address/00002.png diff --git a/tests/monero_client/snapshots/nanox/test_display_address/00003.png b/tests/snapshots/nanox/test_display_address/00003.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_display_address/00003.png rename to tests/snapshots/nanox/test_display_address/00003.png diff --git a/tests/monero_client/snapshots/nanox/test_display_address/00004.png b/tests/snapshots/nanox/test_display_address/00004.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_display_address/00004.png rename to tests/snapshots/nanox/test_display_address/00004.png diff --git a/tests/monero_client/snapshots/nanox/test_display_address/00005.png b/tests/snapshots/nanox/test_display_address/00005.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_display_address/00005.png rename to tests/snapshots/nanox/test_display_address/00005.png diff --git a/tests/monero_client/snapshots/nanox/test_display_subaddress/00000.png b/tests/snapshots/nanox/test_display_subaddress/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_display_subaddress/00000.png rename to tests/snapshots/nanox/test_display_subaddress/00000.png diff --git a/tests/monero_client/snapshots/nanox/test_display_subaddress/00001.png b/tests/snapshots/nanox/test_display_subaddress/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_display_subaddress/00001.png rename to tests/snapshots/nanox/test_display_subaddress/00001.png diff --git a/tests/monero_client/snapshots/nanox/test_display_subaddress/00002.png b/tests/snapshots/nanox/test_display_subaddress/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_display_subaddress/00002.png rename to tests/snapshots/nanox/test_display_subaddress/00002.png diff --git a/tests/monero_client/snapshots/nanox/test_display_subaddress/00003.png b/tests/snapshots/nanox/test_display_subaddress/00003.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_display_subaddress/00003.png rename to tests/snapshots/nanox/test_display_subaddress/00003.png diff --git a/tests/monero_client/snapshots/nanox/test_display_subaddress/00004.png b/tests/snapshots/nanox/test_display_subaddress/00004.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_display_subaddress/00004.png rename to tests/snapshots/nanox/test_display_subaddress/00004.png diff --git a/tests/monero_client/snapshots/nanox/test_display_subaddress/00005.png b/tests/snapshots/nanox/test_display_subaddress/00005.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_display_subaddress/00005.png rename to tests/snapshots/nanox/test_display_subaddress/00005.png diff --git a/tests/monero_client/snapshots/nanox/test_prefix_hash_hash_init/00000.png b/tests/snapshots/nanox/test_prefix_hash_hash_init/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_prefix_hash_hash_init/00000.png rename to tests/snapshots/nanox/test_prefix_hash_hash_init/00000.png diff --git a/tests/monero_client/snapshots/nanox/test_prefix_hash_hash_init/00001.png b/tests/snapshots/nanox/test_prefix_hash_hash_init/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_prefix_hash_hash_init/00001.png rename to tests/snapshots/nanox/test_prefix_hash_hash_init/00001.png diff --git a/tests/monero_client/snapshots/nanox/test_prefix_hashhash_init/00000.png b/tests/snapshots/nanox/test_prefix_hashhash_init/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_prefix_hashhash_init/00000.png rename to tests/snapshots/nanox/test_prefix_hashhash_init/00000.png diff --git a/tests/monero_client/snapshots/nanox/test_prefix_hashhash_init/00001.png b/tests/snapshots/nanox/test_prefix_hashhash_init/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_prefix_hashhash_init/00001.png rename to tests/snapshots/nanox/test_prefix_hashhash_init/00001.png diff --git a/tests/monero_client/snapshots/nanox/test_prefix_hashhash_init/00002.png b/tests/snapshots/nanox/test_prefix_hashhash_init/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_prefix_hashhash_init/00002.png rename to tests/snapshots/nanox/test_prefix_hashhash_init/00002.png diff --git a/tests/monero_client/snapshots/nanox/test_private_view_key/00000.png b/tests/snapshots/nanox/test_private_view_key/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_private_view_key/00000.png rename to tests/snapshots/nanox/test_private_view_key/00000.png diff --git a/tests/monero_client/snapshots/nanox/test_private_view_key/00001.png b/tests/snapshots/nanox/test_private_view_key/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_private_view_key/00001.png rename to tests/snapshots/nanox/test_private_view_key/00001.png diff --git a/tests/monero_client/snapshots/nanox/test_private_view_key/00002.png b/tests/snapshots/nanox/test_private_view_key/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_private_view_key/00002.png rename to tests/snapshots/nanox/test_private_view_key/00002.png diff --git a/tests/monero_client/snapshots/nanox/test_validate_prehash_init/00000.png b/tests/snapshots/nanox/test_validate_prehash_init/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_validate_prehash_init/00000.png rename to tests/snapshots/nanox/test_validate_prehash_init/00000.png diff --git a/tests/monero_client/snapshots/nanox/test_validate_prehash_init/00001.png b/tests/snapshots/nanox/test_validate_prehash_init/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_validate_prehash_init/00001.png rename to tests/snapshots/nanox/test_validate_prehash_init/00001.png diff --git a/tests/monero_client/snapshots/nanox/test_validate_prehash_update/00000.png b/tests/snapshots/nanox/test_validate_prehash_update/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_validate_prehash_update/00000.png rename to tests/snapshots/nanox/test_validate_prehash_update/00000.png diff --git a/tests/monero_client/snapshots/nanox/test_validate_prehash_update/00001.png b/tests/snapshots/nanox/test_validate_prehash_update/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_validate_prehash_update/00001.png rename to tests/snapshots/nanox/test_validate_prehash_update/00001.png diff --git a/tests/monero_client/snapshots/nanox/test_validate_prehash_update/00002.png b/tests/snapshots/nanox/test_validate_prehash_update/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_validate_prehash_update/00002.png rename to tests/snapshots/nanox/test_validate_prehash_update/00002.png diff --git a/tests/monero_client/snapshots/nanox/test_validate_prehash_update/00003.png b/tests/snapshots/nanox/test_validate_prehash_update/00003.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_validate_prehash_update/00003.png rename to tests/snapshots/nanox/test_validate_prehash_update/00003.png diff --git a/tests/monero_client/snapshots/nanox/test_validateprehash_init/00000.png b/tests/snapshots/nanox/test_validateprehash_init/00000.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_validateprehash_init/00000.png rename to tests/snapshots/nanox/test_validateprehash_init/00000.png diff --git a/tests/monero_client/snapshots/nanox/test_validateprehash_init/00001.png b/tests/snapshots/nanox/test_validateprehash_init/00001.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_validateprehash_init/00001.png rename to tests/snapshots/nanox/test_validateprehash_init/00001.png diff --git a/tests/monero_client/snapshots/nanox/test_validateprehash_init/00002.png b/tests/snapshots/nanox/test_validateprehash_init/00002.png similarity index 100% rename from tests/monero_client/snapshots/nanox/test_validateprehash_init/00002.png rename to tests/snapshots/nanox/test_validateprehash_init/00002.png diff --git a/tests/monero_client/snapshots/stax/test_display_address/00000.png b/tests/snapshots/stax/test_display_address/00000.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_address/00000.png rename to tests/snapshots/stax/test_display_address/00000.png diff --git a/tests/monero_client/snapshots/stax/test_display_address/00001.png b/tests/snapshots/stax/test_display_address/00001.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_address/00001.png rename to tests/snapshots/stax/test_display_address/00001.png diff --git a/tests/monero_client/snapshots/stax/test_display_address/00002.png b/tests/snapshots/stax/test_display_address/00002.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_address/00002.png rename to tests/snapshots/stax/test_display_address/00002.png diff --git a/tests/monero_client/snapshots/stax/test_display_address/00003.png b/tests/snapshots/stax/test_display_address/00003.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_address/00003.png rename to tests/snapshots/stax/test_display_address/00003.png diff --git a/tests/monero_client/snapshots/stax/test_display_address/00004.png b/tests/snapshots/stax/test_display_address/00004.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_address/00004.png rename to tests/snapshots/stax/test_display_address/00004.png diff --git a/tests/monero_client/snapshots/stax/test_display_address/00005.png b/tests/snapshots/stax/test_display_address/00005.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_address/00005.png rename to tests/snapshots/stax/test_display_address/00005.png diff --git a/tests/monero_client/snapshots/stax/test_display_address/00006.png b/tests/snapshots/stax/test_display_address/00006.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_address/00006.png rename to tests/snapshots/stax/test_display_address/00006.png diff --git a/tests/monero_client/snapshots/stax/test_display_subaddress/00000.png b/tests/snapshots/stax/test_display_subaddress/00000.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_subaddress/00000.png rename to tests/snapshots/stax/test_display_subaddress/00000.png diff --git a/tests/monero_client/snapshots/stax/test_display_subaddress/00001.png b/tests/snapshots/stax/test_display_subaddress/00001.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_subaddress/00001.png rename to tests/snapshots/stax/test_display_subaddress/00001.png diff --git a/tests/monero_client/snapshots/stax/test_display_subaddress/00002.png b/tests/snapshots/stax/test_display_subaddress/00002.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_subaddress/00002.png rename to tests/snapshots/stax/test_display_subaddress/00002.png diff --git a/tests/monero_client/snapshots/stax/test_display_subaddress/00003.png b/tests/snapshots/stax/test_display_subaddress/00003.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_subaddress/00003.png rename to tests/snapshots/stax/test_display_subaddress/00003.png diff --git a/tests/monero_client/snapshots/stax/test_display_subaddress/00004.png b/tests/snapshots/stax/test_display_subaddress/00004.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_subaddress/00004.png rename to tests/snapshots/stax/test_display_subaddress/00004.png diff --git a/tests/monero_client/snapshots/stax/test_display_subaddress/00005.png b/tests/snapshots/stax/test_display_subaddress/00005.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_subaddress/00005.png rename to tests/snapshots/stax/test_display_subaddress/00005.png diff --git a/tests/monero_client/snapshots/stax/test_display_subaddress/00006.png b/tests/snapshots/stax/test_display_subaddress/00006.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_display_subaddress/00006.png rename to tests/snapshots/stax/test_display_subaddress/00006.png diff --git a/tests/monero_client/snapshots/stax/test_prefix_hash_hash_init/00000.png b/tests/snapshots/stax/test_prefix_hash_hash_init/00000.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_prefix_hash_hash_init/00000.png rename to tests/snapshots/stax/test_prefix_hash_hash_init/00000.png diff --git a/tests/monero_client/snapshots/stax/test_private_view_key/00000.png b/tests/snapshots/stax/test_private_view_key/00000.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_private_view_key/00000.png rename to tests/snapshots/stax/test_private_view_key/00000.png diff --git a/tests/monero_client/snapshots/stax/test_private_view_key/00001.png b/tests/snapshots/stax/test_private_view_key/00001.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_private_view_key/00001.png rename to tests/snapshots/stax/test_private_view_key/00001.png diff --git a/tests/monero_client/snapshots/stax/test_validate_prehash_update/00000.png b/tests/snapshots/stax/test_validate_prehash_update/00000.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_validate_prehash_update/00000.png rename to tests/snapshots/stax/test_validate_prehash_update/00000.png diff --git a/tests/monero_client/snapshots/stax/test_validate_prehash_update/00001.png b/tests/snapshots/stax/test_validate_prehash_update/00001.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_validate_prehash_update/00001.png rename to tests/snapshots/stax/test_validate_prehash_update/00001.png diff --git a/tests/monero_client/snapshots/stax/test_validate_prehash_update/00002.png b/tests/snapshots/stax/test_validate_prehash_update/00002.png similarity index 100% rename from tests/monero_client/snapshots/stax/test_validate_prehash_update/00002.png rename to tests/snapshots/stax/test_validate_prehash_update/00002.png From e50e68cc43940f6c712e4c299fb45f315722bf31 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Wed, 10 Jan 2024 14:28:59 +0100 Subject: [PATCH 124/142] ledger_app.toml: add manifest --- .github/workflows/build_and_functional_tests.yml | 1 - ledger_app.toml | 7 +++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 ledger_app.toml diff --git a/.github/workflows/build_and_functional_tests.yml b/.github/workflows/build_and_functional_tests.yml index 051edb4..946c039 100644 --- a/.github/workflows/build_and_functional_tests.yml +++ b/.github/workflows/build_and_functional_tests.yml @@ -31,4 +31,3 @@ jobs: uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_ragger_tests.yml@v1 with: download_app_binaries_artifact: "compiled_app_binaries" - test_dir: tests diff --git a/ledger_app.toml b/ledger_app.toml new file mode 100644 index 0000000..c264aa9 --- /dev/null +++ b/ledger_app.toml @@ -0,0 +1,7 @@ +[app] +build_directory = "./" +sdk = "C" +devices = ["nanos", "nanox", "nanos+", "stax"] + +[tests] +pytest_directory = "./tests/" From 0a45f65dcdc6c1fb6ed986fbbc170252eef5841b Mon Sep 17 00:00:00 2001 From: Ledger App Tester Bot Date: Wed, 10 Jan 2024 15:12:46 +0000 Subject: [PATCH 125/142] [auto] Update screenshot --- .../nanosp/test_display_address/00001.png | Bin 317 -> 323 bytes .../nanosp/test_display_address/00002.png | Bin 1001 -> 1005 bytes .../nanosp/test_display_address/00003.png | Bin 891 -> 881 bytes .../nanosp/test_display_subaddress/00001.png | Bin 329 -> 331 bytes .../nanosp/test_display_subaddress/00002.png | Bin 1002 -> 1010 bytes .../nanosp/test_display_subaddress/00003.png | Bin 912 -> 909 bytes .../test_validate_prehash_update/00001.png | Bin 1030 -> 1031 bytes .../test_validate_prehash_update/00002.png | Bin 947 -> 939 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/nanosp/test_display_address/00001.png b/tests/snapshots/nanosp/test_display_address/00001.png index 688401ee5d0981a26360f2fcfb8acb1958d76e0d..a074d01aa8c11ee51e345f57be52a8cd28863d61 100644 GIT binary patch delta 296 zcmV+@0oVS$0>c83B!3D?L_t(|obA|Aj)Nc&0MMq{n{fXlahLrtYYc*JY!!yQ_thfC zVJJ}N^#T9@000000Opl*&N&~q6j#6dxQ^bv1Gplkbot(#b4n?tG{_wM^bX+MHd9OL zmn0Tft1a7}G%YDx6IXmKx>Y~48e7jg?e>^pD_}kYO~AS@?|(Oqb?502*3Cj5!ZRsX zz?i32>$kuCGgA$FKb(Vg_JEW0Mp@%g;;d>0A81s8LanOAA7x1SPwzlJ6?hINFvBhs z*GZDi!L353_l}_FI7p%zsvI;#DWa%%7VlQ;%geqjTHLN6deL!F^Z&Kahy_u#pw3J{ uXC|PtAr9eBgdr=40ssI200000&-evhMAO``DA29|0000?O%76PO#xgQxC9)pE(}+9Z zo=4WfZ-4t|rWyHuMF(5$YMt~Z+T)2r4PHi`Ye~7H4I05GT2K8mI*_;Iu0eK_JcW|# zBv}nEl`_3o1U02=@R008)!Uz@(u+(p%zsQ>@~07*qoM6N<$f*}+VH zficYaLt@&!MeM4Ar`hw@P`TEZ~&rGhZkJLbPR4RisORN9S?@-0Jz798_8QQ zc?YZaP?DDc~XbXC)Zm)q~S^c&_9c_`i)iAH0wBB8)Nmyb88&1(b zT{4lR>5%>*x^zhD#ta+knvD9rh`AiK$nZAU)vi&u`C9BBml`^^cEo85{&1zRenz2^ zWn5KY=0!SyN4n_j0JeuF;Ci#D|NKduko+ayOn;+x7qRP?aV{?6=t+w^AnC7lB!3Yj ziMbTbiD@|P&$ER(9ld7Y~O^UT_+i>eac z$hGq59q{#-I38B-fG2bRBQEfdaI#P+6fPh(v~h%}`_|U%a?EJKCk0(D)AiHd9P&wb zYJWUHL$K5PWBy7Lz~B0%b{e0M>lrm0H5xUdk)J zv9jVWW`3B3x0O4<`VDvmH#g@(a=>4jx;?Eu>s-DM+vQIlHUQm}kKW2x-7`HB+=O*n z=@y)(hS&gr-9#qETiC}BUWhI#dD#HdX;5rv7CZPZCZdJEly%pn^Ye6E2$5d8OtSJd zvW2O~9p8wC#H9n@k%F!L$EVp26dU?7DgcE-p-?EigunXQe~DF+@Uj2^002ovPDHLk FV1f;r?41Ar delta 979 zcmV;^11$XQ2k8fpB!93;L_t(|ob6gsw%s5Iv_0L4`(IM_(vN%Up#lR6CcP>1^4xk6_^l(Zp&)GU;v`&!=n05!m7J!m;4#D;EXqNYt`<+c^>IYTL1ZLX=-2!O|}i8lsf?e7gM5)~h9 zRG9Axe#>o2RGbj!;+OKDhgb{+fS>8ZDqp6_C!81C*ncPk)E{u5^RR6f9&Q?FSU!TB z`Q<6FV6G-i1HXi6Cvhbk^fk{*(JmHP4uIC`_$LOj9fN^*Qk$(2m)FGR0Eowk7{;O0 zSp#@EiPTIFc>U0v;RQU)H@t?bbS`)mJz?brqIkzq^2tY0uEvP!ZC>Oy|L*If2 zVo(@(;C~b<3>b@CF*pjoyeb55(oz~6eS_WnTwTCHI zw!0=LZ@Q#^l`-|t`XGmj7_6C?SsHn{YS%;EV24ek;{7Xlh1|T;iH)QAx0r(Ud@ z5j!7d;cX=faK8bmAm-*?NILw|RJ_pgvrZ)YuwDPj;|+kB^4cgJGS75v;vvL2r7>}v z7xD%G>?UVYJcXnDVABf~EjGY(8XKBI4NN|cjcDPY$;>q|evrY9kkd<%MxK1tY+>Fp z81FcwegpMUgTk&fBWnNv002ovPDHLkV1jsJ B*r)&i diff --git a/tests/snapshots/nanosp/test_display_address/00003.png b/tests/snapshots/nanosp/test_display_address/00003.png index 74a8cafbc8de0148c512665ca51d412b028d5641..c4ba4822fb25fea63e9fa15777220d75198acb19 100644 GIT binary patch delta 858 zcmV-g1Eu`?2Jr@vB!4(bL_t(|ob8)ia-=W}MM)|=<~RqVT>ejE=8SVLu9Q$9>;7DZH_q z*Qt1&pLB}`;tPnGxbM5x3V4Z#_7nJcI{71jG$n8MLPY#Aa~6Pnn$DJd`(8m34!Ef^yP@@v!!@`BvB zXifWD#2Eo%QqKXJvadw4m{S+7$^8^Ct_Lq`6ZwAYg?|hVkv5T@5LKO!7jZEcWu-*k zv;$s3NS)2<3EBbf9*ZN^5jSV+)vllLRZhGo0D~cqjOEuX6f)&ZQ*&FuX*(5@`yBSd zTk7k3{Gr9}8z3X{cMAH?TVGuBtKCsA?=vAh9<`~v4{pF|!~D~^Eb-I3n`6FXEfdJ*vwgC8U9uXk+q2JtKJ3xh$5xYZK0AVfTH zEs#?_DHoRz`@%~MGAo6}Szc@h*Q3(`NJ42}oPXI*RbV8ts0gKdpLi1va_0=@=lVb~sRK*@I9Q6Zm|m0NHtxkAbRh&4FnH)5Zg`%Tj{O+M}g zESLN?cILd$N)She!P|KKXDQ_P3hLFo4sJmUBl<`RukU~f78|Qt;0*EB9Z)nO;8NNR zyi-L7j2}5^QX+nngUbUX1~lAMo^ujDW&MiErF>)u7^9)pPzb&Z+ILbTXH8_nF+R6) k71^d~nx<)*rg<{|0I#OIuKB_exBvhE07*qoM6N<$f*y63TL1t6 delta 868 zcmV-q1DpKu2Kxq(B!5ClL_t(|ob8-ja-=W}MLntPg#9mxz060aD36|3wnVxaov*|g zN!Y@VYmzaVrfHg{X`1FSoacF-Cw|GOpA`@BWyiql6ovOyVRU|s3j0xbJ08a|r10i) zUZ>)5zSAulhz}rU;&B{WE8ry}+9mMzbn@Q-(xBvRAkQWi4u2(Q#fB#L@)FHO6z!$i zr0NYI;exrpW?^nzu(?UKP;%r_G6#%;N%fc*UZdNtk-%=7y^=fNihCXkUSm41j3k#m zn!DoDi0^615zSsnx<)* zADm^Vv2cto$bWFLW!_BSmXZDNyd!bFXaSRL4Y#B1dsYyYvMf_O)yOSefU?DpkQXjY zB^r-uL9_eN-pa7HRxR|FENBm#DI9%?EkopJLK8cOk^*y~VTx4Kf-zzsSEF8#2js>@ zYue8u&Kn>m^%|fl`$!~n4iA>VI3kbl9sB%15j0rXt7L5UY}G8bi~ zMBcOmeua=ao7EGv1Kc$hN30_*&i1Qam+)DRqvM1YEXLF}SZ` zPrRkRzUB)pcHaPbBY%dV|Gf3ZIltN+_3}Og!sAh!y8GY;oJQ_GD1|q#e<*KAF;Ven zOp}c}>wjqCjO$voELziI;4VT^Rn>H&i7m#@h&7}F7iu)=1}rhkqho;WZdVHu35h4< z7CY${T-e@SJ0!w6w|LAIsf~8P!a7xqTSM$2-hcLIJhqI3_>~uk@i=kPv>-%6K#Y*> zJ}DQc5c}jyj5Bd)7H1>8OP~%wvPt{y46&b%k$=ddG*l4)STp(C(4EK2-HqSV(EAk1 z(XM9cij=$pJ_l%#*dAR#`SyMJh^!jdg#%bAIPv6)Xs= z1zq9n>S!sv(GWEL{n|;CMMvZ$2R{r51)0kOcfv1OzoK#lpWOk*+t6yLfFUJbh3=Wu uT>m^zWWX`LyK)uTrfHg{X_}^aAb$bK>!%!|wrK1C0000)j{#=y2ykras#Ux0C$0PUt+X%h9^)KErRDQOLj?sVDkOjS#UxcW&jk2EVG!XFlo_hM6||Us>(4Ff8=Z`Ae#?73@W!j|?RaaI6l9o2z2X zw%u#yJ?kd9WaX2qLbHnm7l|akn)@s#lu!TmrWKWc5*$q)cwW9)7x=m2?dR2A=@TR! vbWcb!Kj>jB5YtQ&-uKAGQ3T;NhCj{xq5ICc>I5^|gG4=D{an^LB{Ts57FdJ| delta 302 zcmX@jbdqU;O1*%mi(^Q|oVPau`I-!P8WNNCc)qV+a_=bnqfJvbDt6>P|8M)!$SG5{ zI97}S0Sxp*L$Cfj@om!kdlye1wr-g0^5o0bRa#0)LJQga-!mM0WioZodQTJKS;}91 zwygcB6=@uQ*5q@g#g6jb54YU+*v9lscm>1LrF&}Ylh-H*hbg^Qv*F#%l#~}a_kP{q z^ktGizja!9zs+m@q89bI)5)|<`TSRpor_GR4ysql)qduCGU<-#iM&bM1A>}Wf}5k4 z`n;EQ^xx2}vh8|yk>DcH#9wotC4}cf(kYwlmPx%cDGinEd_tQWY8 t+!*HsGNdb-Jyh5BD{*E-c+QpbFPp1Cg_1gJzf1=);T3K0RVEegg^iQ diff --git a/tests/snapshots/nanosp/test_display_subaddress/00002.png b/tests/snapshots/nanosp/test_display_subaddress/00002.png index 2801466ceb0093560747e51129d3659c82dcf808..d7e397564b3383c0d02954da263403935593375d 100644 GIT binary patch delta 988 zcmV<210($E2l5AyB!9U{L_t(|ob6m&a^xTk^lt464xRwzF}e5GG{}HP83mZy8M!!^fb`8`ce>2YYhPy>eeBhhe+6~d>HgT#7k{7NTRGW*rTf0nDDY^or3AY50Cgk9g@8^%gev@&!P5FH6Cm_p{ zLZMJ76bLi{HGeoY%hrxjf6Kq?UXs8uTwjv)-Wb8Jz&;_1Lwq$*8Bw%Sf%P@TMZg|B+zxy~S7` zgm<}O9Zt-tg^%exQn_=sa;)MyFMU1fI-g8{uYYInpLX{dsBZQFbHq^L436AF1rmcG zR}PNChJW`DBh8m(s_$nQ67;lGR%WCy7Q38DMDdgfmpHq;+kbqhhmjfDvJS5$a*%+v4KlT}q7#Fs zN37h?v96!@XZB!C0ezad^X}#;Fb2C-M24Z<6?KeHKsO(aMCj*WIEATGhe}*Ss%l`I zCl@%3%#nmuo0g7KUq=^6R00ZxLgDuUv7s(V+RrxP(XUcH6za zI(!090wO+dmQ2P>oP?Vd*9xgk`K+cakbqc#47$Y1mvKk;6myK^y-%iu*#ykRB58({ zI3#?UsIEoQv#FEeLZ)g#iJB6fb$e(QTvY|g`8KrwEIqzgKiT}rU!T$Sg zDlsG@3%p7pLG6iY@E=r=B?gP)K^ZJWsmQoDqY_Xk6bgmHoA4h}DW*b*mlUS}0000< KMNUMnLSTY?N$P$8 delta 980 zcmV;_11tRU2kHlqB!96nEPs4+bYy(Nnx2K%GsX z^s_(f1b@;s`cT)PRzvUI+6a7P&j)92I<8cJm2PxH*;Bb@nSXk{cXgxLTsgu_NC5=W zbP6t30P`5k{XGqIL#>E9SjvoC+@H zGJYOR9C1P8dw)BOb~l`eXl4Sd4UwNQNQby;@x|tbv*G|aTBr>ww(WGN+4l#TA`4FK znPn$G2N_R(h~)|hE7w{o)v)dQ$=pP3GX_)@eM-fA6MsPf)C6fj7(j*Zh1{U+)ZSjy z>F)z_>(SQ?9)|MA(27bOra;yT0}p`jH*&a#GE9KE=+D}FyM()7`IZ7|JxGhagJt_Z zcaB80$v1b{P=ZN+BD)c1Azkfb0nn9i=l)ek9|r4YZ`%Tf3U`oy3Keh!n_Mxt3c0<% z5NZ5Q#($cAgieun(C}7@Tw9xQ=aXFv9g(i8wpM*UZ9nm{0GUY8ibG}~Ivs_+pO%0# zYjtT8Yn`y44oJ(oF@<@5*e6Q)OPzef5_g%3P`4~(E9D}?1ylCX(JbZhdc_$F)!bB~ zjtrZEr8uIaRj8{{S>h!VDr?rX(>&CJ$b`0}!+(2$Tw_B)EM=BeG5&P*X=o8iNhf=J z<$LhHnt1Z=#`!M4w?-_?ItZsA_ta2{YKYw$5a+=KhC6d5VAZCj zZId&tY$})O~>8DZ*PnmH&F6g;v|Wxir557PufawLw1F zC*!2|D(%Ib!I_^%w!>PT1%z6chZuhBY<@HDURohFM9+ONBuEAz2MeVcQZ^yyUlp*E z5p)i(3>6*!#+hqKLJ$D!KsbNJ;ei1eS;wUm z5>!^qYsBB8%xo(vG{nXh6&d$tQ~(NvLZMK26aE5*mZan;B)}U00000(w3j}(@u*yWz($Uo@;!7C zSptM4Y;f9IQ4~c{6h%>d488Z>yZ;jCpJflxg>B${CYkp&L+Ch-8Sh!YTZ;%6W3} zSM{6x)r{e5$xZcx7J!@16Zbqq1deNh2zukpekya(P7Ig~#kD9ihad*At9_ld|M_qp?V9IC5p4Q{}2a;?Es zxO?rF@_#%c6DcI3X{j<7E54U+kw-&N8UhA@QUs99FKJ2sxw**j6v<4Ew44R2&_qSY zdW2{-xRBX?U3jcf4NZJ7?Jth6X8*>PlL#T5Jpy+?g2s=6_92DjU&eK%G{}#w36E@A z$nrcxFPr6DS^(z*``9@h(X*a_?yP^9mAH#bdw=Pti6OZSs&AH>XCeFFs`afbj*sOKWZ2aV{JeQ&$Xw9mp zdT&06(!`c^)?ls2(9?jey^gO%-tZWT(dwxf?e)vDMbLxg7Qll)7d79Py`ASRfc92E z>`B&O9lswebPt$OPhG#Z@w^ithLHth%crsUM*d_fbt;OYD2ieN-+taaSfZcsaR2}S M07*qoM6N<$f(a437ytkO delta 889 zcmV-<1BU#K2apGlB!5>)L_t(|ob8)iax5VThE3}1r1!rh_mYP`(`5laprUamd=IIK zt$;TadZv^lNs=T#XR`zi^2PVh6;PcwHA71%HVMdgN>#PW%oa14?!S>6=(sz<-(*2b#3yB}hdtXwyux zY6lQ=oojzgLOZz5;U?9(7Dp^g&VaJuP`w(8HR!r(k73(Ruiy!I>~3Ab?bCT>&*IX( zx#@rWl7}svHDpn!oUA9ST1 zk+7bY5o@BS`XHhOUO-Uou?LMKTDcyvCZ4EGOU6AGgol5+z&kp9;!iWBp+h8yqUtLF zPW~c$_*`;poxlm;M)Ros(MK#M#u0(UP_fT{huL(rxqnZU)J@lL6MwpSw#1atCeYbZ zu*Wnjh}D#{4mIrkS2@N!eev{5m&~C%pmk?=iSiDwedPBcT=G)?!(BEh+_|WYZqA?k zfpYvpqRid{vG%)t@CVPp{g55`-vvdDe&E{g@@DUa>~i0YRfO7=xU1uoOPL z_Dgy0k$;I4;?YpFEJ_w%&6l35A(zkZmtq~1iclo;M<~u8>x-<3NHl{Z6tI|DkhI>m z9w8_P*K4^`m(tM4h6Y|t>x;I;Y*N^aayd?Eq>d7xiCeSFazDXeO{^d<$oH%V?%a^e z@?4|O40NU@z<*&cp{s^V7GDyW4&9Ri@ucBqrhj(otBGA&uNN~Kkz{j2hz^HyH*{7; zy1EGaZm9ASV*~AwA-!f+PDG!Q`95~Lpsv*+wnDCelsumw58zj==u&JOTR=pY-j}mL zYihXdHUf=Y_4|Nf#&+15c>1#SH)0RES?BKA{+)MnUy>wAj)0_D^fZ}L2gz((iFu@? z<8s>{&djBrtvhE9j=P4Ap)Bol##-ceuAvB&Of^C8Ue3&bwwyHqPW*wW`LgWSdA|uj zuLQ)JWDd?5_lHx?fJMpF^Aj8Iw*y2sa-eVdG!9?LpG<~MNs=T;yk{h4!7et z25(55=P586=vgom_h{_ido`=)^6`VFRt8fEs8G)$;}}M4F=&Z1V5my-ZLD^dqSBqitMj09 zP?EBBwe%&ZDW8UAXVqh`oS%zCPtukkklD>0a?_0z)25OX&G7-~=McGi_I6qILr>Xl zYQ^gel$g5(V}HU6(`y;RB+V5JkkxRhhEK=-0AzVmC=?2XPl3yZ0tP1Qu%+*1v0JN2 z)R@ZU4eADva1A#U;~&skk5ub1?I#eXG!}#vt`Q-*kVJ|=PZECrk7b=uw)5)bNzJ1on?J4&<+j#?t~^YoVO+@>3MlC@!5lNq4*qG^gf`Vjj^ zZh9u+$_zQ!V01*oQm!{1le;B%-Auefv3m&YC5+T&e~mx#i`WwQ^X1h_cJZ1sV29Uy z&3}jrg+k#XEU=*u;2YqS^3)WH(D~?dYFfFr(MFCdI9z2J(BI7avi++*k)4% z8`6KL{!GKsSh$G2#MNUPn9;l+3rmpR>uP#6c{Rm|09E8f_LiE{`J$~^WKPy#Fqx4E zQW1e4!aNaP)zYt2J2;5%P=Rd!pAlr)(6__6$Y_%A67o80+O>GoY5++7L8kC$LEdW$ fg+ifFcpH2J8&J4i+`Uy{00000NkvXXu0mjf+6wO2 delta 1008 zcmVr1!rh_L2`*C|S>opdX2KKBlHI z2uVEq+G(vQilQirq9`usU!qO#ojxANvEsqY+U-Vq@3grzNJ~ZrMg`U!=PT=QJC1{S z1JZk^O@^K8jZkaOBkiRbBjL32`JZUxz>*?M#^VTs#Y5|;7Jq1oYNXjSRF?Z8IC1SF zzXBv93u@wCg~NMm&dRlX{LsYCpc-*zsMRClm``pqXd71mo0aOPxw$hHm8_iJotaH$ zWXsXjwr@dA_{6rIS&yyhd@mb4*|r5anO!^~7v0#>wQ6LG<@^AQdkEb(DKtR}4% z_F`3bjHsst(tm{&rd7hi1iLE~z}axBg->UF0Css&6h%>d3Z@$BC@{M&Tk^du_tvTk zHL7v?7A8<|#No!OPK7jFQpY%*PQL};Z(tvTi87z6pQ-+vHX`0A#yj?~E|rW8R%U{;7| zyt6JY+8Kh!(zYuavS1U04(wM$Z$VvH;3{eFE1Q;Fz>*reea$-1Y+9L>6BeAp)>^+H zI=%wrHZ6}+T7edVXDma_=1CJ!y|A|TD3~*&L>=AGvUI@9%m*q;Q+LzZYIAKrF#9b# z08=%gwtt_Q{TH2ZWv4(=j#|AZsv$a3 z=zM5o&l}S0oy^e={W?}hp##2J>3@W%p`nv$&j-^|gfoRNcyA0>WKIr}K_NPt+PsNH z>{|#1K<*5x&b*%esl85}_)?`%y_NQ@pd1GnpnnFe5)1&S9^9$i?w~2Lunz8fe>D!%KapOv*wk>SJ-U^ThQJ7*&JM^6cPdrs^ zMTXozU}R8iEAP=CcXS~Phc0d436tGoYE)($uGE+Ok#EGN!0(r58(HF+D_~L7d}dHZ zQGXOC0sWd?q98=(0wzirM{HP7@1p!G5B`-xJ zzId{l;HIX&s7iAHze9D}j{hSK;{kYx$ef^0ikb*kHlDMmoz5?v4Hi4UkSYE+;Hynh e6h%?|4!!}=Qn+25J^{)A0000hi=hxI2 zL`9-+($=ja3K41cV{T7V_2ktTCPP)28E5}kZ zyQGvyLYU+f)QCeU?ReeQGx8=Z4P`l#mV)%GnwT`bZiJhrkz{GkOMC*xJ_KguQ4XUX z)r8fitw@y>BY*7E!qUWW7O>M3W+<5T^6F80;)r^0M8I9;b92*c(zTYZJh}YJXsDNj1^c_7<&KWK1>G+K>x~*(s zzu<)z=6}TWrTtj=o*w9Y2kdU^7?uMd+vV5HL2)Avbtn@m>GD;IIh}BYb{Vx&pl7FQCemA0A8vei|cT9^7AEAxuXfgrz zq$a)0qBov-&Myu(wL|NqoLlq14TaGDZ(T8q7=6pt3-(UHIxu^nB%@rC?6hY{&=Bi0 zU;w2IOJ}5Q+}43Gwu1JQ^sdKFTTv86Q540y6Zud19Y|6rTP}&O>ur7db~8~`wYLHb z&wroKw@VTC5A-J5dzz!rBNDqTB>CRRnPcNFlyH{f*S-Q85v5tPmPTQrOXW`C=~~bx z=yEh_O6k1o1cded8|h`_dERvbSXQ*NSLx&%Cm``j3rpJXsGlZ{sSoJ(VQ}65KSeAs rANbnmjmg^b7w4!6D2k#ep365p)a`IJpbn(K00000NkvXXu0mjf$1%!e delta 925 zcmV;O17iHE2eSu|B!7BIL_t(|ob8)klH?!=fZeUVN$!6n@3If6wHW>cBxJUS@2T4u zKt&>?dyJ-Onx<)*rYYxF;GQ`r{CZv2i3PW`*M-bE*X?V7NFdZg`#=eHen$-+*L5LN zjLbRVElW)Yj4}R1?3F>2LR;3?H3l>o*nfwW09#lgLv~NewIR|a zYDNn29Y9&Lz)sxVxJ;LPmTu(hAA^J%R*2%BlE#rSr?GgDwgZq?vR7k+bPb7ij)i7+ zODT_pFv%fk5Q9+I@tUhgJxzFh*}E5b|?LS%4Hvnx<)*pTedZ%BD`Ja0tsd ztc3f6az0bat9o%sZ&Y;As?oY}RgI7tQln*1@w2H?S3pjtmtOH0PG6~)_+Q=C%USKtVE-duy`%_!7tCb`$(QRwuVej5r)p0Hi7`LKmUHUpv+ zO0PQ05WF_Cwoy@1PWMQ@8LkEDB~M*o?xwVqKWU3%Bs(Wl_&Ei|lnGnPysm?do{t#k z2z^#AZB?WPUc2MFYe9N;$JPQ9K`%_^*Y_mKrGI4)Ouu7w*~D~u1Qx)WRm(57=#4c` z{=?~}a%i8xlH~t3RELiL(H(P$(YBMVP`v=>!03U3jB-hmGu|#o$DaX<%l5|yDnTmN zKY>vTI#bfS-dVP97#u!^%zwx<0X8A1eZOg%=7Wj+Q(niLYO)gGS1B7}Gh3H-MbW#- z!G951&+Wu|s!;`OEIWNXk_od}4{Y4#J1$Ui#O?{HYHy?_Tg*YJkB9rvuT+RG)1nbJ zx{BK;{C~BeTYAzIweLH?{_# zdzZ9x<3EjnZ+1~DnUo`cQ%5gA(=<) Date: Wed, 21 Feb 2024 13:43:16 +0000 Subject: [PATCH 126/142] [auto] Update screenshot --- .../stax/test_display_address/00005.png | Bin 4615 -> 5035 bytes .../stax/test_display_subaddress/00005.png | Bin 4615 -> 5035 bytes .../stax/test_private_view_key/00001.png | Bin 4982 -> 5589 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/stax/test_display_address/00005.png b/tests/snapshots/stax/test_display_address/00005.png index f59899e9aa967b23177d83aef0c8c2c9041eab91..13499fcc9366bb214269b05db05ce8ae4380ce24 100644 GIT binary patch delta 3143 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 diff --git a/tests/snapshots/stax/test_display_subaddress/00005.png b/tests/snapshots/stax/test_display_subaddress/00005.png index f59899e9aa967b23177d83aef0c8c2c9041eab91..13499fcc9366bb214269b05db05ce8ae4380ce24 100644 GIT binary patch delta 3143 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 diff --git a/tests/snapshots/stax/test_private_view_key/00001.png b/tests/snapshots/stax/test_private_view_key/00001.png index ebc5b36b084d1767697c5de3dd7acc951bc40f34..b802c1ccb172dab76feaae9c2c6d535f1caf83a8 100644 GIT binary patch delta 3707 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 E|8fI~Z2$lO From f853cc309106d3b577903263fc1a2c3e91e367dd Mon Sep 17 00:00:00 2001 From: Xavier Chapron Date: Tue, 27 Feb 2024 14:34:47 +0100 Subject: [PATCH 127/142] tests: snapshots: Remove unused snapshots --- .../nanos/test_prefix_hash_hash_init/00002.png | Bin 340 -> 0 bytes .../nanos/test_prefix_hashhash_init/00000.png | Bin 411 -> 0 bytes .../nanos/test_prefix_hashhash_init/00001.png | Bin 367 -> 0 bytes .../nanos/test_prefix_hashhash_init/00002.png | Bin 359 -> 0 bytes .../nanos/test_prefix_hashhash_init/00003.png | Bin 318 -> 0 bytes .../nanos/test_validate_prehash_init/00002.png | Bin 340 -> 0 bytes .../nanos/test_validateprehash_init/00000.png | Bin 276 -> 0 bytes .../nanos/test_validateprehash_init/00001.png | Bin 326 -> 0 bytes .../nanos/test_validateprehash_init/00002.png | Bin 319 -> 0 bytes .../nanos/test_validateprehash_init/00003.png | Bin 318 -> 0 bytes .../nanosp/test_prefix_hashhash_init/00000.png | Bin 413 -> 0 bytes .../nanosp/test_prefix_hashhash_init/00001.png | Bin 347 -> 0 bytes .../nanosp/test_prefix_hashhash_init/00002.png | Bin 307 -> 0 bytes .../nanosp/test_validateprehash_init/00000.png | Bin 282 -> 0 bytes .../nanosp/test_validateprehash_init/00001.png | Bin 347 -> 0 bytes .../nanosp/test_validateprehash_init/00002.png | Bin 307 -> 0 bytes .../nanox/test_prefix_hashhash_init/00000.png | Bin 413 -> 0 bytes .../nanox/test_prefix_hashhash_init/00001.png | Bin 347 -> 0 bytes .../nanox/test_prefix_hashhash_init/00002.png | Bin 307 -> 0 bytes .../nanox/test_validateprehash_init/00000.png | Bin 282 -> 0 bytes .../nanox/test_validateprehash_init/00001.png | Bin 347 -> 0 bytes .../nanox/test_validateprehash_init/00002.png | Bin 307 -> 0 bytes 22 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/snapshots/nanos/test_prefix_hash_hash_init/00002.png delete mode 100644 tests/snapshots/nanos/test_prefix_hashhash_init/00000.png delete mode 100644 tests/snapshots/nanos/test_prefix_hashhash_init/00001.png delete mode 100644 tests/snapshots/nanos/test_prefix_hashhash_init/00002.png delete mode 100644 tests/snapshots/nanos/test_prefix_hashhash_init/00003.png delete mode 100644 tests/snapshots/nanos/test_validate_prehash_init/00002.png delete mode 100644 tests/snapshots/nanos/test_validateprehash_init/00000.png delete mode 100644 tests/snapshots/nanos/test_validateprehash_init/00001.png delete mode 100644 tests/snapshots/nanos/test_validateprehash_init/00002.png delete mode 100644 tests/snapshots/nanos/test_validateprehash_init/00003.png delete mode 100644 tests/snapshots/nanosp/test_prefix_hashhash_init/00000.png delete mode 100644 tests/snapshots/nanosp/test_prefix_hashhash_init/00001.png delete mode 100644 tests/snapshots/nanosp/test_prefix_hashhash_init/00002.png delete mode 100644 tests/snapshots/nanosp/test_validateprehash_init/00000.png delete mode 100644 tests/snapshots/nanosp/test_validateprehash_init/00001.png delete mode 100644 tests/snapshots/nanosp/test_validateprehash_init/00002.png delete mode 100644 tests/snapshots/nanox/test_prefix_hashhash_init/00000.png delete mode 100644 tests/snapshots/nanox/test_prefix_hashhash_init/00001.png delete mode 100644 tests/snapshots/nanox/test_prefix_hashhash_init/00002.png delete mode 100644 tests/snapshots/nanox/test_validateprehash_init/00000.png delete mode 100644 tests/snapshots/nanox/test_validateprehash_init/00001.png delete mode 100644 tests/snapshots/nanox/test_validateprehash_init/00002.png diff --git a/tests/snapshots/nanos/test_prefix_hash_hash_init/00002.png b/tests/snapshots/nanos/test_prefix_hash_hash_init/00002.png deleted file mode 100644 index 9c7e7049cb3e9bcfb1601ec510ee465d38229d4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmV-a0jvIrP)b=%MgRq*37h4eRxPbkJCLY|1VIo49_}P}TKpH4$L<8?X{t;p zy+UQc_4@p%0?~E_&igM#?#L~IOHR(-<@sYotiy&C*Y&GII0yeh-p3zW9cv$Q0k>6Y_)5~SfP=m zSMUtz)%Ex|-o}7!H9hbQ(8{%C?kQVa?C`*Uj-J(h>P7(Y#?ZWvi?6}@n{fGLp>YTp myqR(V_$?>^<%seR_VWh!;mP%U%q3x9j006*S8PaB+C)qNLYvV9p8uL{5 zi!)y4n>F$J%;Nd;9Fav{091H9=4qD`TgGfb;yI*7uI%FUN=k)K zcbTLb@T4iU4kqQ{azY~nxooh6rw%@K+I*! z&oQ84m*w=zTMPgIAcX(6WZ+J?$Km}P7Qe&$nP}dRR6|uMh78q3G>UsY96?oh9I>cU zSvr)PE)#YRP^B0$a!{3~t)r78`-tiIAmu%%L37kZD_9J$@YS^zl6)1Qy32cgV$4@0KNoWkq}`O zDEy_KJtr3e=SeJY>kjIz{qevdaj#rDu4kU zkok*u25<>#F|@lBsA`TX?^K8aIv~A&`BDwn>9RVfIQI}j2qA?0iXAN=v4&-Zg@phB N002ovPDHLkV1f?qpM?Mb diff --git a/tests/snapshots/nanos/test_prefix_hashhash_init/00002.png b/tests/snapshots/nanos/test_prefix_hashhash_init/00002.png deleted file mode 100644 index cb243a75c4306623dcb8d4166d7272ca120f0921..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359 zcmV-t0hs=YP)UO00I+b;`fN^S($jnf6D1U(fm z0r0El))e)bgB+~x%)w}SS|0LilCGhy>u}N}I1mnCOC)u|t}XM(TRD;yvFW^OH%+`| zN*bASyRBAK-c|ta1JsA84GGoD?RcfpMcb&@?;8lx4(Md}r_Hh3L{b5~U;>m|oEg9+ zsKu`Cu3Z{Lwd&XqE|>r@lC|u%;Fc9cvF{;-5JCtU#Ru!koy?n%;_(0g002ovPDHLk FV1lM(n?V2o diff --git a/tests/snapshots/nanos/test_prefix_hashhash_init/00003.png b/tests/snapshots/nanos/test_prefix_hashhash_init/00003.png deleted file mode 100644 index 0830ee530a3e5800f570f39868689fed06cf3bdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmV-E0m1%>P)8w$TZu1OWI~Q{#B+vJXEuj$fX`wL_cy zg^pGe|90#0%}?Hp$Rw{nwmz?S!&rybB~9~g;>bDpnWfunTI9VPI^4yl;cXGZoU6SW z#>z1hD!IOp#_eTVlIv*G3%*4kF5D!IU5m**S3r1?9?ib+%VuE0t;5vioO=eKVMq9x zuE%DZ_@<@MZ;aVfB}n)a4y#9|UryDZd?tl^Wr|_7M;2j2uW7mvn}sf1`brkzLWPU! zQJ%doond8uV)pQO3Bq3MJK-Vx!tFW$00000=lK6Vdq35=hG#(l008LV15i_q_az45 QfB*mh07*qoM6N<$f+B5^DgXcg diff --git a/tests/snapshots/nanos/test_validate_prehash_init/00002.png b/tests/snapshots/nanos/test_validate_prehash_init/00002.png deleted file mode 100644 index 9c7e7049cb3e9bcfb1601ec510ee465d38229d4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmV-a0jvIrP)b=%MgRq*37h4eRxPbkJCLY|1VIo49_}P}TKpH4$L<8?X{t;p zy+UQc_4@p%0?~E_&igM#?#L~IOHR(-<@sYotiy&C*Y&GII0yeh-p3zW9cv$Q0k>6Y_)5~SfP=m zSMUtz)%Ex|-o}7!H9hbQ(8{%C?kQVa?C`*Uj-J(h>P7(Y#?ZWvi?6}@n{fGLp>YTp myqR(V_$?>^<%seR_VWh!MS!&w)Gb7c~W8wxgA(tDMUmxs~SB4k9|9x)-`Az-?T(e zz;B4$MZyBS(aS<=V-7-kL{GqP-(LB)gSs9mw^MTvRl;Y0`7{3vcoF2^g338xsS0rD zTEZg9!#Sz<3A|fK9 aIXwYpPFeUCtH*2r00000os6NDEX(qfl8A`h)pB+RjBWiqFRy6(NJ|OX z)^|+H!~gyQ#`EkB#JH2AngN40?$c|9l{ZX2*t z(}OnvIdj`IkECsz?C>6Eci_lu+^2pB0B;*w>UfGRu<=FMemT*M5HP$wc~v z6;b-P{T%hYoJHk_qWfdQeKd{Z%$}PmGS7=A(l&IU>iUItka#EIfeXdGpc;Tm@Z^P! z>KtIVp5+*9&$sSNY*cH&_?F)VKM9yiQ0iQN!Ux@=DnSMF^=E~%1lgAv?IJ89A|i56 YI{*ZWjv*ny7ytkO07*qoM6N<$f(hJ_V!3KIlUe!W5fkZgQ#jJQ=br4YX7yLPSJ_Vy&{)=tbP;6}^B@n)?6M z0Ib08=mm_iDJ#o2krvz)xP2^CiC%zl+?Y0xHd+0MJ|7?4?}h?vK_XHXC$m;3(r+(F zok!udpet#D+1KM>PJrg!o`AJFIUR|(Aj<=D2aL4!=E@~(e_23FG7+#hP8UoIdMd8~ z@VjPeE&HrN44Ze>;BF%$5B(aj0>(mB}< zy>1X&syo2l=6&#oAae^6@4q8SkaR0m3sP>1Q{`RdY(X~Iq`icRh=_=uX#>8lchttC RNLc^?002ovPDHLkV1fc&iTVHl diff --git a/tests/snapshots/nanos/test_validateprehash_init/00003.png b/tests/snapshots/nanos/test_validateprehash_init/00003.png deleted file mode 100644 index 0830ee530a3e5800f570f39868689fed06cf3bdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmV-E0m1%>P)8w$TZu1OWI~Q{#B+vJXEuj$fX`wL_cy zg^pGe|90#0%}?Hp$Rw{nwmz?S!&rybB~9~g;>bDpnWfunTI9VPI^4yl;cXGZoU6SW z#>z1hD!IOp#_eTVlIv*G3%*4kF5D!IU5m**S3r1?9?ib+%VuE0t;5vioO=eKVMq9x zuE%DZ_@<@MZ;aVfB}n)a4y#9|UryDZd?tl^Wr|_7M;2j2uW7mvn}sf1`brkzLWPU! zQJ%doond8uV)pQO3Bq3MJK-Vx!tFW$00000=lK6Vdq35=hG#(l008LV15i_q_az45 QfB*mh07*qoM6N<$f+B5^DgXcg diff --git a/tests/snapshots/nanosp/test_prefix_hashhash_init/00000.png b/tests/snapshots/nanosp/test_prefix_hashhash_init/00000.png deleted file mode 100644 index b02564fa7b5410cfb8be6fc302281ed2b744aa53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>w~ba4!+nDh2VVBTQ`o`%Ho zTfRH~Puy`@PRUh|t$kZJ@74ddxkpU2_|&#?0CmB@j-$#?*KNI)wq!~X&$J-BpJ%2o ztFJg-|8aKF^~cuc_wCCSH$72V;Qf5@wN>Ab>`XqV^3wLo**S9`o$KDeongQVx`+P)7$u9`H7#3W>q_K?&qf16%}%S zZJJ}cb?LI(`5Trdn<#}()$)m9dRLdW`)zi*%YW@a*5h1Sj?-7y&*S=5@nYVVyC-B_ z-!#lj|G(+b9>JZh3xq@h(%(uZ+ diff --git a/tests/snapshots/nanosp/test_prefix_hashhash_init/00001.png b/tests/snapshots/nanosp/test_prefix_hashhash_init/00001.png deleted file mode 100644 index 0a22ed9c048e1c509e4db8bb538a09179382d08c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYJWBdvN%ubj7hzN2rKU;o#ueP&Ci z6u)zl?W>tp=5_ar-fHP|-DAD~1x3nz=bkJ!FFiWbZ1>T1`*`j0KEJ(a_c>wNQ&HWt z15r_H-frDkxAvfq`)=#1HTp|imgVQL>EwMl?09Qd_55?aH`qVuzrMu!vTxS99j})v zFSWhUH1A`+%LVfl%ReU-{_dXcHN8Ck(Au)AuNIX|O`bh7yXJ7s@3QOt`@Je}etTOx zZMU4Gyz&R%A5DIhmh3=xzsvvUuLt%41H%LBzl=N9ZrwU{VzwMe$kWx&Wt~$(6988l BiiiLJ diff --git a/tests/snapshots/nanosp/test_validateprehash_init/00000.png b/tests/snapshots/nanosp/test_validateprehash_init/00000.png deleted file mode 100644 index 7013ca3729c1c32ddbbdd454a910c1042e965d06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h5*QV%^{978JRyuIPrcgTQ;^#b1` zwVnSb)`*KuUF0*Bv5U>J?R!|}u8n_Yo4nn|2viRO`5!089tc)S+LN<3HT2W_bvIe( zeDJJ&ufR)=QeQff6Y(G;bcz!p2S+~sSuKa&1 zn>}A|@zh)W`LMJ8_0NN|7^nOZvdey&KYu+(LMoGoT0;s`!n1-bo1S>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYJWBdvN%ubj7hzN2rKU;o#ueP&Ci z6u)zl?W>tp=5_ar-fHP|-DAD~1x3nz=bkJ!FFiWbZ1>T1`*`j0KEJ(a_c>wNQ&HWt z15r_H-frDkxAvfq`)=#1HTp|imgVQL>EwMl?09Qd_55?aH`qVuzrMu!vTxS99j})v zFSWhUH1A`+%LVfl%ReU-{_dXcHN8Ck(Au)AuNIX|O`bh7yXJ7s@3QOt`@Je}etTOx zZMU4Gyz&R%A5DIhmh3=xzsvvUuLt%41H%LBzl=N9ZrwU{VzwMe$kWx&Wt~$(6988l BiiiLJ diff --git a/tests/snapshots/nanox/test_prefix_hashhash_init/00000.png b/tests/snapshots/nanox/test_prefix_hashhash_init/00000.png deleted file mode 100644 index b02564fa7b5410cfb8be6fc302281ed2b744aa53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>w~ba4!+nDh2VVBTQ`o`%Ho zTfRH~Puy`@PRUh|t$kZJ@74ddxkpU2_|&#?0CmB@j-$#?*KNI)wq!~X&$J-BpJ%2o ztFJg-|8aKF^~cuc_wCCSH$72V;Qf5@wN>Ab>`XqV^3wLo**S9`o$KDeongQVx`+P)7$u9`H7#3W>q_K?&qf16%}%S zZJJ}cb?LI(`5Trdn<#}()$)m9dRLdW`)zi*%YW@a*5h1Sj?-7y&*S=5@nYVVyC-B_ z-!#lj|G(+b9>JZh3xq@h(%(uZ+ diff --git a/tests/snapshots/nanox/test_prefix_hashhash_init/00001.png b/tests/snapshots/nanox/test_prefix_hashhash_init/00001.png deleted file mode 100644 index 0a22ed9c048e1c509e4db8bb538a09179382d08c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYJWBdvN%ubj7hzN2rKU;o#ueP&Ci z6u)zl?W>tp=5_ar-fHP|-DAD~1x3nz=bkJ!FFiWbZ1>T1`*`j0KEJ(a_c>wNQ&HWt z15r_H-frDkxAvfq`)=#1HTp|imgVQL>EwMl?09Qd_55?aH`qVuzrMu!vTxS99j})v zFSWhUH1A`+%LVfl%ReU-{_dXcHN8Ck(Au)AuNIX|O`bh7yXJ7s@3QOt`@Je}etTOx zZMU4Gyz&R%A5DIhmh3=xzsvvUuLt%41H%LBzl=N9ZrwU{VzwMe$kWx&Wt~$(6988l BiiiLJ diff --git a/tests/snapshots/nanox/test_validateprehash_init/00000.png b/tests/snapshots/nanox/test_validateprehash_init/00000.png deleted file mode 100644 index 7013ca3729c1c32ddbbdd454a910c1042e965d06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h5*QV%^{978JRyuIPrcgTQ;^#b1` zwVnSb)`*KuUF0*Bv5U>J?R!|}u8n_Yo4nn|2viRO`5!089tc)S+LN<3HT2W_bvIe( zeDJJ&ufR)=QeQff6Y(G;bcz!p2S+~sSuKa&1 zn>}A|@zh)W`LMJ8_0NN|7^nOZvdey&KYu+(LMoGoT0;s`!n1-bo1S>}8ba4!+nDh2#Am1Sc0oRKc zcL;ymuk!5?JEvmnwkuibaeJSyRt)^uD?4EpBTyF!;K^XIuI0vnmuluBIu;=7LF=pwdVFK5RvW*sptdHLn+n}@cI{$FA}Oll|ZX6|ym zv+E^4$J-}Qw*A>Az5dSkz%5cnFXPh$Okc+LNL4K2u1u2s=CbF;;vKu~m9N=9{MYha zTwZY10sZ%!KAFne?ELQTryeXiAb8GzN%q)U*^OTlbNjEn{+IM4Dt=?sgqcgH{7Q+I zR=)jKHRSoqLt7UZ8y@``d%nAfeardKTg&xoml-QN8=e+U<(-lF`shs89kuD*QImdm oYJWBdvN%ubj7hzN2rKU;o#ueP&Ci z6u)zl?W>tp=5_ar-fHP|-DAD~1x3nz=bkJ!FFiWbZ1>T1`*`j0KEJ(a_c>wNQ&HWt z15r_H-frDkxAvfq`)=#1HTp|imgVQL>EwMl?09Qd_55?aH`qVuzrMu!vTxS99j})v zFSWhUH1A`+%LVfl%ReU-{_dXcHN8Ck(Au)AuNIX|O`bh7yXJ7s@3QOt`@Je}etTOx zZMU4Gyz&R%A5DIhmh3=xzsvvUuLt%41H%LBzl=N9ZrwU{VzwMe$kWx&Wt~$(6988l BiiiLJ From 0f71b194dcd416003db4e5746fee3c3824992d07 Mon Sep 17 00:00:00 2001 From: Xavier Chapron Date: Tue, 27 Feb 2024 15:17:44 +0100 Subject: [PATCH 128/142] tests: Fix some race conditions --- tests/monero_client/monero_cmd.py | 33 ++++++++++++++++-- .../test_prefix_hash_hash_init/00002.png | Bin 0 -> 285 bytes .../test_validate_prehash_init/00002.png | Bin 0 -> 285 bytes .../test_validate_prehash_update/00008.png | Bin 0 -> 285 bytes .../test_prefix_hash_hash_init/00002.png | Bin 0 -> 306 bytes .../test_validate_prehash_init/00002.png | Bin 0 -> 306 bytes .../test_validate_prehash_update/00004.png | Bin 0 -> 306 bytes .../test_prefix_hash_hash_init/00002.png | Bin 0 -> 306 bytes .../test_validate_prehash_init/00002.png | Bin 0 -> 306 bytes .../test_validate_prehash_update/00004.png | Bin 0 -> 306 bytes .../stax/test_prefix_hash_hash_init/00000.png | Bin 3901 -> 9849 bytes .../stax/test_prefix_hash_hash_init/00001.png | Bin 0 -> 3901 bytes .../test_validate_prehash_update/00003.png | Bin 0 -> 3901 bytes 13 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 tests/snapshots/nanos/test_prefix_hash_hash_init/00002.png create mode 100644 tests/snapshots/nanos/test_validate_prehash_init/00002.png create mode 100644 tests/snapshots/nanos/test_validate_prehash_update/00008.png create mode 100644 tests/snapshots/nanosp/test_prefix_hash_hash_init/00002.png create mode 100644 tests/snapshots/nanosp/test_validate_prehash_init/00002.png create mode 100644 tests/snapshots/nanosp/test_validate_prehash_update/00004.png create mode 100644 tests/snapshots/nanox/test_prefix_hash_hash_init/00002.png create mode 100644 tests/snapshots/nanox/test_validate_prehash_init/00002.png create mode 100644 tests/snapshots/nanox/test_validate_prehash_update/00004.png create mode 100644 tests/snapshots/stax/test_prefix_hash_hash_init/00001.png create mode 100644 tests/snapshots/stax/test_validate_prehash_update/00003.png diff --git a/tests/monero_client/monero_cmd.py b/tests/monero_client/monero_cmd.py index ea16c87..ffde497 100644 --- a/tests/monero_client/monero_cmd.py +++ b/tests/monero_client/monero_cmd.py @@ -35,6 +35,7 @@ class MoneroCmd(MoneroCryptoCmd): def __init__(self, debug, backend) -> None: + self.backend = backend MoneroCryptoCmd.__init__(self, backend, debug) def reset_and_get_version(self, @@ -79,6 +80,8 @@ def set_signature_mode(self, sig_type: SigType) -> int: sw, response = self.device.recv() # type: int, bytes + # No screen change expected + if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins) @@ -106,6 +109,9 @@ def open_tx(self) -> Tuple[bytes, bytes, bytes, bytes]: sw, response = self.device.recv() # type: int, bytes + # Wait for internal backend screen to be up to date before continuing + self.backend.wait_for_screen_change() + if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins) @@ -147,6 +153,9 @@ def close_tx(self) -> None: sw, response = self.device.recv() # type: int, bytes + # Wait for internal backend screen to be up to date before continuing + self.backend.wait_for_screen_change() + if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins) @@ -189,6 +198,8 @@ def gen_txout_keys(self, sw, response = self.device.recv() # type: int, bytes + # No screen change expected + if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins) @@ -230,10 +241,12 @@ def prefix_hash_init(self, backend, test_name, firmware, navigator, version: int navigator.navigate_and_compare(TESTS_ROOT_DIR, test_name + "_hash_init", - instructions, screen_change_after_last_instruction=False) + instructions) sw, response = self.device.async_response() # type: int, bytes + # Screen change already waited in navigate_and_compare() above + if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins, message="P1=1 (init)") @@ -251,6 +264,8 @@ def prefix_hash_update(self, index: int, payload: bytes, is_last: bool) -> bytes sw, response = self.device.recv() # type: int, bytes + # No screen change expected + if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins, message="P1=2 (update)") @@ -279,6 +294,8 @@ def gen_commitment_mask(self, _ak_amount: bytes) -> bytes: sw, response = self.device.recv() # type: int, bytes + # No screen change expected + if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins) @@ -311,6 +328,8 @@ def blind(self, sw, response = self.device.recv() # type: int, bytes + # No screen change expected + if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins) @@ -345,6 +364,8 @@ def unblind(self, sw, response = self.device.recv() # type: int, bytes + # No screen change expected + if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins) @@ -386,12 +407,14 @@ def validate_prehash_init(self, if firmware.device.startswith("nano"): navigator.navigate_and_compare(TESTS_ROOT_DIR, test_name + "_prehash_init", - instructions, screen_change_after_last_instruction=False) + instructions) else: pass sw, response = self.device.async_response() # type: int, bytes + # Screen change already waited in navigate_and_compare() above + if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins, message="P1=1 (init)") @@ -452,10 +475,12 @@ def validate_prehash_update(self, backend.wait_for_text_not_on_screen("Processing") navigator.navigate_and_compare(TESTS_ROOT_DIR, test_name + "_prehash_update", - instructions, screen_change_after_last_instruction=False, screen_change_before_first_instruction=False) + instructions, screen_change_before_first_instruction=False) sw, response = self.device.async_response() # type: int, bytes + # Screen change already waited in navigate_and_compare() above + if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins, message="P1=2 (update)") @@ -498,6 +523,8 @@ def validate_prehash_finalize(self, sw, response = self.device.recv() # type: int, bytes + # No screen change expected + if not sw & 0x9000: raise DeviceError(error_code=sw, ins=ins, message="P1=3 (finalize)") diff --git a/tests/snapshots/nanos/test_prefix_hash_hash_init/00002.png b/tests/snapshots/nanos/test_prefix_hash_hash_init/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..2360dfba85d3d3107cbfe890b71b29980adf1cc3 GIT binary patch literal 285 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 X>(^x7I1bzvBhH>af2t!c<@SF8;`C+- diff --git a/tests/snapshots/stax/test_prefix_hash_hash_init/00001.png b/tests/snapshots/stax/test_prefix_hash_hash_init/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..cfb9942059637b72303870dd4c39d520214a1647 GIT binary patch literal 3901 zcmeHKdr*^C77q_+td&LUF32-jbm|tAB9&KoRD7^*t?9HYpt1>wf)F4eT?i2KIfAe? zkjT(3B80G5i7rS&SpvwH1V{-LAOT_w5CVh{ATN`A*{|Kd`+qyj`Qy%t=-$ob`G}d;8%|s!t}n4^WIdS=e33|3K-<&PgGQry z-i0M4kv8IMkw}Coy`PK6hc&#o(H9jFVV>HY-w_rTCMI%+ujr;v<`oti7~-|@gtkf3 zG}71icYszKC?sT6Wz(9PxP-_3{r$lvoleKX{=oYtpuH>-g}QvSZWAkAfg|}z(!1(` zExQZ69%k2xi3vlIG6nW}rlLZ3xUsP@TOR(IWNCVGa#DjvIkjfKg>06OKXZ3?$6Mpx z`1cJ(R_UBLzzLmlgsMX)CME*&KlJwX)winW=jXc}U^~gjN8HFob0Sse5>yEvx!OFT z(P+p{p$#u=HX9jtwBbcM2gA#V_<5X1RaRSOvqO0yt7>(oio(Vhmy}GyI!IaOZFP@yV&x$hYP&t5s+n4!AS%4Gp`h^h|xwii{Ft;L~dks!s{EAM0CKH=eqc*Y03qI)8$t=CF2EMd3ZiH*8t}ik!6n%Px zeBa_GH(I+Mm2#`w^yDK0C`f-gjr+S=OU^G0@O?#7!huSL}?)=dhKB(t;c#Xb&a zRxKo!n{TDv!3F+<*4P+WC(M7u20XPM29)3lmoO%t!;y-MBY=}4u~GS4eFR>(B$Po~l&-w1?yk&^YL@u}#YLOxYe;6PZa1@| zV^LTyO#tTh8wBhMo3g4|jJuq+VR;j#s9ty)1{S#BN|AizO-Rxw^Uv2MANd($aNcc$w#EkUyv!HQ3cBDfX6N54c_*=BCy0 zw|?}di~W-hq25)<1eLqS$O-r=t3e~1BIpgQ;D0vQpS{W!l=}9JRQX^eFYlUAl{QNL zC>scZ=`8I>gJRJiFV4cwKq5xSp{Od?`uAdxS;&{*D5+_q%HA7-pO%x?MX9`yLqsSd zAQ`48w03rO7W6bJz8sRqumxV={aKeaxx_W8qlHo zUgy_};UldmLDp7Kyr}>ExjB`&lOHoqpep{pk-Apn)a4qmYCAwsB`}M8*V8I((Qr*$ zWT!^joDI$Pvf^*=H7S)!CYHAb_V!_zBe>$2%QocLAKap0%qTanvSTsn=SquWp!>l7 z!Ilj0O)-hYwdFrl-Xw2U=IN*hlMYt9pRsRU%)9>b7oW}TAJMP)N3`9!{NHqM5c1LY X>(^x7I1bzvBhH>af2t!c<@SF8;`C+- literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_validate_prehash_update/00003.png b/tests/snapshots/stax/test_validate_prehash_update/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..264824aa9a063e7a04efb45f808709411e10d93c GIT binary patch literal 3901 zcmeHK`&-g!7N^ulb5eHQC!6s`HBUO@jnsm?fz8ygS!r9XcR|G@6=l@M3xYUi+B|rv zwbBNWncCIeH5GEyOz{#5wGJ{pgo+nPP{|7tq9B5>-`)LX|A2n<{o#F{bAEW=b3UK* zIq!LYxEz79vvslsfk1ZW|9JKa2(<4m2(Npg1F2RSjX%i93WT8JfH=_Q z99kg3Hwy<=N`^6GcqN4{p39vt59zh~@WuvZ6rS~wy%5AImL zOEm4QcBml&fdEtNPC6PL6IPM5@3S(iR2#>;NB`eQmVbdsnzpi~P`&=wORj!3P^z=o z5IleRu?1yhFu)5-OKE1Vo-`2ST~kwIPeEWZ*=X~&8VjR^A`osSiE4elsi~Ix1UOSilPE4$n#?2#tP8qt65ni^bw-#@x?7^<(NTWJrjM zNg|DXsDAsYI4CrftiG(%>98NcaN#!uUMW5zHO zd>KtmKuq0(&enPP`7r;JRjB!eg;WDqjEB9*CzHv#vGGzdKEI>{LF4;Eq0;T!BdFZl z-+d~#CYsA+3IRjj(caN9xG?gZ&8G9yJUl!)?4I}cH}caodLz9@Q{?@E!g})Li60Wk zr#NRQtuwYQ3fkU_htal(yG@G?|Jm=UTwv=3onqr_W=l&8J$QOxad|l%u(iGbF5EzZ zbVG~OTR$9IBq5}DSafu>u$snSlF3qFv_uSsvK_kN868upo<208(P#t=BrbmN@4TSR z6jmXL)adR6;4vfDc|bc{i*O5oQ|+k&5K)vuegEZMKc?(b00AC`9;5{0N!2rx?!ss` zWgIFQ1rQv+xuMnO2fZ?F!;M@35Ln`6dNuiJ0#(=lsur(_sy z*Qn2XkrPr^@J-DfJZ8GeV!i)LU_`pv_C0Wi!Pm{rjazNTPnp!Z!Ihks!SEVrmZGsG zj?6tYal&n6xhAB*UI5<>lh{m*KQ?T>ohum!%O9C#o~ptWX#JS9CL}b}Rl`r8q6$R6 zf0phUgdUlN^akXS6ij$o7xK`YKD(-~kQM%UD&z1|Wg^!77Utz+!}l6;s~~y5&^5DWIiZrB zb}>;$Xv}JBHftM^0uq7|p}GJ|O|o14iF;+drmn6oJwn&b%HEJ&y&iI}xn9Jj7_|pN zp5+!4^a$&hZG`)Hwv#d5!GVFX-j4F{Eb~c8z*=P0RkFH)!Jag(tYqv|BqSvCvv%o` z$6~C%%gud8wqk8B(#@oV>;3s%{%9h^*`LyPG-)QIizr|k3S)6 zi~EOx&N2Nqf5A_QeLgsdL?VHDRwxuI<0Vcds{)|xX|i$(BYjlm)ja9;OkJ8?YgEo% zqV-Y+)<*;S2L_saap?HnBJ7m&jFYxDpbXKLRsC8;m6pRF_DDXApL(h!9~7ocX!HMI zKjakkx^R3gQkpinlr0>c)H;Zqo2h+ICfS8fI2;ZT1yC(06w2TgMai6!p7Nj_X?~_R1q6YLgzUd6yHMA)Y6E;@Ey0yjloWE}G$R%d>anX`P>`ie}vc z@(cOhQ6tho0I&<)yTwIBqSMuGFx<7MILaW?79i+f&L@*z-T$D!Y+yED(hBe6j2wEA z(1b28us76wIj`x6oljvkln_-aRf}i{%y1aces72P=lloD)i8u-jF9#>g+`y-o8Vh7 zJoaY%>t1B;kDzP@SIg||>{ME;U&CJn^BlFxWZ_bW4s75gU4m!Fdpj~%65!1BB-d9ct5y9G)p3{V8Ax|0;oYdtVE{M9uwK>c^(IpZDM66J0@@eJ)CJaB+&U#$ z3Z(J5YV$A%F@XstgngchPbtiyF4wS}c4zJh+wb(~ib~d);FA*U>Bppo;)S6#j%_i; zM$#) Date: Tue, 27 Feb 2024 17:23:51 +0100 Subject: [PATCH 129/142] [auto] Update screenshot --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 98b720f..f2fb620 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,5 +4,5 @@ - [ ] Target branch is `develop` - [ ] Application version has been bumped - From 09ca3c49a0cedad7535492b3e1cab060fbad1d83 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 20 Feb 2024 15:29:39 +0100 Subject: [PATCH 130/142] Fix: use explicit_bzero to clear private data from the stack --- src/monero_key.c | 98 +++++++++++++++++++++++++++++++++++++++++++- src/monero_proof.c | 10 +++++ src/monero_stealth.c | 5 +++ 3 files changed, 111 insertions(+), 2 deletions(-) diff --git a/src/monero_key.c b/src/monero_key.c index 2170e05..a9b8c09 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -387,13 +387,16 @@ int monero_apdu_verify_key() { err = monero_io_fetch_decrypt_key(priv, sizeof(priv)); if (err) { + explicit_bzero(priv, sizeof(priv)); return err; } monero_io_fetch(pub, 32); + + err = monero_secret_key_to_public_key(computed_pub, priv, sizeof(computed_pub), sizeof(priv)); + explicit_bzero(priv, sizeof(priv)); + switch (G_monero_vstate.io_p1) { case 0: - err = monero_secret_key_to_public_key(computed_pub, priv, sizeof(computed_pub), - sizeof(priv)); if (err) { return err; } @@ -448,10 +451,13 @@ int monero_apdu_sc_add(/*unsigned char *r, unsigned char *s1, unsigned char *s2* // fetch err = monero_io_fetch_decrypt(s1, 32, TYPE_SCALAR); if (err) { + explicit_bzero(s1, sizeof(s1)); return err; } err = monero_io_fetch_decrypt(s2, 32, TYPE_SCALAR); if (err) { + explicit_bzero(s1, sizeof(s1)); + explicit_bzero(s2, sizeof(s2)); return err; } monero_io_discard(0); @@ -463,14 +469,22 @@ int monero_apdu_sc_add(/*unsigned char *r, unsigned char *s1, unsigned char *s2* // hwdev.sc_secret_add(scalar_step2, scalar_step1,subaddr_sk); if ((memcmp(s1, G_monero_vstate.last_derive_secret_key, 32) != 0) || (memcmp(s2, G_monero_vstate.last_get_subaddress_secret_key, 32) != 0)) { + explicit_bzero(s1, sizeof(s1)); + explicit_bzero(s2, sizeof(s2)); return SW_WRONG_DATA; } } err = monero_addm(r, s1, s2, sizeof(r), sizeof(s1), sizeof(s2)); if (err) { + explicit_bzero(s1, sizeof(s1)); + explicit_bzero(s2, sizeof(s2)); + explicit_bzero(r, sizeof(r)); return err; } monero_io_insert_encrypt(r, 32, TYPE_SCALAR); + explicit_bzero(s1, sizeof(s1)); + explicit_bzero(s2, sizeof(s2)); + explicit_bzero(r, sizeof(r)); return SW_OK; } @@ -487,15 +501,18 @@ int monero_apdu_scal_mul_key(/*const rct::key &pub, const rct::key &sec, rct::ke monero_io_fetch(pub, 32); err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); if (err) { + explicit_bzero(sec, sizeof(sec)); return err; } monero_io_discard(0); err = monero_ecmul_k(r, pub, sec, sizeof(r), sizeof(pub), sizeof(sec)); if (err) { + explicit_bzero(sec, sizeof(sec)); return err; } monero_io_insert(r, 32); + explicit_bzero(sec, sizeof(sec)); return SW_OK; } @@ -509,16 +526,19 @@ int monero_apdu_scal_mul_base(/*const rct::key &sec, rct::key mulkey*/) { // fetch err = monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); if (err) { + explicit_bzero(sec, sizeof(sec)); return err; } monero_io_discard(0); err = monero_ecmul_G(r, sec, sizeof(r), sizeof(sec)); if (err) { + explicit_bzero(sec, sizeof(sec)); return err; } monero_io_insert(r, 32); + explicit_bzero(sec, sizeof(sec)); return SW_OK; } @@ -532,10 +552,12 @@ int monero_apdu_generate_keypair(/*crypto::public_key &pub, crypto::secret_key & monero_io_discard(0); int error = monero_generate_keypair(pub, sec, sizeof(pub), sizeof(sec)); if (error) { + explicit_bzero(sec, sizeof(sec)); return error; } monero_io_insert(pub, 32); monero_io_insert_encrypt(sec, 32, TYPE_SCALAR); + explicit_bzero(sec, sizeof(sec)); return SW_OK; } @@ -549,17 +571,20 @@ int monero_apdu_secret_key_to_public_key( // fetch int err = monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); if (err) { + explicit_bzero(sec, sizeof(sec)); return err; } monero_io_discard(0); // pub err = monero_ecmul_G(pub, sec, sizeof(pub), sizeof(sec)); if (err) { + explicit_bzero(sec, sizeof(sec)); return err; } // pub key monero_io_insert(pub, 32); + explicit_bzero(sec, sizeof(sec)); return SW_OK; } @@ -576,6 +601,7 @@ int monero_apdu_generate_key_derivation(/*const crypto::public_key &pub, const c monero_io_fetch(pub, 32); err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); if (err) { + explicit_bzero(sec, sizeof(sec)); return err; } @@ -584,10 +610,14 @@ int monero_apdu_generate_key_derivation(/*const crypto::public_key &pub, const c // Derive and keep err = monero_generate_key_derivation(drv, pub, sec, sizeof(drv), sizeof(pub), sizeof(sec)); if (err) { + explicit_bzero(sec, sizeof(sec)); + explicit_bzero(drv, sizeof(drv)); return err; } monero_io_insert_encrypt(drv, 32, TYPE_DERIVATION); + explicit_bzero(sec, sizeof(sec)); + explicit_bzero(drv, sizeof(drv)); return SW_OK; } @@ -603,6 +633,7 @@ int monero_apdu_derivation_to_scalar( // fetch int err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); if (err) { + explicit_bzero(derivation, sizeof(derivation)); return err; } output_index = monero_io_fetch_u32(); @@ -612,11 +643,15 @@ int monero_apdu_derivation_to_scalar( err = monero_derivation_to_scalar(res, derivation, output_index, sizeof(res), sizeof(derivation)); if (err) { + explicit_bzero(derivation, sizeof(derivation)); + explicit_bzero(res, sizeof(res)); return err; } // pub key monero_io_insert_encrypt(res, 32, TYPE_SCALAR); + explicit_bzero(derivation, sizeof(derivation)); + explicit_bzero(res, sizeof(res)); return SW_OK; } @@ -632,6 +667,7 @@ int monero_apdu_derive_public_key(/*const crypto::key_derivation &derivation, co // fetch int err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); if (err) { + explicit_bzero(derivation, sizeof(derivation)); return err; } output_index = monero_io_fetch_u32(); @@ -642,11 +678,13 @@ int monero_apdu_derive_public_key(/*const crypto::key_derivation &derivation, co int error = monero_derive_public_key(drvpub, derivation, output_index, pub, sizeof(drvpub), sizeof(derivation), sizeof(pub)); if (error) { + explicit_bzero(derivation, sizeof(derivation)); return error; } // pub key monero_io_insert(drvpub, 32); + explicit_bzero(derivation, sizeof(derivation)); return SW_OK; } @@ -663,11 +701,14 @@ int monero_apdu_derive_secret_key(/*const crypto::key_derivation &derivation, co // fetch err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); if (err) { + explicit_bzero(derivation, sizeof(derivation)); return err; } output_index = monero_io_fetch_u32(); err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); if (err) { + explicit_bzero(derivation, sizeof(derivation)); + explicit_bzero(sec, sizeof(sec)); return err; } monero_io_discard(0); @@ -676,12 +717,19 @@ int monero_apdu_derive_secret_key(/*const crypto::key_derivation &derivation, co err = monero_derive_secret_key(drvsec, derivation, output_index, sec, sizeof(drvsec), sizeof(derivation), sizeof(sec)); if (err) { + explicit_bzero(derivation, sizeof(derivation)); + explicit_bzero(sec, sizeof(sec)); + explicit_bzero(drvsec, sizeof(drvsec)); return err; } // sec key memcpy(G_monero_vstate.last_derive_secret_key, drvsec, 32); monero_io_insert_encrypt(drvsec, 32, TYPE_SCALAR); + + explicit_bzero(derivation, sizeof(derivation)); + explicit_bzero(sec, sizeof(sec)); + explicit_bzero(drvsec, sizeof(drvsec)); return SW_OK; } @@ -698,6 +746,7 @@ int monero_apdu_generate_key_image( monero_io_fetch(pub, 32); int err = monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); if (err) { + explicit_bzero(sec, sizeof(sec)); return err; } monero_io_discard(0); @@ -705,11 +754,13 @@ int monero_apdu_generate_key_image( // pub err = monero_generate_key_image(image, pub, sec, sizeof(image), sizeof(sec)); if (err) { + explicit_bzero(sec, sizeof(sec)); return err; } // pub key monero_io_insert(image, 32); + explicit_bzero(sec, sizeof(sec)); return SW_OK; } @@ -726,6 +777,7 @@ int monero_apdu_derive_view_tag( // fetch err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); if (err) { + explicit_bzero(derivation, sizeof(derivation)); return err; } output_index = monero_io_fetch_u32(); @@ -734,10 +786,12 @@ int monero_apdu_derive_view_tag( // derive and keep err = monero_derive_view_tag(res, derivation, output_index); if (err) { + explicit_bzero(derivation, sizeof(derivation)); return err; } monero_io_insert(res, 1); + explicit_bzero(derivation, sizeof(derivation)); return SW_OK; } @@ -754,6 +808,7 @@ int monero_apdu_derive_subaddress_public_key(/*const crypto::public_key &pub, co monero_io_fetch(pub, 32); int err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); if (err) { + explicit_bzero(derivation, sizeof(derivation)); return err; } output_index = monero_io_fetch_u32(); @@ -763,10 +818,12 @@ int monero_apdu_derive_subaddress_public_key(/*const crypto::public_key &pub, co err = monero_derive_subaddress_public_key(sub_pub, pub, derivation, output_index, sizeof(sub_pub), sizeof(pub), sizeof(derivation)); if (err) { + explicit_bzero(derivation, sizeof(derivation)); return err; } // pub key monero_io_insert(sub_pub, 32); + explicit_bzero(derivation, sizeof(derivation)); return SW_OK; } @@ -830,6 +887,7 @@ int monero_apdu_get_subaddress_secret_key(/*const crypto::secret_key& sec, const err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); if (err) { + explicit_bzero(sec, sizeof(sec)); return err; } monero_io_fetch(index, 8); @@ -838,11 +896,15 @@ int monero_apdu_get_subaddress_secret_key(/*const crypto::secret_key& sec, const err = monero_get_subaddress_secret_key(sub_sec, sec, index, sizeof(sub_sec), sizeof(sec), sizeof(index)); if (err) { + explicit_bzero(sec, sizeof(sec)); + explicit_bzero(sub_sec, sizeof(sec)); return err; } memcpy(G_monero_vstate.last_get_subaddress_secret_key, sub_sec, 32); monero_io_insert_encrypt(sub_sec, 32, TYPE_SCALAR); + explicit_bzero(sec, sizeof(sec)); + explicit_bzero(sub_sec, sizeof(sec)); return SW_OK; } @@ -874,6 +936,7 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se monero_io_fetch_u32(); // skip tx_version err = monero_io_fetch_decrypt_key(tx_key, sizeof(tx_key)); if (err) { + explicit_bzero(tx_key, sizeof(tx_key)); return err; } txkey_pub = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; @@ -889,6 +952,8 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se if (need_additional_txkeys) { err = monero_io_fetch_decrypt_key(additional_txkey_sec, sizeof(additional_txkey_sec)); if (err) { + explicit_bzero(tx_key, sizeof(tx_key)); + explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); return err; } } else { @@ -901,14 +966,20 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se if (G_monero_vstate.io_protocol_version >= 2) { err = monero_sha256_outkeys_update(Aout, 32); if (err) { + explicit_bzero(tx_key, sizeof(tx_key)); + explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); return err; } err = monero_sha256_outkeys_update(Bout, 32); if (err) { + explicit_bzero(tx_key, sizeof(tx_key)); + explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); return err; } err = monero_sha256_outkeys_update(&is_change, 1); if (err) { + explicit_bzero(tx_key, sizeof(tx_key)); + explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); return err; } } @@ -920,12 +991,16 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se err = monero_ecmul_k(additional_txkey_pub, Bout, additional_txkey_sec, sizeof(additional_txkey_pub), 32, sizeof(additional_txkey_sec)); if (err) { + explicit_bzero(tx_key, sizeof(tx_key)); + explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); return err; } } else { err = monero_ecmul_G(additional_txkey_pub, additional_txkey_sec, sizeof(additional_txkey_pub), sizeof(additional_txkey_sec)); if (err) { + explicit_bzero(tx_key, sizeof(tx_key)); + explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); return err; } } @@ -938,6 +1013,8 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se err = monero_generate_key_derivation(derivation, txkey_pub, G_monero_vstate.a, sizeof(derivation), 32, sizeof(G_monero_vstate.a)); if (err) { + explicit_bzero(tx_key, sizeof(tx_key)); + explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); return err; } } else { @@ -946,6 +1023,8 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se (is_subaddress && need_additional_txkeys) ? additional_txkey_sec : tx_key, sizeof(derivation), 32, 32); if (err) { + explicit_bzero(tx_key, sizeof(tx_key)); + explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); return err; } } @@ -954,12 +1033,18 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se err = monero_derivation_to_scalar(amount_key, derivation, output_index, sizeof(amount_key), sizeof(derivation)); if (err) { + explicit_bzero(tx_key, sizeof(tx_key)); + explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); + explicit_bzero(amount_key, sizeof(amount_key)); return err; } if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { if (G_monero_vstate.io_protocol_version >= 2) { err = monero_sha256_outkeys_update(amount_key, 32); if (err) { + explicit_bzero(tx_key, sizeof(tx_key)); + explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); + explicit_bzero(amount_key, sizeof(amount_key)); return err; } } @@ -969,6 +1054,9 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se err = monero_derive_public_key(out_eph_public_key, derivation, output_index, Bout, sizeof(out_eph_public_key), sizeof(derivation), 32); if (err) { + explicit_bzero(tx_key, sizeof(tx_key)); + explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); + explicit_bzero(amount_key, sizeof(amount_key)); return err; } @@ -976,6 +1064,9 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se if (use_view_tags) { err = monero_derive_view_tag(view_tag, derivation, output_index); if (err) { + explicit_bzero(tx_key, sizeof(tx_key)); + explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); + explicit_bzero(amount_key, sizeof(amount_key)); return err; } } @@ -991,5 +1082,8 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se monero_io_insert(view_tag, 1); } G_monero_vstate.tx_output_cnt++; + explicit_bzero(tx_key, sizeof(tx_key)); + explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); + explicit_bzero(amount_key, sizeof(amount_key)); return SW_OK; } diff --git a/src/monero_proof.c b/src/monero_proof.c index cfc013f..0c89b31 100644 --- a/src/monero_proof.c +++ b/src/monero_proof.c @@ -52,6 +52,7 @@ int monero_apdu_get_tx_proof() { monero_io_skip(32); err = monero_io_fetch_decrypt_key(r, sizeof(r)); if (err) { + explicit_bzero(r, sizeof(r)); return err; } @@ -60,6 +61,7 @@ int monero_apdu_get_tx_proof() { // Generate random k err = monero_rng_mod_order(k, k_len); if (err) { + explicit_bzero(r, sizeof(r)); return err; } @@ -72,12 +74,14 @@ int monero_apdu_get_tx_proof() { // X = kB err = monero_ecmul_k(XY, B, k, sizeof(XY), 32, k_len); if (err) { + explicit_bzero(r, sizeof(r)); return err; } } else { // X = kG err = monero_ecmul_G(XY, k, sizeof(XY), k_len); if (err) { + explicit_bzero(r, sizeof(r)); return err; } } @@ -87,12 +91,14 @@ int monero_apdu_get_tx_proof() { // Y = kA err = monero_ecmul_k(XY, A, k, sizeof(XY), 32, k_len); if (err) { + explicit_bzero(r, sizeof(r)); return err; } // tmp = msg || D || X || Y memcpy(G_monero_vstate.tmp + 32 * 3, XY, 32); err = monero_keccak_H((unsigned char *)"TXPROOF_V2", 10, sep); if (err) { + explicit_bzero(r, sizeof(r)); return err; } // tmp = msg || D || X || Y || sep @@ -107,23 +113,27 @@ int monero_apdu_get_tx_proof() { // sig_c = H_n(tmp) err = monero_hash_to_scalar(sig_c, &G_monero_vstate.tmp[0], sizeof(sig_c), 32 * 8); if (err) { + explicit_bzero(r, sizeof(r)); return err; } // sig_c*r err = monero_multm(XY, sig_c, r, sizeof(XY), sizeof(sig_c), sizeof(r)); if (err) { + explicit_bzero(r, sizeof(r)); return err; } // sig_r = k - sig_c*r err = monero_subm(sig_r, k, XY, sizeof(sig_r), k_len, sizeof(r)); if (err) { + explicit_bzero(r, sizeof(r)); return err; } monero_io_insert(sig_c, 32); monero_io_insert(sig_r, 32); + explicit_bzero(r, sizeof(r)); return SW_OK; } diff --git a/src/monero_stealth.c b/src/monero_stealth.c index 97ea397..ba83251 100644 --- a/src/monero_stealth.c +++ b/src/monero_stealth.c @@ -38,6 +38,7 @@ int monero_apdu_stealth() { // fetch sec err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); if (err) { + explicit_bzero(sec, sizeof(sec)); return err; } // fetch paymentID @@ -48,6 +49,7 @@ int monero_apdu_stealth() { // Compute Dout err = monero_generate_key_derivation(drv, pub, sec, sizeof(drv), sizeof(pub), sizeof(sec)); if (err) { + explicit_bzero(sec, sizeof(sec)); return err; } @@ -55,6 +57,7 @@ int monero_apdu_stealth() { drv[32] = ENCRYPTED_PAYMENT_ID_TAIL; err = monero_keccak_F(drv, 33, sec); if (err) { + explicit_bzero(sec, sizeof(sec)); return err; } @@ -65,5 +68,7 @@ int monero_apdu_stealth() { monero_io_insert(payID, 8); + explicit_bzero(sec, sizeof(sec)); + return SW_OK; } \ No newline at end of file From 71d8f4b0e44066195fc0354cdedc9bba63ee59c8 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 20 Feb 2024 16:42:38 +0100 Subject: [PATCH 131/142] Fix: replace memset with explicit_bzero --- src/monero_blind.c | 2 +- src/monero_crypto.c | 8 ++++---- src/monero_init.c | 2 +- src/monero_io.c | 2 +- src/monero_key.c | 30 ++++++++++++++++++------------ src/monero_main.c | 4 ++-- src/monero_open_tx.c | 4 ++-- src/monero_ux_nano.c | 6 +++--- src/monero_ux_stax.c | 4 ++-- src/monero_ux_stax_menu.c | 2 +- 10 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/monero_blind.c b/src/monero_blind.c index c4e3172..58289ae 100644 --- a/src/monero_blind.c +++ b/src/monero_blind.c @@ -41,7 +41,7 @@ int monero_apdu_blind() { monero_io_discard(1); if ((G_monero_vstate.options & 0x03) == 2) { - memset(k, 0, 32); + explicit_bzero(k, 32); err = monero_ecdhHash(AKout, AKout, sizeof(AKout)); if (err) { diff --git a/src/monero_crypto.c b/src/monero_crypto.c index 3fa7e44..3b0b26a 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -407,7 +407,7 @@ int monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t g error |= cx_math_multm_no_throw(v, u, u, MOD); /* 2 * u^2 */ error |= cx_math_addm_no_throw(v, v, v, MOD); - memset(w, 0, 32); + explicit_bzero(w, 32); w[31] = 1; /* w = 1 */ error |= cx_math_addm_no_throw(w, v, w, MOD); /* w = 2 * u^2 + 1 */ error |= cx_math_multm_no_throw(x, w, w, MOD); /* w^2 */ @@ -1246,7 +1246,7 @@ int monero_multm_8(unsigned char *r, unsigned char *a, size_t r_len, size_t a_le if (error) { return error; } - memset(rb, 0, 32); + explicit_bzero(rb, 32); rb[31] = 8; error = cx_math_multm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); if (error) { @@ -1311,7 +1311,7 @@ unsigned int monero_uint642str(uint64_t val, char *str, unsigned int str_len) { PRINTF("%d \n\n", __LINE__); return SW_WRONG_DATA; } - memset(str, 0, str_len); + explicit_bzero(str, str_len); offset = 22; while (val) { @@ -1340,7 +1340,7 @@ int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { PRINTF("%d \n\n", __LINE__); return SW_WRONG_DATA; } - memset(str, 0, str_len); + explicit_bzero(str, str_len); memset(stramount, '0', sizeof(stramount)); stramount[21] = 0; diff --git a/src/monero_init.c b/src/monero_init.c index 69472ee..b7bb3a1 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -38,7 +38,7 @@ const unsigned char C_FAKE_SEC_SPEND_KEY[32] = { /* --- Boot --- */ /* ----------------------------------------------------------------------- */ unsigned int monero_init() { - memset(&G_monero_vstate, 0, sizeof(monero_v_state_t)); + explicit_bzero(&G_monero_vstate, sizeof(monero_v_state_t)); // first init ? if (memcmp((void*)N_monero_pstate->magic, (void*)C_MAGIC, sizeof(C_MAGIC)) != 0) { diff --git a/src/monero_io.c b/src/monero_io.c index 84f1d39..de06eb3 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -59,7 +59,7 @@ void monero_io_discard(int clear) { } void monero_io_clear(void) { - memset(G_monero_vstate.io_buffer, 0, MONERO_IO_BUFFER_LENGTH); + explicit_bzero(G_monero_vstate.io_buffer, MONERO_IO_BUFFER_LENGTH); } /* ----------------------------------------------------------------------- */ diff --git a/src/monero_key.c b/src/monero_key.c index a9b8c09..5c71a49 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -380,36 +380,42 @@ int monero_apdu_get_key() { /* ----------------------------------------------------------------------- */ int monero_apdu_verify_key() { unsigned char pub[32]; - unsigned char priv[32]; unsigned char computed_pub[32]; unsigned int verified = 0; int err = 0; - err = monero_io_fetch_decrypt_key(priv, sizeof(priv)); - if (err) { - explicit_bzero(priv, sizeof(priv)); - return err; - } - monero_io_fetch(pub, 32); + switch (G_monero_vstate.io_p1) { + case 0: { + unsigned char priv[32]; + err = monero_io_fetch_decrypt_key(priv, sizeof(priv)); + if (err) { + explicit_bzero(priv, sizeof(priv)); + return err; + } - err = monero_secret_key_to_public_key(computed_pub, priv, sizeof(computed_pub), sizeof(priv)); - explicit_bzero(priv, sizeof(priv)); + err = monero_secret_key_to_public_key(computed_pub, priv, sizeof(computed_pub), + sizeof(priv)); + explicit_bzero(priv, sizeof(priv)); - switch (G_monero_vstate.io_p1) { - case 0: if (err) { return err; } break; + } case 1: + monero_io_skip(32); memcpy(computed_pub, G_monero_vstate.A, 32); break; case 2: + monero_io_skip(32); memcpy(computed_pub, G_monero_vstate.B, 32); break; default: return SW_WRONG_P1P2; } + + monero_io_fetch(pub, 32); + if (memcmp(computed_pub, pub, 32) == 0) { verified = 1; } @@ -1005,7 +1011,7 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se } } } else { - memset(additional_txkey_pub, 0, 32); + explicit_bzero(additional_txkey_pub, 32); } // derivation diff --git a/src/monero_main.c b/src/monero_main.c index 9a26165..a52f60f 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -40,7 +40,7 @@ void __attribute__((noreturn)) send_error_and_kill_app(int sw) { monero_io_discard(1); monero_io_insert_u16(sw); monero_io_do(IO_RETURN_AFTER_TX); - memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); + explicit_bzero(&G_monero_vstate, sizeof(G_monero_vstate)); app_exit(); } @@ -51,7 +51,7 @@ void app_main(void) { error = monero_init(); if (error) { - memset(&G_monero_vstate, 0, sizeof(G_monero_vstate)); + explicit_bzero(&G_monero_vstate, sizeof(G_monero_vstate)); app_exit(); } diff --git a/src/monero_open_tx.c b/src/monero_open_tx.c index 8e8183d..54f3f3c 100644 --- a/src/monero_open_tx.c +++ b/src/monero_open_tx.c @@ -27,8 +27,8 @@ /* ----------------------------------------------------------------------- */ int monero_reset_tx(int reset_tx_cnt) { int error; - memset(G_monero_vstate.r, 0, 32); - memset(G_monero_vstate.R, 0, 32); + explicit_bzero(G_monero_vstate.r, 32); + explicit_bzero(G_monero_vstate.R, 32); cx_rng(G_monero_vstate.hmac_key, 32); error = monero_keccak_init_H(); diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 1b4523b..6c5aca1 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -130,7 +130,7 @@ unsigned int ui_menu_opentx_action(unsigned int value) { unsigned char x[32]; monero_io_discard(0); - memset(x, 0, 32); + explicit_bzero(x, 32); if (value == ACCEPT) { sw = monero_apdu_open_tx_cont(); @@ -308,7 +308,7 @@ unsigned int ui_menu_export_viewkey_action(unsigned int value) { unsigned char x[32]; monero_io_discard(0); - memset(x, 0, 32); + explicit_bzero(x, 32); sw = SW_OK; if (value == ACCEPT) { @@ -616,7 +616,7 @@ void ui_menu_pubaddr_action(unsigned int value __attribute__((unused))) { int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), unsigned char* pub_view, unsigned char* pub_spend, unsigned char is_subbadress, unsigned char* paymanetID) { - memset(G_monero_vstate.ux_address, 0, sizeof(G_monero_vstate.ux_address)); + explicit_bzero(G_monero_vstate.ux_address, sizeof(G_monero_vstate.ux_address)); switch (G_monero_vstate.disp_addr_mode) { case 0: diff --git a/src/monero_ux_stax.c b/src/monero_ux_stax.c index d2c82ba..eb5e17a 100644 --- a/src/monero_ux_stax.c +++ b/src/monero_ux_stax.c @@ -381,7 +381,7 @@ int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), unsi unsigned char* pub_spend, unsigned char is_subbadress, unsigned char* paymanetID) { int error; - memset(G_monero_vstate.ux_address, 0, sizeof(G_monero_vstate.ux_address)); + explicit_bzero(G_monero_vstate.ux_address, sizeof(G_monero_vstate.ux_address)); error = monero_base58_public_key(G_monero_vstate.ux_address, pub_view, pub_spend, is_subbadress, paymanetID); @@ -401,7 +401,7 @@ static void ui_menu_export_viewkey_action(bool value) { unsigned char x[32]; monero_io_discard(0); - memset(x, 0, 32); + explicit_bzero(x, 32); sw = SW_OK; if (value) { diff --git a/src/monero_ux_stax_menu.c b/src/monero_ux_stax_menu.c index b3bba36..f3551d5 100644 --- a/src/monero_ux_stax_menu.c +++ b/src/monero_ux_stax_menu.c @@ -240,7 +240,7 @@ static void display_settings_menu(void) { void ui_menu_main_display(void) { update_account(); - memset(G_monero_vstate.ux_address, 0, sizeof(G_monero_vstate.ux_address)); + explicit_bzero(G_monero_vstate.ux_address, sizeof(G_monero_vstate.ux_address)); snprintf(transactionContext.buffer, sizeof(transactionContext.buffer), "Show %s", G_monero_vstate.ux_wallet_account_name); From bedba9d7e05d0830993174a3ca4283b39d7b6cf8 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 20 Feb 2024 17:55:13 +0100 Subject: [PATCH 132/142] Clean: remove dead code --- Makefile | 2 -- src/monero_crypto.c | 36 +++++++++--------------------------- src/monero_ux_msg.c | 20 -------------------- src/monero_ux_msg.h | 30 ------------------------------ src/monero_ux_nano.c | 15 --------------- src/monero_ux_stax.c | 1 - src/monero_ux_stax_menu.c | 1 - 7 files changed, 9 insertions(+), 96 deletions(-) delete mode 100644 src/monero_ux_msg.c delete mode 100644 src/monero_ux_msg.h diff --git a/Makefile b/Makefile index 5240eb1..8f7068d 100644 --- a/Makefile +++ b/Makefile @@ -68,8 +68,6 @@ DEFINES += SPEC_VERSION=$(SPECVERSION) #DEFINES += MONERO_BETA -#DEFINES += IOCRYPT - ############ # Platform # ############ diff --git a/src/monero_crypto.c b/src/monero_crypto.c index 3b0b26a..ee41a97 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -343,32 +343,15 @@ int monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t g int error = 0; #define MOD (unsigned char *)C_ED25519_FIELD, 32 #define fe_isnegative(f) (f[31] & 1) -#if 0 - unsigned char u[32], v[32], w[32], x[32], y[32], z[32]; - unsigned char rX[32], rY[32], rZ[32]; - union { - struct { - unsigned char _uv7[32]; - unsigned char _v3[32]; - }; - unsigned char _Pxy[65]; - - } uv; - -#define uv7 uv._uv7 -#define v3 uv._v3 - -#define Pxy uv._Pxy -#else -#define u (G_monero_vstate.io_buffer + 0 * 32) -#define v (G_monero_vstate.io_buffer + 1 * 32) -#define w (G_monero_vstate.io_buffer + 2 * 32) -#define x (G_monero_vstate.io_buffer + 3 * 32) -#define y (G_monero_vstate.io_buffer + 4 * 32) -#define z (G_monero_vstate.io_buffer + 5 * 32) -#define rX (G_monero_vstate.io_buffer + 6 * 32) -#define rY (G_monero_vstate.io_buffer + 7 * 32) -#define rZ (G_monero_vstate.io_buffer + 8 * 32) +#define u (G_monero_vstate.io_buffer + 0 * 32) +#define v (G_monero_vstate.io_buffer + 1 * 32) +#define w (G_monero_vstate.io_buffer + 2 * 32) +#define x (G_monero_vstate.io_buffer + 3 * 32) +#define y (G_monero_vstate.io_buffer + 4 * 32) +#define z (G_monero_vstate.io_buffer + 5 * 32) +#define rX (G_monero_vstate.io_buffer + 6 * 32) +#define rY (G_monero_vstate.io_buffer + 7 * 32) +#define rZ (G_monero_vstate.io_buffer + 8 * 32) union { unsigned char _Pxy[PXY_SIZE]; @@ -386,7 +369,6 @@ int monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes, size_t g #if MONERO_IO_BUFFER_LENGTH < (9 * 32) #error MONERO_IO_BUFFER_LENGTH is too small -#endif #endif unsigned char sign; diff --git a/src/monero_ux_msg.c b/src/monero_ux_msg.c deleted file mode 100644 index e9948a1..0000000 --- a/src/monero_ux_msg.c +++ /dev/null @@ -1,20 +0,0 @@ -/***************************************************************************** - * Ledger Monero App. - * (c) 2017-2020 Cedric Mesnil , Ledger SAS. - * (c) 2020 Ledger SAS. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *****************************************************************************/ - -const char* const C_OK = "OK"; -const char* const C_NOK = "NOK"; diff --git a/src/monero_ux_msg.h b/src/monero_ux_msg.h deleted file mode 100644 index bafdf48..0000000 --- a/src/monero_ux_msg.h +++ /dev/null @@ -1,30 +0,0 @@ -/***************************************************************************** - * Ledger Monero App. - * (c) 2017-2020 Cedric Mesnil , Ledger SAS. - * (c) 2020 Ledger SAS. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *****************************************************************************/ - -#ifndef MONERO_UX_MSG_H -#define MONERO_UX_MSG_H - -extern const char* const C_OK; -extern const char* const C_NOK; - -#define PICSTR(x) ((char*)PIC(x)) - -#define OK PICSTR(C_OK) -#define NOK PICSTR(C_NOK) - -#endif diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 6c5aca1..2a53437 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -24,7 +24,6 @@ #include "monero_api.h" #include "monero_vars.h" -#include "monero_ux_msg.h" #include "os_io_seproxyhal.h" #include "string.h" #include "glyphs.h" @@ -127,10 +126,8 @@ UX_FLOW(ux_flow_opentx, &ux_menu_opentx_1_step, &ux_menu_opentx_2_step, &ux_menu unsigned int ui_menu_opentx_action(unsigned int value) { unsigned int sw = SW_OK; - unsigned char x[32]; monero_io_discard(0); - explicit_bzero(x, 32); if (value == ACCEPT) { sw = monero_apdu_open_tx_cont(); @@ -145,17 +142,6 @@ unsigned int ui_menu_opentx_action(unsigned int value) { return 0; } -#if 0 -void ui_menu_opentx_display(unsigned int value) { - if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { - ux_flow_init(0, ux_flow_opentx,NULL); - } else { - snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "Prepare new"); - snprintf(G_monero_vstate.ux_info2, sizeof(G_monero_vstate.ux_info2), "TX / %d", G_monero_vstate.tx_cnt); - ui_menu_info_display(0); - } -} -#else void ui_menu_opentx_display(unsigned int value __attribute__((unused))) { uint32_t i; if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { @@ -169,7 +155,6 @@ void ui_menu_opentx_display(unsigned int value __attribute__((unused))) { G_monero_vstate.ux_info2[i] = 0; ui_menu_info_display(0); } -#endif /* ----------------- FEE/CHANGE/TIMELOCK VALIDATION ----------------- */ diff --git a/src/monero_ux_stax.c b/src/monero_ux_stax.c index eb5e17a..174d848 100644 --- a/src/monero_ux_stax.c +++ b/src/monero_ux_stax.c @@ -23,7 +23,6 @@ #include "monero_api.h" #include "monero_vars.h" -#include "monero_ux_msg.h" #include "os_io_seproxyhal.h" #include "string.h" #include "glyphs.h" diff --git a/src/monero_ux_stax_menu.c b/src/monero_ux_stax_menu.c index f3551d5..fa1b8bc 100644 --- a/src/monero_ux_stax_menu.c +++ b/src/monero_ux_stax_menu.c @@ -23,7 +23,6 @@ #include "monero_api.h" #include "monero_vars.h" -#include "monero_ux_msg.h" #include "os_io_seproxyhal.h" #include "string.h" #include "glyphs.h" From 839fdb0e1bee767a8131d49ec54e9def2c73ad87 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 20 Feb 2024 17:56:32 +0100 Subject: [PATCH 133/142] Fix: replace memcpy with strncpy --- src/monero_ux_nano.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 2a53437..6f643c4 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -606,21 +606,21 @@ int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), unsi switch (G_monero_vstate.disp_addr_mode) { case 0: case DISP_MAIN: - memcpy(ADDR_TYPE, "Main", 4); - memcpy(ADDR_MAJOR, "Major: 0", 8); - memcpy(ADDR_MINOR, "minor: 0", 8); + memcpy(ADDR_TYPE, "Main", sizeof("Main")); + memcpy(ADDR_MAJOR, "Major: 0", sizeof("Major: 0")); + memcpy(ADDR_MINOR, "minor: 0", sizeof("minor: 0")); break; case DISP_SUB: - memcpy(ADDR_TYPE, "Sub", 3); + memcpy(ADDR_TYPE, "Sub", sizeof("Sub")); snprintf(ADDR_MAJOR, 16, "Major: %d", G_monero_vstate.disp_addr_M); snprintf(ADDR_MINOR, 16, "minor: %d", G_monero_vstate.disp_addr_m); break; case DISP_INTEGRATED: - memcpy(ADDR_TYPE, "Integrated", 10); - memcpy(ADDR_IDSTR, "Payment ID", 10); - memcpy(ADDR_ID, G_monero_vstate.payment_id, 16); + memcpy(ADDR_TYPE, "Integrated", sizeof("Integrated")); + memcpy(ADDR_IDSTR, "Payment ID", sizeof("Payment ID")); + strncpy(ADDR_ID, G_monero_vstate.payment_id, 16); break; } From 2fb84764c05fcae537a95bfb7737a7477bbb298b Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 20 Feb 2024 17:56:51 +0100 Subject: [PATCH 134/142] Clean: remove outdated comment and unify return type --- src/monero_api.h | 2 +- src/monero_crypto.c | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index e2584c4..195cac4 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -113,7 +113,7 @@ int monero_vamount2str(unsigned char *binary, char *str, unsigned int str_len); /** binary little endian unsigned int amount to str */ int monero_bamount2str(unsigned char *binary, char *str, size_t binary_len, unsigned int str_len); /** uint64 amount to str */ -int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len); +unsigned int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len); /** uint64 amount to str */ unsigned int monero_uint642str(uint64_t val, char *str, unsigned int str_len); diff --git a/src/monero_crypto.c b/src/monero_crypto.c index ee41a97..05155fc 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -1284,7 +1284,6 @@ int monero_rng_mod_order(unsigned char *r, size_t r_len) { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -/* return 0 if ok, 1 if missing decimal */ unsigned int monero_uint642str(uint64_t val, char *str, unsigned int str_len) { char stramount[22]; unsigned int offset, len; @@ -1312,8 +1311,7 @@ unsigned int monero_uint642str(uint64_t val, char *str, unsigned int str_len) { /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -/* return 0 if ok, 1 if missing decimal */ -int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { +unsigned int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { // max uint64 is 18446744073709551616, aka 20 char, plus dot char stramount[22]; unsigned int offset, len; From 2b50786ea1e72c4c612a3adab098f3a2b62fd342 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Wed, 21 Feb 2024 12:12:01 +0100 Subject: [PATCH 135/142] Clean: replace magic values with define --- src/monero_api.h | 4 +- src/monero_blind.c | 12 +- src/monero_crypto.c | 10 +- src/monero_init.c | 14 +-- src/monero_key.c | 258 ++++++++++++++++++++++--------------------- src/monero_monero.c | 4 +- src/monero_open_tx.c | 22 ++-- src/monero_prehash.c | 12 +- src/monero_stealth.c | 8 +- src/monero_types.h | 18 +-- src/monero_ux_nano.c | 8 +- src/monero_ux_stax.c | 8 +- 12 files changed, 191 insertions(+), 187 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index 195cac4..2238d80 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -134,8 +134,8 @@ void display_account(void); /* ----------------------------------------------------------------------- */ /* --- KEYS & ADDRESS ---- */ /* ----------------------------------------------------------------------- */ -extern const unsigned char C_FAKE_SEC_VIEW_KEY[32]; -extern const unsigned char C_FAKE_SEC_SPEND_KEY[32]; +extern const unsigned char C_FAKE_SEC_VIEW_KEY[KEY_SIZE]; +extern const unsigned char C_FAKE_SEC_SPEND_KEY[KEY_SIZE]; int is_fake_view_key(unsigned char *s); int is_fake_spend_key(unsigned char *s); diff --git a/src/monero_blind.c b/src/monero_blind.c index 58289ae..47b15aa 100644 --- a/src/monero_blind.c +++ b/src/monero_blind.c @@ -28,10 +28,10 @@ int monero_apdu_blind() { unsigned char v[32]; unsigned char k[32]; - unsigned char AKout[32]; + unsigned char AKout[KEY_SIZE]; int err = 0; - err = monero_io_fetch_decrypt(AKout, 32, TYPE_AMOUNT_KEY); + err = monero_io_fetch_decrypt(AKout, KEY_SIZE, TYPE_AMOUNT_KEY); if (err) { return err; } @@ -132,10 +132,10 @@ int monero_unblind(unsigned char *v, unsigned char *k, unsigned char *AKout, int monero_apdu_unblind() { unsigned char v[32]; unsigned char k[32]; - unsigned char AKout[32]; + unsigned char AKout[KEY_SIZE]; int err = 0; - err = monero_io_fetch_decrypt(AKout, 32, TYPE_AMOUNT_KEY); + err = monero_io_fetch_decrypt(AKout, KEY_SIZE, TYPE_AMOUNT_KEY); if (err) { return err; } @@ -162,10 +162,10 @@ int monero_apdu_unblind() { /* ----------------------------------------------------------------------- */ int monero_apdu_gen_commitment_mask() { unsigned char k[32]; - unsigned char AKout[32]; + unsigned char AKout[KEY_SIZE]; int err = 0; - err = monero_io_fetch_decrypt(AKout, 32, TYPE_AMOUNT_KEY); + err = monero_io_fetch_decrypt(AKout, KEY_SIZE, TYPE_AMOUNT_KEY); if (err) { return err; } diff --git a/src/monero_crypto.c b/src/monero_crypto.c index 05155fc..f986f93 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -59,7 +59,7 @@ unsigned char const C_EIGHT[32] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0 /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_aes_derive(cx_aes_key_t *sk, unsigned char *seed32, unsigned char *a, unsigned char *b) { - unsigned char h1[32]; + unsigned char h1[KEY_SIZE]; int error; error = monero_keccak_init_H(); @@ -67,17 +67,17 @@ int monero_aes_derive(cx_aes_key_t *sk, unsigned char *seed32, unsigned char *a, return error; } - error = monero_keccak_update_H(seed32, 32); + error = monero_keccak_update_H(seed32, KEY_SIZE); if (error) { return error; } - error = monero_keccak_update_H(a, 32); + error = monero_keccak_update_H(a, KEY_SIZE); if (error) { return error; } - error = monero_keccak_update_H(b, 32); + error = monero_keccak_update_H(b, KEY_SIZE); if (error) { return error; } @@ -87,7 +87,7 @@ int monero_aes_derive(cx_aes_key_t *sk, unsigned char *seed32, unsigned char *a, return error; } - error = monero_keccak_H(h1, 32, h1); + error = monero_keccak_H(h1, KEY_SIZE, h1); if (error) { return error; } diff --git a/src/monero_init.c b/src/monero_init.c index b7bb3a1..f22d905 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -27,10 +27,10 @@ /* ----------------------*/ const unsigned char C_MAGIC[8] = {'M', 'O', 'N', 'E', 'R', 'O', 'H', 'W'}; -const unsigned char C_FAKE_SEC_VIEW_KEY[32] = { +const unsigned char C_FAKE_SEC_VIEW_KEY[KEY_SIZE] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; -const unsigned char C_FAKE_SEC_SPEND_KEY[32] = { +const unsigned char C_FAKE_SEC_SPEND_KEY[KEY_SIZE] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; @@ -72,7 +72,7 @@ unsigned int monero_init() { int monero_init_private_key(void) { unsigned int path[5]; unsigned char seed[64]; - unsigned char chain[32]; + unsigned char chain[KEY_SIZE]; int error; // generate account keys @@ -91,7 +91,7 @@ int monero_init_private_key(void) { switch (N_monero_pstate->key_mode) { case KEY_MODE_SEED: - error = monero_keccak_F(seed, 32, G_monero_vstate.b); + error = monero_keccak_F(seed, KEY_SIZE, G_monero_vstate.b); if (error) { return error; } @@ -102,7 +102,7 @@ int monero_init_private_key(void) { return error; } - error = monero_keccak_F(G_monero_vstate.b, 32, G_monero_vstate.a); + error = monero_keccak_F(G_monero_vstate.b, KEY_SIZE, G_monero_vstate.a); if (error) { return error; } @@ -115,8 +115,8 @@ int monero_init_private_key(void) { break; case KEY_MODE_EXTERNAL: - memcpy(G_monero_vstate.a, (void*)N_monero_pstate->a, 32); - memcpy(G_monero_vstate.b, (void*)N_monero_pstate->b, 32); + memcpy(G_monero_vstate.a, (void*)N_monero_pstate->a, KEY_SIZE); + memcpy(G_monero_vstate.b, (void*)N_monero_pstate->b, KEY_SIZE); break; default: diff --git a/src/monero_key.c b/src/monero_key.c index 5c71a49..36b3edd 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -200,8 +200,8 @@ int monero_apdu_display_address() { unsigned int minor; unsigned char index[8]; unsigned char payment_id[8]; - unsigned char C[32]; - unsigned char D[32]; + unsigned char C[KEY_SIZE]; + unsigned char D[KEY_SIZE]; int error = 0; // fetch @@ -222,8 +222,8 @@ int monero_apdu_display_address() { return error; } } else { - memcpy(C, G_monero_vstate.A, 32); - memcpy(D, G_monero_vstate.B, 32); + memcpy(C, G_monero_vstate.A, KEY_SIZE); + memcpy(D, G_monero_vstate.B, KEY_SIZE); } // prepare UI @@ -249,52 +249,52 @@ int monero_apdu_display_address() { /* --- --- */ /* ----------------------------------------------------------------------- */ int is_fake_view_key(unsigned char *s) { - return memcmp(s, C_FAKE_SEC_VIEW_KEY, 32) == 0; + return memcmp(s, C_FAKE_SEC_VIEW_KEY, KEY_SIZE) == 0; } int is_fake_spend_key(unsigned char *s) { - return memcmp(s, C_FAKE_SEC_SPEND_KEY, 32) == 0; + return memcmp(s, C_FAKE_SEC_SPEND_KEY, KEY_SIZE) == 0; } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_put_key() { - unsigned char raw[32]; - unsigned char pub[32]; - unsigned char sec[32]; + unsigned char raw[KEY_SIZE]; + unsigned char pub[KEY_SIZE]; + unsigned char sec[KEY_SIZE]; int err; // option + priv/pub view key + priv/pub spend key + base58 address - if (G_monero_vstate.io_length != (1 + 32 * 2 + 32 * 2 + 95)) { + if (G_monero_vstate.io_length != (1 + KEY_SIZE * 2 + KEY_SIZE * 2 + 95)) { return SW_WRONG_LENGTH; } // view key - monero_io_fetch(sec, 32); - monero_io_fetch(pub, 32); + monero_io_fetch(sec, KEY_SIZE); + monero_io_fetch(pub, KEY_SIZE); err = monero_ecmul_G(raw, sec, sizeof(raw), sizeof(sec)); if (err) { return err; } - if (memcmp(pub, raw, 32) != 0) { + if (memcmp(pub, raw, KEY_SIZE) != 0) { return SW_WRONG_DATA; } - nvm_write((void *)N_monero_pstate->a, sec, 32); + nvm_write((void *)N_monero_pstate->a, sec, KEY_SIZE); // spend key - monero_io_fetch(sec, 32); - monero_io_fetch(pub, 32); + monero_io_fetch(sec, KEY_SIZE); + monero_io_fetch(pub, KEY_SIZE); err = monero_ecmul_G(raw, sec, sizeof(raw), sizeof(sec)); if (err) { return err; } - if (memcmp(pub, raw, 32) != 0) { + if (memcmp(pub, raw, KEY_SIZE) != 0) { return SW_WRONG_DATA; } - nvm_write((void *)N_monero_pstate->b, sec, 32); + nvm_write((void *)N_monero_pstate->b, sec, KEY_SIZE); // change mode unsigned char key_mode = KEY_MODE_EXTERNAL; @@ -314,9 +314,9 @@ int monero_apdu_get_key() { // get pub case 1: // view key - monero_io_insert(G_monero_vstate.A, 32); + monero_io_insert(G_monero_vstate.A, KEY_SIZE); // spend key - monero_io_insert(G_monero_vstate.B, 32); + monero_io_insert(G_monero_vstate.B, KEY_SIZE); // public base address int error = monero_base58_public_key( (char *)G_monero_vstate.io_buffer + G_monero_vstate.io_offset, G_monero_vstate.A, @@ -331,7 +331,7 @@ int monero_apdu_get_key() { case 2: // view key if (G_monero_vstate.export_view_key == EXPORT_VIEW_KEY) { - monero_io_insert(G_monero_vstate.a, 32); + monero_io_insert(G_monero_vstate.a, KEY_SIZE); } else { ui_export_viewkey_display(0); return 0; @@ -354,18 +354,18 @@ int monero_apdu_get_key() { if (os_derive_bip32_no_throw(CX_CURVE_SECP256K1, path, 5, seed, G_monero_vstate.a)) { return SW_WRONG_DATA; } - monero_io_insert(seed, 32); + monero_io_insert(seed, KEY_SIZE); - monero_io_insert(G_monero_vstate.b, 32); - monero_io_insert(G_monero_vstate.a, 32); + monero_io_insert(G_monero_vstate.b, KEY_SIZE); + monero_io_insert(G_monero_vstate.a, KEY_SIZE); break; } // get info case 4: - monero_io_insert(G_monero_vstate.a, 32); - monero_io_insert(G_monero_vstate.b, 32); + monero_io_insert(G_monero_vstate.a, KEY_SIZE); + monero_io_insert(G_monero_vstate.b, KEY_SIZE); break; #endif @@ -379,14 +379,14 @@ int monero_apdu_get_key() { /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_verify_key() { - unsigned char pub[32]; - unsigned char computed_pub[32]; + unsigned char pub[KEY_SIZE]; + unsigned char computed_pub[KEY_SIZE]; unsigned int verified = 0; int err = 0; switch (G_monero_vstate.io_p1) { case 0: { - unsigned char priv[32]; + unsigned char priv[KEY_SIZE]; err = monero_io_fetch_decrypt_key(priv, sizeof(priv)); if (err) { explicit_bzero(priv, sizeof(priv)); @@ -403,20 +403,20 @@ int monero_apdu_verify_key() { break; } case 1: - monero_io_skip(32); - memcpy(computed_pub, G_monero_vstate.A, 32); + monero_io_skip(KEY_SIZE); + memcpy(computed_pub, G_monero_vstate.A, KEY_SIZE); break; case 2: - monero_io_skip(32); - memcpy(computed_pub, G_monero_vstate.B, 32); + monero_io_skip(KEY_SIZE); + memcpy(computed_pub, G_monero_vstate.B, KEY_SIZE); break; default: return SW_WRONG_P1P2; } - monero_io_fetch(pub, 32); + monero_io_fetch(pub, sizeof(pub)); - if (memcmp(computed_pub, pub, 32) == 0) { + if (memcmp(computed_pub, pub, sizeof(pub)) == 0) { verified = 1; } @@ -431,11 +431,11 @@ int monero_apdu_verify_key() { #define CHACHA8_KEY_TAIL 0x8c int monero_apdu_get_chacha8_prekey(/*char *prekey*/) { unsigned char abt[65]; - unsigned char pre[32]; + unsigned char pre[KEY_SIZE]; monero_io_discard(0); - memcpy(abt, G_monero_vstate.a, 32); - memcpy(abt + 32, G_monero_vstate.b, 32); + memcpy(abt, G_monero_vstate.a, KEY_SIZE); + memcpy(abt + KEY_SIZE, G_monero_vstate.b, KEY_SIZE); abt[64] = CHACHA8_KEY_TAIL; int error = monero_keccak_F(abt, 65, pre); if (error) { @@ -450,17 +450,17 @@ int monero_apdu_get_chacha8_prekey(/*char *prekey*/) { /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_sc_add(/*unsigned char *r, unsigned char *s1, unsigned char *s2*/) { - unsigned char s1[32]; - unsigned char s2[32]; - unsigned char r[32]; + unsigned char s1[KEY_SIZE]; + unsigned char s2[KEY_SIZE]; + unsigned char r[KEY_SIZE]; int err; // fetch - err = monero_io_fetch_decrypt(s1, 32, TYPE_SCALAR); + err = monero_io_fetch_decrypt(s1, KEY_SIZE, TYPE_SCALAR); if (err) { explicit_bzero(s1, sizeof(s1)); return err; } - err = monero_io_fetch_decrypt(s2, 32, TYPE_SCALAR); + err = monero_io_fetch_decrypt(s2, KEY_SIZE, TYPE_SCALAR); if (err) { explicit_bzero(s1, sizeof(s1)); explicit_bzero(s2, sizeof(s2)); @@ -473,8 +473,8 @@ int monero_apdu_sc_add(/*unsigned char *r, unsigned char *s1, unsigned char *s2* // https://github.com/monero-project/monero/blob/v0.15.0.5/src/cryptonote_basic/cryptonote_format_utils.cpp#L331 // // hwdev.sc_secret_add(scalar_step2, scalar_step1,subaddr_sk); - if ((memcmp(s1, G_monero_vstate.last_derive_secret_key, 32) != 0) || - (memcmp(s2, G_monero_vstate.last_get_subaddress_secret_key, 32) != 0)) { + if ((memcmp(s1, G_monero_vstate.last_derive_secret_key, KEY_SIZE) != 0) || + (memcmp(s2, G_monero_vstate.last_get_subaddress_secret_key, KEY_SIZE) != 0)) { explicit_bzero(s1, sizeof(s1)); explicit_bzero(s2, sizeof(s2)); return SW_WRONG_DATA; @@ -487,7 +487,7 @@ int monero_apdu_sc_add(/*unsigned char *r, unsigned char *s1, unsigned char *s2* explicit_bzero(r, sizeof(r)); return err; } - monero_io_insert_encrypt(r, 32, TYPE_SCALAR); + monero_io_insert_encrypt(r, KEY_SIZE, TYPE_SCALAR); explicit_bzero(s1, sizeof(s1)); explicit_bzero(s2, sizeof(s2)); explicit_bzero(r, sizeof(r)); @@ -498,13 +498,13 @@ int monero_apdu_sc_add(/*unsigned char *r, unsigned char *s1, unsigned char *s2* /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_scal_mul_key(/*const rct::key &pub, const rct::key &sec, rct::key mulkey*/) { - unsigned char pub[32]; - unsigned char sec[32]; - unsigned char r[32]; + unsigned char pub[KEY_SIZE]; + unsigned char sec[KEY_SIZE]; + unsigned char r[KEY_SIZE]; int err = 0; // fetch - monero_io_fetch(pub, 32); + monero_io_fetch(pub, KEY_SIZE); err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); if (err) { explicit_bzero(sec, sizeof(sec)); @@ -517,7 +517,7 @@ int monero_apdu_scal_mul_key(/*const rct::key &pub, const rct::key &sec, rct::ke explicit_bzero(sec, sizeof(sec)); return err; } - monero_io_insert(r, 32); + monero_io_insert(r, KEY_SIZE); explicit_bzero(sec, sizeof(sec)); return SW_OK; } @@ -526,11 +526,11 @@ int monero_apdu_scal_mul_key(/*const rct::key &pub, const rct::key &sec, rct::ke /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_scal_mul_base(/*const rct::key &sec, rct::key mulkey*/) { - unsigned char sec[32]; - unsigned char r[32]; + unsigned char sec[KEY_SIZE]; + unsigned char r[KEY_SIZE]; int err; // fetch - err = monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); + err = monero_io_fetch_decrypt(sec, KEY_SIZE, TYPE_SCALAR); if (err) { explicit_bzero(sec, sizeof(sec)); return err; @@ -543,7 +543,7 @@ int monero_apdu_scal_mul_base(/*const rct::key &sec, rct::key mulkey*/) { return err; } - monero_io_insert(r, 32); + monero_io_insert(r, KEY_SIZE); explicit_bzero(sec, sizeof(sec)); return SW_OK; } @@ -552,8 +552,8 @@ int monero_apdu_scal_mul_base(/*const rct::key &sec, rct::key mulkey*/) { /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_generate_keypair(/*crypto::public_key &pub, crypto::secret_key &sec*/) { - unsigned char sec[32]; - unsigned char pub[32]; + unsigned char sec[KEY_SIZE]; + unsigned char pub[KEY_SIZE]; monero_io_discard(0); int error = monero_generate_keypair(pub, sec, sizeof(pub), sizeof(sec)); @@ -561,8 +561,8 @@ int monero_apdu_generate_keypair(/*crypto::public_key &pub, crypto::secret_key & explicit_bzero(sec, sizeof(sec)); return error; } - monero_io_insert(pub, 32); - monero_io_insert_encrypt(sec, 32, TYPE_SCALAR); + monero_io_insert(pub, KEY_SIZE); + monero_io_insert_encrypt(sec, KEY_SIZE, TYPE_SCALAR); explicit_bzero(sec, sizeof(sec)); return SW_OK; } @@ -572,10 +572,10 @@ int monero_apdu_generate_keypair(/*crypto::public_key &pub, crypto::secret_key & /* ----------------------------------------------------------------------- */ int monero_apdu_secret_key_to_public_key( /*const crypto::secret_key &sec, crypto::public_key &pub*/) { - unsigned char sec[32]; - unsigned char pub[32]; + unsigned char sec[KEY_SIZE]; + unsigned char pub[KEY_SIZE]; // fetch - int err = monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); + int err = monero_io_fetch_decrypt(sec, KEY_SIZE, TYPE_SCALAR); if (err) { explicit_bzero(sec, sizeof(sec)); return err; @@ -589,7 +589,7 @@ int monero_apdu_secret_key_to_public_key( } // pub key - monero_io_insert(pub, 32); + monero_io_insert(pub, KEY_SIZE); explicit_bzero(sec, sizeof(sec)); return SW_OK; } @@ -598,13 +598,13 @@ int monero_apdu_secret_key_to_public_key( /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_generate_key_derivation(/*const crypto::public_key &pub, const crypto::secret_key &sec, crypto::key_derivation &derivation*/) { - unsigned char pub[32]; - unsigned char sec[32]; - unsigned char drv[32]; + unsigned char pub[KEY_SIZE]; + unsigned char sec[KEY_SIZE]; + unsigned char drv[KEY_SIZE]; int err = 0; // fetch - monero_io_fetch(pub, 32); + monero_io_fetch(pub, KEY_SIZE); err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); if (err) { explicit_bzero(sec, sizeof(sec)); @@ -621,7 +621,7 @@ int monero_apdu_generate_key_derivation(/*const crypto::public_key &pub, const c return err; } - monero_io_insert_encrypt(drv, 32, TYPE_DERIVATION); + monero_io_insert_encrypt(drv, KEY_SIZE, TYPE_DERIVATION); explicit_bzero(sec, sizeof(sec)); explicit_bzero(drv, sizeof(drv)); return SW_OK; @@ -632,12 +632,12 @@ int monero_apdu_generate_key_derivation(/*const crypto::public_key &pub, const c /* ----------------------------------------------------------------------- */ int monero_apdu_derivation_to_scalar( /*const crypto::key_derivation &derivation, const size_t output_index, ec_scalar &res*/) { - unsigned char derivation[32]; + unsigned char derivation[KEY_SIZE]; unsigned int output_index; - unsigned char res[32]; + unsigned char res[KEY_SIZE]; // fetch - int err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + int err = monero_io_fetch_decrypt(derivation, KEY_SIZE, TYPE_DERIVATION); if (err) { explicit_bzero(derivation, sizeof(derivation)); return err; @@ -655,7 +655,7 @@ int monero_apdu_derivation_to_scalar( } // pub key - monero_io_insert_encrypt(res, 32, TYPE_SCALAR); + monero_io_insert_encrypt(res, KEY_SIZE, TYPE_SCALAR); explicit_bzero(derivation, sizeof(derivation)); explicit_bzero(res, sizeof(res)); return SW_OK; @@ -665,19 +665,19 @@ int monero_apdu_derivation_to_scalar( /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_derive_public_key(/*const crypto::key_derivation &derivation, const std::size_t output_index, const crypto::public_key &pub, public_key &derived_pub*/) { - unsigned char derivation[32]; + unsigned char derivation[KEY_SIZE]; unsigned int output_index; - unsigned char pub[32]; - unsigned char drvpub[32]; + unsigned char pub[KEY_SIZE]; + unsigned char drvpub[KEY_SIZE]; // fetch - int err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + int err = monero_io_fetch_decrypt(derivation, KEY_SIZE, TYPE_DERIVATION); if (err) { explicit_bzero(derivation, sizeof(derivation)); return err; } output_index = monero_io_fetch_u32(); - monero_io_fetch(pub, 32); + monero_io_fetch(pub, KEY_SIZE); monero_io_discard(0); // pub @@ -689,7 +689,7 @@ int monero_apdu_derive_public_key(/*const crypto::key_derivation &derivation, co } // pub key - monero_io_insert(drvpub, 32); + monero_io_insert(drvpub, KEY_SIZE); explicit_bzero(derivation, sizeof(derivation)); return SW_OK; } @@ -698,14 +698,14 @@ int monero_apdu_derive_public_key(/*const crypto::key_derivation &derivation, co /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_derive_secret_key(/*const crypto::key_derivation &derivation, const std::size_t output_index, const crypto::secret_key &sec, secret_key &derived_sec*/){ - unsigned char derivation[32]; + unsigned char derivation[KEY_SIZE]; unsigned int output_index; - unsigned char sec[32]; - unsigned char drvsec[32]; + unsigned char sec[KEY_SIZE]; + unsigned char drvsec[KEY_SIZE]; int err = 0; // fetch - err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + err = monero_io_fetch_decrypt(derivation, KEY_SIZE, TYPE_DERIVATION); if (err) { explicit_bzero(derivation, sizeof(derivation)); return err; @@ -730,8 +730,8 @@ int monero_apdu_derive_secret_key(/*const crypto::key_derivation &derivation, co } // sec key - memcpy(G_monero_vstate.last_derive_secret_key, drvsec, 32); - monero_io_insert_encrypt(drvsec, 32, TYPE_SCALAR); + memcpy(G_monero_vstate.last_derive_secret_key, drvsec, KEY_SIZE); + monero_io_insert_encrypt(drvsec, KEY_SIZE, TYPE_SCALAR); explicit_bzero(derivation, sizeof(derivation)); explicit_bzero(sec, sizeof(sec)); @@ -744,13 +744,13 @@ int monero_apdu_derive_secret_key(/*const crypto::key_derivation &derivation, co /* ----------------------------------------------------------------------- */ int monero_apdu_generate_key_image( /*const crypto::public_key &pub, const crypto::secret_key &sec, crypto::key_image &image*/) { - unsigned char pub[32]; - unsigned char sec[32]; - unsigned char image[32]; + unsigned char pub[KEY_SIZE]; + unsigned char sec[KEY_SIZE]; + unsigned char image[KEY_SIZE]; // fetch - monero_io_fetch(pub, 32); - int err = monero_io_fetch_decrypt(sec, 32, TYPE_SCALAR); + monero_io_fetch(pub, KEY_SIZE); + int err = monero_io_fetch_decrypt(sec, KEY_SIZE, TYPE_SCALAR); if (err) { explicit_bzero(sec, sizeof(sec)); return err; @@ -765,7 +765,7 @@ int monero_apdu_generate_key_image( } // pub key - monero_io_insert(image, 32); + monero_io_insert(image, KEY_SIZE); explicit_bzero(sec, sizeof(sec)); return SW_OK; } @@ -775,13 +775,13 @@ int monero_apdu_generate_key_image( /* ----------------------------------------------------------------------- */ int monero_apdu_derive_view_tag( /*const crypto::key_derivation &derivation, const size_t output_index, crypto::view_tag &view_tag*/) { - unsigned char derivation[32]; + unsigned char derivation[KEY_SIZE]; unsigned int output_index; unsigned char res[1]; int err; // fetch - err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + err = monero_io_fetch_decrypt(derivation, KEY_SIZE, TYPE_DERIVATION); if (err) { explicit_bzero(derivation, sizeof(derivation)); return err; @@ -805,14 +805,14 @@ int monero_apdu_derive_view_tag( /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_derive_subaddress_public_key(/*const crypto::public_key &pub, const crypto::key_derivation &derivation, const std::size_t output_index, public_key &derived_pub*/) { - unsigned char pub[32]; - unsigned char derivation[32]; + unsigned char pub[KEY_SIZE]; + unsigned char derivation[KEY_SIZE]; unsigned int output_index; - unsigned char sub_pub[32]; + unsigned char sub_pub[KEY_SIZE]; // fetch - monero_io_fetch(pub, 32); - int err = monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); + monero_io_fetch(pub, KEY_SIZE); + int err = monero_io_fetch_decrypt(derivation, KEY_SIZE, TYPE_DERIVATION); if (err) { explicit_bzero(derivation, sizeof(derivation)); return err; @@ -828,7 +828,7 @@ int monero_apdu_derive_subaddress_public_key(/*const crypto::public_key &pub, co return err; } // pub key - monero_io_insert(sub_pub, 32); + monero_io_insert(sub_pub, KEY_SIZE); explicit_bzero(derivation, sizeof(derivation)); return SW_OK; } @@ -839,8 +839,8 @@ int monero_apdu_derive_subaddress_public_key(/*const crypto::public_key &pub, co int monero_apdu_get_subaddress( /*const cryptonote::subaddress_index& index, cryptonote::account_public_address &address*/) { unsigned char index[8]; - unsigned char C[32]; - unsigned char D[32]; + unsigned char C[KEY_SIZE]; + unsigned char D[KEY_SIZE]; // fetch monero_io_fetch(index, 8); @@ -853,8 +853,8 @@ int monero_apdu_get_subaddress( } // pub key - monero_io_insert(C, 32); - monero_io_insert(D, 32); + monero_io_insert(C, KEY_SIZE); + monero_io_insert(D, KEY_SIZE); return SW_OK; } @@ -864,7 +864,7 @@ int monero_apdu_get_subaddress( int monero_apdu_get_subaddress_spend_public_key( /*const cryptonote::subaddress_index& index, crypto::public_key D*/) { unsigned char index[8]; - unsigned char D[32]; + unsigned char D[KEY_SIZE]; // fetch monero_io_fetch(index, 8); @@ -877,7 +877,7 @@ int monero_apdu_get_subaddress_spend_public_key( } // pub key - monero_io_insert(D, 32); + monero_io_insert(D, KEY_SIZE); return SW_OK; } @@ -886,9 +886,9 @@ int monero_apdu_get_subaddress_spend_public_key( /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_apdu_get_subaddress_secret_key(/*const crypto::secret_key& sec, const cryptonote::subaddress_index& index, crypto::secret_key &sub_sec*/) { - unsigned char sec[32]; + unsigned char sec[KEY_SIZE]; unsigned char index[8]; - unsigned char sub_sec[32]; + unsigned char sub_sec[KEY_SIZE]; int err = 0; err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); @@ -907,8 +907,8 @@ int monero_apdu_get_subaddress_secret_key(/*const crypto::secret_key& sec, const return err; } - memcpy(G_monero_vstate.last_get_subaddress_secret_key, sub_sec, 32); - monero_io_insert_encrypt(sub_sec, 32, TYPE_SCALAR); + memcpy(G_monero_vstate.last_get_subaddress_secret_key, sub_sec, KEY_SIZE); + monero_io_insert_encrypt(sub_sec, KEY_SIZE, TYPE_SCALAR); explicit_bzero(sec, sizeof(sec)); explicit_bzero(sub_sec, sizeof(sec)); return SW_OK; @@ -920,7 +920,7 @@ int monero_apdu_get_subaddress_secret_key(/*const crypto::secret_key& sec, const int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_sec, crypto::public_key Aout, crypto::public_key Bout, size_t output_index, bool is_change, bool is_subaddress, bool need_additional_key, bool use_view_tags*/) { // IN - unsigned char tx_key[32]; + unsigned char tx_key[KEY_SIZE]; unsigned char *txkey_pub; unsigned char *Aout; unsigned char *Bout; @@ -928,15 +928,15 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se unsigned char is_change; unsigned char is_subaddress; unsigned char need_additional_txkeys; - unsigned char additional_txkey_sec[32]; + unsigned char additional_txkey_sec[KEY_SIZE]; unsigned char use_view_tags; // OUT - unsigned char additional_txkey_pub[32]; + unsigned char additional_txkey_pub[KEY_SIZE]; #define amount_key tx_key #define out_eph_public_key additional_txkey_sec unsigned char view_tag[1]; // TMP - unsigned char derivation[32]; + unsigned char derivation[KEY_SIZE]; int err = 0; monero_io_fetch_u32(); // skip tx_version @@ -946,11 +946,11 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se return err; } txkey_pub = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; - monero_io_skip(32); + monero_io_skip(KEY_SIZE); Aout = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; - monero_io_skip(32); + monero_io_skip(KEY_SIZE); Bout = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; - monero_io_skip(32); + monero_io_skip(KEY_SIZE); output_index = monero_io_fetch_u32(); is_change = monero_io_fetch_u8(); is_subaddress = monero_io_fetch_u8(); @@ -963,20 +963,20 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se return err; } } else { - monero_io_skip(32); + monero_io_skip(KEY_SIZE); } use_view_tags = monero_io_fetch_u8(); // update outkeys hash control if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { if (G_monero_vstate.io_protocol_version >= 2) { - err = monero_sha256_outkeys_update(Aout, 32); + err = monero_sha256_outkeys_update(Aout, KEY_SIZE); if (err) { explicit_bzero(tx_key, sizeof(tx_key)); explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); return err; } - err = monero_sha256_outkeys_update(Bout, 32); + err = monero_sha256_outkeys_update(Bout, KEY_SIZE); if (err) { explicit_bzero(tx_key, sizeof(tx_key)); explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); @@ -995,7 +995,8 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se if (need_additional_txkeys) { if (is_subaddress) { err = monero_ecmul_k(additional_txkey_pub, Bout, additional_txkey_sec, - sizeof(additional_txkey_pub), 32, sizeof(additional_txkey_sec)); + sizeof(additional_txkey_pub), KEY_SIZE, + sizeof(additional_txkey_sec)); if (err) { explicit_bzero(tx_key, sizeof(tx_key)); explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); @@ -1011,13 +1012,14 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se } } } else { - explicit_bzero(additional_txkey_pub, 32); + explicit_bzero(additional_txkey_pub, KEY_SIZE); } // derivation if (is_change) { - err = monero_generate_key_derivation(derivation, txkey_pub, G_monero_vstate.a, - sizeof(derivation), 32, sizeof(G_monero_vstate.a)); + err = + monero_generate_key_derivation(derivation, txkey_pub, G_monero_vstate.a, + sizeof(derivation), KEY_SIZE, sizeof(G_monero_vstate.a)); if (err) { explicit_bzero(tx_key, sizeof(tx_key)); explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); @@ -1027,7 +1029,7 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se err = monero_generate_key_derivation( derivation, Aout, (is_subaddress && need_additional_txkeys) ? additional_txkey_sec : tx_key, - sizeof(derivation), 32, 32); + sizeof(derivation), KEY_SIZE, KEY_SIZE); if (err) { explicit_bzero(tx_key, sizeof(tx_key)); explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); @@ -1046,7 +1048,7 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se } if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { if (G_monero_vstate.io_protocol_version >= 2) { - err = monero_sha256_outkeys_update(amount_key, 32); + err = monero_sha256_outkeys_update(amount_key, KEY_SIZE); if (err) { explicit_bzero(tx_key, sizeof(tx_key)); explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); @@ -1058,7 +1060,7 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se // compute ephemeral output key err = monero_derive_public_key(out_eph_public_key, derivation, output_index, Bout, - sizeof(out_eph_public_key), sizeof(derivation), 32); + sizeof(out_eph_public_key), sizeof(derivation), KEY_SIZE); if (err) { explicit_bzero(tx_key, sizeof(tx_key)); explicit_bzero(additional_txkey_sec, sizeof(additional_txkey_sec)); @@ -1079,10 +1081,10 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se // send all monero_io_discard(0); - monero_io_insert_encrypt(amount_key, 32, TYPE_AMOUNT_KEY); - monero_io_insert(out_eph_public_key, 32); + monero_io_insert_encrypt(amount_key, KEY_SIZE, TYPE_AMOUNT_KEY); + monero_io_insert(out_eph_public_key, KEY_SIZE); if (need_additional_txkeys) { - monero_io_insert(additional_txkey_pub, 32); + monero_io_insert(additional_txkey_pub, KEY_SIZE); } if (use_view_tags) { monero_io_insert(view_tag, 1); diff --git a/src/monero_monero.c b/src/monero_monero.c index 297465d..a6b585d 100644 --- a/src/monero_monero.c +++ b/src/monero_monero.c @@ -163,8 +163,8 @@ int monero_base58_public_key(char* str_b58, unsigned char* view, unsigned char* return error; } - memcpy(data + offset, spend, 32); - memcpy(data + offset + 32, view, 32); + memcpy(data + offset, spend, KEY_SIZE); + memcpy(data + offset + KEY_SIZE, view, KEY_SIZE); offset += 64; if (paymanetID) { memcpy(data + offset, paymanetID, 8); diff --git a/src/monero_open_tx.c b/src/monero_open_tx.c index 54f3f3c..97afc80 100644 --- a/src/monero_open_tx.c +++ b/src/monero_open_tx.c @@ -27,9 +27,9 @@ /* ----------------------------------------------------------------------- */ int monero_reset_tx(int reset_tx_cnt) { int error; - explicit_bzero(G_monero_vstate.r, 32); - explicit_bzero(G_monero_vstate.R, 32); - cx_rng(G_monero_vstate.hmac_key, 32); + explicit_bzero(G_monero_vstate.r, sizeof(G_monero_vstate.r)); + explicit_bzero(G_monero_vstate.R, sizeof(G_monero_vstate.R)); + cx_rng(G_monero_vstate.hmac_key, KEY_SIZE); error = monero_keccak_init_H(); if (error) { @@ -71,9 +71,9 @@ int monero_apdu_open_tx_cont() { G_monero_vstate.tx_in_progress = 1; #ifdef DEBUG_HWDEVICE - memset(G_monero_vstate.hmac_key, 0xab, 32); + memset(G_monero_vstate.hmac_key, 0xab, sizeof(G_monero_vstate.hmac_key)); #else - cx_rng(G_monero_vstate.hmac_key, 32); + cx_rng(G_monero_vstate.hmac_key, KEY_SIZE); #endif error = monero_rng_mod_order(G_monero_vstate.r, sizeof(G_monero_vstate.r)); @@ -87,12 +87,12 @@ int monero_apdu_open_tx_cont() { return error; } - monero_io_insert(G_monero_vstate.R, 32); - monero_io_insert_encrypt(G_monero_vstate.r, 32, TYPE_SCALAR); - monero_io_insert(C_FAKE_SEC_VIEW_KEY, 32); - monero_io_insert_hmac_for((void*)C_FAKE_SEC_VIEW_KEY, 32, TYPE_SCALAR); - monero_io_insert(C_FAKE_SEC_SPEND_KEY, 32); - monero_io_insert_hmac_for((void*)C_FAKE_SEC_SPEND_KEY, 32, TYPE_SCALAR); + monero_io_insert(G_monero_vstate.R, KEY_SIZE); + monero_io_insert_encrypt(G_monero_vstate.r, KEY_SIZE, TYPE_SCALAR); + monero_io_insert(C_FAKE_SEC_VIEW_KEY, KEY_SIZE); + monero_io_insert_hmac_for((void*)C_FAKE_SEC_VIEW_KEY, KEY_SIZE, TYPE_SCALAR); + monero_io_insert(C_FAKE_SEC_SPEND_KEY, KEY_SIZE); + monero_io_insert_hmac_for((void*)C_FAKE_SEC_SPEND_KEY, KEY_SIZE, TYPE_SCALAR); return SW_OK; } diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 1405f8b..403865f 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -74,7 +74,7 @@ int monero_apdu_mlsag_prehash_update() { unsigned char *Aout; unsigned char *Bout; unsigned char is_change; - unsigned char AKout[32]; + unsigned char AKout[KEY_SIZE]; unsigned char C[32]; unsigned char v[32]; unsigned char k[32]; @@ -94,7 +94,7 @@ int monero_apdu_mlsag_prehash_update() { monero_io_skip(32); Bout = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; monero_io_skip(32); - err = monero_io_fetch_decrypt(AKout, 32, TYPE_AMOUNT_KEY); + err = monero_io_fetch_decrypt(AKout, KEY_SIZE, TYPE_AMOUNT_KEY); if (err) { return err; } @@ -134,11 +134,11 @@ int monero_apdu_mlsag_prehash_update() { } // update destination hash control if (G_monero_vstate.io_protocol_version >= 2) { - err = monero_sha256_outkeys_update(Aout, 32); + err = monero_sha256_outkeys_update(Aout, KEY_SIZE); if (err) { return err; } - err = monero_sha256_outkeys_update(Bout, 32); + err = monero_sha256_outkeys_update(Bout, KEY_SIZE); if (err) { return err; } @@ -146,7 +146,7 @@ int monero_apdu_mlsag_prehash_update() { if (err) { return err; } - err = monero_sha256_outkeys_update(AKout, 32); + err = monero_sha256_outkeys_update(AKout, KEY_SIZE); if (err) { return err; } @@ -195,7 +195,7 @@ int monero_apdu_mlsag_prehash_update() { if (err) { return err; } - if (memcmp(k, G_monero_vstate.OUTK, 32) != 0) { + if (memcmp(k, G_monero_vstate.OUTK, KEY_SIZE) != 0) { return SW_SECURITY_COMMITMENT_CHAIN_CONTROL; } } diff --git a/src/monero_stealth.c b/src/monero_stealth.c index ba83251..9c4936e 100644 --- a/src/monero_stealth.c +++ b/src/monero_stealth.c @@ -27,14 +27,14 @@ /* ----------------------------------------------------------------------- */ int monero_apdu_stealth() { int i; - unsigned char pub[32]; - unsigned char sec[32]; + unsigned char pub[KEY_SIZE]; + unsigned char sec[KEY_SIZE]; unsigned char drv[33]; unsigned char payID[8]; int err = 0; // fetch pub - monero_io_fetch(pub, 32); + monero_io_fetch(pub, KEY_SIZE); // fetch sec err = monero_io_fetch_decrypt_key(sec, sizeof(sec)); if (err) { @@ -54,7 +54,7 @@ int monero_apdu_stealth() { } // compute mask - drv[32] = ENCRYPTED_PAYMENT_ID_TAIL; + drv[KEY_SIZE] = ENCRYPTED_PAYMENT_ID_TAIL; err = monero_keccak_F(drv, 33, sec); if (err) { explicit_bzero(sec, sizeof(sec)); diff --git a/src/monero_types.h b/src/monero_types.h index 13eba01..7119fb6 100644 --- a/src/monero_types.h +++ b/src/monero_types.h @@ -46,6 +46,8 @@ #define TESTNET_CRYPTONOTE_PUBLIC_INTEGRATED_ADDRESS_BASE58_PREFIX 54 #define TESTNET_CRYPTONOTE_PUBLIC_SUBADDRESS_BASE58_PREFIX 63 +#define KEY_SIZE 32 + enum network_type { #ifndef MONERO_ALPHA MAINNET = 0, @@ -71,9 +73,9 @@ struct monero_nv_state_s { unsigned int account_id; /* spend key */ - unsigned char b[32]; + unsigned char b[KEY_SIZE]; /* view key */ - unsigned char a[32]; + unsigned char a[KEY_SIZE]; /*words*/ #define WORDS_MAX_LENGTH 20 @@ -139,8 +141,8 @@ struct monero_v_state_s { unsigned int tx_sign_cnt; /* sc_add control */ - unsigned char last_derive_secret_key[32]; - unsigned char last_get_subaddress_secret_key[32]; + unsigned char last_derive_secret_key[KEY_SIZE]; + unsigned char last_get_subaddress_secret_key[KEY_SIZE]; /* ------------------------------------------ */ /* --- Crypo --- */ @@ -152,11 +154,11 @@ struct monero_v_state_s { /* SPK */ cx_aes_key_t spk; - unsigned char hmac_key[32]; + unsigned char hmac_key[KEY_SIZE]; /* Tx key */ - unsigned char R[32]; - unsigned char r[32]; + unsigned char R[KEY_SIZE]; + unsigned char r[KEY_SIZE]; /* prefix/mlsag hash */ cx_sha3_t keccakF; @@ -167,7 +169,7 @@ struct monero_v_state_s { /* -- track tx-in/out and commitment -- */ cx_sha256_t sha256_out_keys; - unsigned char OUTK[32]; + unsigned char OUTK[KEY_SIZE]; cx_sha256_t sha256_commitment; unsigned char C[32]; diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 6f643c4..c865d0c 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -290,17 +290,17 @@ void ui_export_viewkey_display(unsigned int value __attribute__((unused))) { unsigned int ui_menu_export_viewkey_action(unsigned int value) { unsigned int sw; - unsigned char x[32]; + unsigned char x[KEY_SIZE]; monero_io_discard(0); - explicit_bzero(x, 32); + explicit_bzero(x, sizeof(x)); sw = SW_OK; if (value == ACCEPT) { - monero_io_insert(G_monero_vstate.a, 32); + monero_io_insert(G_monero_vstate.a, KEY_SIZE); G_monero_vstate.export_view_key = EXPORT_VIEW_KEY; } else { - monero_io_insert(x, 32); + monero_io_insert(x, KEY_SIZE); G_monero_vstate.export_view_key = 0; } monero_io_insert_u16(sw); diff --git a/src/monero_ux_stax.c b/src/monero_ux_stax.c index 174d848..7189fb7 100644 --- a/src/monero_ux_stax.c +++ b/src/monero_ux_stax.c @@ -397,17 +397,17 @@ int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), unsi static void ui_menu_export_viewkey_action(bool value) { unsigned int sw; - unsigned char x[32]; + unsigned char x[KEY_SIZE]; monero_io_discard(0); - explicit_bzero(x, 32); + explicit_bzero(x, sizeof(x)); sw = SW_OK; if (value) { - monero_io_insert(G_monero_vstate.a, 32); + monero_io_insert(G_monero_vstate.a, KEY_SIZE); G_monero_vstate.export_view_key = EXPORT_VIEW_KEY; } else { - monero_io_insert(x, 32); + monero_io_insert(x, KEY_SIZE); G_monero_vstate.export_view_key = 0; } monero_io_insert_u16(sw); From d1bfbedae7f1cc6a7554bc13bc5068bbdb1ba62a Mon Sep 17 00:00:00 2001 From: Ledger App Tester Bot Date: Mon, 8 Apr 2024 14:15:40 +0000 Subject: [PATCH 136/142] [auto] Update screenshot --- .../stax/test_display_address/00002.png | Bin 15409 -> 15397 bytes .../stax/test_display_subaddress/00002.png | Bin 15553 -> 15542 bytes .../test_validate_prehash_update/00003.png | Bin 3901 -> 3901 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/stax/test_display_address/00002.png b/tests/snapshots/stax/test_display_address/00002.png index ec01c3d3c459dc65b5c0cc32483681e61fd98749..4380f09025a1c96b1db19a7f170c1ac5e6cd8acd 100644 GIT binary patch literal 15397 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 literal 15409 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 F{{fj&4=Mlv diff --git a/tests/snapshots/stax/test_display_subaddress/00002.png b/tests/snapshots/stax/test_display_subaddress/00002.png index 014f3cb428fa14aaac4c3c03feb62fe2b8ae47d9..ce34346470580d1464fed2f78674501fc9c238ed 100644 GIT binary patch literal 15542 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 diff --git a/tests/snapshots/stax/test_validate_prehash_update/00003.png b/tests/snapshots/stax/test_validate_prehash_update/00003.png index 264824aa9a063e7a04efb45f808709411e10d93c..cfb9942059637b72303870dd4c39d520214a1647 100644 GIT binary patch literal 3901 zcmeHKdr*^C77q_+td&LUF32-jbm|tAB9&KoRD7^*t?9HYpt1>wf)F4eT?i2KIfAe? zkjT(3B80G5i7rS&SpvwH1V{-LAOT_w5CVh{ATN`A*{|Kd`+qyj`Qy%t=-$ob`G}d;8%|s!t}n4^WIdS=e33|3K-<&PgGQry z-i0M4kv8IMkw}Coy`PK6hc&#o(H9jFVV>HY-w_rTCMI%+ujr;v<`oti7~-|@gtkf3 zG}71icYszKC?sT6Wz(9PxP-_3{r$lvoleKX{=oYtpuH>-g}QvSZWAkAfg|}z(!1(` zExQZ69%k2xi3vlIG6nW}rlLZ3xUsP@TOR(IWNCVGa#DjvIkjfKg>06OKXZ3?$6Mpx z`1cJ(R_UBLzzLmlgsMX)CME*&KlJwX)winW=jXc}U^~gjN8HFob0Sse5>yEvx!OFT z(P+p{p$#u=HX9jtwBbcM2gA#V_<5X1RaRSOvqO0yt7>(oio(Vhmy}GyI!IaOZFP@yV&x$hYP&t5s+n4!AS%4Gp`h^h|xwii{Ft;L~dks!s{EAM0CKH=eqc*Y03qI)8$t=CF2EMd3ZiH*8t}ik!6n%Px zeBa_GH(I+Mm2#`w^yDK0C`f-gjr+S=OU^G0@O?#7!huSL}?)=dhKB(t;c#Xb&a zRxKo!n{TDv!3F+<*4P+WC(M7u20XPM29)3lmoO%t!;y-MBY=}4u~GS4eFR>(B$Po~l&-w1?yk&^YL@u}#YLOxYe;6PZa1@| zV^LTyO#tTh8wBhMo3g4|jJuq+VR;j#s9ty)1{S#BN|AizO-Rxw^Uv2MANd($aNcc$w#EkUyv!HQ3cBDfX6N54c_*=BCy0 zw|?}di~W-hq25)<1eLqS$O-r=t3e~1BIpgQ;D0vQpS{W!l=}9JRQX^eFYlUAl{QNL zC>scZ=`8I>gJRJiFV4cwKq5xSp{Od?`uAdxS;&{*D5+_q%HA7-pO%x?MX9`yLqsSd zAQ`48w03rO7W6bJz8sRqumxV={aKeaxx_W8qlHo zUgy_};UldmLDp7Kyr}>ExjB`&lOHoqpep{pk-Apn)a4qmYCAwsB`}M8*V8I((Qr*$ zWT!^joDI$Pvf^*=H7S)!CYHAb_V!_zBe>$2%QocLAKap0%qTanvSTsn=SquWp!>l7 z!Ilj0O)-hYwdFrl-Xw2U=IN*hlMYt9pRsRU%)9>b7oW}TAJMP)N3`9!{NHqM5c1LY X>(^x7I1bzvBhH>af2t!c<@SF8;`C+- delta 1823 zcmV+)2jKX<9=#rrEKuFyRa)7?fMMoaUjw#4O286K38n-s0ZY&lv;-|dN{|wygjj<2 z$6h&$1!|m$;(g~n&#wvDIUGe^&)#g9ziw}DPft&00RQ#=@2gJ$;Jvc}0VxBK(CrrE z|G)YK;9dUu>#y-2&(F_adnSA#SCilb85?2aC|_XO1qy$QD=Z*Guz(CxLcW0a1M<(f z!jZ91fBc`H59H?NX8*?de7;yLj*gBFe?DJpyH#avo zo6TnW(f?ntTrQuUo{o-=w!a$(b9Qz%GBk`w;pF6G`^MR9HoA6weSP=K&Vbo$c7A?7 zo6RmSFW>lu#7A<4br|CZdjEpr=g*(xudc7JzvRTYy}g~yW+x{nuMN1oyqwKu^ZERp zf4B2_EV_TOqoboSKf1fSdvU;KvstZHFRr<4HkGV zr>C7e+P>xK>1ngs{Pr%Mo}R`zZ{PCvKluli%jJAN-)uHlS69=Go6Y9p;$k+NU0+{+ z_&xF}S6GMf+7;IG^YhQ2KWAINsK+|=e`2wCe0-cH8u$12+vE2qFRvYWXXIkBc=0Ol z?CfmkfG;k}ESJmewdbRwqZcm>e>-e^joa5I(^tKJ&M)4@{MCBBUaeNgf5*qS zx3}Aaw?{4(i}`%MTCLXW_3`oX!^6Y$Y~LO>R&B;L-M4SwwujATvx|$1tE;Q&l5jSg zU0q#`MV#&4y>r+bU-f#uK0Q61PWb%%{OIUtXVvNW_;@y(Ef$M$hT~<&F-Q9h^ZESp z^77*1;`{gSkB^VzmBE?ItHX1Je{~pdTw#qL`sp|P^vnFkD}~XNonP$Z8euk@{rvfJ zx^X;{cSeqgY+u@p1Ma+1IZkQ+3h3zQX!|Z69v;Sx|7_U)@%O*#al$({jxTNJoTplS z#ue5u9>nR6Ja-PyH~m1~2-eP``}EY^e$Ef$ng8M{?|5P_m&@OdJUu-ffAh_0*o)8A z5wdA2I$p%wAGtGgeCMz?g0(*t-T7{eyLhomBV?Z!tnFQ6CWBwXqWeLux2#sHo12?& z-@c9M*v@omKA-RJR2&QQ`!BA~e$BR~mHRhF-rn9mJUom_zA2ROkMYHoNcY9|Mr|ef6shApHA;fHe_H8>!8L`&W@9llW9)(wy|#V;!|Zjk*1f` z#((_w2|TiLcXzkbm+1)80mlm0SS&j^Iaw?g<4SG+G~P4pPmEK2@tB{z*Zk`0YWjv; zTwJ`d{hd!DSO;}-aWl9qu0H78fRx`_xJaY zkB>)3NBb*Qe{0y^H7%3v|J8>a|3zamIG@i)-Nr75*(-B=K969P>@0+D8y_k#En2-X z^2d)KW8>A^!^VVe`r~G^8Si=A9y4}$&9+v=-#P40j7zrte|vd)dKy!<4>uiodsh46 z_IEy=DdAy!$dvH;Q2Vf^P4?52XZ*vRdDH%0gm(`6lPTfzuUX+@v6y~(@9*!Y)xZy* z62A6<4L+*j@C55XJ}Ow#o2BRT`Et2jE|=3H(auA;KXRG?ZlA{Xu(PwX?E~&qY)lWw z7WVC7)8?=De-Hb^U`;n}TPzlzv4-{HFN4WwnfE^*j9?weM+NKoAnzp{joTl#vv1(V z_Y%Hm*q;aM`T6<&{(gL1&tkE-yu5t=wGZ|KgEijfIh)PK@&Ca9KGt75Z$KktY+`tE zi|LNB8vWam)2@iO_j!Koun#oeV>qIGn0w^F?86FsXMYIZxz+2P2mIJ!|IBK&+TSKR zUL~*x{a?(hg!CLAAAkS;edoo^^?E&C%k$al|6;DN=s7(-9iJz&{qZtm+Pm}d$Nb9( z7Cqw?&x?zT?T;HB?^~Qcgo}SA!6IqAF#6SJ!J%2hv9Wmrk Date: Tue, 23 Apr 2024 14:31:25 +0200 Subject: [PATCH 137/142] Tests: fix waiting for processing call --- tests/monero_client/monero_cmd.py | 5 ++--- .../test_validate_prehash_update/00003.png | Bin 3901 -> 3901 bytes 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/monero_client/monero_cmd.py b/tests/monero_client/monero_cmd.py index ffde497..40e1697 100644 --- a/tests/monero_client/monero_cmd.py +++ b/tests/monero_client/monero_cmd.py @@ -463,6 +463,7 @@ def validate_prehash_update(self, NavIns(NavInsID.USE_CASE_REVIEW_CONFIRM) ] + backend.wait_for_text_on_screen("Processing") with self.device.send_async(cla=PROTOCOL_VERSION, ins=ins, p1=2, @@ -471,11 +472,9 @@ def validate_prehash_update(self, 0x02 if is_short else 0), payload=payload): - backend.wait_for_text_on_screen("Processing") - backend.wait_for_text_not_on_screen("Processing") navigator.navigate_and_compare(TESTS_ROOT_DIR, test_name + "_prehash_update", - instructions, screen_change_before_first_instruction=False) + instructions) sw, response = self.device.async_response() # type: int, bytes diff --git a/tests/snapshots/stax/test_validate_prehash_update/00003.png b/tests/snapshots/stax/test_validate_prehash_update/00003.png index cfb9942059637b72303870dd4c39d520214a1647..264824aa9a063e7a04efb45f808709411e10d93c 100644 GIT binary patch delta 1823 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 X>(^x7I1bzvBhH>af2t!c<@SF8;`C+- From 0d71169f332560d46aa3663de5d677da0b4b7049 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 30 Apr 2024 18:05:54 +0200 Subject: [PATCH 138/142] tests: set screen_change_after_last_instruction to False for validate_prehash_update command --- tests/monero_client/monero_cmd.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/monero_client/monero_cmd.py b/tests/monero_client/monero_cmd.py index 40e1697..e494379 100644 --- a/tests/monero_client/monero_cmd.py +++ b/tests/monero_client/monero_cmd.py @@ -474,7 +474,8 @@ def validate_prehash_update(self, navigator.navigate_and_compare(TESTS_ROOT_DIR, test_name + "_prehash_update", - instructions) + instructions, + screen_change_after_last_instruction=False) sw, response = self.device.async_response() # type: int, bytes From e31e70946df26916d3dc42c0ad74fdfe1a6f1c20 Mon Sep 17 00:00:00 2001 From: tdejoigny-ledger Date: Wed, 1 May 2024 16:38:38 +0200 Subject: [PATCH 139/142] flex porting --- .gitignore | 6 ++ CHANGELOG.md | 4 + Makefile | 5 +- README.md | 2 +- icons/app_monero_40px.gif | Bin 0 -> 536 bytes ledger_app.toml | 2 +- src/monero_nvram.c | 2 +- src/{monero_ux_stax.c => monero_ux_nbgl.c} | 27 +++-- ...o_ux_stax_menu.c => monero_ux_nbgl_menu.c} | 101 +++++++++++------- src/monero_vars.h | 2 +- tests/monero_client/monero_cmd.py | 13 ++- tests/monero_client/monero_crypto_cmd.py | 7 +- .../flex/test_display_address/00000.png | Bin 0 -> 8891 bytes .../flex/test_display_address/00001.png | Bin 0 -> 25668 bytes .../flex/test_display_address/00002.png | Bin 0 -> 14986 bytes .../flex/test_display_address/00003.png | Bin 0 -> 25668 bytes .../flex/test_display_address/00004.png | Bin 0 -> 8488 bytes .../flex/test_display_address/00005.png | Bin 0 -> 5874 bytes .../flex/test_display_address/00006.png | Bin 0 -> 14357 bytes .../flex/test_display_subaddress/00000.png | Bin 0 -> 8891 bytes .../flex/test_display_subaddress/00001.png | Bin 0 -> 25484 bytes .../flex/test_display_subaddress/00002.png | Bin 0 -> 14892 bytes .../flex/test_display_subaddress/00003.png | Bin 0 -> 25484 bytes .../flex/test_display_subaddress/00004.png | Bin 0 -> 10604 bytes .../flex/test_display_subaddress/00005.png | Bin 0 -> 5874 bytes .../flex/test_display_subaddress/00006.png | Bin 0 -> 14357 bytes .../flex/test_prefix_hash_hash_init/00000.png | Bin 0 -> 10943 bytes .../flex/test_prefix_hash_hash_init/00001.png | Bin 0 -> 4145 bytes .../flex/test_private_view_key/00000.png | Bin 0 -> 8842 bytes .../flex/test_private_view_key/00001.png | Bin 0 -> 7000 bytes .../test_validate_prehash_update/00000.png | Bin 0 -> 9559 bytes .../test_validate_prehash_update/00001.png | Bin 0 -> 26352 bytes .../test_validate_prehash_update/00002.png | Bin 0 -> 8606 bytes .../stax/test_display_address/00000.png | Bin 7222 -> 7258 bytes .../stax/test_display_address/00001.png | Bin 23444 -> 23559 bytes .../stax/test_display_address/00003.png | Bin 23444 -> 23559 bytes .../stax/test_display_address/00004.png | Bin 7232 -> 7232 bytes .../stax/test_display_address/00005.png | Bin 5035 -> 4707 bytes .../stax/test_display_subaddress/00000.png | Bin 7222 -> 7258 bytes .../stax/test_display_subaddress/00001.png | Bin 23242 -> 23356 bytes .../stax/test_display_subaddress/00003.png | Bin 23242 -> 23356 bytes .../stax/test_display_subaddress/00004.png | Bin 9104 -> 9104 bytes .../stax/test_display_subaddress/00005.png | Bin 5035 -> 4707 bytes tests/test_version.py | 2 +- 44 files changed, 104 insertions(+), 69 deletions(-) create mode 100644 icons/app_monero_40px.gif rename src/{monero_ux_stax.c => monero_ux_nbgl.c} (95%) rename src/{monero_ux_stax_menu.c => monero_ux_nbgl_menu.c} (75%) create mode 100644 tests/snapshots/flex/test_display_address/00000.png create mode 100644 tests/snapshots/flex/test_display_address/00001.png create mode 100644 tests/snapshots/flex/test_display_address/00002.png create mode 100644 tests/snapshots/flex/test_display_address/00003.png create mode 100644 tests/snapshots/flex/test_display_address/00004.png create mode 100644 tests/snapshots/flex/test_display_address/00005.png create mode 100644 tests/snapshots/flex/test_display_address/00006.png create mode 100644 tests/snapshots/flex/test_display_subaddress/00000.png create mode 100644 tests/snapshots/flex/test_display_subaddress/00001.png create mode 100644 tests/snapshots/flex/test_display_subaddress/00002.png create mode 100644 tests/snapshots/flex/test_display_subaddress/00003.png create mode 100644 tests/snapshots/flex/test_display_subaddress/00004.png create mode 100644 tests/snapshots/flex/test_display_subaddress/00005.png create mode 100644 tests/snapshots/flex/test_display_subaddress/00006.png create mode 100644 tests/snapshots/flex/test_prefix_hash_hash_init/00000.png create mode 100644 tests/snapshots/flex/test_prefix_hash_hash_init/00001.png create mode 100644 tests/snapshots/flex/test_private_view_key/00000.png create mode 100644 tests/snapshots/flex/test_private_view_key/00001.png create mode 100644 tests/snapshots/flex/test_validate_prehash_update/00000.png create mode 100644 tests/snapshots/flex/test_validate_prehash_update/00001.png create mode 100644 tests/snapshots/flex/test_validate_prehash_update/00002.png diff --git a/.gitignore b/.gitignore index 1185f63..30351c4 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,9 @@ build/ dist/ *.manifest *.spec + +# Temporary directory with snapshots taken during test runs +tests/snapshots-tmp/ + +# Virtual env for sideload (macOS and Windows) +ledger/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index e7aaa17..5843b37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to this project will be documented in this file. +## 2.0.0 - 2024-05-01 + +- Support of Flex device + ## 1.7.6 - 2021-03-30 - Support of Monero client version `0.17.2.*` diff --git a/Makefile b/Makefile index 8f7068d..5d01240 100644 --- a/Makefile +++ b/Makefile @@ -27,8 +27,8 @@ include $(BOLOS_SDK)/Makefile.defines APPNAME = "Monero" # Application version -APPVERSION_M = 1 -APPVERSION_N = 9 +APPVERSION_M = 2 +APPVERSION_N = 0 APPVERSION_P = 0 APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" @@ -43,6 +43,7 @@ ICON_NANOS = icons/app_monero_16px.gif ICON_NANOX = icons/app_monero_14px.gif ICON_NANOSP = icons/app_monero_14px.gif ICON_STAX = icons/app_monero_32px.gif +ICON_FLEX = icons/app_monero_40px.gif # Application allowed derivation curves. CURVE_APP_LOAD_PARAMS = secp256k1 diff --git a/README.md b/README.md index dc9d137..08fb891 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Monero Ledger App -Monero wallet application for Ledger Nano S and Nano X. +Monero wallet application for all Ledger devices. ## Install diff --git a/icons/app_monero_40px.gif b/icons/app_monero_40px.gif new file mode 100644 index 0000000000000000000000000000000000000000..0cc57ad95dd9efc59943a01b63579e88751cd052 GIT binary patch literal 536 zcmZ?wbhEHb)L_tH_{_t=#KgqP%F4~nEiNvuudiQRT)c4M!iyI#K701;+qZAOe*O9n z1`IHu_>%?9RQ%8FnVXoN>YJFJnVij+o|v1PXltNnVhVx`Iv_P58yHyrO*rYfdhd>P zXSe@4l_=tnIjyy@Ay#{9Y>~*p%=t$*)_nN%ZS$?%2rdx;TlvLHBPO&Q(KvYFcjcT5 zE5rgCBF(qFDT{brBy#_GMa;e2HLpyi9diE(e5&bO5NzgIRT-PXW2DZ=#@wjJ#Ae3M zDa6^J#=)MH&B$J1F_C9_zhbu)yBSMMU%Pf&(Jc9;W^6)JrgCv|FNmJS={v_l$hp>c zLzI>84s*r><{r|VMl)O|Y?t1te!4&J{DqUN^SJk2=W#yEe(xH?Ebi^kt~%dPd&S*n z^(NqX$vg88Q>ED$nR{9#9(2h%YCX8uyZhpE`G$tqLMtNLy(iivJ!;yyTJXZO&0Q;A z3gmL6Cy5!?t1H+sOD<4#>Pc1kBkeFbZF7j40$;M6qf@L8k&0Oo%T&AixO6GdZRk3&L(4Elaa9vUJ(lXZ{%*u;57yXJTWMS14H00P? z)UnwklQAxTS`24$d5Q<=gG5MS{^JLGGz$}gvAKyeg XT`TA6VKy;o)^RP#q|<$}j11NQH=owz literal 0 HcmV?d00001 diff --git a/ledger_app.toml b/ledger_app.toml index c264aa9..7329320 100644 --- a/ledger_app.toml +++ b/ledger_app.toml @@ -1,7 +1,7 @@ [app] build_directory = "./" sdk = "C" -devices = ["nanos", "nanox", "nanos+", "stax"] +devices = ["nanos", "nanox", "nanos+", "stax", "flex"] [tests] pytest_directory = "./tests/" diff --git a/src/monero_nvram.c b/src/monero_nvram.c index 495f881..fe326b9 100644 --- a/src/monero_nvram.c +++ b/src/monero_nvram.c @@ -22,7 +22,7 @@ #include "monero_api.h" #include "monero_vars.h" -#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) +#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) || defined(TARGET_FLEX) const monero_nv_state_t N_state_pic; #else monero_nv_state_t N_state_pic; diff --git a/src/monero_ux_stax.c b/src/monero_ux_nbgl.c similarity index 95% rename from src/monero_ux_stax.c rename to src/monero_ux_nbgl.c index 7189fb7..36115a7 100644 --- a/src/monero_ux_stax.c +++ b/src/monero_ux_nbgl.c @@ -59,7 +59,7 @@ static void release_context(void) { /* -------------------------------- INFO UX --------------------------------- */ void ui_menu_show_tx_aborted(void) { - nbgl_useCaseStatus("Transaction\ncancelled", false, ui_menu_main_display); + nbgl_useCaseReviewStatus(STATUS_TYPE_TRANSACTION_REJECTED, ui_menu_main_display); } void ui_menu_show_security_error(void) { @@ -103,7 +103,7 @@ unsigned int ui_menu_transaction_start(void) { } unsigned int ui_menu_transaction_signed(void) { - nbgl_useCaseStatus("TRANSACTION\nSIGNED", true, ui_menu_main_display); + nbgl_useCaseReviewStatus(STATUS_TYPE_TRANSACTION_SIGNED, ui_menu_main_display); return 0; } @@ -193,6 +193,13 @@ void ui_menu_timelock_validation_display(unsigned int value __attribute__((unuse } /* ----------------------------- USER DEST/AMOUNT VALIDATION ----------------------------- */ + +#ifdef TARGET_FLEX +#define NEXT_PAGE_TEXT ("Swipe to continue") +#else +#define NEXT_PAGE_TEXT ("Tap to continue") +#endif + static void fill_amount_and_destination(void) { transactionContext.tagValuePair[0].item = "Amount"; transactionContext.tagValuePair[0].value = G_monero_vstate.ux_amount; @@ -225,7 +232,7 @@ static void continue_display(int token, unsigned char index) { .navType = NAV_WITH_TAP, .progressIndicator = true, .navWithTap.backButton = false, - .navWithTap.nextPageText = "Tap to continue", + .navWithTap.nextPageText = NEXT_PAGE_TEXT, .navWithTap.nextPageToken = CONTINUE_TOKEN, .navWithTap.quitText = "Cancel", .quitToken = QUIT_TOKEN, @@ -265,7 +272,7 @@ static void display_previous_infos(bool last) { .navType = NAV_WITH_TAP, .progressIndicator = true, .navWithTap.backButton = false, - .navWithTap.nextPageText = "Tap to continue", + .navWithTap.nextPageText = NEXT_PAGE_TEXT, .navWithTap.nextPageToken = CONTINUE_TOKEN, .navWithTap.quitText = "Cancel", .quitToken = QUIT_TOKEN, @@ -315,7 +322,7 @@ static void ui_menu_pubaddr_action_cancelled(void) { monero_io_do(IO_RETURN_AFTER_TX); } G_monero_vstate.disp_addr_mode = 0; - nbgl_useCaseStatus("Address display\ncancelled", false, ui_menu_main_display); + nbgl_useCaseReviewStatus(STATUS_TYPE_ADDRESS_REJECTED, ui_menu_main_display); } void ui_menu_pubaddr_action(bool confirm) { @@ -325,7 +332,7 @@ void ui_menu_pubaddr_action(bool confirm) { monero_io_do(IO_RETURN_AFTER_TX); } G_monero_vstate.disp_addr_mode = 0; - nbgl_useCaseStatus("ADDRESS\nVERIFIED", true, ui_menu_main_display); + nbgl_useCaseReviewStatus(STATUS_TYPE_ADDRESS_VERIFIED, ui_menu_main_display); } else { ui_menu_pubaddr_action_cancelled(); } @@ -372,8 +379,8 @@ void display_account(void) { transactionContext.tagValueList.pairs = transactionContext.tagValuePair; - nbgl_useCaseAddressConfirmationExt(G_monero_vstate.ux_address, ui_menu_pubaddr_action, - &transactionContext.tagValueList); + nbgl_useCaseAddressReview(G_monero_vstate.ux_address, &transactionContext.tagValueList, + &C_Monero_64px, "Review Address", NULL, ui_menu_pubaddr_action); } int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), unsigned char* pub_view, @@ -388,8 +395,8 @@ int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), unsi return error; } - nbgl_useCaseReviewStart(&C_Monero_64px, "Review Address", "", "Cancel", display_account, - ui_menu_pubaddr_action_cancelled); + display_account(); + return 0; } diff --git a/src/monero_ux_stax_menu.c b/src/monero_ux_nbgl_menu.c similarity index 75% rename from src/monero_ux_stax_menu.c rename to src/monero_ux_nbgl_menu.c index fa1b8bc..758d43d 100644 --- a/src/monero_ux_stax_menu.c +++ b/src/monero_ux_nbgl_menu.c @@ -56,14 +56,16 @@ enum { RESET_TOKEN, ACCOUNT_CHOICE, ACCOUNT_CHOICE_2, + ACCOUNT_CHOICE_3, NETWORK_CHOICE }; enum { MAIN_NET, STAGE_NET, TEST_NET, MAX_NET }; +#define SETTING_INFO_NB 4 static const char* const infoTypes[] = {"Spec", "Version", "Developer", "Copyright"}; static const char* const infoContents[] = {XSTR(SPEC_VERSION), APPVERSION, "Ledger", - "(c) 2022 Ledger"}; + "(c) 2024 Ledger"}; static const char* const barTexts[] = {"Select Account", "Select Network", "Reset"}; static const uint8_t tokens[] = {ACCOUNT_TOKEN, NETWORK_TOKEN, RESET_TOKEN}; @@ -83,32 +85,9 @@ static void update_account(void) { G_monero_vstate.disp_addr_m = 0; } -static bool settings_navigation_cb(uint8_t page, nbgl_pageContent_t* content) { - if (page == 0) { - content->type = BARS_LIST; - content->barsList.barTexts = barTexts; - content->barsList.tokens = tokens; - content->barsList.nbBars = 3; - content->barsList.tuneId = TUNE_TAP_CASUAL; - } else if (page == 1) { - content->type = INFOS_LIST; - content->infosList.nbInfos = 3; - content->infosList.infoTypes = infoTypes; - content->infosList.infoContents = infoContents; - } else if (page == 2) { - content->type = INFOS_LIST; - content->infosList.nbInfos = 1; - content->infosList.infoTypes = infoTypes + 3; - content->infosList.infoContents = infoContents + 3; - } else { - return false; - } - return true; -} - static bool account_settings_navigation_cb(uint8_t page, nbgl_pageContent_t* content) { content->type = CHOICES_LIST; - content->choicesList.nbChoices = 5; + content->choicesList.nbChoices = 4; content->choicesList.localized = false; content->choicesList.tuneId = TUNE_TAP_CASUAL; @@ -117,13 +96,22 @@ static bool account_settings_navigation_cb(uint8_t page, nbgl_pageContent_t* con content->choicesList.names = accountNames; content->choicesList.token = ACCOUNT_CHOICE; } else if (page == 1) { - if (N_monero_pstate->account_id > 4) { - content->choicesList.initChoice = N_monero_pstate->account_id - 5; + if (N_monero_pstate->account_id > 3) { + content->choicesList.initChoice = N_monero_pstate->account_id - 4; } else { - content->choicesList.initChoice = 5; + content->choicesList.initChoice = 4; } - content->choicesList.names = accountNames + 5; + content->choicesList.names = accountNames + 4; content->choicesList.token = ACCOUNT_CHOICE_2; + } else if (page == 2) { + content->choicesList.nbChoices = 2; + if (N_monero_pstate->account_id > 7) { + content->choicesList.initChoice = N_monero_pstate->account_id - 8; + } else { + content->choicesList.initChoice = 8; + } + content->choicesList.names = accountNames + 8; + content->choicesList.token = ACCOUNT_CHOICE_3; } else { return false; } @@ -164,12 +152,11 @@ static void resetCallback(void) { } static void account_settings_control_cb(int token, uint8_t index) { - UNUSED(index); switch (token) { + case ACCOUNT_CHOICE_3: case ACCOUNT_CHOICE_2: - index = index + 5; - __attribute__((fallthrough)); case ACCOUNT_CHOICE: + index = (token - ACCOUNT_CHOICE) * 4 + index; if (index <= 9) { monero_nvm_write((void*)&N_monero_pstate->account_id, &index, sizeof(uint8_t)); monero_init(); @@ -209,11 +196,12 @@ static void network_settings_control_cb(int token, uint8_t index) { } } -static void settings_control_cb(int token, uint8_t index) { +static void settings_control_cb(int token, uint8_t index, int page) { UNUSED(index); + UNUSED(page); switch (token) { case ACCOUNT_TOKEN: - nbgl_useCaseSettings("Select account", 0, 2, IS_TOUCHABLE, display_settings_menu, + nbgl_useCaseSettings("Select account", 0, 3, IS_TOUCHABLE, display_settings_menu, account_settings_navigation_cb, account_settings_control_cb); break; case NETWORK_TOKEN: @@ -231,12 +219,29 @@ static void settings_control_cb(int token, uint8_t index) { } } -static void display_settings_menu(void) { - nbgl_useCaseSettings("Monero settings", PAGE_START, NB_PAGE_SETTING, IS_TOUCHABLE, - ui_menu_main_display, settings_navigation_cb, settings_control_cb); -} +// info menu definition +static const nbgl_contentInfoList_t infoList = { + .nbInfos = SETTING_INFO_NB, + .infoTypes = infoTypes, + .infoContents = infoContents, +}; -void ui_menu_main_display(void) { +// settings menu definition +#define SETTING_CONTENTS_NB 1 +static const nbgl_content_t contents[SETTING_CONTENTS_NB] = { + {.type = BARS_LIST, + .content.barsList.barTexts = barTexts, + .content.barsList.tokens = tokens, + .content.barsList.nbBars = 3, + .content.barsList.tuneId = TUNE_TAP_CASUAL, + .contentActionCallback = settings_control_cb}}; + +static const nbgl_genericContents_t settingContents = {.callbackCallNeeded = false, + .contentsList = contents, + .nbContents = SETTING_CONTENTS_NB}; +static nbgl_homeAction_t homeAction; + +static void display_home_and_settings(bool displayHome) { update_account(); explicit_bzero(G_monero_vstate.ux_address, sizeof(G_monero_vstate.ux_address)); @@ -247,8 +252,22 @@ void ui_menu_main_display(void) { monero_base58_public_key(G_monero_vstate.ux_address, G_monero_vstate.A, G_monero_vstate.B, 0, NULL); - nbgl_useCaseHomeExt("Monero", &C_Monero_64px, NULL, true, transactionContext.buffer, - display_account, display_settings_menu, app_exit); + homeAction.callback = display_account; + homeAction.icon = NULL; + homeAction.text = transactionContext.buffer; + + nbgl_useCaseHomeAndSettings(APPNAME, &C_Monero_64px, NULL, displayHome ? INIT_HOME_PAGE : 0, + &settingContents, &infoList, &homeAction, app_exit); +} + +static void display_settings_menu(void) { + // display settings page + display_home_and_settings(false); +} + +void ui_menu_main_display(void) { + // display home page + display_home_and_settings(true); } /* --- INIT --- */ diff --git a/src/monero_vars.h b/src/monero_vars.h index d46166e..547d41a 100644 --- a/src/monero_vars.h +++ b/src/monero_vars.h @@ -28,7 +28,7 @@ extern monero_v_state_t G_monero_vstate; -#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) +#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) || defined(TARGET_FLEX) extern const monero_nv_state_t N_state_pic; #define N_monero_pstate ((volatile monero_nv_state_t *)PIC(&N_state_pic)) #else diff --git a/tests/monero_client/monero_cmd.py b/tests/monero_client/monero_cmd.py index e494379..0b08c1f 100644 --- a/tests/monero_client/monero_cmd.py +++ b/tests/monero_client/monero_cmd.py @@ -25,7 +25,7 @@ from .crypto.hmac import hmac_sha256 from .exception.device_error import DeviceError from .utils.varint import encode_varint -from .utils.utils import get_nano_review_instructions, get_stax_review_instructions +from .utils.utils import get_nano_review_instructions from pathlib import Path from ragger.navigator import NavInsID, NavIns @@ -229,16 +229,14 @@ def prefix_hash_init(self, backend, test_name, firmware, navigator, version: int instructions = get_nano_review_instructions(1) else: instructions = [ - NavIns(NavInsID.USE_CASE_REVIEW_TAP) + NavIns(NavInsID.SWIPE_CENTER_TO_LEFT) ] - with self.device.send_async(cla=PROTOCOL_VERSION, ins=ins, p1=1, p2=0, option=0, payload=payload): - navigator.navigate_and_compare(TESTS_ROOT_DIR, test_name + "_hash_init", instructions) @@ -458,7 +456,8 @@ def validate_prehash_update(self, instructions = get_nano_review_instructions(3) else: instructions = [ - NavIns(NavInsID.USE_CASE_REVIEW_TAP), + + NavIns(NavInsID.SWIPE_CENTER_TO_LEFT), NavIns(NavInsID.USE_CASE_REVIEW_TAP), NavIns(NavInsID.USE_CASE_REVIEW_CONFIRM) ] @@ -474,8 +473,8 @@ def validate_prehash_update(self, navigator.navigate_and_compare(TESTS_ROOT_DIR, test_name + "_prehash_update", - instructions, - screen_change_after_last_instruction=False) + instructions, + screen_change_after_last_instruction=False, timeout=10000) sw, response = self.device.async_response() # type: int, bytes diff --git a/tests/monero_client/monero_crypto_cmd.py b/tests/monero_client/monero_crypto_cmd.py index 8a8c56c..2066a7b 100644 --- a/tests/monero_client/monero_crypto_cmd.py +++ b/tests/monero_client/monero_crypto_cmd.py @@ -120,14 +120,13 @@ def display_address(self, test_name, firmware, navigator, derivation: bytes, out instructions = get_nano_review_instructions(4) else: instructions = [ - NavIns(NavInsID.USE_CASE_CHOICE_CONFIRM), - NavIns(NavInsID.TOUCH, (200, 410)), + NavIns(NavInsID.SWIPE_CENTER_TO_LEFT), + NavIns(NavInsID.TOUCH, (200, 350 if firmware.device.startswith("flex") else 410)), NavIns(NavInsID.USE_CASE_ADDRESS_CONFIRMATION_EXIT_QR), - NavIns(NavInsID.USE_CASE_ADDRESS_CONFIRMATION_TAP), + NavIns(NavInsID.SWIPE_CENTER_TO_LEFT), NavIns(NavInsID.USE_CASE_ADDRESS_CONFIRMATION_CONFIRM), NavIns(NavInsID.USE_CASE_STATUS_DISMISS) ] - with self.device.send_async(cla=PROTOCOL_VERSION, ins=ins, p1=0, diff --git a/tests/snapshots/flex/test_display_address/00000.png b/tests/snapshots/flex/test_display_address/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..18c1600c218daa9a20d1470a21326850fbbeb67a GIT binary patch literal 8891 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 PMaJQ*%bChk0k{7LZY0~N literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_display_address/00001.png b/tests/snapshots/flex/test_display_address/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..075ca11eda98e07e3e41b0709d3289681fe688ae GIT binary patch literal 25668 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 Q0ikxx%h$8v$ffN60`KfnUjP6A literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_display_address/00005.png b/tests/snapshots/flex/test_display_address/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..4321e60181db1ab7e8a7538c25e72daba09d225c GIT binary patch literal 5874 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

d35T<%ZLxEI zW+hOnrl`Lw6^D${zou}Bhw}>AcgNltFc0NKFQGW9Y`PN_2B3P2xr18xC-l_;Nd0TGJ=om}tB?WsXgO-TF zlwdgo5U`bm;1p4R!RJV=4nZbmakP#0%v)5^|HM2nLMmwKkMPlvUtvsVO%wTI5{S1S z^HX{6r1t9oW!|}gqcD1aXv^43j}a%yZosFO`VPW9sW8|u%;cRsZlZNb(j_kmxgm{& znnc$ZBEIE5tFIFV>Ovc)EXHiD2YQ}+)}Gh7kdol8pvTt&te0;TANnqkeX9TM0jcRG z@zZ_O7e(^1bbBr>$Axy(KS$X%?(ucm{i*BN{%!_0YoI(SGpIZrwqgZNJ zbs2wFNq$g^?dC2F;zNRaSa;~1{oN}Xt=52F7ZHwcGji&+iv%dHqUrMmhs(zxXuyne~yP z;X(ADUcRngrSfDGn#0ib@b3)O7nHv|pVmhQSgimR1Y>fY?ZBpn7ojZg?yjlJ=D5dL zrm2mSS=*z<4(PUGXTObB_MH~h!*JqZNiI@*in+X%TX5d>Ug~H^cMMerP2>3T>$wM} z(wxz+1C2YtyB&oRb!Du-KK?v4`1Br|W~?&rqUH85OcG#QonIjpzrP>SQL!rq46ym} z>D#c(LyAc4O}YPPN9M>Tn5WB{NGhAlZ7n!)RjR#2+@A#xi(@~wtZo%yoSY2T)5|Ps zvwG)K|4|*z6nBHV#t^%!{viB~HQX0q+hs_Ad|Y*X-1mK4dj7v}e$_Y!?-zouw+%3` Q%Z8kA_4=mv*rlug0an##761SM literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_display_address/00006.png b/tests/snapshots/flex/test_display_address/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..876e018f3a6bf5685a225c3fa2a7f91eeedda8c6 GIT binary patch literal 14357 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 u+%ukoqO8CRZp!!xk0* literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_display_subaddress/00000.png b/tests/snapshots/flex/test_display_subaddress/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..18c1600c218daa9a20d1470a21326850fbbeb67a GIT binary patch literal 8891 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 PMaJQ*%bChk0k{7LZY0~N literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_display_subaddress/00001.png b/tests/snapshots/flex/test_display_subaddress/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bc6495205abbc98fa308293996f53d0553049f GIT binary patch literal 25484 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_display_subaddress/00002.png b/tests/snapshots/flex/test_display_subaddress/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..1775cfc5a4e2565c69333367bbfd15dd09d4f126 GIT binary patch literal 14892 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 z zOA2km(VkjkCa{|g9f$RRE0eK=i4PIj+X#GEu7h-A0bJaRHqspQZwro;eh$Eeqa1q|~xb$$gh#gfaU}_e}Au zG-JdYoACYG;pM?IO4*E>uWI}LxG+3+KYYQWmO>f|8}!~+l24m@$W zM9oK?m8E3W*cTzSWt{9JENB~{6n*2hs`tk!l4ZQ|j-_jT4jR^`Z=UtW@Vj?75WWIP z=VWAlYDS$J1$G?m?QKXhy|FV{RWt3XUm+v{mm|PWi1>m*-LokH>`;|Q;cugg#h{h( z(2AL*4jMkWmm^!WE=byJe(WI_sMA>oJwwQJjNE>{SC;pquE1+w(smiWA1&{2i#X18 z_yTyJ|LAWg$8QLgGQ@CxWZGOJ(Zotnzuj1Iwt7Twtkykpf9mhOzroV?_;-*6DsKA< zj)o@abL`})9SzCv9QpI;sB*=Z&tNQ4MO7m4sExI=#A?k&a)nu#Md<$BD(IQe6*KI| zH%!SWunI7)nPiLv5zRD1zA2veIP55QZ#WE3;T9D$NuFR))s|vojI!x!{cp^(kq_>? zPbs|_7tml?x5{lV6YBwvnYP4dKVt1Ekvg3UDsxB8vv;Qz%hm+n@%g2m2m-Bqc9CI; zUVrqW6|be6S=LaTh4i-yT*l_)R5V`JyxU?knX@6UF2t}6O+lsOCF(eu<%=Kv&b>09Qp4pmIZz&PuW#M_}lHx^;bW71FU zoUNub+|5*qLVp*Tht!+%uhh1BjNx(+{GMg@@Ri$u4o zO!j!`Z}sdd1?U9`dr+MVRcVZVOw9|TDt~HTUY=G`PboR7CQM&#$o7F=EQto1mGxgQ zOi>XpOZtLF?`|j!whZ{L`nCKbQ-Co+mB#UID`CjK8WhfN^p(>HcA^A!8eQl!=g25d zi2Uk$t4pPs`}EVKdDfZ_<*qe)+#G>0>hf*$T5^=c4u_wO{Bs*%S~pL%@%8N5z3GfS z3(D2x_JzRliTbabIjk3l*IK(}+PK@>eGJb$^Rt?JL6Ap%bp6T59pPC@#uQl>}t3jvP~*Jzns(4WA+%$pMY^ z_;PZbrNd`HcTuRu$bHVLyi1JAUD&BwgCHsbR#~fZot*x2#5Sfg`+0|hVb)In*C51% z!wJd9pZm;r?Wb{m3eaY^j1WfS$Zp|@o%b7@h z6Hh;7KDMn1h7tFphYp)ThOfH3U_tJ{oJvHZqW~NP!xCM`CNbKHMV5$!jt2tj;f6== z32h%mOl+@oybg-^SJcs-2O7m?KH!mz;#%4IX>XV2|3aw9_;NY77x#T9jIx!B2j{w`+1csh9_BG*IQK9r%oK90iJf;nReT5 z4mIbp1_hx)RrzsKyfa#!e!#t?{to6@F}?gQGhXO;TB-xeP+cH>b;Pw{N|}pqs%zJLIpu>{J;=YJ zDJ3QxBTs<_#YX`2p?ArpJPDdnx&8DX0gBPl(T}w6o(Htu1Ar54qn8D?k{T`QCJm0J zB`R$uw^{<=SWk}K_kq(dnOhUD&vj9}i)R?+_5$UJACkkPn0M*VT4`#!1UQfI*SGvR z-<(GVpR}OYxMc0kmIOwxASPCa@l99I+xs7ATN_)~Z$MP=t20pbaR1AU;tXwZsswVoG7WgMoV9e**zrQGIwoA&$ni3b#8GpyKW?EGQET32Ia{;X7Nr11KJlcxwXXAaQ@^W)m!#pQyt zX7Of6>FX!&x4B+`tGE!u9e=9voY!d<+uV$JmvaibFXm%7%JLFEKmlfF;ye9*G#HRS z=e@PIvco2m%!N7>T-!KZMfZ|N5m8yJ+;GsFj4>{qxqh+3(z%A6*ljMnAADRL9hAkB z$qPuVsNgoTZt?b&=iOf;P((#8?hCHX--1n;=NjX9%O&m~)YoP#F6+-a--HYbkRWIL zFO|T4sJA!EluOu(qWmI){1+XbKUO=nP7th_dRI%;TRAs!s|hnuJge$&q2P4h3o?Ep z3_}UGhdV$4a7ig^E`9~FmKwx(f9@t`Thr{8#3Z(>d(4#OjyP6`kL~P?9@O{Y!NoP9 zzp3?!@v`mFUWUfC7i1dN>7xE=KSxUVI%@dY5}SlVSDGbkk$j<=C$eqZjttZvgcnQ5 zzORLd{_1)*>1J__Kl}?4>p17FRqWEW@Z`=j)YuhmC&w$qvo&QrI>o(eej;9xdCLn< zdFB6}zgLNmtufBjEk~uWokPaSXEq4jINPydA>XPB0q6nX>jz0EMj}oUOcW+kCZ(-)W`ivROB6a$;P}-z=+EmM3V0l@tD`A&L@5W6WnT~!5 z#7vVjrjN^OHk?WqkM@Dho%ip`4JMKWkkiL&Aw1!w7unIbd!E-es@bfwHeS}qLcFds z7>YXcGfSabGkl2P${v@p`+?j|i9AZ{l-LU3tJtXck`b5{0&9yGa=0j|A)a|9 zuBJb%{!pk4%c^ncO!S9=3&VH#PuL_y9F6K0yO+rgZk$)J;an^H@^=})ItjE$IJBW{ zhZzVYx~YU#_16gkTTKCqoYOnIWd(vnjnQ~Y^4Ea9TK%cwQnJ^J{y|mNX&ml) z-FTVW6-GrMD-HADNvQQ55oWV&;^JoOJh_aGyGJ-pg?Z!R!rHgb^WjgQLDb_bK=_-n*kxbCApF?Y`sUVIdo5p=0%Oq^)TwZ+5hK z&-08%9H4E3(CwXjMB>2ZzzXcwZ)!_jQaic-aN0Cz4jpxRbqL|xk1ny%$T%6U%5SK< z7fL>^`9YA(tZg<}OV`d-c%9ackCEa{)6{bUL&jucQ1iIKOyI!e>V>My#=1 zy$!G~m;h)v9PuarTBCzB_){0qBW*|3iE;NTrW~D{X0!_c_lGJSc(R85i)S}e+e*gj z6F<4WCXD{eC##NFbPIo;6L*(G`NGWT&>Hohjl(>y;3dQYumc$1l+@vrivf=U@X76u zS#7?*M2sG0?fmLX)ake)`^D;FILLxALEvs4B+$$#nfSr$)(f&{ME3PWa}Bh^Xm60Q zI3IbEmz?tSuKox!5PnDQeGWxW$}qVpFG*fGWlZhfimv{+Gm`OmGqPx@*a3Q{nL_#t zUr$5qQui}fQg~K7wM^AtEX)GNUrFV4c7OBirfy9JYpzF`)ifutPz~n-d);DR(`KGg3@q--jCnM*J!q zIzLZf5BGv&^$j0YV*QUYzRxN>A8&P*uD{&#Viut9F%+@LM3=mOLZ%@fWhYt3T-(ce zzi9mOUFKNflRNFRZz|{RXP;)rUom<3vS@nsufLvO`=9sVW^^{omqVkv$=dQvnNpu3 zv%~bcR<5&5hcj~@1nx5(s{McIUd!=X8)M?C9VpAh)Oj3YKTW0ADV$>ZA=Go?|J>U? z)yM6?QybF=J4rb9@eyMnYl=Yef*CLhmyjg^0tJY$Q+J^;$(|dDD58U68EN-0S5l83 zV>~Tv4&N>91Gn9$G8*D9n(|^ePZ&N5{BfP}UF|R@?fe>~e`hf+QJ##d&Te?+a^P|Mm z9DxKUgq?wy8z}PG9tb6MEh&R?DpRR=`1oW~V3fz<;l3;^mp3c+a8FR+=y2am<8W{9 z9E!0^H~-DLNl}YhRO~T7@m?dASjrgih1#AQc*~T0oqj+uT*Lr7hQ#-`@x$H1$&33; z5U5AuJ!-VNdyZqhr3C@s^@a1vkhGA(9Y#EWfx4e;M!s092v;u-M?$dctJ%KvapzBp zd~6wK$u#x0c+vrbOcnwdfpuc{mqCA5{&O$&FO}RY>s}Z!T^=~?p@2DJ?5S}~A%JPZ z^h1U=+G@%3C}dp*H^Wv3ozv`cmlEZ?>6u7X>9fGVANqHEY>{@77>T9D#qN4J#<^2d z+4re*5W}qx{O!Nd!>N(@w4>W?M^4;3&^aicC!RVxIqf(vb zK`GmlMoC;245jfh(sxGtAhiT(bWd5IcjkJ@x0NfdB$)~`!QtRxa2Cm~Mi*-ti7Dqgjo$L_a{AYvgk_M*CToJunwL4Rti+ zInNk(;Tl9m@0T9uXc|-)fRMP5=n7Ks*9s@@*$Z0?ueh)GOA=)*&X{p~9T5%$car56 z`Rrq{KfJmC(|8$kGX6U|58PV3RA)44niLhYzk&?#-G9#0d9PZkU3-&9u;?XI zGX6X#4-Wr`heW{ehrec3@ZKb&jv1~Xdr)fNmGy4bBaGn(a>m~oTXs6G^1o3W g`ak2c;}JWncBo4WYDJuJ3zSJ;$5^{T>-nqy1%}TG1ONa4 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_display_subaddress/00003.png b/tests/snapshots/flex/test_display_subaddress/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..f9bc6495205abbc98fa308293996f53d0553049f GIT binary patch literal 25484 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_display_subaddress/00004.png b/tests/snapshots/flex/test_display_subaddress/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..409120c84be3b6e1182055ddcef75a5c901f7cf2 GIT binary patch literal 10604 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

d35T<%ZLxEI zW+hOnrl`Lw6^D${zou}Bhw}>AcgNltFc0NKFQGW9Y`PN_2B3P2xr18xC-l_;Nd0TGJ=om}tB?WsXgO-TF zlwdgo5U`bm;1p4R!RJV=4nZbmakP#0%v)5^|HM2nLMmwKkMPlvUtvsVO%wTI5{S1S z^HX{6r1t9oW!|}gqcD1aXv^43j}a%yZosFO`VPW9sW8|u%;cRsZlZNb(j_kmxgm{& znnc$ZBEIE5tFIFV>Ovc)EXHiD2YQ}+)}Gh7kdol8pvTt&te0;TANnqkeX9TM0jcRG z@zZ_O7e(^1bbBr>$Axy(KS$X%?(ucm{i*BN{%!_0YoI(SGpIZrwqgZNJ zbs2wFNq$g^?dC2F;zNRaSa;~1{oN}Xt=52F7ZHwcGji&+iv%dHqUrMmhs(zxXuyne~yP z;X(ADUcRngrSfDGn#0ib@b3)O7nHv|pVmhQSgimR1Y>fY?ZBpn7ojZg?yjlJ=D5dL zrm2mSS=*z<4(PUGXTObB_MH~h!*JqZNiI@*in+X%TX5d>Ug~H^cMMerP2>3T>$wM} z(wxz+1C2YtyB&oRb!Du-KK?v4`1Br|W~?&rqUH85OcG#QonIjpzrP>SQL!rq46ym} z>D#c(LyAc4O}YPPN9M>Tn5WB{NGhAlZ7n!)RjR#2+@A#xi(@~wtZo%yoSY2T)5|Ps zvwG)K|4|*z6nBHV#t^%!{viB~HQX0q+hs_Ad|Y*X-1mK4dj7v}e$_Y!?-zouw+%3` Q%Z8kA_4=mv*rlug0an##761SM literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_display_subaddress/00006.png b/tests/snapshots/flex/test_display_subaddress/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..876e018f3a6bf5685a225c3fa2a7f91eeedda8c6 GIT binary patch literal 14357 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 u+%ukoqO8CRZp!!xk0* literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_prefix_hash_hash_init/00000.png b/tests/snapshots/flex/test_prefix_hash_hash_init/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..60911aed2a69cc0ad4af191c408cfbca842c96ea GIT binary patch literal 10943 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 J+u69ne*n@*d*J{8 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_private_view_key/00000.png b/tests/snapshots/flex/test_private_view_key/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..146a5f576cf30a37ffd7d55f90291e8d911889cd GIT binary patch literal 8842 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_private_view_key/00001.png b/tests/snapshots/flex/test_private_view_key/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..d08de44405a5b97666e33646a7002671115db687 GIT binary patch literal 7000 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_validate_prehash_update/00000.png b/tests/snapshots/flex/test_validate_prehash_update/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..f965f7ce424e49c01e180ecd124169b3fd86c6f2 GIT binary patch literal 9559 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_validate_prehash_update/00001.png b/tests/snapshots/flex/test_validate_prehash_update/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..daf5fa50f3ea57f16cef946b2357568ad4f4cf7a GIT binary patch literal 26352 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 PB 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_display_address/00000.png b/tests/snapshots/stax/test_display_address/00000.png index 153d298d71d558a6d97ee0f3f96862a440e4e0f9..9cc0861e260c116420f1733b6e65cb27d73b3fd4 100644 GIT binary patch literal 7258 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 literal 7222 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

U%l&d))(5xW=P86&$TVk;Eu+BGg|%ZP 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 diff --git a/tests/snapshots/stax/test_display_address/00003.png b/tests/snapshots/stax/test_display_address/00003.png index a793ded99c8bb7778f490bacf38948d03b737450..b331e0205ab5ba5353e2744e56f8ddd55c7141a4 100644 GIT binary patch literal 23559 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

U%l&d))(5xW=P86&$TVk;Eu+BGg|%ZP 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 diff --git a/tests/snapshots/stax/test_display_address/00004.png b/tests/snapshots/stax/test_display_address/00004.png index 1d12a315df463ca97211a494a9a39d0097f4eee2..3a3a98e2068e7da270e89f2e54e2fc3d2a468bbb 100644 GIT binary patch literal 7232 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 literal 7232 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 diff --git a/tests/snapshots/stax/test_display_address/00005.png b/tests/snapshots/stax/test_display_address/00005.png index 13499fcc9366bb214269b05db05ce8ae4380ce24..3f906b2b76be79fc321634fc00b2785ca627789c 100644 GIT binary patch delta 2731 zcmXArdt6d?8^E(nSDBXYwDLOFYs}Ov?bR}c?Cx5!yyB&)QJMsrH@t8;rPW$aaKoZz zN}DFBC^&Bkf>BdSW@HMeh?q*|1yQ_}h`h(`Iscu{`8>bp_kEt{`#DvRk^dI#4m02D zf5I;~^N~vaK76=;{q6HyQNp^jLxtBJ4>|64y!LGj_!OA43|$S*7MPbAs>wc(48_r7 zCXeU%5v_3rwj0nt{JL!h+YoV%-fevyHVE)=8`mwH*Etw4*HgY)KMu4~V;hWRS;Z2s&^r^yXh|x9|-mApl59W!$Z^!T(6SP2~h;<{%mH&shg7gic zGSn0aRIS`dy3hoB+;qirbB|Un6XU zhbQs70RFHcR#q1JC^x3-iGKT&Kflkts$6F&UtONI7!qk_XAeBHT17dG#cj#kz(ZFF zK3EuUvOK5I7^8Vg_`;9l6;zYXquTu5q>Zsi-3p7NZ(S|(+Q}W%`lhC)*~|gJ1(KG} z??-!b1l1)aC5Dq7zCJz-=_D5hz7xatP+liivjr)~q?vEIz+j72{;9doEy)fu0(QGA zgMF^95A9i`Th(ble2C-7c`YqIK0Y=!tD3b4Ft z0`~_1kMBuM^e(ou;bdey&L)>@U5jFolNGSy0L9>7$JpX@|1`n6iXA7=hGOpRA`6m| zlIT|NzE{-DX8KHd)3~*S>DS9xF%?KtD?8)r0!!_@rj%eI0M9gA&{4y zVG_lZ+PYm8iA1(_@iV=e1WB*C6K$tjt(F@PfhY&#+xRcB90RNUm!zl$?@ZnD=6vm? z-h5Rmyu=BSYhR2kA9%uM$B43TzSE(XRXuttr1|oZ| zI~d#F;ldk9e{AKfU5?uo&Xi6ruz&b;$vs?O#rWvr{wAUS9{@In}?ghpF}ZZ(~@ z0PaV|aww%yQ_~itU6FQM6L7YmUm47xP)1{&qEGTj9jHhcS9k>Vyufq81FyD= zCcLz_vkOQ;Y6mE`T^06!HQF@g+qS$Ad{?vudx2jWAA;<^SBFvu*LWG5zLCoNQvY5f zhb=3u!8HFExVOo)L&%|PL7fAM8Ac`vLC~-x#Pdj^DQ~UxRKu$?o9#U?`+CziRuQjT z)7r)don2@V9JgONQm1&)0VM1$JzU0cmA0s|5J}pB6}=x@H2v3B>vz9nn5+SN7dP04 zcDoh`?9Da?-x)tz-y9Q`7I8eQJY)o;nYeRm!Dun18Qt=G5b;l-UiC3SrWE{)VZ0v{ z3O!;bDb`0Mv2}etT@O3s#IO568-V+6W@gqsUa#%BX>i>8@3A>lf>8M<{=~%T%Gyz6 zB3k7P|6*s$3;J)K)G@2v5Z`zCX3wM^+J%LN16{%d=>hp9oN|w}OZMyqcm$oV(-8#b zdzDEKMPp(h!Ou%y@^!Ey&c`l{{)OuPmFESf;8B|;adl4Wx#co?`#Vx|Z3ELpGGqZ2 z*Ejn}Q_8hiPBp}@A^q+5w2sVfq6D`T1yjJ`PY<+$9lu!Ht9z{O?(P=RVBnNyG;IL^ zd)SdD&xpq!OY~1Yakzab<}=9L^k%(7H}FA}>>7!@{Dd0F%OKQDz zn)nwUN)wHRBv(>|Lg{BvaD~R`XcG<)xY9|cIs4xt5AuX3aIE%6xXHj7q1jbzPHxQsdnnr}d%(9elrO1H|!pQhDn z{i;^YEyXq+H#QkBC7!r1ysSH;B0Mls^s3!6Z;5;{ITv1LAr_qVe6knS*s5bLx4LhepppFKiXDmn49Kw(dFv@;1eI7KPA$ zy}B}ZYGVftlyuw0+K6h)ypvg3BdH!6ZqIiiMD2oPaA#Yc5xHTRONpO*3OT_5)t;d_ z57R7T)ZQSyrKP3mJ`Xfn6ho*7aQ+zerf#{qRHb7-FgR|C!aKd-A3i+PPDFw(xu$&J zl<~_x{mxJVqHN6HS2=*P*@Iw8!SZVL?!^I|R-@5RwS-`WH!FiEimL-tbJc+%kPwxx zExr~prPFA@oZq5WZnWl-dsx=m{C^w$NG3+5kB(=BJypRIN^od) delta 3140 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 OCpakd2>oz;!T$hx@V%n| diff --git a/tests/snapshots/stax/test_display_subaddress/00000.png b/tests/snapshots/stax/test_display_subaddress/00000.png index 153d298d71d558a6d97ee0f3f96862a440e4e0f9..9cc0861e260c116420f1733b6e65cb27d73b3fd4 100644 GIT binary patch literal 7258 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 literal 7222 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

rgKg5-8S)-*YE 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 diff --git a/tests/snapshots/stax/test_display_subaddress/00003.png b/tests/snapshots/stax/test_display_subaddress/00003.png index 50660621851adb0720ae8d242a4c23c0b9bafc12..e6bce053bab71155f76742143020d42461270441 100644 GIT binary patch literal 23356 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
rgKg5-8S)-*YE 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 diff --git a/tests/snapshots/stax/test_display_subaddress/00004.png b/tests/snapshots/stax/test_display_subaddress/00004.png index 4ca09347690f41238281d041483d4494d37d829b..58f51b5459bcd72946763f5a2f7395e81131baf2 100644 GIT binary patch literal 9104 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 literal 9104 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 delta 3140 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 OCpakd2>oz;!T$hx@V%n| diff --git a/tests/test_version.py b/tests/test_version.py index e17d544..fc4c644 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -8,7 +8,7 @@ def check_accepted_version(monero, valid_version: bytes): major, minor, patch = monero.reset_and_get_version( monero_client_version=valid_version ) # type: int, int, int - assert (major, minor, patch) == (1, 9, 0) # version of the Monero app + assert (major, minor, patch) == (2, 0, 0) # version of the Monero app def check_refused_version(monero, invalid_version: bytes): From 49c1dda4edfd7a73dde884e687d1366837a19e6e Mon Sep 17 00:00:00 2001 From: tdejoigny-ledger Date: Fri, 24 May 2024 20:54:56 +0200 Subject: [PATCH 140/142] add ticker and change wordings --- src/monero_nvram.c | 6 +++--- src/monero_prehash.c | 5 +++++ src/monero_ux_nano.c | 4 ++-- src/monero_ux_nbgl.c | 19 +++++++++--------- src/monero_vars.h | 8 ++++---- .../flex/test_display_address/00000.png | Bin 8891 -> 9896 bytes .../flex/test_display_subaddress/00000.png | Bin 8891 -> 9896 bytes .../test_validate_prehash_update/00000.png | Bin 9559 -> 11184 bytes .../test_validate_prehash_update/00001.png | Bin 26352 -> 26913 bytes .../test_validate_prehash_update/00002.png | Bin 8606 -> 9583 bytes .../test_prefix_hash_hash_init/00001.png | Bin 324 -> 411 bytes .../test_validate_prehash_init/00000.png | Bin 261 -> 317 bytes .../test_validate_prehash_init/00001.png | Bin 324 -> 411 bytes .../test_validate_prehash_update/00000.png | Bin 399 -> 439 bytes .../test_validate_prehash_update/00007.png | Bin 324 -> 411 bytes .../test_prefix_hash_hash_init/00001.png | Bin 347 -> 437 bytes .../test_validate_prehash_init/00000.png | Bin 282 -> 342 bytes .../test_validate_prehash_init/00001.png | Bin 347 -> 437 bytes .../test_validate_prehash_update/00000.png | Bin 424 -> 467 bytes .../test_validate_prehash_update/00003.png | Bin 347 -> 437 bytes .../test_prefix_hash_hash_init/00001.png | Bin 347 -> 437 bytes .../test_validate_prehash_init/00000.png | Bin 282 -> 342 bytes .../test_validate_prehash_init/00001.png | Bin 347 -> 437 bytes .../test_validate_prehash_update/00000.png | Bin 424 -> 467 bytes .../test_validate_prehash_update/00003.png | Bin 347 -> 437 bytes .../stax/test_display_address/00000.png | Bin 7258 -> 8211 bytes .../stax/test_display_subaddress/00000.png | Bin 7258 -> 8211 bytes .../test_validate_prehash_update/00000.png | Bin 8444 -> 9749 bytes .../test_validate_prehash_update/00001.png | Bin 23917 -> 24972 bytes .../test_validate_prehash_update/00002.png | Bin 7514 -> 8937 bytes 30 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/monero_nvram.c b/src/monero_nvram.c index fe326b9..c12ce79 100644 --- a/src/monero_nvram.c +++ b/src/monero_nvram.c @@ -22,8 +22,8 @@ #include "monero_api.h" #include "monero_vars.h" -#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) || defined(TARGET_FLEX) -const monero_nv_state_t N_state_pic; -#else +#if defined(TARGET_NANOS) monero_nv_state_t N_state_pic; +#else +const monero_nv_state_t N_state_pic; #endif diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 403865f..c609b63 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -56,6 +56,9 @@ int monero_apdu_mlsag_prehash_init() { // fee str monero_vamount2str(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, G_monero_vstate.ux_amount, 15); + + snprintf(G_monero_vstate.ux_amount + strlen(G_monero_vstate.ux_amount), + sizeof(G_monero_vstate.ux_amount) - strlen(G_monero_vstate.ux_amount), " XMR"); // ask user monero_io_discard(1); ui_menu_fee_validation_display(0); @@ -212,6 +215,8 @@ int monero_apdu_mlsag_prehash_update() { amount = monero_bamount2uint64(v, sizeof(v)); if (amount) { monero_amount2str(amount, G_monero_vstate.ux_amount, 15); + snprintf(G_monero_vstate.ux_amount + strlen(G_monero_vstate.ux_amount), + sizeof(G_monero_vstate.ux_amount) - strlen(G_monero_vstate.ux_amount), " XMR"); if ((G_monero_vstate.options & IN_OPTION_MORE_COMMAND) == 0) { if (!is_change) { diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index c865d0c..d48e37b 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -181,7 +181,7 @@ UX_STEP_NOCB(ux_menu_validation_timelock_1_step, bn, UX_STEP_CB(ux_menu_validation_cf_2_step, pb, ui_menu_amount_validation_action(ACCEPT), { &C_icon_validate_14, - "Accept", + "Sign transaction", }); UX_STEP_CB(ux_menu_validation_cf_3_step, pb, ui_menu_amount_validation_action(REJECT), @@ -241,7 +241,7 @@ UX_STEP_NOCB(ux_menu_validation_2_step, {"Destination", G_monero_vstate.ux_address}); UX_STEP_CB(ux_menu_validation_3_step, pb, ui_menu_validation_action(ACCEPT), - {&C_icon_validate_14, "Accept"}); + {&C_icon_validate_14, "Sign transaction"}); UX_STEP_CB(ux_menu_validation_4_step, pb, ui_menu_validation_action(REJECT), {&C_icon_crossmark, "Reject"}); diff --git a/src/monero_ux_nbgl.c b/src/monero_ux_nbgl.c index 36115a7..de0dfd8 100644 --- a/src/monero_ux_nbgl.c +++ b/src/monero_ux_nbgl.c @@ -160,13 +160,13 @@ void ui_menu_change_validation_display_last(unsigned int value __attribute__((un transactionContext.tagValueList.nbPairs++; transactionContext.infoLongPress.icon = &C_Monero_64px; - transactionContext.infoLongPress.longPressText = "Approve"; + transactionContext.infoLongPress.longPressText = "Hold to sign"; transactionContext.infoLongPress.longPressToken = 0; transactionContext.infoLongPress.tuneId = TUNE_TAP_CASUAL; - transactionContext.infoLongPress.text = "Hold to confirm"; + transactionContext.infoLongPress.text = "Sign transaction"; nbgl_useCaseStaticReview(&transactionContext.tagValueList, &transactionContext.infoLongPress, - "Cancel", ui_menu_validation_action); + "Reject transaction", ui_menu_validation_action); } static void timelock_callback(void) { @@ -234,7 +234,7 @@ static void continue_display(int token, unsigned char index) { .navWithTap.backButton = false, .navWithTap.nextPageText = NEXT_PAGE_TEXT, .navWithTap.nextPageToken = CONTINUE_TOKEN, - .navWithTap.quitText = "Cancel", + .navWithTap.quitText = "Reject transaction", .quitToken = QUIT_TOKEN, .tuneId = TUNE_TAP_CASUAL}; @@ -255,13 +255,13 @@ static void continue_display_last(int token, unsigned char index) { fill_amount_and_destination(); transactionContext.infoLongPress.icon = &C_Monero_64px; - transactionContext.infoLongPress.longPressText = "Approve"; + transactionContext.infoLongPress.longPressText = "Hold to sign"; transactionContext.infoLongPress.longPressToken = 0; transactionContext.infoLongPress.tuneId = TUNE_TAP_CASUAL; - transactionContext.infoLongPress.text = "Hold to confirm"; + transactionContext.infoLongPress.text = "Sign transaction"; nbgl_useCaseStaticReview(&transactionContext.tagValueList, &transactionContext.infoLongPress, - "Cancel", ui_menu_validation_action); + "Reject transaction", ui_menu_validation_action); } static void display_previous_infos(bool last) { @@ -274,7 +274,7 @@ static void display_previous_infos(bool last) { .navWithTap.backButton = false, .navWithTap.nextPageText = NEXT_PAGE_TEXT, .navWithTap.nextPageToken = CONTINUE_TOKEN, - .navWithTap.quitText = "Cancel", + .navWithTap.quitText = "Reject transaction", .quitToken = QUIT_TOKEN, .tuneId = TUNE_TAP_CASUAL}; @@ -380,7 +380,8 @@ void display_account(void) { transactionContext.tagValueList.pairs = transactionContext.tagValuePair; nbgl_useCaseAddressReview(G_monero_vstate.ux_address, &transactionContext.tagValueList, - &C_Monero_64px, "Review Address", NULL, ui_menu_pubaddr_action); + &C_Monero_64px, "Verify Monero\naddress", NULL, + ui_menu_pubaddr_action); } int ui_menu_any_pubaddr_display(unsigned int value __attribute__((unused)), unsigned char* pub_view, diff --git a/src/monero_vars.h b/src/monero_vars.h index 547d41a..161475a 100644 --- a/src/monero_vars.h +++ b/src/monero_vars.h @@ -28,12 +28,12 @@ extern monero_v_state_t G_monero_vstate; -#if defined(TARGET_NANOX) || defined(TARGET_NANOS2) || defined(TARGET_STAX) || defined(TARGET_FLEX) -extern const monero_nv_state_t N_state_pic; -#define N_monero_pstate ((volatile monero_nv_state_t *)PIC(&N_state_pic)) -#else +#if defined(TARGET_NANOS) extern monero_nv_state_t N_state_pic; #define N_monero_pstate ((WIDE monero_nv_state_t *)PIC(&N_state_pic)) +#else +extern const monero_nv_state_t N_state_pic; +#define N_monero_pstate ((volatile monero_nv_state_t *)PIC(&N_state_pic)) #endif #ifdef MONERO_DEBUG_MAIN diff --git a/tests/snapshots/flex/test_display_address/00000.png b/tests/snapshots/flex/test_display_address/00000.png index 18c1600c218daa9a20d1470a21326850fbbeb67a..b824ee5078a210889f5391b02724f355d8ddd1d4 100644 GIT binary patch literal 9896 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 LOuy>J{pkM%E{zdY literal 8891 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 PMaJQ*%bChk0k{7LZY0~N diff --git a/tests/snapshots/flex/test_display_subaddress/00000.png b/tests/snapshots/flex/test_display_subaddress/00000.png index 18c1600c218daa9a20d1470a21326850fbbeb67a..b824ee5078a210889f5391b02724f355d8ddd1d4 100644 GIT binary patch literal 9896 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 LOuy>J{pkM%E{zdY literal 8891 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 PMaJQ*%bChk0k{7LZY0~N diff --git a/tests/snapshots/flex/test_validate_prehash_update/00000.png b/tests/snapshots/flex/test_validate_prehash_update/00000.png index f965f7ce424e49c01e180ecd124169b3fd86c6f2..fa42052bf5a9dc924cf934bd135d4681f9babc0b 100644 GIT binary patch literal 11184 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 literal 9559 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 diff --git a/tests/snapshots/flex/test_validate_prehash_update/00001.png b/tests/snapshots/flex/test_validate_prehash_update/00001.png index daf5fa50f3ea57f16cef946b2357568ad4f4cf7a..5dfb8a9b95474b32c7a7be175e0b4c654e537ac0 100644 GIT binary patch delta 24439 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%0DFO+B8H?#=UU}mh| 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

(Q-msS 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 literal 8606 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 diff --git a/tests/snapshots/nanos/test_prefix_hash_hash_init/00001.png b/tests/snapshots/nanos/test_prefix_hash_hash_init/00001.png index 1e284f082ac82ce25a1a8f68870b8152aa91a8ec..e66f66280afcb24932d9918af065d9aa301e3d22 100644 GIT binary patch delta 384 zcmV-`0e}9)0-FPnB!6N_L_t(|ob8#*5`!=ZMX^)=|ASrFg-%L=JTR#QhqJ4O1TJ~d z2oMB85ClQc&A!3DSv#TQW$nN?yh(rXlmsO8m(|n{HLenn+hN?Q56%*BKyu(&eQ=h5 zBykemx%vRGSUaGH??P_X2Vn)wUrP|VeW_oOcYgH~4om)%tbf~1(Qo0s+$4s@&lK0)vk@xox=z6(XP%{9hW z@Ovr5JLD}zThU4407w^5<dK1kDh1|CSs_Kk7$M9@z_X^Oq-e`L}R};`UgRH`? zj;r#DHy#(%)h#G@DiTx&)X}H7Xz;5l;vt+X3b2Qb4ota{ejx#y*OwFH>XYOX`P(N+ eUe^b~gnR&sRK?A=BIl$40000D9f|G_-qLrv540j0z(x_}jNunQffVr5yMR7YW#QF#bR{fi0Ry~6Bh7+ZL!MIB@k+cd zFRGt)1*`>`*|Jv5rW~vsw-=<&6TxdiGn!!j*Zsge0qJBvo%@$gdseDI#sjkl^tAQB v%qE|5JJdZ3Frjc*w({kSU`F7=ZQ|>3=`?DxH2Fk-4^PN8621gI)O86>s#MA2+K?5 zcxeX5#??E(T;_F#-vpjZkR0_@SB4io#Z?JXOo?6TuJ|lLX@4-{_9aaIi-*2ocIW{f zdVq%>Afft5!0M;R316qKMWlF0J*cSM8^@LOx`0>zQy%41`@noE^T%}q%6os$L`Mh)xJ%Pn pMzUtfY<@sp5F80HccP0?t|H&0(BGb=>c(E}+MY`kuK8pi({-Ih*FBVIOq?J(l_3-!zERugmGM zIcb}#cR=$t-)H_I@Vo?tZGUqr=9^w}wFG6&7Q51-MjaQgJnoO8@`>07*qoM6N<$f(w~!9{>OV diff --git a/tests/snapshots/nanos/test_validate_prehash_init/00001.png b/tests/snapshots/nanos/test_validate_prehash_init/00001.png index 1e284f082ac82ce25a1a8f68870b8152aa91a8ec..e66f66280afcb24932d9918af065d9aa301e3d22 100644 GIT binary patch delta 384 zcmV-`0e}9)0-FPnB!6N_L_t(|ob8#*5`!=ZMX^)=|ASrFg-%L=JTR#QhqJ4O1TJ~d z2oMB85ClQc&A!3DSv#TQW$nN?yh(rXlmsO8m(|n{HLenn+hN?Q56%*BKyu(&eQ=h5 zBykemx%vRGSUaGH??P_X2Vn)wUrP|VeW_oOcYgH~4om)%tbf~1(Qo0s+$4s@&lK0)vk@xox=z6(XP%{9hW z@Ovr5JLD}zThU4407w^5<dK1kDh1|CSs_Kk7$M9@z_X^Oq-e`L}R};`UgRH`? zj;r#DHy#(%)h#G@DiTx&)X}H7Xz;5l;vt+X3b2Qb4ota{ejx#y*OwFH>XYOX`P(N+ eUe^b~gnR&sRK?A=BIl$40000D9f|G_-qLrv540j0z(x_}jNunQffVr5yMR7YW#QF#bR{fi0Ry~6Bh7+ZL!MIB@k+cd zFRGt)1*`>`*|Jv5rW~vsw-=<&6TxdiGn!!j*Zsge0qJBvo%@$gdseDI#sjkl^tAQB v%qE4-1GfW^B!7NML_t(|ob8!i7s4P2hFPcm{~x@Ibzx@_AVXbYr}w!s6JmU* zBO(9*03extqkYRZB7s}B0YpSE*MBVr)5QCpZ9tuUqh)=%=@^vpvA~?+QbLbV#g`>9 zK?R6RzCHa3E`E%cHP`zzMF0v-zR(_@V?XI&ntv_mXFWJbb_MXQS#Rz& zbgg9XB;8~OpujifCK2-#)dz+n{;!qyuOQy}AO`s$2KgWcnZWy*ynBCXkTLJ+x)0;5 z;R>CVj()AJNu0~p4E8UzqC;hBbDlkNMV1tGX4U8}W~8rKyL~&dk(za+n(Pef(Jd@f z=b7b!7qM$!GJktgAe)l%pRs(P7sL&6s*>Kzy!H&b(zUFZal|9$4N`QP9q$${YR2il zalEmk2_6q4=AEt_#7`GSZvZ+B6=#V!hesaUPyZ1;VqX8RP%Er(x_q%6t?v?3@d=ao zHdW!G0O(u@*PwxxHT5^OPK9{z&?4(BnJsky00000eio1iOJxa{>jpYh00000NkvXX Hu0mjfey_hB delta 372 zcmV-)0gL{(1CIlcB!5;(L_t(|ob8y)5`!=ZMX^)=|ASrFMLLv*1oM=1de16VKneyT zL;wH)fHUVo=i%*y0}pQph=@L+zbyyLL~bN_mfT!=*jY0E%pKAV-IA?sXjS<+sEmyJ5F4A=iEqkU z%%26xP)37d7H#0WTE(!I(~Yhe>LuAe>8>dp~t;T$!;dkf*Ks(Qo0s+$4s@&lK0)vk@xox=z6(XP%{9hW z@Ovr5JLD}zThU4407w^5<dK1kDh1|CSs_Kk7$M9@z_X^Oq-e`L}R};`UgRH`? zj;r#DHy#(%)h#G@DiTx&)X}H7Xz;5l;vt+X3b2Qb4ota{ejx#y*OwFH>XYOX`P(N+ eUe^b~gnR&sRK?A=BIl$40000D9f|G_-qLrv540j0z(x_}jNunQffVr5yMR7YW#QF#bR{fi0Ry~6Bh7+ZL!MIB@k+cd zFRGt)1*`>`*|Jv5rW~vsw-=<&6TxdiGn!!j*Zsge0qJBvo%@$gdseDI#sjkl^tAQB v%qEB!7HKL_t(|obB0Lj>8}fKv7RMJ7NDzVlVwbLX=m4kT{O+`I>2Y z7!ycBMF0Q*0000000000u)%xpz1NOn!bdxRoouB(c+UjH>^tXlBbj1s0$Mwa(d>)4 z2?(+|u$z4`HvuulG3lnWFCu^10jwx@A*0zBb1NXo(rq{U6@P}FH)9Sou?uP9KCFrKKF+B(;dDNobK&3DycRuuINRTY)L*Pr0$5)Gc;%0-+yKmvtf?+KJI_HW}N)jLGRqJMLhB+Gv;F&Aw zM>b&f=gTKE`HR?_T=ko9`CNZdM*si-00000002PO7Zk#mAac-Jg)0C6002ovPDHLk FV1i$v$cq2~ delta 320 zcmdnWe4A;4O1+Y&i(^Q|oVPav`3@-vxL&-tL-^Z%m2Z#OITc&CUCBz1+xvXAV&KPK z*$J~48Q@@n;`2Gh-{u`<^ncG;Gdb+b(ORy6%l?`_&pi>?$h4+Z;^G(Ibqq%rvF&;} zJBBgqh-t~oFK6F8v~BeN66;}7J9#&Am+PHfFZns%)<1c&?awyp^>@ApZjmy28J{L# z`ZB&ps$vm$Ws>YSmpwNY@7Qgxe9ivhzn16X@`9@l=)dRm$yC;6=XZBM^D%dE}1X5dG_}+d6vfI3%*F+pEUJnbDnGctfsECj^v|zIV@Rkp3*tx9ucaZ zbG4pxqe+B}n`?$ zf8JguyrK3FJCnR?Ntub#r8~QQHJ$_>$y7DWoaLMOK(N4a`r|#O!U0v^x6Lk3Q=eWh z_%EAFDslPBtEM5ZCwx>rwSCr=*x=Bk&#JD}in1Vl$&mMnZQ8B3hnIUr-3N(!y85}S Ib4q9e0FMcdN&o-= delta 255 zcmcb{G>d71ay`RCPZ!6KiaBp@IQAVf;9o+cu?K>clJ?}RO%46@e%(#hIUhW0-)pfJ80dA+J6lqeI{gikUq{Ei z`?VLMZtva`@24&v{!-SU_RRa}dO?wUP22AOeYgTe~DWM4f DA`o;$ diff --git a/tests/snapshots/nanosp/test_validate_prehash_init/00001.png b/tests/snapshots/nanosp/test_validate_prehash_init/00001.png index 0a22ed9c048e1c509e4db8bb538a09179382d08c..63db7647ff4de471b692cef68df0dd8b4493503a 100644 GIT binary patch delta 411 zcmV;M0c8H$0<{B>B!7HKL_t(|obB0Lj>8}fKv7RMJ7NDzVlVwbLX=m4kT{O+`I>2Y z7!ycBMF0Q*0000000000u)%xpz1NOn!bdxRoouB(c+UjH>^tXlBbj1s0$Mwa(d>)4 z2?(+|u$z4`HvuulG3lnWFCu^10jwx@A*0zBb1NXo(rq{U6@P}FH)9Sou?uP9KCFrKKF+B(;dDNobK&3DycRuuINRTY)L*Pr0$5)Gc;%0-+yKmvtf?+KJI_HW}N)jLGRqJMLhB+Gv;F&Aw zM>b&f=gTKE`HR?_T=ko9`CNZdM*si-00000002PO7Zk#mAac-Jg)0C6002ovPDHLk FV1i$v$cq2~ delta 320 zcmdnWe4A;4O1+Y&i(^Q|oVPav`3@-vxL&-tL-^Z%m2Z#OITc&CUCBz1+xvXAV&KPK z*$J~48Q@@n;`2Gh-{u`<^ncG;Gdb+b(ORy6%l?`_&pi>?$h4+Z;^G(Ibqq%rvF&;} zJBBgqh-t~oFK6F8v~BeN66;}7J9#&Am+PHfFZns%)<1c&?awyp^>@ApZjmy28J{L# z`ZB&ps$vm$Ws>YSmpwNY@7Qgxe9ivhzn16X@`9@l=)dRm$yC;6=XZBM^1lv1Kw5#T$z0V$=_y8dHhaL#zYq8l((O369bZfY0x zx)m7Skx^YeT~)GJl=v0U%|!WU?K^qV6>Gm<{tFr2u5-?@y?>uh7=UW2FLaL|vY*^= z$`x-$Sb8rq#D-8sDT*!J|_ zsi(WI3m9w5KVv?Wjvl^Coa0SRlH1hG0|THZf`0*OIx==x|5Dzx3wIt`X>^vHHgy01 j00000000000Km)-$oGT2uv>R{00000NkvXXu0mjf2|mw< delta 398 zcmV;90dfA*1E>R#B!6#7L_t(|obA|AZo?o9fMGW6Cfxr>++`0)$ihG&kl1bi?QvcW-_?hoN>j8A7lwyoIP30nA zmj=yGWK`8p)s<{!#eM};ccT0==T2T!&C0hge?o?r>lmYL_J4zi3CNamp)>AeKe@om z7WBRu++@50ydQ(g*bo}&7|7=%B(^1gPVJHi~;V-D;w2bRdb zC9-cxXaDDT@6E?~U9K6lksS_N4*J){R)-9F>%~@|48muIceh82ak{)bU;oi2 zkB6P%y==Mf-dfOwftIsGA1a&w_W1VS>1T(Ra&%GcFy2mr<3oCM0`w-k^Hir}oBc0U sSgY{KLkj=^0000000000066pyz5_Y-=Z2s700000Ne4wvM6N<$f~jA^KL7v# diff --git a/tests/snapshots/nanosp/test_validate_prehash_update/00003.png b/tests/snapshots/nanosp/test_validate_prehash_update/00003.png index 0a22ed9c048e1c509e4db8bb538a09179382d08c..63db7647ff4de471b692cef68df0dd8b4493503a 100644 GIT binary patch delta 411 zcmV;M0c8H$0<{B>B!7HKL_t(|obB0Lj>8}fKv7RMJ7NDzVlVwbLX=m4kT{O+`I>2Y z7!ycBMF0Q*0000000000u)%xpz1NOn!bdxRoouB(c+UjH>^tXlBbj1s0$Mwa(d>)4 z2?(+|u$z4`HvuulG3lnWFCu^10jwx@A*0zBb1NXo(rq{U6@P}FH)9Sou?uP9KCFrKKF+B(;dDNobK&3DycRuuINRTY)L*Pr0$5)Gc;%0-+yKmvtf?+KJI_HW}N)jLGRqJMLhB+Gv;F&Aw zM>b&f=gTKE`HR?_T=ko9`CNZdM*si-00000002PO7Zk#mAac-Jg)0C6002ovPDHLk FV1i$v$cq2~ delta 320 zcmdnWe4A;4O1+Y&i(^Q|oVPav`3@-vxL&-tL-^Z%m2Z#OITc&CUCBz1+xvXAV&KPK z*$J~48Q@@n;`2Gh-{u`<^ncG;Gdb+b(ORy6%l?`_&pi>?$h4+Z;^G(Ibqq%rvF&;} zJBBgqh-t~oFK6F8v~BeN66;}7J9#&Am+PHfFZns%)<1c&?awyp^>@ApZjmy28J{L# z`ZB&ps$vm$Ws>YSmpwNY@7Qgxe9ivhzn16X@`9@l=)dRm$yC;6=XZBM^B!7HKL_t(|obB0Lj>8}fKv7RMJ7NDzVlVwbLX=m4kT{O+`I>2Y z7!ycBMF0Q*0000000000u)%xpz1NOn!bdxRoouB(c+UjH>^tXlBbj1s0$Mwa(d>)4 z2?(+|u$z4`HvuulG3lnWFCu^10jwx@A*0zBb1NXo(rq{U6@P}FH)9Sou?uP9KCFrKKF+B(;dDNobK&3DycRuuINRTY)L*Pr0$5)Gc;%0-+yKmvtf?+KJI_HW}N)jLGRqJMLhB+Gv;F&Aw zM>b&f=gTKE`HR?_T=ko9`CNZdM*si-00000002PO7Zk#mAac-Jg)0C6002ovPDHLk FV1i$v$cq2~ delta 320 zcmdnWe4A;4O1+Y&i(^Q|oVPav`3@-vxL&-tL-^Z%m2Z#OITc&CUCBz1+xvXAV&KPK z*$J~48Q@@n;`2Gh-{u`<^ncG;Gdb+b(ORy6%l?`_&pi>?$h4+Z;^G(Ibqq%rvF&;} zJBBgqh-t~oFK6F8v~BeN66;}7J9#&Am+PHfFZns%)<1c&?awyp^>@ApZjmy28J{L# z`ZB&ps$vm$Ws>YSmpwNY@7Qgxe9ivhzn16X@`9@l=)dRm$yC;6=XZBM^D%dE}1X5dG_}+d6vfI3%*F+pEUJnbDnGctfsECj^v|zIV@Rkp3*tx9ucaZ zbG4pxqe+B}n`?$ zf8JguyrK3FJCnR?Ntub#r8~QQHJ$_>$y7DWoaLMOK(N4a`r|#O!U0v^x6Lk3Q=eWh z_%EAFDslPBtEM5ZCwx>rwSCr=*x=Bk&#JD}in1Vl$&mMnZQ8B3hnIUr-3N(!y85}S Ib4q9e0FMcdN&o-= delta 255 zcmcb{G>d71ay`RCPZ!6KiaBp@IQAVf;9o+cu?K>clJ?}RO%46@e%(#hIUhW0-)pfJ80dA+J6lqeI{gikUq{Ei z`?VLMZtva`@24&v{!-SU_RRa}dO?wUP22AOeYgTe~DWM4f DA`o;$ diff --git a/tests/snapshots/nanox/test_validate_prehash_init/00001.png b/tests/snapshots/nanox/test_validate_prehash_init/00001.png index 0a22ed9c048e1c509e4db8bb538a09179382d08c..63db7647ff4de471b692cef68df0dd8b4493503a 100644 GIT binary patch delta 411 zcmV;M0c8H$0<{B>B!7HKL_t(|obB0Lj>8}fKv7RMJ7NDzVlVwbLX=m4kT{O+`I>2Y z7!ycBMF0Q*0000000000u)%xpz1NOn!bdxRoouB(c+UjH>^tXlBbj1s0$Mwa(d>)4 z2?(+|u$z4`HvuulG3lnWFCu^10jwx@A*0zBb1NXo(rq{U6@P}FH)9Sou?uP9KCFrKKF+B(;dDNobK&3DycRuuINRTY)L*Pr0$5)Gc;%0-+yKmvtf?+KJI_HW}N)jLGRqJMLhB+Gv;F&Aw zM>b&f=gTKE`HR?_T=ko9`CNZdM*si-00000002PO7Zk#mAac-Jg)0C6002ovPDHLk FV1i$v$cq2~ delta 320 zcmdnWe4A;4O1+Y&i(^Q|oVPav`3@-vxL&-tL-^Z%m2Z#OITc&CUCBz1+xvXAV&KPK z*$J~48Q@@n;`2Gh-{u`<^ncG;Gdb+b(ORy6%l?`_&pi>?$h4+Z;^G(Ibqq%rvF&;} zJBBgqh-t~oFK6F8v~BeN66;}7J9#&Am+PHfFZns%)<1c&?awyp^>@ApZjmy28J{L# z`ZB&ps$vm$Ws>YSmpwNY@7Qgxe9ivhzn16X@`9@l=)dRm$yC;6=XZBM^1lv1Kw5#T$z0V$=_y8dHhaL#zYq8l((O369bZfY0x zx)m7Skx^YeT~)GJl=v0U%|!WU?K^qV6>Gm<{tFr2u5-?@y?>uh7=UW2FLaL|vY*^= z$`x-$Sb8rq#D-8sDT*!J|_ zsi(WI3m9w5KVv?Wjvl^Coa0SRlH1hG0|THZf`0*OIx==x|5Dzx3wIt`X>^vHHgy01 j00000000000Km)-$oGT2uv>R{00000NkvXXu0mjf2|mw< delta 398 zcmV;90dfA*1E>R#B!6#7L_t(|obA|AZo?o9fMGW6Cfxr>++`0)$ihG&kl1bi?QvcW-_?hoN>j8A7lwyoIP30nA zmj=yGWK`8p)s<{!#eM};ccT0==T2T!&C0hge?o?r>lmYL_J4zi3CNamp)>AeKe@om z7WBRu++@50ydQ(g*bo}&7|7=%B(^1gPVJHi~;V-D;w2bRdb zC9-cxXaDDT@6E?~U9K6lksS_N4*J){R)-9F>%~@|48muIceh82ak{)bU;oi2 zkB6P%y==Mf-dfOwftIsGA1a&w_W1VS>1T(Ra&%GcFy2mr<3oCM0`w-k^Hir}oBc0U sSgY{KLkj=^0000000000066pyz5_Y-=Z2s700000Ne4wvM6N<$f~jA^KL7v# diff --git a/tests/snapshots/nanox/test_validate_prehash_update/00003.png b/tests/snapshots/nanox/test_validate_prehash_update/00003.png index 0a22ed9c048e1c509e4db8bb538a09179382d08c..63db7647ff4de471b692cef68df0dd8b4493503a 100644 GIT binary patch delta 411 zcmV;M0c8H$0<{B>B!7HKL_t(|obB0Lj>8}fKv7RMJ7NDzVlVwbLX=m4kT{O+`I>2Y z7!ycBMF0Q*0000000000u)%xpz1NOn!bdxRoouB(c+UjH>^tXlBbj1s0$Mwa(d>)4 z2?(+|u$z4`HvuulG3lnWFCu^10jwx@A*0zBb1NXo(rq{U6@P}FH)9Sou?uP9KCFrKKF+B(;dDNobK&3DycRuuINRTY)L*Pr0$5)Gc;%0-+yKmvtf?+KJI_HW}N)jLGRqJMLhB+Gv;F&Aw zM>b&f=gTKE`HR?_T=ko9`CNZdM*si-00000002PO7Zk#mAac-Jg)0C6002ovPDHLk FV1i$v$cq2~ delta 320 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

^sBHK)I{nZe)G_~o%*N19KvTBuaOa;HXn)ebjh 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 diff --git a/tests/snapshots/stax/test_display_subaddress/00000.png b/tests/snapshots/stax/test_display_subaddress/00000.png index 9cc0861e260c116420f1733b6e65cb27d73b3fd4..ef48b90a4b7c660f71dd2c3dbee00237d368d6c9 100644 GIT binary patch literal 8211 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

^sBHK)I{nZe)G_~o%*N19KvTBuaOa;HXn)ebjh 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 diff --git a/tests/snapshots/stax/test_validate_prehash_update/00000.png b/tests/snapshots/stax/test_validate_prehash_update/00000.png index 9096b81a1069508203a70830589ae746aee4e475..bc5b2d0efa189d4086a678e3974989b2635aa591 100644 GIT binary patch literal 9749 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 Jl7IDx{}20OyY2u0 diff --git a/tests/snapshots/stax/test_validate_prehash_update/00001.png b/tests/snapshots/stax/test_validate_prehash_update/00001.png index d6aed2f7cb039a516e0ef5f9023ca43053e0ee7e..17d0bfbac135a9e07b65308b177052803c998c2f 100644 GIT binary patch literal 24972 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

  • 0JwT$d|G*QW?XY# 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 TrN;xlvH;Nr-oWacwh{jV3N|N; literal 23917 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

    MqoOt#|F9TGxpRQ^w>bV8%HSY8Vl zn)X-4sH7GSh3GsG;0q9x33O;TVKhTawVq39j} zN!--YNj<`0C}^_#;GX}-kR~cZqVwxAb9y~$=|_wVdzoXVx2~f?RGx^5ZOh1gI&{x# zfi|Z{u7!k&oBakux50658{eoJcuXDpFjy#uDzr$KRS8rvPe%t1o8QvU=Tv#C#BB`g zRpm~CZPgArm}D0Z#Du&y2G4624K79u>wzRbDh(zMYiu^~Bn7nDmmY`3`(;p9V zMB<0;QyBmqwJJCB z66>OID+)3vdRR$hzK$`@7VgDdKR2t@K87ri*GV^1djXk`5 zFkT#v{2USO?_*+GXq1d5HE`FNS3(Ckj)_TZy48K#InHq0{-{|#4B#ac!fBtJ3@$*E zW0=1BTJO{4`}++a$(m;uZyxkO8!7(n)3?S>;eMg4xpm1CC%d=;K;n)dWYJdsKpJXr zBrr2!I$Q~=+*XOB*i*gJ>-5!21A}+(%{TfeVi+@<*|Bq@^>CkPxuS5Mu@srw>#Pbs zyWkA>=S~%f;gjZ`%l?ym4mn~MP6E*Y^8gHOAJJu%Egr-4C^u^Qd3_hTj40|a2dTdl z;4nnCKqCD0l^ZPNfUtTzqUyBOKomejymuu2x^GaP-j#tZ!PAZ^OjhDH0!#YnMyx@P-Uxq%Ds!n=W?9I`9zLE*H);mlk8qXeJ+%X5WJzt! z&Lsq15pv^4@lv`ci#!+BTH1JtqMEIKFVXO1?6uZiGzB|1p3e^~9H6L4bbhY6(d?#J z6s{#?&DeC2DjgSdJjN0K6*E3>#s-Au*S)Zy|X)OwNo?hy_gj$;#w5n zz`2dSAq0MaRaTPbT1BC+ivE`TwRj3MfBP9N&ukUrk7r~PFIMaYA@=Es^J2<;Oa)Dl zyAQCwBoaB>6j*mKmZz7FIIpgXD}^Val@(a~wdreb|3Kg}GaA6sEb6Ot#O2usZx-?T zcFpxpi=k*|eNg;R%F>$|uZ>8((e@$~?sJGZHEyr41a%R14abRuN7bl+92>@fas>P`32r1W=arC^*kP9`Sr!Sta zGpQ&vljhHZ6q|x)(d^X6E~wWBOxaNp+R+IaZsnl@#w4=-SkGyN8=pd+t8(WAf30wN zhv+gXP*})vig0bAHto`%2sQ3$53t|&`XaE*Y-#$l%7Y;;Vix^YW~jP zn2kF1VEOorz$Topd_>)ELnmZ=4lbH#o~}XO@ZWPHucynFHl40q(E-FJuu^KGqGPVG z*2c?)u8+}S-%Uk|U5^>^zw!?_^wl4D>KwPA$>zJ88@Ak@LMFD<$*8866Q)10SHy$j zj>M5V_dTo5(;ARDr{pU4S(H!G&;A$;uW#C1@2-TRD@;JedY@y-WjEq_@lE1iXMfJ# zs!7rAEVK&Rcn2BtsjhUWzMFh1KSg)qq`B8dvOdg`5@ICb+`JRbDDzv~dr@ vH@3gglRGfrFTuWJO8@M~9sgR1w&JGpx6(TeGPi(FSU~0`))y;{JQDs3ip0dN literal 7514 zcmeHMd03L$y0<~iEUlfHmBY3&Gf^8H%CUBtm6~aaii$(d^E^OmX=Ph0bvu<4Zs!=B zQ4!I|%%h~FgeEGKZ9_012Si2mes<1t|3CNMbMN!q=fEF}k8iP9>s{}9f5Z3t?OPUm zcOTg;CMLG`#`UXqVq)8}#Kg9j?b;4}V`$Tf5))HWy>a!jeS9%zijz=2NxSd4piH@M zBV{FZ3wT%Vypy7#s&U!!jGDg`BqhI0?Jp6L9<*4t^7}x@(BjzB%dRiNeIEEjt0@7t za)&Q5MT`nbvGCKx?Qiyhe%Us! zRDnQ{s4N$MPOvKz24(Fr+bz#rk??K|mu0`k3w6NjW#VYOCQC}wpgJHt} zHFsttu>H-8(jH=cR}YKRs0%j)ft966Z^S2^g=3xp^5Mq~aN+jN_g&hlE>XJD{!@Dy z>uBdo_)y{exkB-l*>5VJYn(5+aOd~;1DDgck{|xoe1C3=N4|&qq0~O&wwV<;4w~7n z9mO+qs0Y99F|)~D4`b1KA;TjA*=mQy-x{C3n$jE5cAd&y^U0{_y!kg(9UYyvItP9u zck$9&H7DJU3bTdw-^eW5Ryz7y?WFRFUqx8GE#pBC0yW}@VURgy4 zo{4_oF>j`{=c;7d+Z|H!o5SO}(Xk$r2#;)^@=NEMQUO7CGv7|_FSKWK>J<@GT=N@`R#X7GW7=ASrUwdcE& zLB#1_9Q8?)>7-rqhdM482KM&u%pkdCDPyOPr1Uxr?aqQks1c_j>b}=8?WGzx{pCPLrnQ56TknBUO^9oM(g;r%{h!h>c|o^J?y@su^!wf%$Z)xP zrm~o9RK^ZeK|ujKPzRNF+_dn8=WvspMwBMR@3FbCGX3b;p8u?j;W8PLh)6@xFah@D zu>9HI_IYJZ7XCcd&ZDcVmVIe`Q^1Z4kDvN`@PQq%y7G@58F_W-@7rWMmTeX7tq`5= z(b(5>cmBt=57sHYNwQXtA;VW2{Fk!AYY$4s2g#)6uC|lmah2&6J2Sq9mT0}&N|#rm z*}w--N^b&fAm2V>8xYz8QI%Bo&oz5L!ACgn_`j+$TL(a_!yo4w+BN|qt%;KA$1K|l z48UPuN|Rs>-xd>AGl?D_xNmBl>c;{k|F*b3iPtG0EvO`vPCTNWduc_d(~)iOeVZ4I zHh|aa>Pw$-f8Di}mH787N$srYHPM}CeP5T172V?Xi>e+uq8v1LoJucu^|X~cG-+ba z{`$2dZ~ly;Oq?Kl!Ln$u8urz54XuWz%0*u-Jzuc`R!whC=hy=GE*FKWLBF&E*LOgl0{)Hi9{x(b2d{IyX4pVUW zVV*!xYNxnIBBOV@D|Oo4byV!3=VNLUC)VhtRqI5^>RbndCo7Sf)SWzN$Xr~#XKJIV zD3f-m_>xBEPKtB}D<4FXNF~yx%;zSWrb0;}8kB(Uu(% zg8gk1Aqh~Oy}>xwYV{fhucq%N5LRWHY*o4&LHRuzlaN-sA)1U9{jv%Z%+LJZ=rl#}er=>f33VW96Gqb3N8NFV-4c9JE{2J;Z z*0DYC-Pd{kMC3>Mq0i6jeoT5+KF=lh)1_|*l9#_!bbbkMH+n%kGEyOD-Uz`U&stkn z`&_FS1|XZ;rbk|k>?hQa7mVFO@`sE$Ht$qDjanx-JVrMqY`Ads-iA=XV_%%Q11cbO zCvR3C&~)JOc+5IZG$zav_l7MUjy=eodOw#oFW@l<()SV*30+;K`peBg1FmU=bEfEg zmPK;BRTu}+|C6}J5GI=9ZK_{R<+J(s$u zMyIWmf>P^CBb7#j^@|350}6APtKYi=D>{N*WNPce&nQ^cP^f_pN><>P?yeV~M%OQ_ zYPj#wGHBL!MkO6M1ca&a`d5}fn6Zhh+nn8lDqdWM5z0>i;fgmd9rT4uf=y-dMR$bk zXhTd=1!;WT=A_f6aNY#n8XjXpJ%o#!ur-;k6_u&%0`r;iaV1n3*RAXZgcJH}-DLhr zAirMkM!91)PC<>ILKMlgj-|hrgd)O3q^{FUqM*8Sl))|lqa65noJ-Y5bTyAgR&^?< z71tCQbGWKi?4-znup#Cc4~m^$bxD^HH#7d`RkML?7FP)wqUEo0yF4LvPlW zSbTEmdVz(*`G@!q5WPv=?%D|hI?HTjxJL;K6A}`z_4_YckLRnc;I4OWh_Yyyi6k&919IOX!c|DrF82|L$&m%Z2gZEPkS?#56_VDG*~cr zW2{?``C6zcs}r@Nb%z?~s*l-B3%~xUaN*9j*!uUkR1_NE1<-m&;YuZ~(Q`F)gGO35 zw*|>(WVn+yS5_1<`>2ki%gR}$c&)TNgiAx*BMPe};1NbPbr#SwucGofG$5Eo+emGh z#Vh4-+&zk8(MBCp?-ma9xhdr0=V|qtDbIbm0Ayb{vGZT7cm9P^>fb~E6GHW=yK_Ep zv`kv*1P}S+b-gGOQh=cpHQxegaJ{tIXqEA|yFF_-IY+3@QNVP&9TKR!!~ zm~w`TKu%dC2e-PWiJvuY1^3@g^L#AsHkNI#CR-f%((`gn32e%T818bw_ z0BE-M`4}>qd3m>dwCxi}9`~X>F=a@~9yKy00do4F^(D}ugWMo4ZFs^Tb2Cn%^Cwe{ zHlJlVuttl1b^0J>a~m~cZE&^W{+XT9%DjMT$Et~t=RbQHf6B40ziB`__0tcCudFGC z=7lx}{0!KSGd9MA)7Y*D{|KL8<+vPa=9~!6;4!}J|5I4H5#O-1urM->KmjTqU;+rU zRg1HYI>59^aT?BoKH4}aJG+2`8pXV-c{ zkD~c7LQxH^Sb8?439J-08j_kj7-6Uh1aOp>e3;2gtAV4Ez>PBi0hJMySe*pu8GcIM{H&r( z5Gkx}qThRqk-_;w5z(VTp!XpXMcSrIxZdHaO&KTHFVlK}MA9lCabhRt_yEVXl>?^3 zqkRTpe~Zzo-aJ=wt2^v&qf@1YGe{mV8v^10cE*ANwU_ktS_MFQ2=FjlIe?u`39IkR z|721=<4Pg0vO?hBAeh3@VrBvbtOE5lC`fC2#GU9iFnyCKF-lvE#d}l{I>zSm+U%tx zm!K8H{$UX}6H0kp)YxR(5j4%X_6T~=m!fN7>D%laGe}|SCI%SzRkghC>$Bi55Bf%} z3}BPG>z(&2ZS3zT!aqY|nVeYSO-azqJthD}&Eu7Ofzk@+<(21joH_Cgi~`uy5unyO zDZW^74QI%qBR>ID`BXYUd6Y9z+mOorK*)*)fqq_%wfsi;>?Qk;Fnhz>ErFQFJzu;U zKLzWfs7OO5TOh1SyfT|biQ`9=bS>cb1_&Cplj)&y=<(qEcaSNmOyz^4&s$?_PEf@I zqh1DaU9@Z|Emg4oxlkA~?KKvI%8!o2vi<}>jlVn}KdDQj_2^L%LxzctW+c{JH#xpg znY+N`TqEAZ`*Q@zG3v(mlurkJl0{Kkss@?!1^n2<3D2iyB{E;Oakw#QZdP_pI9TnHytE(iN|6KVXxPsEMP#xttHfbP^ z3Shcpz^v!iHjtRPz&j1q6>r${9u#EZc8HQ4WqHKfkHe`knz7}c|D#71)>!14=0F%h z#zxi{8?@j*)m6_a2f733#G$vbAP?9F8?5Jed{}@y*d>ADlh*Pe;Fp+#@gaH1Yl zY!^c^cmx((c{jS9Lu8@=Wf`R#J4VluY1Fp&Onv;E`J^!nEAZW>ZCP7KkBmr zbM^~aPe8ES-Nyw5Ur@}?LHB#xDXUg{C|!6w*o0pDBj|vN?lmgc7`05rXVxllBsG=3 z+S|;2M32oy_G#DLg~zq-P+{MGHbhTr|JG%VOf?QaQ8e0(zqA`{c-o3cBfQ7L1U(mz zm$S2J&vX+b>7pR&w^yQAcQs?tbXm)%2bKp4>!ibA$4Pnu43w1={T^Pwxo-L;@9okl z6%`d0pGY|5=ish3N!XR49!^byH>DZRemUz}F%#uP&3qmJlXTVSoq27smbaJ zc?U+Qe*+g_$Ok8WAk5j2`@PTIAXDk;NEkSX*Xr%8k05WZuP!bxFTbtXjS#`ib@|#8#JK-gJPkAe1O#3VHmS?#+UKNzIHk+mDBUaYuhj8+9^&b}wzRJ@U17<3qj#~U z8A~x`km}O1>M*a~~@r*rrLl8a46lXTq<8(eG>Hy+uz{YEPoxn=x z5IuBgHftZ?e3cz2{bn_~g?eS0rDe`-^qoH;ZZ_*f4%%oBw4ux;MSsq;M;)~=xpZ%9WAWo;VDD25a0v_0skuq27V0o`ck;A7d~+Qag1 zKV-ie{fXb6#<581Bd^`^JEJy(V^kf~h$&gz91OP-dBSPmCr%R;Yo7-Y1vO^dDqa2i2w29Xx;ol!7`U6{=G5Xnt& zmic__WE+akU;sEDZ=CeE+ByRSnL(#-t>CwY($Xt$R6GIMvLS-Efvftx7XZh=NLC8) zUdi>vE+Jd46pTOzPEfG^M6iDI_*U5>RVM6?etG2$Q?Rj78i<8p07oc6=y672k3>Rg zcXzj+v;IpfQ&ZCs#~e#d4_*c?luuV5r3_Ek1-c@MH2e<$ zd`(Ba8vP3ssOilBe~|Y7*9^F^UaC5xuB4K-KTt5;^651Y@l`e44m8_}k~U}4RC3iZw^nB#Nf!$P_8J_Kc(C=<=gM#YglzloXxx=# Date: Thu, 30 May 2024 17:36:42 +0200 Subject: [PATCH 141/142] fix PR review remarks --- tests/test_version.py | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/tests/test_version.py b/tests/test_version.py index fc4c644..a47549b 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -1,3 +1,5 @@ +from typing import List +import re import pytest # pylint: disable=wildcard-import, unused-wildcard-import @@ -8,7 +10,7 @@ def check_accepted_version(monero, valid_version: bytes): major, minor, patch = monero.reset_and_get_version( monero_client_version=valid_version ) # type: int, int, int - assert (major, minor, patch) == (2, 0, 0) # version of the Monero app + _verify_version(f"{major}.{minor}.{patch}") def check_refused_version(monero, invalid_version: bytes): @@ -25,3 +27,33 @@ def test_version(monero): check_accepted_version(monero, b"0.18.9.0") check_accepted_version(monero, b"0.18.18.0") + +def _verify_version(version: str) -> None: + """Verify the app version, based on defines in Makefile + + Args: + Version (str): Version to be checked + """ + + vers_dict = {} + vers_str = "" + lines = _read_makefile() + version_re = re.compile(r"^APPVERSION_(?P\w)\s?=\s?(?P\d*)", re.I) + for line in lines: + info = version_re.match(line) + if info: + dinfo = info.groupdict() + vers_dict[dinfo["part"]] = dinfo["val"] + try: + vers_str = f"{vers_dict['M']}.{vers_dict['N']}.{vers_dict['P']}" + except KeyError: + pass + assert version == vers_str + + +def _read_makefile() -> List[str]: + """Read lines from the parent Makefile """ + + with open("Makefile", "r", encoding="utf-8") as f_p: + lines = f_p.readlines() + return lines \ No newline at end of file From d5249eae52ccbf2f7dbbf5d000f2a219a0ea774d Mon Sep 17 00:00:00 2001 From: Bugoy <73203646+MegoyTambayan@users.noreply.github.com> Date: Thu, 10 Oct 2024 17:44:34 -0400 Subject: [PATCH 142/142] Create SECURITY.md --- SECURITY.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..034e848 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,21 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| 5.1.x | :white_check_mark: | +| 5.0.x | :x: | +| 4.0.x | :white_check_mark: | +| < 4.0 | :x: | + +## Reporting a Vulnerability + +Use this section to tell people how to report a vulnerability. + +Tell them where to go, how often they can expect to get an update on a +reported vulnerability, what to expect if the vulnerability is accepted or +declined, etc.

  • Z@cb-1u(swkcacpiuvE zJKNdm$U>^esvq$rh{3+*Bhp_1VJl{{)T6OK_JE6!mOmq`lM)kl)E$R!NbdNC33K_) zLO|zdRy}uguYT3CgO{m?GZO&+A%l?KzNIer@yln5pOBLKbhlW zmfPOgIfCJJ*sZ*1^&!7y20mM8GhdCkfA_NO*?eR96e%$1?Yc#Baxut_>g&mIUJpBG zEqVlfzP8u;n~##;MZ4mE&%J;{t#N)s_bm?wpWNRemU92>B%-e8HMrK&JfddwT8ElL z|FRL>08wOC*`N8LV-y~Ly?RO)6}Uh4p=cGJSn}Z1?i)q_x!+;WKO4tJQ7Me|ar_dn zs^OeyP9+X{Ds|COm1?QDrD3NGPF9bjv~BK}K)cKfy5z?{;$V8s7#$sMwjLlE9pazg zRP*Mr(x$8B{O>@lyA+cYV;UOTr4K%JT@sg9yufuB?H(Mk%a(QbWxL-Csqx@d)FNLR zmMD2Etn@4w#mW*h0z9zREW4l^RjUzuaAu#j<>Wx{YW!=ZR#_!t`*pdH8WIb?8p=&gMMyT zO2sp?T4Nd0s!I_Tl@E8YUd$mSDRLfF*wsZ}Vo%V!M`D_tsfo?5JLoZW@4=)_TYu9( zW^tluJEpkqQ$%BHw3Cf}hD<~i*K>57yZW0~iF|dHR-Pvi-VjF{Q=4Mge*@`srGKs5Z8hwLa`#x^P!bCL3t$Pbjic=kcIL zGBm%-HL)DXZ%l|-PgNOx2z=1rNR1-(I6nN){V-@q!rAC~$f#ORKRct<_cWEpgZmH1 z#e&2cmmZ%-@57#MAnpfsV_;torYd|PRPU&t9GtJvQ$y;SNsEMsbQttqf<`)lD2tz( zwHeijCX54>CO>^5mVNObS9XF^^}9fYYLq`GA#QJ;Q-iZ#jQ?t)nlR>=pbCl|em_g7 z70R<+?PQqkqY`d=4=z&b8o*Pr?1e_ZdoD9D`+SKC?#Rztz%;tGx*Ej?*6Gi=Nn z*nv21)3u59cR+8i!xV#=SH_zsXSD+Tw0eCxk5CpX{r*1actQL>5w!QX?y%OnpzzE(9LVmA?{b<-{T zT$a$@QfSs$R4OHNo24|TxZyls^#0>-G;Nt|gg8%`zA6v*pE57ff0*IbE(+~NnRe); zfcodx{t}2jD?242u(uF)|8zbYLH?r&c;5xQPlc)?-fUd_q&rGjDyLy$i}t4!Lp+=S zviQm!+myHPuBrcba`>GxN!xNtb6l~$x|T+RS*tUnk2w_7GqDm2Q8!fvb$$=J4M;|(L_(v49~cs)auG)$-Txu*lF3%rRgHS2aLqq{yQM*3LujAbO%wU zFQ%2$rjnFKyk-H$4(SyzDwa98I+fXW8*gG|>51Y=kdUN55SUY?G-^lf1T^Fyu5SDYoD%fgFB@l^`RZmyn_u|+j$Gca)U!6s z+#3cUxQ&2X^vU-#2enAW175u?@65vV#uwye8Lt+5o2C^KP|kjm9@EdL)z9&sexRV_ zx8JCj*VCbfg1e(VfWlsLBc{1=ShTIjCR<6m;jTliJsr*be!l-Mk-@0g;a$Hel~KSH zgnhag3HaZcGTFXh*2-}U-){XtQ0!amoo1~)!Q?wu*D)?&q!{kgVYSN}UhZG1M8;4Aoenv-7_{;+Ui_$ z9_QePce;KCc;AN)1}8`+z_am7ix|26L?D}CuJC}@o z+x)06B7~cY=nnJrVpuGb zrR6kRIdaCvb@kAhX+yySQ_2z%N~0;flAlQ5`Q#TXf%zR)4v-G@-i(Y7~r5rkpD~;r`pD?y@ddjlWProBq}e{^xdEB7^KTejxu3q{md%qsg~V z0;GqeWHgObw4^06+(p{=e1Y(#+FF$}7AX4-8BLEf_IW(5)Y{nae#B6ijLtq}a1qmw zO+V>N5c?EMH|&+ze9=htFa0&WDWdtW3jrRmc)ipFEA%CIeE1grX=-4uIgmTjsiP*; z73fQ79?4)UH={xDktmIe?L!EAYp-r?g=)zu#dqIC6rH0qsC zNtM_9;n0MhJZ|DVHx;xbpBtoqLxHdG7T)FA`K5GC^9ie0|6J6SJ?J#ltPt+h1 za2gxr`dMZ3uL9y!QvT-?+~CIwfmlpJbVsLX^2>8IrBRUK zAD#bsaOQ#6&&#-8e&+gJ*Y*8;Kc9C+plW@9qtjmW)SoO+Hd|ZOdO`5r)q>ko!!fuL z_KrlbzHi?uu;x9Y2rljxSflXDR^|$;JJ;%-gDZ|Nyb+q^*e;B)B40;L%+pw#Xf$2{ zyy1w%U_asu* z42dvvPFj{_YQWlR)jrnY9cI&|<2~K$4RBC=QsqMkf>!N(Xm+Vlb~_bU32+Si^eo_z zj?mePgdSijfRNtq^}7b%3&}3^$nNoFj3+a#e>O)kPJl0;Xnt#zAwHQ0O@T9T6nKtb z0J|F(frYsH@3q-`e!`#IS*V#aC)ISe zWvvuS__th>y=KDN?3G1w5|WmZs8lM5^o`zc$K$P;nJ&9~z>R*dZq%F(egG2V!yA!i zJNrx~ny}af;!-8f^%LHUjccjK!|Itezk`4W$PG~2OyuRyQYgd`6ZAm0vsaH)A1!ye zVrFfjQ4jzg@Z7c<{zA;}R?}qPZ*4>Ri^{Z6dCBXqjMl2eoyx-V=P#yYEIt5Hy98_W z3Fv$jo~Daq>*-3Z5QaIm)URLkiZ_-ZsGV=XUPpDI4d|rJhrSY&G9R~m{9}WRf$ws6DdUn=No`_2GS9wwek1qBAH{ENYZ}_d@SrC_a^?g>~ zJE@LI5BGh#ECY~)LiRu;`M}HAf9#L*aDih7ldZU6Yd24^$VoJlknW>1nmm+#X=9_v zUu}cy&K&gvjmi{;&qIzAd=Y~5ZLJ(3gkY~jNl6cvb&jBT*K@0H-t;!9qf+naclpGo z5~Q*QXZ_L%JMc@iioYx^doy8(OxMK_YK2AL6W$2JhAUpeXo&??F$cgm%`$D$2xFI7DK{# zg|Fg3$l2bU%+!00F1XRC=3w@2f5p-gFd%-`_UiQSL|jbmqeu!Psg1!!X?Lm@u9MV| z8R2nX=D+XhK2t6nusXTZEpU*~lD^YCId%Z7$=BWh(>OpY<=519=){!;+)+zk2~uFn z3CDv6;1P&4c;gZl6l${E&yJ%~kfyRG8x9)6MD+MzBiMnI66PO+>X=L>gSi!<^VaKL zIENpym+{m;rAJ+ogwe`%-)I!te`;88dw?ZwQ(Tl;xW7T8b$Z>O+_LjBrg-`v z*0e|x)&{ONR=wtkh^dcpeEsn}eYr?u_MMz_z|ebcv)f!qYO-`BBY3PK6RM;4OAwmY zqo_F20+t0D%^C9kX|acmmNt)KWoHXxJ;VV2*<10Z`i-2hTqiMeHL^kvjpT*JGX>R-Ak}|U(Kfqzy2wO#_cfj&V3$83wSHJrppt2(;VBjc~?H(7H3R_ zE}DV{MCiSpj5p5=W(1N2x{n@9=T>VZQ~BZRPnf|u&U9xjsR`Gv&N`77x>lW4v**v) z_hy}beOBvxbe{GAc$g=D$_0Iy$TtKlR}@}BByHw-D=aMRL`A`K#JW@wKTdmK_B+>S z{Ni}en$eYn&-i+U2xDS%CFr>2qtxX0yo-uG`poujNmB%rF}s^(SeX5ELC6162!r{7+`!n}Mu zWLna-%p-78?UMJ9Nmdfh4}8o9?EFa5C-Fv>d#oL7jvPN3?UzMPB{ILsP1}xJc|XWp zY0K7-=VDx7I!3F;J=(l~N(-QE$hFnj0dWO8HJ}SAMh~|pG7A7`>-{X1cf=w^F?cmc zsbra(1vRh;ZOzBaSw#;%J%mrgTc_+}9buUHUSL1JN@KH{b^l&K0?eE8?KfWas!raQ{C_`DZQTGvxFT&j7c7d ztLLOcXsS5(!BgW>_EFo8Xn%VygGWNf9bozgG+5ZqP_?J$y+vJw>tFP{6 zyNSksc7Y*UPo0l`(N0YxI7<+KbV2QhSRLmc$$sNSkp_sHQV)6@LvAAyO7N8+RN*&i zsyerZ)e(Y+I|lh6O(C~3>*YM_9ifYFBbyy z3IyW0Ndyb=6Dea~2|!YlOI+8Ewn$|v}9)#s(kw3&_WI`Ju~L@Q)%0QE2H+@ z?neE|5n5rXeb7lr68|;}gz`z99j&2fx+lzXj zjcD>a@bhj5<2HtgwZo*AK)1eC~&0PC41z6szw2_4`^vqLC(ph^|9 zGDiKaz2+;i6&bB5k-Ug=GXKj{07;TeGu%SD&=)X7htH4qqRdQE>(23YE(Umxjm+yN zmqF7Al@vGf0luRXW!C0pyI#7hoq2f6)qRS#{vgySw(@!SNQvB{b&(lFKlrXPTwQq%&63 z`1BiT`sC)Njd>uS5pR;uEiwl+*!l@qq73rb(DK# zY^nnX03C|bX#$dEJ{Fv|%UhXz;y>K7C*CYhkPV!HL!9^wwc(*-eGPXA`eeqn4ZdClu^LvPd&UukVjV*~~?s^J&H(&aov-M980$8~jzOsS$6z zC`T$9yh;dvW0j=^Fu^Xtfxe95V=;Y~e8poLhC#3Mk=kGtgsQe#D2#Rg`j1&wP1Sk` zc?;~$*qV_~qSvxky#!&tni8O|A;B+W|K+`;>6Q#Ul^{*fK-9{>BWx~X>d90ORvvy7 zm^M1>viqDh!i`OZ}URjf}&X zNW&ah-D;nUdP*vbVrx>myC(ij%DdWFJ}83*ZglUXmAki-Mev*QM|XZ{@10<^9(ei$ zPGYzs+%P=NfB$!aCEGRY_dGFIA&UPdZfEB{R?ahfZekQr8+@4}Fhu@5wf_(cOY*<& zfc>}aT+`72e;OixfOwp5rxwX29`Gr(2grFi*ancxz?6fdT&#bsEXB;Tb~Izg8o z_))olb5#%qLx7HZtGvSvkAvGYh{Aa^VQ*-(Pukv$TKv=rI{9VpO2 zFoVVyQp5eicfc+{3hcRYP=ALRt+vEE?)k+#0p*lgNzqDmmeu{;CnNtD`U@25_b-Cd z0n>5c@7p&6(iLFroZU2`r|(JG)-kw~1qiI#3wo=z*Qrv`8C5K>GeW!n`JTJ_CkvBFVF7Rfhxcn9h!fGGnD(NQwy9ItzP=WcdsB* zJ2dyJ$yL2-RH=uN;VG+V-YzFrb~x&Kr=j6ibeTtAd$n9*@>={&B3H|$>sz7IH@Y)wJ{0n#cqLpjFB@3Bk3!wMO%DOuP#o;m^ z}>Tn%1EFTr;`4sj(>C;tj%b zkS#(4C389n=OI=ia6R-o>hG{5z>%~Alnic3j#OrpRdN43Z7n48YOnR>Hz5!GDsL(9 zhB}~*2O;I1u%H|Q{r5COVIxzV3*e0c6=Q5!HGLs1t~wqca|{``IZS(krDWslpu zuRf7nM630Rkt$@3a^t7(50J(|%3YA&=w}zk@o*&mb0Y zlY2-#@Z-xhpg`^JRUQDt>_9je)sva)6zYv6G3+3hUr!x)_q8@Ioawj~()}61`tv~Y zv6+}|8(lT#iP8|2Wh8A2Fs@t(n9{FhWn)9?{a=R_ckXlc)SvB%T(6S`%^emv%=FJn IJ;%8J0N?{qX8-^I literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/stax/test_display_address/00004.png b/tests/monero_client/snapshots/stax/test_display_address/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..53a4fe3291ec4c7ed8c1d148cd68ac2287f085df GIT binary patch literal 7169 zcmeHMc{rQdzqhod)zU>bOSIEP$6Bqe1nq4ttv1GJ>|19nEs7!{N>a;AM%CytVu+=s zqy$l_u@kDQsVGK*h)^WeG*V)Vgxq6(f8Xc1&%Jl!Gxcc{Dd+Td zrzbtn8NB^6ZR6606=fL>$Lf2hwl-|(@MyOk`+V_~v64BPZ_S~;K~7vXTR$@Nm)?vVESi^D z?xs5tKvq7`-t*61?*D+@HjtdP!P!?;yoiIm6>;$Rp7sVxZXdUM3vqBZ#v=c$KxuV~ zw#${o2;COi;9ccPtkG*?g-09J$Z7uausi7Wu->X#>NKQdE@N)d|2@5 zLtn?@LVIfT6jCV5nzDCTF{xR!fNO+7I-fYCldl-6>0i1H4j-D0`7s_xoryFb8(#p6 zm%}ZZ{BVIjjLyl(25;ZlmojAJ;2yALFN196p3B=q^Zz9A8moAmNIjFAb)FgBQygg8 zAJz1UP$;C2E6mKy>=2DDU{dIk|LBy;4QU%C1*d0J!@SGS|4thsnn-#hm0o%HF6n(0mV?i>Vc+&+=U)e9^us- z?JSQvGvJu|&0%g|#o~hBm;R(dzEISRiYl+-fxG$CmP8%AG)S%)3R#+;e-!kyPl7b5 zslM~*jd`|%ruoWs_)w(z)mrkGM%a9Lc{$=&w6R)=8-zVRK7hk3Nk7N!TkV}&=5Vj$ zYV=edR1e@~-H7mlx{tFlcE!%2FKhI)pIinf_N`~~!wq-7K}_y(B{SFif8#LCv4<#7U-FsL*4WgpjafHKO-%pR?BII}v4s~qVv@(q6;~g5WmXTIc=@sxupyFI5r{jYD#aG7WaR~@j3)Z(ZvpW_ifG78p?)fLA!iYLiKB#^%%lX z$dKd%#nD6WK>ntQ^$w(`M`+ZOsD9ryRPjU!8~k9d_pP`S@Nex^3p$fVM!7Hoqds&Z z$!F%`DI7JhH9-vPF63U}2vHluYnu@|*GjbjzP)(GgD`mO_k{(1i?1PO`b&&OZ(*GI zp`9?a2Y;0n>S>TYHE-VA{yD~C9W7neT%BzcO(L6Eiy>b@?868MpB3>szon8F4}}m^ zP*+J3NW)#=f!2itO-HS!b-uee6~5YJu&Q%I_;a3keIp6J@E4Zj638W{KIsWy3j?@5 z(``%Pk4{p|8c4gg7V; zVXi%T{Z;%M$OUb!tp;^FFk`=@nBaRC3R$f)c))0P=|Z1c_cW zrvhIR*_R~Ly2;D=m{$VwOPHx68Izc3l0Mj&9g&h{6C7r&rhg!PB#f^1gN6ut?)FNq zP2sC2wIg47ywI2K&sjIoNK1EZ5;K0))_GC9-V<;}En}e|!W7RLW1-vH-1X?ZB?iMy zxbHZzJcJJyHm##=q%y&^9<5DuPwfgheCQTkss5ZeCA4(%eD%VUV6OQIsd#K{j!YTd zpmW-m&P6>$jLw-9zL=eeVTXs=bMp{*6%1QY((p@A*JI8^)sopDv^}D7NV0A!Jz;)h z|FHKlcf9muSzV-VutIXyhoIVgGM7JXc@13FWJ+$n>?oJel#Nvp&y}1T3$+F7wI#0N z-#Ym>{aUFoG@6u%%zci*d72ee?+B|h8f-arU$Qt{zpFNCX(S+nNC z2({5Es6xyuiWc8DzF$AFMKEcGb-u=}V7?MeG7$OP`8g)6wMC@-v1r~ONjp3)s(QQ6 zHR;opK{dPLek#@RrOAj+TfC2CWr=dEM0+Tt4#1B+jlg~_$cfxIJI!Q;(!R2hpD=98 z_C62tEp}&^>E}O@M=D&2(C+|b-70t=QU^+mE5hT-PS?QEPgSW_zz8mI_*#>6b@iR} z40qOz-P(#P(Z9}#Gw!< zq-}G&IV^Y)xS7teilS57QZ85|)p=HeKqU)?$_V`uaq}$DQuccp%`(WU?+_ zVgws*IYv@_Eli82HQFFP;Ej;Vxgbf#OWUIwt_oru*dSiPyxxQEFyCKn<~%nsfx#<@ zb_c*`il2E#H|iuxVA(~dz{Nf~R)gPk)Z#SGxu>C|yAOiy(GEjO9Rr_}+=xQ}H7(|d zyhc>i#0U6lZB<;_w1i+<*oW<$%!HB63~w|FotEE4Tew95uXEB7-0k;g-|gu0SUJ?o z_xlp;1t0q9<-0Pgpjz#Uj>4!ee-o8;bbO-~<2IY>K(@!>$~ss4`1wdYP;h1+{M3A(Av`C zGxZ76ZHZdRRl$h6>KP1%y!JC1SWL8cl{yn8-r`;UA*Aj~HtHr?H$Ta<(v?{f3b8b^ zr-P8{g7@9n?}dpJ2kD20LY@JOfWS1iJ$vn#0|VMHMRd>>_*$41`s(`_WIH)IfqJC8 zys^qUy=F0<2O~%~)*Z7ymGR;myg6=h=|wkNGS3Kx;-J0;*|#c< zwe(4FT;Rsf!0}cwRrB<`QjXEYvgKdO%_aoYBolTZAtzrnD_5k7A4B_-{Eg4(;YmC)J81vZK3g4(%93$j6Qc(>CQs`k?FQ2EFX z9f^l*^45pY3Hu@W%q#yKHTWN>UjNUR*Z;r4f0$qXzZ3nF?ERm=-6_n??Wh-08F&4H z>gJ0Qc)7IFOV><30pHDPsX_2iKr>L8T6W?xGpe8Ofb?ZxJ?_-a_%U)4%z5YoRaD-dblTvsUZ?KUnHrDN9daG@?$tX<_wo%6DIC)~@_@R9 z`fZ2##E)rz51ro}itstEYPZQiy7d1D9GQ(NFAo_XkocLu4>&WDH#y$a=L?5t*cF31 zGUuwbjm_Pb@s`*r9#2!GOGx;cxY{M(<#H7mdx}%fIv` z;Vn-e+IhcdRU)}6ZSo~WG~0|Z&ee@5(x(8a$6^B0yFLY3o;|d4Ais*i100thORdqn zUsPVMT5~r;T%R2sQoE-@!37s6B%f8wC@;Ul&CG54jL)cDa0oG0V{ss&8CqGdT{YzD z#%-{IG49s;sr=rc+I80R@^VlT3YwTd?po0=T;Znrmsp)kXtQKQ8A#1638wh7DF{I~ z4P%UTV}&ERXG9XDMfP9bJ9byGw}c-EFjnJB@Rv<`m^oKZ zR_bHW=va&V1Wu?J?G-#PylIrl*{gtWqxb0u{m9}M@m2cvA$6X;Twy-7xuvC~D_80H zmRC4EYLu}WqKO462tNOhK+)3DkcN8++RDa;lp|iIGp&ylb-3N zB?P-K>BWO;h#ll7$)YM8LIbSK*sC1%Z5WzMJ+^sTUy@6IZc3SP=(ANRHmr6;k7b>6 z74RlVvgV;1Gfah)3#~l*y7IOZaKrH@V$S5eisj%84I`VMq}1MVSapcfe62F0{O)$h zu9}7GWgNrC!@qONia7k$Uv~X%@g~_P}n4utJM&D^hqtLnxC^O z>gg-Z{Ja!CV~PfKMzl}rn}s4i@S%q&@fxBsw7+TlYi}~2E4j5bmA9v&`w`Yb%rREA zHB!qsklqDqK5m2Z_1W{(34<-XJ9^nvZ(O3GDmdU`h>!Icb*hG+=7@TZJNT=3Zv}Q? zW22z;^NP6gASYLd|I$bcE)~{SERFs|X7&=ud2cz{yDP9~@?p{5+fpd;EieWyr#GlK z=W}nvQ!Op6Ti!TMaw%-rwiIabm#L|#*D7+$X9m~%LFG*gs*O?G6kOz6fI;a;#{r4R zO@+hZbJx%OUBYG|5C4v!D^lMyvuA-Fo37Y8Kj@yqNH=b4u`6AP;H9qAl0fau%yYqKnAzAg7t+2pk3aaqyzt4~-*Um7@anv`a=*u* z4IccfESi#|L|s=*;C=V(@8G^#y|dY$u?Cs&iMFu8C{uUGCq?|J*tqr2b2lLH@a#f)Wr7g@On7xb^xvtMPqiPFYXqV+uK zuCin8gj2(^%f=UN7Wnv^I&>srUgud5rL(DbP+~WzW~>Am?k$)gi@iG*9~Kl8gvVyK z*RkUCqIhY=zj^{ON*dGJscoYkav^3#4K>Cu{t~G4U8CT_04q7`-GNK<>NM`yIrp?M zO2o4Ik6DuY{wGA(BJXeNk^)#@+bMSsUiWjqNcFbrAN1Rd-1Xa}SjDkll~!eMC?44T ztN(w!k&sT^pN)wZuw+)prT2?IFU7Bn@46>AcYI67ZoMNrDRTb{%__SEc@GaL#MFFT zo#%dAXIvne$=}>bSuJ3iq6A-6TR5B*zB1m_iP%o}b7m~@c)X~FuyJ!pW_l5DbHHqn zqoin%dVs81bSl23z~2grO~rIXHAq$jeni)iI4By0YM3{mY~RA0A40Ic_WPe+U0d@c zG19xf(^4_WrW(VN*dSQ_44gf1yrp}ZKpH{nEABs)h=f8Ih?bUkAI7E}x@=+R z!vHjhTk7db9O}xRez~2VLgd9;3wrsjdG+zOZ{96rm7xuOe_0{{#_W$vQ?egI)c zqhZ1Icq$ZNua(syh;M+|X( z1~)5d7xz{uWH$|hIetJpF&4f8$&rT`zwUuU^=MSYi2YCh*&76Y&K~B+;=O2f02@v5 zC9a%bf@?>XAG5;E@?%1O-yQ9>mFEN?D%)>XE5ojvw6wHja%g9Ki*M}_yxpaR`m)0n z9RG5ZcsZkY+9aY6!E8Oza{{PEvj-?^E+0C7!UA3$e(NOGcSrO5?7mZOCN=7ansMUkFD{kdqL?@!=*tqVcc9g-sbCxa@Nd$LAo9=bPB zJ%GW}AEV5^G>#)J9@w97S1~|N6D~dmpCt>QN~Uk3)pMJtlUN5TY#gc~-Xwu56bTK7-DQr%APMqP1%I{oCz9!HSy5*;CDOQ$wB!i%vG z^+*A)7FwmCl&?qcy|o5zoR{qLqFg8APaysB4xQ#-1ZKZ!WSDcZ-ZwqTiBjv)>79%;*HDf=C45||X>kA3%*+gcN%gdi zQ-f+7$w6uFYrZbU&z>iVvOngTN~~3ZQ|y>*Zdo zOcYiF7Xd-g8-#jQXC+&tM+K+i6i>`6(*5qN4(L{jTzfsP_YTbX=4n*O3mKV(v*USh z>p3tx$X*>&9M`K!i$x*nIb|x2rYOLH${8Xg`6vH7t=V|F literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/stax/test_display_address/00005.png b/tests/monero_client/snapshots/stax/test_display_address/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..96678cba2c4f45dd73eec70f4e9ce696d7d5419c GIT binary patch literal 4494 zcmeHLX;@Qd7LK??6r@@Q7-i9?MN}eGp=`2P(SoHc5(9`Nge@RqRCW`R6i{fTf>kuK zHMUXE1PF^rA%uu1f-yvPAtWf61u!HKLI@$r-1eE7&cFK1{Fxu#pWnUD`QCfZ`=0N- z-w%QQ-i8~tZ2*BlhR1x41c5-Su7N;$ch>6xE3N^pR1j!0?AVd7PGpoxcoNt|AUQYE zeZ~P~bx1!jyXZTsc>U1qqA!Z>SRwTT_4cg#Mz+%BiWLZak95AfC~CpG7;HB!ADjJr zdy;N((XrfL3UZYaM)9ja#4V5=xyV)f*KGWLXXqh=cD<Qc8Jkx1lc0oJaa;+FsY-*SzYm$s>c8b@@ln4d)_${ zk4Mmky}>oZGvw7qSD#NpIa;mOqxjop4PNu(`FO?XEy^cz=@G-d^naX=> z5L*`-u8D`ifNgka<(bve+1a6)ROUD{>P<1&Y*SvP5KZUJ&dtpU1cKbvQ|sHOTdr5O zBLfK+P~d9kvON$YYk6}TomX65MFo4fyPIo0ApOPiXpSz(y)55v*Nx@;yu7@@ghn3P z)6=twD@kZ9@vl@wutoBYa|45`r#2+NDVR}U6afhhBMwXtjHtdLdHQ*nMWl37h!KQ- z$va1(QZ@6?EW)F~1Q_}pO8nAO7kIIgOus@Rks3y-+PrAP^zK6~9R}3?G&-DNGBl%D zm($+S;e`Xrt4=jq5^+e&`BIDMHVkqPk7tBPgI>ILz2(%=7*WLEwDGZLnS5!Z^@!P^;H9=xeyfNpOU8luxO zF{LZro#Efi37Wfni@+|)cOSg}%E21?uc#HUUC!gK3wZwEjqlGHCjK1S8e{mB_@XJQ zF0{3^H5@-NKb@75hfEDQ7L;rv6y?=jp*Fo{frDW%|Cel3gV3S+0b%rQ^RwaM;d#Si zjz}@Vnac>L`8eAv0WjthkjS{3s;)#w8z)@0YTL1NVF5 z7l52&4xg~oX5w&X{qOkiV>2;3sz0qN*xOI-fZtAH85Pnaa6Pl)#~qi+T*)KE$V09K zfk2?^*UuCoXinR%q8d)RXYFkws60xk;JzzEwujp<#>%xzOU?>?Lr;UD2Lhj_ZLen( zh=_=EI^6x!GLFbI!bYamB6L)6&Q~Wz&2bLfu6|9%G}UD0*I4*e0(>91oOiqp`!H52 z?z1z1cni)YA;puE(RHB^<9xaLb{6r=1u;_p-tK;N;4Al}aVXl}Oh>CB}L)pr-0zb!H6&e_zU zgtiEv`TjB)-tYDkL5TJyWV1DmVyFZgmq&IE5xBHSc)eG?T}34MfOWADGf5e1h74Uf^L~roe>Ds>lE^1S=NK4F zsiTekhM-C9>@5mQ3l~>bG8fPqJi*z_!_$-0GBlOx!Ib@7S#u{<<;&1}PSw zos)CDbi=%k?wED0S1E!qK>Y3v?s8Md3E1(;m;Ckn;W7V#-O$*ok<)n&PsQnJ;AU0)dR0)CIK{4 z(+dILRu;{SmS7+G)Q0uD)nq!CKcG;|P#y$*F?VmkatOzFSAxIiVC%l@!HS??JCI+} zbSr0Ql>^hWvo&VFh^`?UpVj9&y1Tm%M!LHFm>OBTtkFJTZZlZNhN2=Ul{lq?8$!>m%VQAT_^S1)INK3ikReavOhSYi!?$um}h*=mvZlkr)4`vnEqIdU` z>Kr)T}?}C1Cct6&)Z`_ca}~|LB_jq5vQ5<%iJiqYwW8_wqkq cSm?mpJFjdJ{}gx=xMu+!JL-R=<}fn*A8q1aYXATM literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/stax/test_display_address/00006.png b/tests/monero_client/snapshots/stax/test_display_address/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ac4ba4748ef534d3348505851257fd18a33911 GIT binary patch literal 12223 zcmdUVXH-+&`z0OeAc#m4kxu9xAru8fny7RQAib;fCQU(l?@f^+p(J!Mln4k?gCI4A z4iQ4A(%W2o=QnG<&AjuUwPsE7<>uU*bMHOpDSPkdiGHZBMMKF-NkBkAqkaG0BLV`# zBmx4W_g9F35k-TR3IYPLNbP%SPyF)m7+gLSe!TxO2#g>sCHdzI3KRS)sHVfBGkmq4 zL{RNP=+z*|ufXL(4qCEhFWlydvq;ok)z7->p=0we?vF|ngnl~-@w`qz5X4|g@RJKp z@JY>z@L>d!=sj5&sVWT-RVXV7Gl9$%5P>uO|Lz6bh0Rn1R+K%9+Z)pTA+5w=q%C}f zZ`KOz!j3eo2*pZ7%7R9EvL{Y`6?!j!FB}~wOU0VKKeeH#0e-Jd8Om5yW@+^9WYSxZ zFu$L?Z@8SqD|V~#3P`oYsi?2<&E#`-=J$yh4)9CoNtd8G^`+EL)`U5rrM~=fH@&B0 zMUkYRYLeHh!?SUhr(&dIv^;b)uFxoPQk%BN+$y6~idcYZEQTcsg z3AM|kSAq|OC44TA)b&*QoK$aLD?k!4>lyAnh%>h$qB7<7j#oqb(cA?N*~grCHTyvS ztPmU|_OSJ;&6C=H777{OqPzEi8q&-C&w}bmsO>qAJ#UerwfN6athnahTFvz6oOd;$ zuo(&SR*vp(=~5Kl2Z3=9#^!LKyvQL*jB>uCWiP|WoX1$4rGWPu@R;163r+v{fm!BB zMG}$-62mC5S6X>|r@bR;(gh_2q|$niy}Y!4myG9gG?n)<%ibQu#3? z(lknjIJ0Se`E+_Y;qqwWj4W*%cqy2oS0k0)kIJoiH;C>m4cG#heG+t7G9r!@FqnUS zLdrCZDyf}Kkrs|F3nEa1Gg08Ue~qQ`g|FuBrUvN^z%<@LBCaW}>>UM(N>hZHjN_c7 z;_E<^VWb1DadJFt9H`V)zv%%M-Wy99+Q9qCpbkEYdD0uJ0)|s6@|?46^o3#er4{uz z--IvvOWG4TbeGHv-P(GTrxUjKJK3Q4$HcygLs)0#j^R&u=n)Ni6KvH*-SFuH=cD^H zRDNpu$~brafJKs6s09V^a4u`FN%bv4#yc$Y?phJXig!C!HYOX}42)SLqsAHkdO&Ci zi}!cL=LQy!_|7)QcmKEw=sQVzr6A3DpT_?%h{wIGi}B`K&|rgNJ$BK)u2*~jM_69VT8V+L}#s)&fF z9)7hQC$i~Ja}L*+BcdAq+V!3 zQp>v-4%SFAGH_65DsBw@}O zWMQ{uo~Ac-6c4l=fDnKf!$>F8JD%VAhAg5tJ-itk6RmNLOh?sf{sJV<#cawm@DAA# zA|lJmY$2|jh*YPir+gTW3@2I=Bnczsc=^64iG}TNSjSP0odQ-pQ z&JTCZ=dDSYIS*9-BpLgWg}p8NL&-HlX}}HN0-;#AtG1MgsFdrU6(HC&-56iA(zVi? z{>Fw4a94>l5mB}7^?^nxiGgdcpe~1i@Jsh4*R1#&nU>Z3OO9*}b8Bi6=7JI7(EGwl z(a4TEC7XBk9lKX5`dQ~y>0vS8hf zkJb(5RqNlt8OHU8!;!4aWcKPYUx3+Zs5);$#jiU5&p8kb8u+!m)b3Nw8P3Y=MG_XH z{@nE+cPII}fD@w<;hS@XFs8_L>`K_ews@TAAS}qV&BqpY=&@=v*{1 z947HR_R~MBFVy%>NGTNAaho%6l;qZ1eg;!NW{Eew;+2H|2TA_!CFyG6gb=Y*+TaOo+$PkVd&O1qs|r1fv9#cjW*unD?>D03id~BM} z0AT=wX$<}#u&_6#NFe6n{@}vp1)H2wNxcGW&!VCEdqXBS*<3{H z$v*4yh(m^*n`gERpEmb|Vj_TA{3@YB{k771g;VSTFXY+XA3jH5`kI&{KitSkvNP)e ztt{0Wtki|JmZC-Vsb(O_Xot~b$x+tyqpKotlCoVxx&d=S~AEGx8R8&-gC;Y&LDqwK2 z`Og&`uEHjqUyhtggGPq|5$TP<=$;kfb)@%_rS*VEvS*}v-b%2{p#*I*NGmLXFu5mVGCB8e`ro0@+y>E2W}y4pMVb%((; zM?TC>zx_B`WWDA0mCDX}t8&wSY6Gw~+2yJys25^Us=!Qq;<|+r%>pf?ZOx2fG~ROhxY5bN*=LJVxe?1Y zrV;LF{5}pR{E4Pfu@F^y_Y3}cHvFW3O>8$>Ag1`@JP15-eNvY4!?tH&JoxSwu=RBJ z94!{PawEQR!@Xh`C-VXkm?3GOfi2<3Jx+`MH3OB)M~I+xnFrH8xHjX-nk`ylciPe} zIN6>qPxdy=zQ`S4Eh#@qnHay(%o@Fl2GgTKa6o z>VY(cWf(>2?$PPV32q7_x?Zr_sJ6QTQ9{`r!(ML9uZ()omfo{!B|@xXXEE+ssV#VY zr<0kS1RalaUFA>s>U`j@M@P*N*vU)_$3Trj7IoMj_W*rWg2Bd+g^|%&EoO6bbMDz; zNJz*|q7n-4AQxLCFpl#!WZL10Y@;fC?J0ia7!G+eS|7bQ*?vbMVG-0{Oqh;6a&AcJ z`SyKG({o-W!RCVgk0sy_r-z5)E(5#2+M=i1Q1&&s5xw-Lu+F>^wZgUZB%#FYRtOB3 z1sgMCo{l**!S$Rm@+@#CM3NIfzp~yw@&6 zcEKsOtxG=oCpUtkk~WI?`h&S7@@z8Y+>D4yz*xUVvFf%fuu$l!OJ|+yReY>YzTVSD zo%81Z7E$^4G43K8L2$;N*i$61q2D;=x^xqP5sfL5)r~c(vKv1cr4(Ey~Ld43HB@Mhweq+r- zqGp!iTb8yvibdppvn8k2D!pq)gWKGML4|f_ft^s|{3tN(-n4J~lKsGZ-3K8O!yQx9 zCbgif=YxD~26H*e9f z;??FJ><0A@WI7Zs#rG68gVXJ%d=N6&XcVW^E}wSolxr<0b$80_t%AGlympGMnZ5B+ zUUw_s23I*lq;-bfK5Y%cd+^JGyewkqUP>LglH7Qu`2tshjbNx?BId>{vnlv(I}NZz z186^F7L~stllHc)N)|rY>cEF217)&k$s+<$fv+)U%^EoL9a}R*eo+1xbT$;lf%6{X zRzR#peS}v~*qP-J<7%SO-#uOdw~VU2yN-88d%u#L@J&N?&zyhLJM$Dw&u@+o8>`qt z1^N17-KarF%y|ph{Xu)ko!Qp-JEt2htue*lEJ%#c6u$%|uhheCGH3SlIyylQnJPj3 z$KH;s%6g;qkdEUfE>cHohQesJ-sp+X2p%f^vedfj<7&^^nGhR~3!;jT4URq@%J5UF ziveG(f(M##bTTr1-JQA;foQr7-xxwy01NxNERZE~B?^;-T>Bl7Mlpn~lZwZx!o{fr zpG8$$E~inpd)cT+)#yb&mrX#Y&0-g~9YcOM67y65a~NsCWCYsnP$0DK=c= z)4rOG0b2yKwlkfA~FnLX{W3ooFp)gwO_6p9ZJ~6 zH{h!VdcDh#9q_IoFEQ;DyLir+|(UX{EoSmIv@(=u!&QDJ#%PRhy zO&B!3KbuQM<$JbGbkQEU*xXpBI9_Y0QNtSC*CGtKcAmYtQR8oiN7)X~F`E`+TVJPc z-N+p*1@+_h0_53?2Ww|H+uPc{V1dko+xr5Ag8D@>WBKJLo)>}0MCZNH#1TE22Fq{qOI z8CcRG&zbJC+vG+pk^2O(0x`CUV^K1P>obkkG~nHRp%i8kV_e!R*6;N5gZ4ILjPm@t z=ztQd+(G-gsqfjwDk6gc%k`Pb3z*v&W&RC;TxHXsx~Z%_!{E@YiyO;zHTIc(^di}9 zZp8?*~Y(BQd?W7Dc8dr2*al)PgbiwVUX4Rl?mSJ}`PY-U$LgRe^c(jp) z_Yp2}qpq~TGdCZXkGU+k53TRv*SwAW+}H7z%)icQgk@Mqjn{}I)nFa71t%LpEBHy3 zvQceK_3vVRRZib=X<^G|JR-&`idUwYGz^W5m^6YBC4={e8r!y@P%s!=Bp?}2o84Bk z**wt&=A5b4^p$I@A^7@n`2ch(g_i$$-n)AWWQv4Ea?y?i+c1rtF8Rt6PW?A+cabO6 zxcP7zNrcUMe6Z^bg|T)2Zc7{EQaBPGh@K^i{X<=Sm8kO&_#7X<5=~^*u#PNvRE#z3 zB#Nw=a(x{VGJ*4E(valQ>+U00ODc6*6p{2WEp{m1@S4yU4fNj+-p^sF`}|Z?|3o;Z z$lsublzH`r*B9c45#ax&x>s2u9J8>vxVXFPxe*S+xHsjl^tSgbzHCAtDZMu;u$(@8 zW2EG$5b*~#;c_s_WeHj26!-A_)L!{VS!Saoq3j;bkdoWVM%s$KGU{M+p}OQJd`Icx z^c3(S&+E3bZh=+^OsSJ|!P3zRvv=OFDn;e}tRSyBCmKq56t+wKG88mrpPirUn`Oz> zq_JkSOfGKVMq-K_gS69>HbyRJ^ue$|DD=UMrl+sug^{oBYBPC&NS!;9rm#{;_M&yk zEDlmqg+lvDQx?jN#?`$H(EURS1l3@>(HZaM7`_h3tk3<~bGS+77?cpbRz2u`-F&{fug>OiTm zdoz(Kc4lXL^tBS!V?9BV>%5REJalOY|Tmp_G)|z&Gs+iA?5~=(E<69$fn@vh|ID!%EHz(o@ldL!Mn5yZH!0fwS z=&kG#2b)1eNbzL+=DI{Ilzg1!q|Y-}aft6Cd{9TvN+!WipuhG!RRHn%JfpSyt-PhC zg~Xas0LsWWZ&w>2FSapDH%&SEy&x`%-H{XVh6S>8?EFLhFvXb{c2EtBop{(-Q1G!1EghlQ448@8P; z%0_!z8a`(x*!7h!Jk`7D(^)2nvI)unmAJKh;m@5@Iex;KCORRoj=Ezk(cQL&(1`C} zw}3bQW*L8Rfbr~Etbvp0T~7%rQd6W#=vl;K%Ub*%&8Qx2K?jL1Hmj!#L3P_SMDb;3 zENoyOf6meU3i}I_2Z-5CoWuLHIul3tCNu!eXJ;)}?dZbi{FIE1c%M1#t@ccs1UES* zg%4_ISv4qdCIUpzNA-RaPO6pC}(-IU?Z*;bQ}pJYrKA5e5|)i6*L zuz}6|HM!re%Bu&Y8;7q3flZ8fXKUBxumKfyTh<3-To%R4IzNB#xO#yLff!+AWR~$v z^tw}qC2S(0Ca6F*SI;bC0yoz3!KQsSBsdtjgTlM0Gw&3;Mh;aJyQ!~S(85lf+JiuO z_CDrd%Sh0mK(FA9DIUFV2@P}z7}*rJh-J|NQc}eZU>mPieJ7W-4AV->*~!0N(4u!O z8`wX0HeT3e$3GJ>XlsFZxgLU+Z)Bu33dF!QW=Z>CX@3YY!D_24C(cPCBRjmJ!temn zX5FVA-YTB`ZNDI!Or3vVxx3>bW2FU;EGG^Q4uB=E69pWvMpwa_(@(7w8);x%;Ep<- z^G%aQ?UKJX?-18bDTYE9w;G$$Fu;X#bmJ+aL=>(_a(^3E`V&~Xq?6-F6{paM9AOGO266fZfefUpHra4^#(6DYhY0ITcF97jH{+iA(nUPNr3q9$b0>HAk#1VIti3i zQek)x5pI9;MO+bJ{6O9l-I~&hxPW>z5O(c*Ue8N@dLH=RCVTJ42(i0gu0-Ex>E_Ev zbd>>4dV3%6#%vbKaQAU3hdjN{cSeGf{@xErL~wr*0bpGDvAvk@<^pbSO}eTHU3JQ* z#BK@z>xNlzYTU&c#(%=XRZAm}YWfocv3yV`SOO{#1BDg|tO@AO8ud$V>i=?~qn_bktDAqEQKmP$ zSo|ZE?c{Vi;=`q_)qhIxL0=`NB48E43Ed*_`nN@;bO6ywC1$*RM8f>#d)W~=siNhllDpA=(i!e_~lFi5{{qo{5%nwnt=(lbc^Pf5bTP*&~s_Z>G#uL(d zbs#CarRtDx`~8Nspo;cyWuSgg|I#x$d&yl+@}pm7uIP$T+h-gwzZ$CH!)cbOBpz)* zD|jo{ru$(#UBgcTcviUO9s3Z`O#@e@n*2=PvDs9=lY=j<0VM3SQSbLPLA#8mAvbgC zCc6)2dnJi+ZqjaS-Y%4&ku^Plkt6fadri+21-ZnytF(~#Sp|=Ym(xTQZKnS1*)8#7 zLkzuYcRHqL-UL*%7Bt#?%tLZl&5#G1!fsP{9_Qv4E888HDbAFL`p+w{j{3iC9pJ6H zj}X(HNfp&;q_PTme!o1=q(aU;&8-zuh{Ez{58R2_?l_n7B@|~VJQ&vQ*?-;c`|8$V zCb(c?eMEY2H>iD9hXWAoqO1ix;=zR|KzEzr;CHE+?Gzw=F*7NY=h}(@@Ke=}#Od40UeGmrVOaoSnkVm17PuA|NxYSMEFEh2tXMjZ^ z1H?)<1zqRc1wJO0Xd3dEumD!0jIIN8 z`2evI)zo({m;7f;wVf*V?vH6hWqribgU(M*ER536jxa>uSthzSsxXjN@JZ9EH5?MQOf3y4hoz4e-@MCKz7j5Wjj?pRX%dT;mZhBP-Eq6R}=9r|`>mCpI8pH`lB!zT!7s(wlL zPW?523u6lk$cg%&N{D~u&z)^_dgyS;xpK%Ncc}ahiRA-df2T$e%%FxjZiu1wP+P%D_|Bh>*k-Eyzu+NbA$0rL`q1yP}WXz z<}qP{ukwcCFMulu;=U4x@!cYjiKGTWO$gXKyNP4~zCq1w`UFNG%_`0g6eu6sWFd%g3e7=)J}*uoi`lL#CcZ36!TpjzA3HHQ{rBB7E_M9Z+n~Un+3|dawaNhnO_N8g5y$*qiZ%v?9Fi z_qnbB#fH;PNVv$Qd~gy8#0@}pxe^XQv$~jsXaJaVU(=|W-DGQGbu+FQtAka@v(q;5 zQ`g_}xTT#^3&Ndj0W3JNCAqZxbaivnqk806oZP@HW3Qc0`+4J!C4Kguf*u1Vjrhlk zIxn7zUau3qnLF4mIFE^M;GiYH@V<2={3LrM8kzI1_r2^s#YbK^5$+J}-ZWIGtBAIk z?}~rI!=|8RkG{IGG2jk>R_y(@r=o7S6iQYl%-O~l22)0fz;!Rhsj+z6o=~AB%tWfD z2w59pI^DdmxoH6Q60+3)<&}qb)5f{`no!$&}!#Y%an21K+JdgK+q}5k zZ=9|%0a@#?KEzdnakpDY2x_8wdQowdI!YByizy$8N9KfM&elC`bCH0$y7#!LjlL{o zdIb>svHOC~mXwZphwfp6*>VLftnk%0vj?4AWphNu z&EK9+Cm7u%8Navw5KueqZSUSLi+YW~0K2I^Z(Pxw_0|#q%?i`y*1l1>FmxWunq?X% zY3RtWGfPtmn}A<;p{wP08FX5RLgw6O z(%5_a1=J5DmH>}f4%2;0d``~MaNfSYf#+hE52mWEIyYT%<%#P+zG7L`#5f+mWVP6} zAGN3FNCi5fj5H`qnNq>f%xow=@jau8Hz)o^941qa_d&}u^&joY-g*SXWSQxb4tlYS zp#(gM(AeUj=lV_x1bww>%ULox-;U`Reou0DQh+=Uvni7)9+VT0)5#VB$_!rZvG-a* z9Fp}H1_lG>BzCIJmQtH^iwRKvF7EF@)F1T7fO&U$nm<=t!Yq8?{NTW0NI6^g93OJl zpLd~YGolb?=WC*nYjb^Zg#*B!$HnPpKQLslsi=4vy}D7ytH-#*rFyP_X<=BOSTEL!5+z8Jcg z`jm8+8)Z*tIAwYtY_gP&`zYqGLrw#vpfi~szO85serMwN>-c1p-9gt8)1+=llgEti z)TFRO+Z~iM2T{(O{)x#<+n<5j0i?#W;7X+PMlV#)=lj(cqr zY+_)=9;3y=HJukZ74|m4?sQu%xA_leD?SYw==T&3&qJ!cZox~fj(ykKM|=|Fjv6+v znYt}jvB9oVmYq~`rgb=|-n9tsOB;1!0bsc&{d7b6F<(7tMr*6@;>Q|Sx3#-RZ>Qpa z=}+poy!YdRm(Im`r*OKL&9-hs)C++^S_=fGo#GYO`6@$fy|MVL85K%aN1@M*R&$-$ zWF@XxWT4%nyVGsmz#H31y}84VccLRlJQa1y0i>7N*ITC8Mf5ArVmcxhZj6D8K>rBs z`?j!Um62zYgwx~jFaCK^`|Enm@ZK__(knL1H7g z0k3`Y*QrvzK+Ia8MR$VY<9(V+Swy#pQWQtSU*_NXYAAx9r^pfgd8@ab$rC`fUV1Vi&Jpi!EWlvi- zL6}AbJ@Q!u3F+S)#Ay1YmcWZei2H92f+LGkNZ_NVu(L{uiieCP54R=Uzc zK=WOB3h?z$<{cXZR#}e$`H8n{+%*iq9OmC|d;!48t-s&|82q^iUw2m;p?uf__AG0E zukwt>CCr4KK&ks@BVV<%-jhxMbxcSF8@a?>;tvy2t6EsGKL%?izKeJ zG;gy;5|aa%hl@p|4rreG4^)Yh5Hh>O9}=ckhOI<%EG;P-mxj^#7o5aLR@nl|>tB=F zqg0Ion)oiSRkQjK1%<{GWg(dSEKy|4_^+fwF$+ND6R43+-~jUZ;rI>;yW7*#129+= z3dKd$b;1HQ`uxsh%tpY-C^#ep>+c@&d3G~`YtmH~D0^qWMT?1EoSaCx09^@J!o{gO z#e?jRkk5buGC)~x-n^-AeglEoz~OM&%O0|9(LAZfwUfZazz5@gFwj8=B(&I1(7vIM zc%Q&lNPlh1Q&H`d?@|5*!1F|zFlZQ>Wi+AVISB^dA_EvoEd{ANYe90kdQ2MDEZr}I z6!U4LB2M@Glp2k`a^A+Po!l(&yrwZf8)9i>RDdn0_$?!m1~9KCEe_f!2m79feLz#f z@8wrcdEGzjfP{ZDhf8PlXZ8#T?)H4wGU{i?G(cnpV%Aqb3Ml654@vLGEXZ>@KOevy zb-j<=qXddkr?+FcPvRP~Ien$J|Ga+vdK}mAxCU6llM@8~_y<7OpYf(eqh&u#bPc~l z29U1gNsoO}yz`yxhE96vD$ufUX0|iizdYhoC64lJhTI_eI{yNYTmBO9)b0;g0r^fK zX3*ZV`RO`z3eb{L8Se@b;jU#7yfU|-W#qlPx7qd5bzC4F(RiF+8C*A2>=dAw50G?g zdO+KH1Z})kUN-84z;wUND_z|SkjWkPGpzmRQEu-hqymC80>eog)#z-ctl25<#Ww>` zvBUsI;F5-C?Jl!0q`Uy#FA^ zTr@e1zC-?bCEz`te}C$(Gb$a!-CSRYZ9e+-G^=hbij^92-!mG3uIFcG+S^|o%1v1G zmd1pmTlpd%0j45;aDYEJ0Wk2rIQsg&^?F#Gb@NI>y))%DGO)yS(m${=AqbUbNgYOFSyC#seYoxDnH{ zIDj^8?6&YBS|4CYhxDq>UYe5f?tntN;h)3C_<*h|rR~F!w^~*>>5%M_a}firU|xZQTMf)e|oC zBt}Nwmf>mFt^xI+bR}KxPYsW7wg6WNDqxs&dH(6HRV%10*b5;3wCPGHw6lOg^$$-9 zUol#+%7je?5@^8LPWuCL0yUbZ!EM)=L;tVhIlbqZmbJCBp6uqE1n)rZ)#H*&i;wb-<(`fDj zgA*)FK-2`zSH&RuaHIMg?O{M;&N%zY$gKtuRVqZJ z#Du~fv`gDN5!G0rEj8X=fEnKfftW|kOGUwIo-nSvdOjz7_(3U_??b z%rZ$CxAII7i;>u;T9wAA#eInUXFg?GTw++{4*Dd5^b>p)8klCZMW<->&gFWs&#UDJ zb+=*?;^UX+JhO>Q5bg8c$!%xHeeQ`r8GXA&XBBzOAh&IQavR9q_1)m+*USS5OVvGu z@}A%4Vhx>jX|aW*coV~QA4190)_kjNu*3ZTLfKAqW)Kba#$9XlG|%7Mr=F&^_~3la z@0lsvQ>M$e=xk5*`w4(oM3BVk`wg^dXU zJHID4Fud)Ux)4`j>80p@{Cv0l4%3V!TMz4{aM5nwar&gX?u~~{yG_0|b&00GeZHH# zqrwK=n=xqnkLccl;U8PPl5O_}S#^!w!KtSeCfeIqesr$+SZ$v;a3@+rC&>EnnQLu1 z>S@u2Is5A;vB_;)v5**f zT4d!^*?5Zn2QA}j>29C1HK)29H(dI$_W&Ya_+GPg_v}t!AtPON)y$8v6(A6(vsvW+BL-`5CAIB0zC(^zWaL$Zcj0A; zZFkMDN7c7#oC7)o#$+cUKLZ~Vqy`9ECH1Ag*M4Zt}Zu9*-HERyT#$)%;Ct&n-b%GdiNZIjz*%I9a4&*`6cYUnt_4(x;l=qV3@kG~7t1}tdft^Hrt^`GdLiU-k1_ENq523VU98}vGk6W)NiQN1S2 zYiCU;6bZEm%}ptSn3YwzI8=Mqw3%y0inG)&z!MbmQwCbDs>*^oGxt~CX6s|=3hbI- zt3}QQ-uQSmq#uS~Qy#WQi)!=Bv1WB6pOWKF6)|bi$f_ZM#CE!VHd0-^Zu+Ff>=0JUc#ct=_ZJ4UKdqvpNF$5o^o3G(TX3 zEwrqeh&TlzYO8Qe555&wP3l!wRyMy;|J_t1W}?MIi@-QXY>dlMW{hDPS_yqB z7Txy))X}pS>gf$1Y;U)3Qbsj(!yt=VU0WZJmCY&WxucXKOjG#k zi zHvn7^+Y)|VWU?laWZw7`FV3#Zlf)}!G8wS3k+4e}x{6+<3}U`mGZ5HHR8u~4_Qs7H z3AH%!O(~fruw4I!$Ky#ECx+%~J9~CkJd>J76q^TnbjC$o(s?2&o4Ngt*Wk``(Jwi* ztAfXPFP6Sb9pwpv$AYLybt5m^@eU(&i_CC~0PY%RRc9F+%X0sJupxxkI$vksh zJ2m1viS)OBO`ft2ys z28kJl_uI#Zmtm?S(>0(UJQI}9zb%L!I+9W!S2WN3&V233W@jLcIK*N9?7TP{U4PAM zb=qah&|}TnX3_32DMWc_9N%71S=-6;EjWI+RnW1OXjj~Frb$R@_&m?(xNgYtYA1F& z{)G7^%K)r}?xo{#N!8LyF}@zAheI@XQGe>jMn4du8DCfJW~=>&@j8m@}Jp-LHl(73{87io-}%NcDIL!O5mjFs}H%J4#;)!CNl`m@xDD zVf|<#|7icP^omK+PA3Ju+tMaDJ|UrF>q%%xJOjX&RR#(GmRf{zWl6}c_7RDp!rIR3 z&Ev>7@5Zb6QHtf|M{BCZ#eq|-@rZ7F_dnL@y>AT zg`XhEO1FfQu}Ad`C@xXeSjsfoQ5@|+y>h&j8Uz&3NM+{*ugv<2T+ z9MRO2zjcYIwev_b2l+=VQv*c-#$i1`HMX=&Y2k7xD3w*c5*4vL#pVvW)rr&ueb3(Q6W#ADx;3i$B}9( zPy3N*b^AjNYUkzK6-loUrc$089Nv!KG7HQdT@t0q=RVswM=_HlhN#vw8}%__owNNmjo*B zMk@*ig+d_^!%>sYptm|{wqh0iI3Y8o9#zeX4tsmZ{GOO5U-OmUQIOMrpOzRTerH2P zN%GOeK5^T)DAv{0m4;Jw5)Ac6+c#q>qI5s)u$taDN^a<6=!nvYRgneE@p@h8IP=}8cde=;1UGk}Zi9J!dA*)zK^5;iov1FZGf@}Qw%h;SI!YhdTE zS%jOBebC@^iWH9;+)#}YgFUVRr$Hp2&lUi1BXc8qDedY)*Ku8%QV?vJ%bXSba)&QU zXFil8_%mN{R-Ec8|C2InlwRj#SdEv|Xv+wEuHTseq z6gA&4pGjX~$=k#dLv0mRXA*#FlQfa){V<2a;W=Ni$T3*h^aBwZV;bA-Sk7Y{(hXmK zxw`6=(Zn%=wX+~bq4?}S<4?P|R@xv`Ll7tezd~Kc&|++obcGw;oBXu9_|m86${t8< zkMYq@;%x4k-*>Tj=H%rH>Bsg`?B^ttB;6saHReUL#!lxiERS?T%}?V??YZIa?r#(P zzlwr)U&>@>k1vHAo-!N*R;AL%>bT)@sq_+jP&`hnhUl0%)|iE~qW12r=nJ;gPpA5w z-Ui@&8PKTfPiVb76QIi5lyVly=7?lJn4j=D4?J#>^MF1Y-VhS4Pi*I3aUZz_oCZRn zFya(Y(u}Wv^qKyU1sv8PsU>bF?P|yK+j1L#(u z)NJNvc9EMnrP`V64Gc%d$JUjS!cUp5a|6wy*=|yX|06%-$hG=w28wIqKL^k%r7~Y@ zKdq(Zfma)VRXta^+L^LEDG~yKh>*3BOgP+`%$kZT9W7^Gt(%Bg7FteQ^WrBnfxI$OAO%r!tfXKrrJ5xtTZpN7F^P4Y5ItJ%UB zOVuM2w1b>0i|CG?z0_S(b+CY;ueqsiq++bUu&78#K~=h?8~Ff)1`R1!GAIO%j2p%5S z4)ggO&dM6K`P!K|fSPCav(-_2+aGO2_DMlV{y*(b0VB4&lO|) z1}jOe9Lt&3pgm0MB*)Ek%Ci`Ca!W~B*{;X3Hw3F!F&Oc6qsrmc2X3A!*7khGA=ocG zjtKSZ)*Th)9VTSE;y&OIvB&m{1W~NibK*6ltVjoN_W*|VQ#l??vsw5V_iXX$!K{ua zTV~RezL_)G4w%Y5V2|#GrF+a$xfjI!MUu9lu(^S<$P&eJTHWJkim^2R(cIZruCQx4ZLGugV(sJxIH1Va;JmU<0lZlHFhtILUUeoARCh#k4@g)`n0$AR+M zlBfM8J9G_p-}XiJ@Q#lQmncRE;BxxP{VIxqL1Z^3V)>#w755@?!!?kjT>bNhxwN+L zk)8K&i8ICdD^Gg|Kyy6RqI8rkl>te-vXWc%j`HbsjZ^#ymS7Pez|CAJ3`UMGInpxq zcs1e_7AP6nCrjE=85766Feo8FJCkmnr#f7L7LkRtqQb)dyXHPtCkk9(1pn9cVtSgP@h)0L#c*PnF}|o;#jKDEBNa?llK{PykYY#HhT&)(>pd`^XmC=vEuz8Z8Eu{`u$r+d4j)t zj_N|}mYe^rrF`>PvfCx1;eY5W|0T2hFS|7$!2xsaJV2#{x*6EEn3pypK={y{sgvEBxE=)uKI!3Ui zrx|HMaat8qix@z2QLR-%01dP-hQ(Dv;4qL^=>rJdMw))LWhfnxHtIb~@aCkhvNHXx zfI=}5@o23;DXSvJ|2s`VBgpk2SL{=nYE$S}Y<2eaPYCu};J*CV~6h&k(z4!`fqZ5%5Q#3U*`^Ln0jv)aEj zdulmAEbdz)1hSDZKmxD=o==~WG`7romjkDgO!m+-M;C{|gqmA}h^(^>QK^qOKOo|4 zYr?&uELahf=p$6Ak^rW6FzdxW{GH#Y6Mp%wBFX~J<56obpb{`uUaJoekYX(LOT5&D zRgGF{5CF5SB_W}E*Foua3dFGQ(P0ea8r06sh2H;0FfnS+(%1dH#NM&}Ph!INV|sK- zWP;1U)GjY1aE2weqQqksjTI9OVyN0rAkHu zQ5y2@rDvu7>aQW1jESS7BQwUVja4LlwZ5i^MH%1Wh)x=bM3UO`$+7*Ula@nALbJ^h zU_l2IAK+6KeSoilyFfGOYzgpxokIT;V9M*t1)}y2?qSl2v6L4;U;_4iS?o^T*;#HE zO_mzx0v^2UjymOo|3EF8h)gZQKrrtJYM_ zSe-EtoubS2Y3*<1m9^X{GeyqZiha@EG@LSfo*(E9NLc){X72u6tL9tsNs*{B|49IV z*Hcr)nRPLKm%mHy3m%Y^=1u|f9g#=`RMfxl)y`OMmb2Nrs@dCYVF4UX&fYuk*W_)t z-s|X+O^aM)sR7ACsbV$Qc*p74n{`}|e)t(=h@TWYnHw(eXYAYFeCt1?!u~tpe35(C bwe|cr?|Z%bi5c*}otmSq%lWE*_$L1oHV-Sl literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/stax/test_display_subaddress/00001.png b/tests/monero_client/snapshots/stax/test_display_subaddress/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab4ba3913520a1e331a12dc2fee825504170b01 GIT binary patch literal 22542 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 literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/stax/test_display_subaddress/00006.png b/tests/monero_client/snapshots/stax/test_display_subaddress/00006.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ac4ba4748ef534d3348505851257fd18a33911 GIT binary patch literal 12223 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 F{{l-GJyQSx literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/stax/test_private_view_key/00001.png b/tests/monero_client/snapshots/stax/test_private_view_key/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..1023fdcc9e7e76668e5020f2c8fd34875b14243f GIT binary patch literal 4832 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 HsJwpxj1(mH literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/stax/test_validate_prehash_update/00000.png b/tests/monero_client/snapshots/stax/test_validate_prehash_update/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..5b24cb351cebdb79def29c7a1e969526d82a9ac8 GIT binary patch literal 8399 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%0D&V{&uqFtK(P%Riz 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 literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/stax/test_validate_prehash_update/00002.png b/tests/monero_client/snapshots/stax/test_validate_prehash_update/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..2a78db9ca80426c1103699beba20c77143c4cd77 GIT binary patch literal 7318 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 literal 0 HcmV?d00001 From 82467369bda26f42f4c0085c72e5462d4cf3a191 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 30 May 2023 13:48:21 +0200 Subject: [PATCH 093/142] ui: info_display functions are now internal to nano --- src/monero_api.h | 4 ++-- src/monero_init.c | 2 +- src/monero_open_tx.c | 2 +- src/monero_ux_nano.c | 14 +++++++++++--- src/monero_ux_nanos.c | 14 +++++++++++--- src/monero_ux_stax.c | 6 ++---- 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index 58b8ca6..4a174c5 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -88,8 +88,8 @@ int monero_apdu_close_tx(void); void ui_init(void); void ui_menu_lock_display(void); void ui_menu_main_display(void); -void ui_menu_info_display(unsigned int value); -void ui_menu_info_display2(unsigned int value, const char *line1, const char *line2); +void ui_menu_show_security_error(void); +void ui_menu_show_tx_aborted(void); void ui_export_viewkey_display(unsigned int value); void ui_menu_any_pubaddr_display(unsigned int value, unsigned char *pub_view, unsigned char *pub_spend, unsigned char is_subbadress, diff --git a/src/monero_init.c b/src/monero_init.c index bfc9e27..215f9b4 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -240,6 +240,6 @@ void monero_lock_and_throw(int sw) { G_monero_vstate.protocol_barrier = PROTOCOL_LOCKED; snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "Security Err"); snprintf(G_monero_vstate.ux_info2, sizeof(G_monero_vstate.ux_info2), "%x", sw); - ui_menu_info_display(0); + ui_menu_show_security_error(); THROW(sw); } diff --git a/src/monero_open_tx.c b/src/monero_open_tx.c index 640b287..b799781 100644 --- a/src/monero_open_tx.c +++ b/src/monero_open_tx.c @@ -95,7 +95,7 @@ int monero_apdu_close_tx() { /* ----------------------------------------------------------------------- */ int monero_abort_tx() { monero_reset_tx(1); - ui_menu_info_display2(0, "TX", "Aborted"); + ui_menu_show_tx_aborted(); return 0; } diff --git a/src/monero_ux_nano.c b/src/monero_ux_nano.c index 199945a..132bfcb 100644 --- a/src/monero_ux_nano.c +++ b/src/monero_ux_nano.c @@ -121,17 +121,25 @@ unsigned int ui_menu_info_action(unsigned int value __attribute__((unused))) { return 0; } -void ui_menu_info_display2(unsigned int value __attribute__((unused)), const char* line1, - const char* line2) { +static void ui_menu_info_display2(unsigned int value __attribute__((unused)), const char* line1, + const char* line2) { snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "%s", line1); snprintf(G_monero_vstate.ux_info2, sizeof(G_monero_vstate.ux_info2), "%s", line2); ux_flow_init(0, ux_flow_info, NULL); } -void ui_menu_info_display(unsigned int value __attribute__((unused))) { +static void ui_menu_info_display(unsigned int value __attribute__((unused))) { ux_flow_init(0, ux_flow_info, NULL); } +void ui_menu_show_tx_aborted(void) { + ui_menu_info_display2(0, "TX", "Aborted"); +} + +void ui_menu_show_security_error(void) { + ui_menu_info_display(0); +} + /* -------------------------------- OPEN TX UX --------------------------------- */ unsigned int ui_menu_transaction_start(void) { return SW_OK; diff --git a/src/monero_ux_nanos.c b/src/monero_ux_nanos.c index 28ab06c..c4519e0 100644 --- a/src/monero_ux_nanos.c +++ b/src/monero_ux_nanos.c @@ -152,17 +152,25 @@ unsigned int ui_menu_info_button(unsigned int button_mask, return 0; } -void ui_menu_info_display2(unsigned int value __attribute__((unused)), const char* line1, - const char* line2) { +static void ui_menu_info_display2(unsigned int value __attribute__((unused)), const char* line1, + const char* line2) { snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "%s", line1); snprintf(G_monero_vstate.ux_info2, sizeof(G_monero_vstate.ux_info2), "%s", line2); UX_DISPLAY(ui_menu_info, NULL); } -void ui_menu_info_display(unsigned int value __attribute__((unused))) { +static void ui_menu_info_display(unsigned int value __attribute__((unused))) { UX_DISPLAY(ui_menu_info, NULL); } +void ui_menu_show_tx_aborted(void) { + ui_menu_info_display2(0, "TX", "Aborted"); +} + +void ui_menu_show_security_error(void) { + ui_menu_info_display(0); +} + /* -------------------------------- OPEN TX UX --------------------------------- */ unsigned int ui_menu_transaction_signed(void) { diff --git a/src/monero_ux_stax.c b/src/monero_ux_stax.c index 0c03bb1..3a1d54d 100644 --- a/src/monero_ux_stax.c +++ b/src/monero_ux_stax.c @@ -91,13 +91,11 @@ static void ui_menu_info_action(void) { } } -void ui_menu_info_display2(unsigned int value __attribute__((unused)), - const char* line1 __attribute__((unused)), - const char* line2 __attribute__((unused))) { +void ui_menu_show_tx_aborted(void) { nbgl_useCaseStatus("Transaction\ncancelled", false, ui_menu_info_action); } -void ui_menu_info_display(unsigned int value __attribute__((unused))) { +void ui_menu_show_security_error(void) { nbgl_useCaseStatus("Security Error", false, ui_menu_info_action); } From 240c706818290c880a0cb0a11a6a36d48da5e249 Mon Sep 17 00:00:00 2001 From: Alexandre Paillier Date: Thu, 3 Aug 2023 11:15:08 +0200 Subject: [PATCH 094/142] QR code source path is now used explicitly --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 2fbb1e9..f2add04 100644 --- a/Makefile +++ b/Makefile @@ -56,6 +56,7 @@ DEFINES += UI_NANO_S else ifeq ($(TARGET_NAME),TARGET_STAX) DEFINES += UI_STAX DEFINES += NBGL_QRCODE +SDK_SOURCE_PATH += qrcode else DEFINES += UI_NANO_X TARGET_UI := FLOW From e433f12b732bd7801ab6eadc7dd0f8e1baafcf13 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 19 Oct 2023 09:55:29 +0200 Subject: [PATCH 095/142] crypto: clean deprecated crypto calls --- src/monero_api.h | 42 +++++------- src/monero_clsag.c | 5 +- src/monero_crypto.c | 153 +++++++++++++++++++++++--------------------- src/monero_init.c | 16 +++-- src/monero_io.c | 16 +++-- src/monero_key.c | 6 +- src/monero_main.c | 3 +- src/monero_mlsag.c | 5 +- 8 files changed, 128 insertions(+), 118 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index 4a174c5..eb636f8 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -27,7 +27,7 @@ void monero_lock_and_throw(int sw) __attribute__((noreturn)); void monero_install(unsigned char netId); void monero_init(void); -void monero_init_private_key(void); +int monero_init_private_key(void); void monero_wipe_private_key(void); void monero_init_ux(void); @@ -193,39 +193,27 @@ void monero_clear_words(void); /* ----------------------------------------------------------------------- */ extern const unsigned char C_ED25519_ORDER[]; -void monero_aes_derive(cx_aes_key_t *sk, unsigned char *seed32, unsigned char *a, unsigned char *b); +int monero_aes_derive(cx_aes_key_t *sk, unsigned char *seed32, unsigned char *a, unsigned char *b); void monero_aes_generate(cx_aes_key_t *sk); /* Compute Monero-Hash of data*/ -void monero_hash_init_keccak(cx_hash_t *hasher); +int monero_hash_init_keccak(cx_hash_t *hasher); void monero_hash_init_sha256(cx_hash_t *hasher); -void monero_hash_update(cx_hash_t *hasher, const unsigned char *buf, unsigned int len); +int monero_hash_update(cx_hash_t *hasher, const unsigned char *buf, unsigned int len); int monero_hash_final(cx_hash_t *hasher, unsigned char *out); int monero_hash(unsigned int algo, cx_hash_t *hasher, const unsigned char *buf, unsigned int len, unsigned char *out); -static inline void monero_keccak_init_F(void) { - monero_hash_init_keccak((cx_hash_t *)&G_monero_vstate.keccakF); -} - -static inline void monero_keccak_update_F(const unsigned char *buf, size_t len) { - monero_hash_update((cx_hash_t *)&G_monero_vstate.keccakF, buf, len); -} - -static inline int monero_keccak_final_F(unsigned char *out) { - return monero_hash_final((cx_hash_t *)&G_monero_vstate.keccakF, out); -} - static inline int monero_keccak_F(unsigned char *buf, size_t len, unsigned char *out) { return monero_hash(CX_KECCAK, (cx_hash_t *)&G_monero_vstate.keccakF, buf, len, out); } -static inline void monero_keccak_init_H(void) { - monero_hash_init_keccak((cx_hash_t *)&G_monero_vstate.keccakH); +static inline int monero_keccak_init_H(void) { + return monero_hash_init_keccak((cx_hash_t *)&G_monero_vstate.keccakH); } -static inline void monero_keccak_update_H(const unsigned char *buf, size_t len) { - monero_hash_update((cx_hash_t *)&G_monero_vstate.keccakH, buf, len); +static inline int monero_keccak_update_H(const unsigned char *buf, size_t len) { + return monero_hash_update((cx_hash_t *)&G_monero_vstate.keccakH, buf, len); } static inline int monero_keccak_final_H(unsigned char *out) { @@ -240,8 +228,8 @@ static inline void monero_sha256_commitment_init(void) { monero_hash_init_sha256((cx_hash_t *)&G_monero_vstate.sha256_commitment); } -static inline void monero_sha256_commitment_update(const unsigned char *buf, size_t len) { - monero_hash_update((cx_hash_t *)&G_monero_vstate.sha256_commitment, buf, len); +static inline int monero_sha256_commitment_update(const unsigned char *buf, size_t len) { + return monero_hash_update((cx_hash_t *)&G_monero_vstate.sha256_commitment, buf, len); } static inline int monero_sha256_commitment_final(unsigned char *out) { @@ -253,8 +241,8 @@ static inline void monero_sha256_outkeys_init(void) { monero_hash_init_sha256((cx_hash_t *)&G_monero_vstate.sha256_out_keys); } -static inline void monero_sha256_outkeys_update(const unsigned char *buf, size_t len) { - monero_hash_update((cx_hash_t *)&G_monero_vstate.sha256_out_keys, buf, len); +static inline int monero_sha256_outkeys_update(const unsigned char *buf, size_t len) { + return monero_hash_update((cx_hash_t *)&G_monero_vstate.sha256_out_keys, buf, len); } static inline int monero_sha256_outkeys_final(unsigned char *out) { @@ -361,7 +349,7 @@ void monero_io_rewind(void); void monero_io_hole(unsigned int sz); void monero_io_inserted(unsigned int len); void monero_io_insert(unsigned char const *buffer, unsigned int len); -void monero_io_insert_encrypt(unsigned char *buffer, int len, int type); +void monero_io_insert_encrypt(unsigned char *buffer, size_t len, int type); void monero_io_insert_hmac_for(unsigned char *buffer, int len, int type); void monero_io_insert_u32(unsigned int v32); @@ -384,8 +372,8 @@ int monero_io_fetch_l(unsigned int *L); int monero_io_fetch_tl(unsigned int *T, unsigned int *L); int monero_io_fetch_nv(unsigned char *buffer, int len); int monero_io_fetch(unsigned char *buffer, int len); -int monero_io_fetch_decrypt(unsigned char *buffer, int len, int type); -int monero_io_fetch_decrypt_key(unsigned char *buffer); +int monero_io_fetch_decrypt(unsigned char *buffer, size_t len, int type); +int monero_io_fetch_decrypt_key(unsigned char *buffer, size_t len); int monero_io_do(unsigned int io_flags); /* ----------------------------------------------------------------------- */ diff --git a/src/monero_clsag.c b/src/monero_clsag.c index 73db36e..e43bc2f 100644 --- a/src/monero_clsag.c +++ b/src/monero_clsag.c @@ -91,7 +91,10 @@ int monero_apdu_clsag_hash() { unsigned char c[32]; if (G_monero_vstate.io_p2 == 1) { - monero_keccak_init_H(); + if (monero_keccak_init_H()) + { + return SW_WRONG_DATA; + } } monero_io_fetch(msg, 32); diff --git a/src/monero_crypto.c b/src/monero_crypto.c index e326828..9dbddde 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -56,7 +56,7 @@ unsigned char const C_EIGHT[32] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0 /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_aes_derive(cx_aes_key_t *sk, unsigned char *seed32, unsigned char *a, +int monero_aes_derive(cx_aes_key_t *sk, unsigned char *seed32, unsigned char *a, unsigned char *b) { unsigned char h1[32]; @@ -68,7 +68,7 @@ void monero_aes_derive(cx_aes_key_t *sk, unsigned char *seed32, unsigned char *a monero_keccak_H(h1, 32, h1); - cx_aes_init_key(h1, 16, sk); + return cx_aes_init_key_no_throw(h1, 16, sk); } /* ----------------------------------------------------------------------- */ @@ -77,7 +77,7 @@ void monero_aes_derive(cx_aes_key_t *sk, unsigned char *seed32, unsigned char *a void monero_aes_generate(cx_aes_key_t *sk) { unsigned char h1[16]; cx_rng(h1, 16); - cx_aes_init_key(h1, 16, sk); + cx_aes_init_key_no_throw(h1, 16, sk); } /* ----------------------------------------------------------------------- */ @@ -139,22 +139,22 @@ void monero_hash_init_sha256(cx_hash_t *hasher) { cx_sha256_init((cx_sha256_t *)hasher); } -void monero_hash_init_keccak(cx_hash_t *hasher) { - cx_keccak_init((cx_sha3_t *)hasher, 256); +int monero_hash_init_keccak(cx_hash_t *hasher) { + return cx_keccak_init_no_throw((cx_sha3_t *)hasher, 256); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ -void monero_hash_update(cx_hash_t *hasher, const unsigned char *buf, unsigned int len) { - cx_hash(hasher, 0, buf, len, NULL, 0); +int monero_hash_update(cx_hash_t *hasher, const unsigned char *buf, unsigned int len) { + return cx_hash_no_throw(hasher, 0, buf, len, NULL, 0); } /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ int monero_hash_final(cx_hash_t *hasher, unsigned char *out) { - return cx_hash(hasher, CX_LAST, NULL, 0, out, 32); + return cx_hash_no_throw(hasher, CX_LAST, NULL, 0, out, 32); } /* ----------------------------------------------------------------------- */ @@ -162,12 +162,17 @@ int monero_hash_final(cx_hash_t *hasher, unsigned char *out) { /* ----------------------------------------------------------------------- */ int monero_hash(unsigned int algo, cx_hash_t *hasher, const unsigned char *buf, unsigned int len, unsigned char *out) { + int err = 0; if (algo == CX_SHA256) { cx_sha256_init((cx_sha256_t *)hasher); } else { - cx_keccak_init((cx_sha3_t *)hasher, 256); + err = cx_keccak_init_no_throw((cx_sha3_t *)hasher, 256); + if (err) { + return err; + } } - return cx_hash(hasher, CX_LAST, buf, len, out, 32); + err = cx_hash_no_throw(hasher, CX_LAST, buf, len, out, 32); + return err; } /* ----------------------------------------------------------------------- */ @@ -331,62 +336,62 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { // cx works in BE monero_reverse32(u, bytes); - cx_math_modm(u, 32, (unsigned char *)C_ED25519_FIELD, 32); + cx_math_modm_no_throw(u, 32, (unsigned char *)C_ED25519_FIELD, 32); // go on - cx_math_multm(v, u, u, MOD); /* 2 * u^2 */ - cx_math_addm(v, v, v, MOD); + cx_math_multm_no_throw(v, u, u, MOD); /* 2 * u^2 */ + cx_math_addm_no_throw(v, v, v, MOD); memset(w, 0, 32); w[31] = 1; /* w = 1 */ - cx_math_addm(w, v, w, MOD); /* w = 2 * u^2 + 1 */ - cx_math_multm(x, w, w, MOD); /* w^2 */ - cx_math_multm(y, (unsigned char *)C_fe_ma2, v, MOD); /* -2 * A^2 * u^2 */ - cx_math_addm(x, x, y, MOD); /* x = w^2 - 2 * A^2 * u^2 */ + cx_math_addm_no_throw(w, v, w, MOD); /* w = 2 * u^2 + 1 */ + cx_math_multm_no_throw(x, w, w, MOD); /* w^2 */ + cx_math_multm_no_throw(y, (unsigned char *)C_fe_ma2, v, MOD); /* -2 * A^2 * u^2 */ + cx_math_addm_no_throw(x, x, y, MOD); /* x = w^2 - 2 * A^2 * u^2 */ // inline fe_divpowm1(r->X, w, x); // (w / x)^(m + 1) => fe_divpowm1(r,u,v) #define _u w #define _v x - cx_math_multm(v3, _v, _v, MOD); - cx_math_multm(v3, v3, _v, MOD); /* v3 = v^3 */ - cx_math_multm(uv7, v3, v3, MOD); - cx_math_multm(uv7, uv7, _v, MOD); - cx_math_multm(uv7, uv7, _u, MOD); /* uv7 = uv^7 */ - cx_math_powm(uv7, uv7, (unsigned char *)C_fe_qm5div8, 32, MOD); /* (uv^7)^((q-5)/8)*/ - cx_math_multm(uv7, uv7, v3, MOD); - cx_math_multm(rX, uv7, w, MOD); /* u^(m+1)v^(-(m+1)) */ + cx_math_multm_no_throw(v3, _v, _v, MOD); + cx_math_multm_no_throw(v3, v3, _v, MOD); /* v3 = v^3 */ + cx_math_multm_no_throw(uv7, v3, v3, MOD); + cx_math_multm_no_throw(uv7, uv7, _v, MOD); + cx_math_multm_no_throw(uv7, uv7, _u, MOD); /* uv7 = uv^7 */ + cx_math_powm_no_throw(uv7, uv7, (unsigned char *)C_fe_qm5div8, 32, MOD); /* (uv^7)^((q-5)/8)*/ + cx_math_multm_no_throw(uv7, uv7, v3, MOD); + cx_math_multm_no_throw(rX, uv7, w, MOD); /* u^(m+1)v^(-(m+1)) */ #undef _u #undef _v - cx_math_multm(y, rX, rX, MOD); - cx_math_multm(x, y, x, MOD); - cx_math_subm(y, w, x, MOD); + cx_math_multm_no_throw(y, rX, rX, MOD); + cx_math_multm_no_throw(x, y, x, MOD); + cx_math_subm_no_throw(y, w, x, MOD); memcpy(z, C_fe_ma, 32); if (!cx_math_is_zero(y, 32)) { - cx_math_addm(y, w, x, MOD); + cx_math_addm_no_throw(y, w, x, MOD); if (!cx_math_is_zero(y, 32)) { goto negative; } else { - cx_math_multm(rX, rX, (unsigned char *)C_fe_fffb1, MOD); + cx_math_multm_no_throw(rX, rX, (unsigned char *)C_fe_fffb1, MOD); } } else { - cx_math_multm(rX, rX, (unsigned char *)C_fe_fffb2, MOD); + cx_math_multm_no_throw(rX, rX, (unsigned char *)C_fe_fffb2, MOD); } - cx_math_multm(rX, rX, u, MOD); // u * sqrt(2 * A * (A + 2) * w / x) - cx_math_multm(z, z, v, MOD); // -2 * A * u^2 + cx_math_multm_no_throw(rX, rX, u, MOD); // u * sqrt(2 * A * (A + 2) * w / x) + cx_math_multm_no_throw(z, z, v, MOD); // -2 * A * u^2 sign = 0; goto setsign; negative: - cx_math_multm(x, x, (unsigned char *)C_fe_sqrtm1, MOD); - cx_math_subm(y, w, x, MOD); + cx_math_multm_no_throw(x, x, (unsigned char *)C_fe_sqrtm1, MOD); + cx_math_subm_no_throw(y, w, x, MOD); if (!cx_math_is_zero(y, 32)) { - cx_math_addm(y, w, x, MOD); - cx_math_multm(rX, rX, (unsigned char *)C_fe_fffb3, MOD); + cx_math_addm_no_throw(y, w, x, MOD); + cx_math_multm_no_throw(rX, rX, (unsigned char *)C_fe_fffb3, MOD); } else { - cx_math_multm(rX, rX, (unsigned char *)C_fe_fffb4, MOD); + cx_math_multm_no_throw(rX, rX, (unsigned char *)C_fe_fffb4, MOD); } // r->X = sqrt(A * (A + 2) * w / x) // z = -A @@ -396,16 +401,16 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { if (fe_isnegative(rX) != sign) { cx_math_sub(rX, (unsigned char *)C_ED25519_FIELD, rX, 32); } - cx_math_addm(rZ, z, w, MOD); - cx_math_subm(rY, z, w, MOD); - cx_math_multm(rX, rX, rZ, MOD); + cx_math_addm_no_throw(rZ, z, w, MOD); + cx_math_subm_no_throw(rY, z, w, MOD); + cx_math_multm_no_throw(rX, rX, rZ, MOD); // back to monero y-affine - cx_math_invprimem(u, rZ, MOD); + cx_math_invprimem_no_throw(u, rZ, MOD); Pxy[0] = 0x04; - cx_math_multm(&Pxy[1], rX, u, MOD); - cx_math_multm(&Pxy[1 + 32], rY, u, MOD); - cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_math_multm_no_throw(&Pxy[1], rX, u, MOD); + cx_math_multm_no_throw(&Pxy[1 + 32], rY, u, MOD); + cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); memcpy(ge, &Pxy[1], 32); #undef u @@ -601,7 +606,9 @@ void monero_get_subaddress_secret_key(unsigned char *sub_s, unsigned char *s, void monero_check_scalar_range_1N(unsigned char *s) { unsigned char x[32]; monero_reverse32(x, s); - if (cx_math_is_zero(x, 32) || cx_math_cmp(x, C_ED25519_ORDER, 32) >= 0) { + int diff; + cx_math_cmp_no_throw(x, C_ED25519_ORDER, 32, &diff); + if (cx_math_is_zero(x, 32) || diff >= 0) { THROW(SW_WRONG_DATA_RANGE); } } @@ -622,8 +629,8 @@ void monero_ecmul_G(unsigned char *W, unsigned char *scalar32) { unsigned char s[32]; monero_reverse32(s, scalar32); memcpy(Pxy, C_ED25519_G, 65); - cx_ecfp_scalar_mult(CX_CURVE_Ed25519, Pxy, sizeof(Pxy), s, 32); - cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_ecfp_scalar_mult_no_throw(CX_CURVE_Ed25519, Pxy, s, 32); + cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); memcpy(W, &Pxy[1], 32); } @@ -638,10 +645,10 @@ void monero_ecmul_H(unsigned char *W, unsigned char *scalar32) { Pxy[0] = 0x02; memcpy(&Pxy[1], C_ED25519_Hy, 32); - cx_edwards_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); - cx_ecfp_scalar_mult(CX_CURVE_Ed25519, Pxy, sizeof(Pxy), s, 32); - cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_ecfp_scalar_mult_no_throw(CX_CURVE_Ed25519, Pxy, s, 32); + cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); memcpy(W, &Pxy[1], 32); } @@ -657,10 +664,10 @@ void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32) Pxy[0] = 0x02; memcpy(&Pxy[1], P, 32); - cx_edwards_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); - cx_ecfp_scalar_mult(CX_CURVE_Ed25519, Pxy, sizeof(Pxy), s, 32); - cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_ecfp_scalar_mult_no_throw(CX_CURVE_Ed25519, Pxy, s, 32); + cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); memcpy(W, &Pxy[1], 32); } @@ -682,11 +689,11 @@ void monero_ecmul_8(unsigned char *W, unsigned char *P) { Pxy[0] = 0x02; memcpy(&Pxy[1], P, 32); - cx_edwards_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); - cx_ecfp_add_point(CX_CURVE_Ed25519, Pxy, Pxy, Pxy, sizeof(Pxy)); - cx_ecfp_add_point(CX_CURVE_Ed25519, Pxy, Pxy, Pxy, sizeof(Pxy)); - cx_ecfp_add_point(CX_CURVE_Ed25519, Pxy, Pxy, Pxy, sizeof(Pxy)); - cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Pxy); + cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Pxy); + cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Pxy); + cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); memcpy(W, &Pxy[1], 32); } @@ -699,15 +706,15 @@ void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q) { Pxy[0] = 0x02; memcpy(&Pxy[1], P, 32); - cx_edwards_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); Qxy[0] = 0x02; memcpy(&Qxy[1], Q, 32); - cx_edwards_decompress_point(CX_CURVE_Ed25519, Qxy, sizeof(Qxy)); + cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Qxy, sizeof(Qxy)); - cx_ecfp_add_point(CX_CURVE_Ed25519, Pxy, Pxy, Qxy, sizeof(Pxy)); + cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Qxy); - cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); memcpy(W, &Pxy[1], 32); } @@ -720,16 +727,16 @@ void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q) { Pxy[0] = 0x02; memcpy(&Pxy[1], P, 32); - cx_edwards_decompress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); Qxy[0] = 0x02; memcpy(&Qxy[1], Q, 32); - cx_edwards_decompress_point(CX_CURVE_Ed25519, Qxy, sizeof(Qxy)); + cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Qxy, sizeof(Qxy)); cx_math_sub(Qxy + 1, (unsigned char *)C_ED25519_FIELD, Qxy + 1, 32); - cx_ecfp_add_point(CX_CURVE_Ed25519, Pxy, Pxy, Qxy, sizeof(Pxy)); + cx_ecfp_add_point_no_throw(CX_CURVE_Ed25519, Pxy, Pxy, Qxy); - cx_edwards_compress_point(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); + cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); memcpy(W, &Pxy[1], 32); } @@ -784,7 +791,7 @@ void monero_addm(unsigned char *r, unsigned char *a, unsigned char *b) { monero_reverse32(ra, a); monero_reverse32(rb, b); - cx_math_addm(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); + cx_math_addm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); monero_reverse32(r, r); } @@ -797,7 +804,7 @@ void monero_subm(unsigned char *r, unsigned char *a, unsigned char *b) { monero_reverse32(ra, a); monero_reverse32(rb, b); - cx_math_subm(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); + cx_math_subm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); monero_reverse32(r, r); } /* ----------------------------------------------------------------------- */ @@ -809,7 +816,7 @@ void monero_multm(unsigned char *r, unsigned char *a, unsigned char *b) { monero_reverse32(ra, a); monero_reverse32(rb, b); - cx_math_multm(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); + cx_math_multm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); monero_reverse32(r, r); } @@ -823,7 +830,7 @@ void monero_multm_8(unsigned char *r, unsigned char *a) { monero_reverse32(ra, a); memset(rb, 0, 32); rb[31] = 8; - cx_math_multm(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); + cx_math_multm_no_throw(r, ra, rb, (unsigned char *)C_ED25519_ORDER, 32); monero_reverse32(r, r); } @@ -833,7 +840,7 @@ void monero_multm_8(unsigned char *r, unsigned char *a) { void monero_reduce(unsigned char *r, unsigned char *a) { unsigned char ra[32]; monero_reverse32(ra, a); - cx_math_modm(ra, 32, (unsigned char *)C_ED25519_ORDER, 32); + cx_math_modm_no_throw(ra, 32, (unsigned char *)C_ED25519_ORDER, 32); monero_reverse32(r, ra); } @@ -843,7 +850,7 @@ void monero_reduce(unsigned char *r, unsigned char *a) { void monero_rng_mod_order(unsigned char *r) { unsigned char rnd[32 + 8]; cx_rng(rnd, 32 + 8); - cx_math_modm(rnd, 32 + 8, (unsigned char *)C_ED25519_ORDER, 32); + cx_math_modm_no_throw(rnd, 32 + 8, (unsigned char *)C_ED25519_ORDER, 32); monero_reverse32(r, rnd + 8); } diff --git a/src/monero_init.c b/src/monero_init.c index 215f9b4..1f657c5 100644 --- a/src/monero_init.c +++ b/src/monero_init.c @@ -53,7 +53,8 @@ void monero_init() { G_monero_vstate.protocol_barrier = PROTOCOL_UNLOCKED; // load key - monero_init_private_key(); + if (!monero_init_private_key()) { + } // ux conf monero_init_ux(); // Let's go! @@ -72,9 +73,9 @@ void monero_wipe_private_key() { G_monero_vstate.key_set = 0; } -void monero_init_private_key() { +int monero_init_private_key(void) { unsigned int path[5]; - unsigned char seed[32]; + unsigned char seed[64]; unsigned char chain[32]; // generate account keys @@ -86,7 +87,9 @@ void monero_init_private_key() { path[2] = 0x80000000 | N_monero_pstate->account_id; path[3] = 0x00000000; path[4] = 0x00000000; - os_perso_derive_node_bip32(CX_CURVE_SECP256K1, path, 5, seed, chain); + if (os_derive_bip32_no_throw(CX_CURVE_SECP256K1, path, 5, seed, chain)) { + return -1; + } switch (N_monero_pstate->key_mode) { case KEY_MODE_SEED: @@ -104,15 +107,16 @@ void monero_init_private_key() { default: THROW(SW_SECURITY_LOAD_KEY); - return; + return 1; } monero_ecmul_G(G_monero_vstate.A, G_monero_vstate.a); monero_ecmul_G(G_monero_vstate.B, G_monero_vstate.b); // generate key protection - monero_aes_derive(&G_monero_vstate.spk, chain, G_monero_vstate.a, G_monero_vstate.b); + int err = monero_aes_derive(&G_monero_vstate.spk, chain, G_monero_vstate.a, G_monero_vstate.b); G_monero_vstate.key_set = 1; + return err; } /* ----------------------------------------------------------------------- */ diff --git a/src/monero_io.c b/src/monero_io.c index 0f350bb..ce0d324 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -117,7 +117,7 @@ void monero_io_insert_hmac_for(unsigned char* buffer, int len, int type) { monero_io_insert(hmac, 32); } -void monero_io_insert_encrypt(unsigned char* buffer, int len, int type) { +void monero_io_insert_encrypt(unsigned char* buffer, size_t len, int type) { // for now, only 32bytes block are allowed if (len != 32) { THROW(SW_WRONG_DATA); @@ -126,14 +126,16 @@ void monero_io_insert_encrypt(unsigned char* buffer, int len, int type) { monero_io_hole(len); #if defined(IODUMMYCRYPT) - for (int i = 0; i < len; i++) { + for (unsigned int i = 0; i < len; i++) { G_monero_vstate.io_buffer[G_monero_vstate.io_offset + i] = buffer[i] ^ 0x55; } #elif defined(IONOCRYPT) memcpy(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, buffer, len); #else - cx_aes(&G_monero_vstate.spk, CX_ENCRYPT | CX_CHAIN_CBC | CX_LAST | CX_PAD_NONE, buffer, len, - G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len); + if (cx_aes_no_throw(&G_monero_vstate.spk, CX_ENCRYPT | CX_CHAIN_CBC | CX_LAST | CX_PAD_NONE, buffer, len, + G_monero_vstate.io_buffer + G_monero_vstate.io_offset, &len)) { + send_error_and_kill_app(SW_SECURITY_INTERNAL); + } #endif G_monero_vstate.io_offset += len; if (G_monero_vstate.tx_in_progress) { @@ -262,14 +264,14 @@ int monero_io_fetch_decrypt(unsigned char* buffer, int len, int type) { if (buffer) { #if defined(IODUMMYCRYPT) - for (int i = 0; i < len; i++) { + for (unsigned int i = 0; i < len; i++) { buffer[i] = G_monero_vstate.io_buffer[G_monero_vstate.io_offset + i] ^ 0x55; } #elif defined(IONOCRYPT) memcpy(buffer, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len); #else // IOCRYPT - cx_aes(&G_monero_vstate.spk, CX_DECRYPT | CX_CHAIN_CBC | CX_LAST | CX_PAD_NONE, - G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len, buffer, len); + error = cx_aes_no_throw(&G_monero_vstate.spk, CX_DECRYPT | CX_CHAIN_CBC | CX_LAST | CX_PAD_NONE, + G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len, buffer, &len); #endif } G_monero_vstate.io_offset += len; diff --git a/src/monero_key.c b/src/monero_key.c index a24df6f..9def47e 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -325,7 +325,7 @@ int monero_apdu_get_key() { // get info case 3: { unsigned int path[5]; - unsigned char seed[32]; + unsigned char seed[64]; // m/44'/128'/0'/0/0 path[0] = 0x8000002C; @@ -334,7 +334,9 @@ int monero_apdu_get_key() { path[3] = 0x00000000; path[4] = 0x00000000; - os_perso_derive_node_bip32(CX_CURVE_SECP256K1, path, 5, seed, G_monero_vstate.a); + if (os_derive_bip32_no_throw(CX_CURVE_SECP256K1, path, 5, seed, G_monero_vstate.a)) { + return SW_WRONG_DATA; + } monero_io_insert(seed, 32); monero_io_insert(G_monero_vstate.b, 32); diff --git a/src/monero_main.c b/src/monero_main.c index 8d4bc94..a011379 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -133,7 +133,8 @@ unsigned char io_event(unsigned char channel __attribute__((unused))) { if (s_before != s_after) { if (s_after == PIN_VERIFIED) { - monero_init_private_key(); + if (!monero_init_private_key()) { + } } else { ; // do nothing, allowing TX parsing in lock mode // monero_wipe_private_key(); diff --git a/src/monero_mlsag.c b/src/monero_mlsag.c index 7c255d5..f5a0850 100644 --- a/src/monero_mlsag.c +++ b/src/monero_mlsag.c @@ -78,7 +78,10 @@ int monero_apdu_mlsag_hash() { unsigned char msg[32]; unsigned char c[32]; if (G_monero_vstate.io_p2 == 1) { - monero_keccak_init_H(); + if (monero_keccak_init_H()) + { + return SW_WRONG_DATA; + } memcpy(msg, G_monero_vstate.mlsagH, 32); } else { monero_io_fetch(msg, 32); From 6fd509207cfb17234cf7b3e3e6809cf7788f5dac Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 19 Oct 2023 09:59:44 +0200 Subject: [PATCH 096/142] use standard Makefile and standard files --- Makefile | 180 +++++++++----------------------------- src/monero_main.c | 106 ++-------------------- src/monero_ram.c | 6 +- src/monero_ux_stax_menu.c | 3 - 4 files changed, 53 insertions(+), 242 deletions(-) diff --git a/Makefile b/Makefile index f2add04..7cd1383 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ #******************************************************************************* -# Ledger Nano S -# (c) 2016-2019 Ledger -# +# Ledger App Monero +# (c) 2023 Ledger SAS. +# # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -15,188 +15,92 @@ # limitations under the License. #******************************************************************************* -TARGET_NAME := TARGET_NANOX - --include Makefile.env ifeq ($(BOLOS_SDK),) $(error Environment variable BOLOS_SDK is not set) endif include $(BOLOS_SDK)/Makefile.defines -#Monero /44'/128' -APP_LOAD_PARAMS= --path "2147483692/2147483776" --curve secp256k1 $(COMMON_LOAD_PARAMS) --appFlags 0x240 +######################################## +# Mandatory configuration # +######################################## +# Application name APPNAME = "Monero" -ifeq ($(TARGET_NAME),TARGET_NANOS) -ICONNAME = images/icon_monero.gif -else ifeq ($(TARGET_NAME),TARGET_STAX) -ICONNAME = images/icon_monero_stax.gif -else -ICONNAME = images/icon_monero_nanox.gif -endif +# Application version +APPVERSION_M = 1 +APPVERSION_N = 8 +APPVERSION_P = 2 +APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" -#DEFINES += MONERO_ALPHA -#DEFINES += MONERO_BETA +SPECVERSION = "1.0" -APPVERSION_M=1 -APPVERSION_N=8 -APPVERSION_P=2 +# Application source files +APP_SOURCE_PATH += src -APPVERSION=$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P) -SPECVERSION="1.0" +# Application icons following guidelines: +# https://developers.ledger.com/docs/embedded-app/design-requirements/#device-icon +ICON_NANOS = icons/app_monero_16px.gif +ICON_NANOX = icons/app_monero_14px.gif +ICON_NANOSP = icons/app_monero_14px.gif +ICON_STAX = icons/app_monero_32px.gif + +# Application allowed derivation curves. +CURVE_APP_LOAD_PARAMS = secp256k1 + +# Application allowed derivation paths. +PATH_APP_LOAD_PARAMS = "44'/128'" + +VARIANT_PARAM = COIN +VARIANT_VALUES = monero + +ENABLE_BLUETOOTH = 1 +ENABLE_NBGL_QRCODE = 1 DEFINES += $(MONERO_CONFIG) DEFINES += MONERO_VERSION_MAJOR=$(APPVERSION_M) MONERO_VERSION_MINOR=$(APPVERSION_N) MONERO_VERSION_MICRO=$(APPVERSION_P) DEFINES += MONERO_VERSION=$(APPVERSION) DEFINES += MONERO_NAME=$(APPNAME) + DEFINES += SPEC_VERSION=$(SPECVERSION) +# Enable StageNet by default +#DEFINES += MONERO_ALPHA // This will also disable mainnet +#DEFINES += MONERO_BETA + + ifeq ($(TARGET_NAME),TARGET_NANOS) DEFINES += UI_NANO_S else ifeq ($(TARGET_NAME),TARGET_STAX) DEFINES += UI_STAX -DEFINES += NBGL_QRCODE -SDK_SOURCE_PATH += qrcode else DEFINES += UI_NANO_X -TARGET_UI := FLOW endif #DEFINES += IOCRYPT -################ -# Default rule # -################ - -all: default - ############ # Platform # ############ -ifneq ($(NO_CONSENT),) -DEFINES += NO_CONSENT -endif - -DEFINES += OS_IO_SEPROXYHAL -DEFINES += HAVE_SPRINTF -DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=4 IO_HID_EP_LENGTH=64 HAVE_USB_APDU DEFINES += CUSTOM_IO_APDU_BUFFER_SIZE=\(255+5+64\) DEFINES += HAVE_LEGACY_PID -DEFINES += USB_SEGMENT_SIZE=64 DEFINES += U2F_PROXY_MAGIC=\"MOON\" DEFINES += HAVE_IO_U2F HAVE_U2F -DEFINES += UNUSED\(x\)=\(void\)x -DEFINES += APPVERSION=\"$(APPVERSION)\" - -ifeq ($(TARGET_NAME),$(filter $(TARGET_NAME),TARGET_NANOX TARGET_STAX)) -DEFINES += HAVE_BLE BLE_COMMAND_TIMEOUT_MS=2000 -DEFINES += HAVE_BLE_APDU # basic ledger apdu transport over BLE -endif - -ifeq ($(TARGET_NAME),TARGET_NANOS) -DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=128 -DEFINES += HAVE_BAGL -else -DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300 -ifneq ($(TARGET_NAME),TARGET_STAX) -DEFINES += HAVE_BAGL BAGL_WIDTH=128 BAGL_HEIGHT=64 -DEFINES += HAVE_GLO096 -DEFINES += HAVE_BAGL_ELLIPSIS # long label truncation feature -DEFINES += HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX -DEFINES += HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX -DEFINES += HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX -endif -endif - -ifeq ($(TARGET_UI),FLOW) -DEFINES += HAVE_UX_FLOW -endif - # Enabling debug PRINTF -DEBUG = 0 +#DEBUG = 0 ifneq ($(DEBUG),0) - - ifeq ($(TARGET_NAME),TARGET_NANOS) - DEFINES += HAVE_PRINTF PRINTF=screen_printf - else - DEFINES += HAVE_PRINTF PRINTF=mcu_usb_printf - endif - DEFINES += PLINE="PRINTF(\"FILE:%s..LINE:%d\n\",__FILE__,__LINE__)" # Debug options DEFINES += DEBUG_HWDEVICE DEFINES += BYPASS_COMMITMENT_FOR_TESTS DEFINES += IODUMMYCRYPT # or IONOCRYPT # Stagenet network by default DEFINES += MONERO_BETA -else - - DEFINES += PRINTF\(...\)= - DEFINES += PLINE\(...\)= - -endif - - -############## -# Compiler # -############## -ifneq ($(BOLOS_ENV),) -$(info BOLOS_ENV=$(BOLOS_ENV)) -CLANGPATH := $(BOLOS_ENV)/clang-arm-fropi/bin/ -GCCPATH := $(BOLOS_ENV)/gcc-arm-none-eabi-5_3-2016q1/bin/ -else -$(info BOLOS_ENV is not set: falling back to CLANGPATH and GCCPATH) -endif -ifeq ($(CLANGPATH),) -$(info CLANGPATH is not set: clang will be used from PATH) -endif -ifeq ($(GCCPATH),) -$(info GCCPATH is not set: arm-none-eabi-* will be used from PATH) endif -CC := $(CLANGPATH)clang -#CFLAGS += -O0 -gdwarf-2 -gstrict-dwarf -CFLAGS += -O3 -Os -#CFLAGS += -fno-jump-tables -fno-lookup-tables -fsave-optimization-record -#$(info $(CFLAGS)) - -AS := $(GCCPATH)arm-none-eabi-gcc - -LD := $(GCCPATH)arm-none-eabi-gcc - -#LDFLAGS += -O0 -gdwarf-2 -gstrict-dwarf -LDFLAGS += -O3 -Os -LDLIBS += -lm -lgcc -lc - -# import rules to compile glyphs(/pone) -include $(BOLOS_SDK)/Makefile.glyphs ### variables processed by the common makefile.rules of the SDK to grab source files and include dirs -APP_SOURCE_PATH += src -SDK_SOURCE_PATH += lib_stusb lib_stusb_impl lib_u2f - -ifeq ($(TARGET_UI),FLOW) -SDK_SOURCE_PATH += lib_ux -endif - -ifeq ($(TARGET_NAME),$(filter $(TARGET_NAME),TARGET_NANOX TARGET_STAX)) -SDK_SOURCE_PATH += lib_blewbxx lib_blewbxx_impl -endif - -load: all - python -m ledgerblue.loadApp $(APP_LOAD_PARAMS) - -delete: - python -m ledgerblue.deleteApp $(COMMON_DELETE_PARAMS) - -# import generic rules from the user and SDK --include Makefile.rules -include $(BOLOS_SDK)/Makefile.rules - -#add dependency on custom makefile filename -dep/%.d: %.c Makefile +SDK_SOURCE_PATH += lib_u2f -listvariants: - @echo VARIANTS COIN monero +include $(BOLOS_SDK)/Makefile.standard_app diff --git a/src/monero_main.c b/src/monero_main.c index a011379..c80966c 100644 --- a/src/monero_main.c +++ b/src/monero_main.c @@ -35,11 +35,18 @@ /* ----------------------------------------------------------------------- */ /* --- Application Entry --- */ /* ----------------------------------------------------------------------- */ +extern uint8_t G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; -void monero_main(void) { +void app_main(void) { unsigned int io_flags, cont; io_flags = 0; cont = 1; + + monero_init(); + + // set up initial screen + ui_init(); + while (cont) { volatile unsigned short sw = 0; BEGIN_TRY { @@ -145,101 +152,4 @@ unsigned char io_event(unsigned char channel __attribute__((unused))) { return 1; } -unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) { - switch (channel & ~(IO_FLAGS)) { - case CHANNEL_KEYBOARD: - break; - - // multiplexed io exchange over a SPI channel and TLV encapsulated protocol - case CHANNEL_SPI: - if (tx_len) { - io_seproxyhal_spi_send(G_io_apdu_buffer, tx_len); - - if (channel & IO_RESET_AFTER_REPLIED) { - reset(); - } - return 0; // nothing received from the master so far (it's a tx - // transaction) - } else { - return io_seproxyhal_spi_recv(G_io_apdu_buffer, sizeof(G_io_apdu_buffer), 0); - } - - default: - THROW(INVALID_PARAMETER); - return 0; - } - return 0; -} - -void app_exit(void) { - BEGIN_TRY_L(exit) { - TRY_L(exit) { - os_sched_exit(-1); - } - FINALLY_L(exit) { - } - } - END_TRY_L(exit); -} - -/* -------------------------------------------------------------- */ - -__attribute__((section(".boot"))) int main(void) { - // exit critical section - __asm volatile("cpsie i"); - unsigned int cont = 1; - - // ensure exception will work as planned - os_boot(); - while (cont) { - // Initialize the UX system - UX_INIT(); - - BEGIN_TRY { - TRY { - // start communication with MCU - io_seproxyhal_init(); - - USB_power(0); - USB_power(1); - -#ifdef HAVE_USB_CLASS_CCID - io_usb_ccid_set_card_inserted(1); -#endif - -#ifdef HAVE_BLE - G_io_app.plane_mode = os_setting_get(OS_SETTING_PLANEMODE, NULL, 0); - BLE_power(0, NULL); - BLE_power(1, NULL); -#endif // HAVE_BLE - - monero_init(); - - // set up initial screen - ui_init(); - - // start the application - // the first exchange will: - // - display the initial screen - // - send the ATR - // - receive the first command - monero_main(); - } - CATCH(EXCEPTION_IO_RESET) { - // reset IO and UX - CLOSE_TRY; - ; - } - CATCH_OTHER(e) { - cont = 0; - CLOSE_TRY; - } - FINALLY { - } - } - END_TRY; - } - app_exit(); -} - #endif diff --git a/src/monero_ram.c b/src/monero_ram.c index 7f7fd49..553cf7a 100644 --- a/src/monero_ram.c +++ b/src/monero_ram.c @@ -24,14 +24,14 @@ #include "os_io_seproxyhal.h" -unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; +extern unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; #ifdef HAVE_UX_FLOW /* --- "NANO-X" and "NANO-S flow" config --- */ #include "ux.h" -ux_state_t G_ux; -bolos_ux_params_t G_ux_params; +extern ux_state_t G_ux; +extern bolos_ux_params_t G_ux_params; #else /* --- "NANO-S legacy" config --- */ diff --git a/src/monero_ux_stax_menu.c b/src/monero_ux_stax_menu.c index 98d3f7a..283f6dc 100644 --- a/src/monero_ux_stax_menu.c +++ b/src/monero_ux_stax_menu.c @@ -49,9 +49,6 @@ typedef struct { static TransactionContext_t transactionContext; -ux_state_t G_ux; -bolos_ux_params_t G_ux_params; - enum { ACCOUNT_TOKEN = FIRST_USER_TOKEN, NETWORK_TOKEN, From 86d528f2f37216214f89ba4e692fcebd48d6b5bf Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 19 Oct 2023 10:48:55 +0200 Subject: [PATCH 097/142] monero_io: use dedicated function for offset increase --- src/monero_api.h | 1 + src/monero_io.c | 5 +++++ src/monero_key.c | 8 ++++---- src/monero_prehash.c | 4 ++-- src/monero_proof.c | 10 +++++----- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/monero_api.h b/src/monero_api.h index eb636f8..fd969cf 100644 --- a/src/monero_api.h +++ b/src/monero_api.h @@ -371,6 +371,7 @@ int monero_io_fetch_t(unsigned int *T); int monero_io_fetch_l(unsigned int *L); int monero_io_fetch_tl(unsigned int *T, unsigned int *L); int monero_io_fetch_nv(unsigned char *buffer, int len); +void monero_io_skip(int len); int monero_io_fetch(unsigned char *buffer, int len); int monero_io_fetch_decrypt(unsigned char *buffer, size_t len, int type); int monero_io_fetch_decrypt_key(unsigned char *buffer, size_t len); diff --git a/src/monero_io.c b/src/monero_io.c index ce0d324..abd43c4 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -211,6 +211,11 @@ void monero_io_assert_available(int sz) { } } +void monero_io_skip(int len) { + monero_io_assert_available(len); + G_monero_vstate.io_offset += len; +} + int monero_io_fetch(unsigned char* buffer, int len) { monero_io_assert_available(len); if (buffer) { diff --git a/src/monero_key.c b/src/monero_key.c index 9def47e..5abed1e 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -742,11 +742,11 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se monero_io_fetch_u32(); // skip tx_version monero_io_fetch_decrypt_key(tx_key); txkey_pub = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; - monero_io_fetch(NULL, 32); + monero_io_skip(32); Aout = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; - monero_io_fetch(NULL, 32); + monero_io_skip(32); Bout = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; - monero_io_fetch(NULL, 32); + monero_io_skip(32); output_index = monero_io_fetch_u32(); is_change = monero_io_fetch_u8(); is_subaddress = monero_io_fetch_u8(); @@ -754,7 +754,7 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se if (need_additional_txkeys) { monero_io_fetch_decrypt_key(additional_txkey_sec); } else { - monero_io_fetch(NULL, 32); + monero_io_skip(32); } use_view_tags = monero_io_fetch_u8(); diff --git a/src/monero_prehash.c b/src/monero_prehash.c index 5735926..0d6e0e4 100644 --- a/src/monero_prehash.c +++ b/src/monero_prehash.c @@ -80,9 +80,9 @@ int monero_apdu_mlsag_prehash_update() { is_change = 0; } Aout = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; - monero_io_fetch(NULL, 32); + monero_io_skip(32); Bout = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; - monero_io_fetch(NULL, 32); + monero_io_skip(32); monero_io_fetch_decrypt(AKout, 32, TYPE_AMOUNT_KEY); monero_io_fetch(C, 32); monero_io_fetch(k, 32); diff --git a/src/monero_proof.c b/src/monero_proof.c index ca4b265..f4941fc 100644 --- a/src/monero_proof.c +++ b/src/monero_proof.c @@ -39,15 +39,15 @@ int monero_apdu_get_tx_proof() { #define k (G_monero_vstate.tmp + 256) msg = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; - monero_io_fetch(NULL, 32); + monero_io_skip(32); R = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; - monero_io_fetch(NULL, 32); + monero_io_skip(32); A = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; - monero_io_fetch(NULL, 32); + monero_io_skip(32); B = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; - monero_io_fetch(NULL, 32); + monero_io_skip(32); D = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; - monero_io_fetch(NULL, 32); + monero_io_skip(32); monero_io_fetch_decrypt_key(r); monero_io_discard(0); From 2ea70ca414216694bf88fa80e2193234478c183d Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 19 Oct 2023 14:25:47 +0200 Subject: [PATCH 098/142] monero_crypto: sanitize input --- src/monero_crypto.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/monero_io.c | 21 +++++++++++++++++++-- 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/src/monero_crypto.c b/src/monero_crypto.c index 9dbddde..8709c86 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -86,6 +86,9 @@ void monero_aes_generate(cx_aes_key_t *sk) { unsigned int monero_encode_varint(unsigned char *varint, unsigned int max_len, uint64_t value) { unsigned int len; len = 0; + if (!varint) { + return 0; + } while (value >= 0x80) { if (len == (max_len - 1)) { THROW(SW_WRONG_DATA_RANGE); @@ -106,6 +109,9 @@ unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, u size_t len; v = 0; len = 0; + if (!varint) { + return 0; + } while ((varint[len]) & 0x80) { if (len == (max_len - 1)) { THROW(SW_WRONG_DATA_RANGE); @@ -125,6 +131,9 @@ unsigned int monero_decode_varint(const unsigned char *varint, size_t max_len, u void monero_reverse32(unsigned char *rscal, unsigned char *scal) { unsigned char x; unsigned int i; + if (!rscal || !scal) { + return; + } for (i = 0; i < 16; i++) { x = scal[i]; rscal[i] = scal[31 - i]; @@ -627,6 +636,9 @@ void monero_check_scalar_not_null(unsigned char *s) { void monero_ecmul_G(unsigned char *W, unsigned char *scalar32) { unsigned char Pxy[65]; unsigned char s[32]; + if (!W) { + return; + } monero_reverse32(s, scalar32); memcpy(Pxy, C_ED25519_G, 65); cx_ecfp_scalar_mult_no_throw(CX_CURVE_Ed25519, Pxy, s, 32); @@ -641,6 +653,9 @@ void monero_ecmul_H(unsigned char *W, unsigned char *scalar32) { unsigned char Pxy[65]; unsigned char s[32]; + if (!W) { + return; + } monero_reverse32(s, scalar32); Pxy[0] = 0x02; @@ -660,6 +675,9 @@ void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32) unsigned char Pxy[65]; unsigned char s[32]; + if (!W || !P) { + return; + } monero_reverse32(s, scalar32); Pxy[0] = 0x02; @@ -687,6 +705,9 @@ void monero_ecmul_8k(unsigned char *W, unsigned char *P, unsigned char *scalar32 void monero_ecmul_8(unsigned char *W, unsigned char *P) { unsigned char Pxy[65]; + if (!W || !P) { + return; + } Pxy[0] = 0x02; memcpy(&Pxy[1], P, 32); cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); @@ -704,6 +725,10 @@ void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q) { unsigned char Pxy[65]; unsigned char Qxy[65]; + if (!W || !P || !Q) { + return; + } + Pxy[0] = 0x02; memcpy(&Pxy[1], P, 32); cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); @@ -725,6 +750,10 @@ void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q) { unsigned char Pxy[65]; unsigned char Qxy[65]; + if (!W || !P || !Q) { + return; + } + Pxy[0] = 0x02; memcpy(&Pxy[1], P, 32); cx_edwards_decompress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); @@ -756,6 +785,9 @@ void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q) { */ void monero_ecdhHash(unsigned char *x, unsigned char *k) { unsigned char data[38]; + if (!k) { + return; + } memcpy(data, "amount", 6); memcpy(data + 6, k, 32); monero_keccak_F(data, 38, x); @@ -777,6 +809,9 @@ void monero_ecdhHash(unsigned char *x, unsigned char *k) { */ void monero_genCommitmentMask(unsigned char *c, unsigned char *sk) { unsigned char data[15 + 32]; + if (!sk) { + return; + } memcpy(data, "commitment_mask", 15); memcpy(data + 15, sk, 32); monero_hash_to_scalar(c, data, 15 + 32); @@ -862,6 +897,9 @@ void monero_uint642str(uint64_t val, char *str, unsigned int str_len) { char stramount[22]; unsigned int offset, len; + if (!str) { + return; + } memset(str, 0, str_len); offset = 22; @@ -886,6 +924,9 @@ int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { char stramount[22]; unsigned int offset, len, ov; + if (!str) { + return -1; + } memset(str, 0, str_len); memset(stramount, '0', sizeof(stramount)); @@ -939,6 +980,9 @@ int monero_amount2str(uint64_t xmr, char *str, unsigned int str_len) { uint64_t monero_bamount2uint64(unsigned char *binary) { uint64_t xmr; int i; + if (!binary) { + return 0; + } xmr = 0; for (i = 7; i >= 0; i--) { xmr = xmr * 256 + binary[i]; diff --git a/src/monero_io.c b/src/monero_io.c index abd43c4..7e27faa 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -87,12 +87,18 @@ void monero_io_hole(unsigned int sz) { } void monero_io_insert(unsigned char const* buff, unsigned int len) { + if (!buff) { + return; + } monero_io_hole(len); memcpy(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, buff, len); G_monero_vstate.io_offset += len; } void monero_io_insert_hmac_for(unsigned char* buffer, int len, int type) { + if (!buffer) { + return; + } // for now, only 32bytes block are allowed if (len != 32) { THROW(SW_WRONG_DATA); @@ -118,6 +124,10 @@ void monero_io_insert_hmac_for(unsigned char* buffer, int len, int type) { } void monero_io_insert_encrypt(unsigned char* buffer, size_t len, int type) { + if (!buffer) { + return; + } + // for now, only 32bytes block are allowed if (len != 32) { THROW(SW_WRONG_DATA); @@ -218,15 +228,19 @@ void monero_io_skip(int len) { int monero_io_fetch(unsigned char* buffer, int len) { monero_io_assert_available(len); - if (buffer) { - memcpy(buffer, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len); + if (!buffer) { + return 0; } + memcpy(buffer, G_monero_vstate.io_buffer + G_monero_vstate.io_offset, len); G_monero_vstate.io_offset += len; return len; } static void monero_io_verify_hmac_for(const unsigned char* buffer, int len, unsigned char* expected_hmac, int type) { + if (!buffer || !expected_hmac) { + return; + } // for now, only 32bytes block allowed if (len != 32) { THROW(SW_WRONG_DATA); @@ -302,6 +316,9 @@ int monero_io_fetch_decrypt(unsigned char* buffer, int len, int type) { int monero_io_fetch_decrypt_key(unsigned char* buffer) { unsigned char* k; + if (!buffer) { + return -1; + } monero_io_assert_available(32); k = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; From 883e7f6be06fdaf73cbc404f9c0a1f1414a06212 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 19 Oct 2023 14:33:21 +0200 Subject: [PATCH 099/142] monero_io: remove dead code --- src/monero_io.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/monero_io.c b/src/monero_io.c index 7e27faa..9b3d23f 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -480,7 +480,6 @@ int monero_io_do(unsigned int io_flags) { G_monero_vstate.io_ins = G_io_apdu_buffer[1]; G_monero_vstate.io_p1 = G_io_apdu_buffer[2]; G_monero_vstate.io_p2 = G_io_apdu_buffer[3]; - G_monero_vstate.io_lc = 0; G_monero_vstate.io_le = 0; G_monero_vstate.io_lc = G_io_apdu_buffer[4]; memcpy(G_monero_vstate.io_buffer, G_io_apdu_buffer + 5, G_monero_vstate.io_lc); From 5305c0ded5a85797bc5f64f5547af3e0d5666e73 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 19 Oct 2023 14:59:24 +0200 Subject: [PATCH 100/142] monero_crypto: use define for PXY_SIZE value --- src/monero_crypto.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/monero_crypto.c b/src/monero_crypto.c index 8709c86..6caf675 100644 --- a/src/monero_crypto.c +++ b/src/monero_crypto.c @@ -22,6 +22,8 @@ #include "monero_api.h" #include "monero_vars.h" +#define PXY_SIZE 65 + /* ----------------------------------------------------------------------- */ /* --- --- */ /* ----------------------------------------------------------------------- */ @@ -323,7 +325,7 @@ void monero_ge_fromfe_frombytes(unsigned char *ge, unsigned char *bytes) { #define rZ (G_monero_vstate.io_buffer + 8 * 32) union { - unsigned char _Pxy[65]; + unsigned char _Pxy[PXY_SIZE]; struct { unsigned char _uv7[32]; unsigned char _v3[32]; @@ -634,13 +636,13 @@ void monero_check_scalar_not_null(unsigned char *s) { /* --- --- */ /* ----------------------------------------------------------------------- */ void monero_ecmul_G(unsigned char *W, unsigned char *scalar32) { - unsigned char Pxy[65]; + unsigned char Pxy[PXY_SIZE]; unsigned char s[32]; if (!W) { return; } monero_reverse32(s, scalar32); - memcpy(Pxy, C_ED25519_G, 65); + memcpy(Pxy, C_ED25519_G, PXY_SIZE); cx_ecfp_scalar_mult_no_throw(CX_CURVE_Ed25519, Pxy, s, 32); cx_edwards_compress_point_no_throw(CX_CURVE_Ed25519, Pxy, sizeof(Pxy)); memcpy(W, &Pxy[1], 32); @@ -650,7 +652,7 @@ void monero_ecmul_G(unsigned char *W, unsigned char *scalar32) { /* --- --- */ /* ----------------------------------------------------------------------- */ void monero_ecmul_H(unsigned char *W, unsigned char *scalar32) { - unsigned char Pxy[65]; + unsigned char Pxy[PXY_SIZE]; unsigned char s[32]; if (!W) { @@ -672,7 +674,7 @@ void monero_ecmul_H(unsigned char *W, unsigned char *scalar32) { /* --- --- */ /* ----------------------------------------------------------------------- */ void monero_ecmul_k(unsigned char *W, unsigned char *P, unsigned char *scalar32) { - unsigned char Pxy[65]; + unsigned char Pxy[PXY_SIZE]; unsigned char s[32]; if (!W || !P) { @@ -703,7 +705,7 @@ void monero_ecmul_8k(unsigned char *W, unsigned char *P, unsigned char *scalar32 /* --- --- */ /* ----------------------------------------------------------------------- */ void monero_ecmul_8(unsigned char *W, unsigned char *P) { - unsigned char Pxy[65]; + unsigned char Pxy[PXY_SIZE]; if (!W || !P) { return; @@ -722,8 +724,8 @@ void monero_ecmul_8(unsigned char *W, unsigned char *P) { /* --- --- */ /* ----------------------------------------------------------------------- */ void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q) { - unsigned char Pxy[65]; - unsigned char Qxy[65]; + unsigned char Pxy[PXY_SIZE]; + unsigned char Qxy[PXY_SIZE]; if (!W || !P || !Q) { return; @@ -747,8 +749,8 @@ void monero_ecadd(unsigned char *W, unsigned char *P, unsigned char *Q) { /* --- --- */ /* ----------------------------------------------------------------------- */ void monero_ecsub(unsigned char *W, unsigned char *P, unsigned char *Q) { - unsigned char Pxy[65]; - unsigned char Qxy[65]; + unsigned char Pxy[PXY_SIZE]; + unsigned char Qxy[PXY_SIZE]; if (!W || !P || !Q) { return; From 23d2b6881d5bf88903becb0812e5fe2232b72b88 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 19 Oct 2023 15:00:19 +0200 Subject: [PATCH 101/142] monero_io_fetch_decrypt_key: add buffer size as parameter --- src/monero_io.c | 5 ++++- src/monero_key.c | 14 +++++++------- src/monero_proof.c | 2 +- src/monero_stealth.c | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/monero_io.c b/src/monero_io.c index 9b3d23f..ca17b36 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -314,11 +314,14 @@ int monero_io_fetch_decrypt(unsigned char* buffer, int len, int type) { return len; } -int monero_io_fetch_decrypt_key(unsigned char* buffer) { +int monero_io_fetch_decrypt_key(unsigned char* buffer, size_t buffer_size) { unsigned char* k; if (!buffer) { return -1; } + if (buffer_size > 32) { + return -1; + } monero_io_assert_available(32); k = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; diff --git a/src/monero_key.c b/src/monero_key.c index 5abed1e..28cca7a 100644 --- a/src/monero_key.c +++ b/src/monero_key.c @@ -367,7 +367,7 @@ int monero_apdu_verify_key() { unsigned char computed_pub[32]; unsigned int verified = 0; - monero_io_fetch_decrypt_key(priv); + monero_io_fetch_decrypt_key(priv, sizeof(priv)); monero_io_fetch(pub, 32); switch (G_monero_vstate.io_p1) { case 0: @@ -445,7 +445,7 @@ int monero_apdu_scal_mul_key(/*const rct::key &pub, const rct::key &sec, rct::ke unsigned char r[32]; // fetch monero_io_fetch(pub, 32); - monero_io_fetch_decrypt_key(sec); + monero_io_fetch_decrypt_key(sec, sizeof(sec)); monero_io_discard(0); monero_ecmul_k(r, pub, sec); @@ -508,7 +508,7 @@ int monero_apdu_generate_key_derivation(/*const crypto::public_key &pub, const c unsigned char drv[32]; // fetch monero_io_fetch(pub, 32); - monero_io_fetch_decrypt_key(sec); + monero_io_fetch_decrypt_key(sec, sizeof(sec)); monero_io_discard(0); @@ -576,7 +576,7 @@ int monero_apdu_derive_secret_key(/*const crypto::key_derivation &derivation, co // fetch monero_io_fetch_decrypt(derivation, 32, TYPE_DERIVATION); output_index = monero_io_fetch_u32(); - monero_io_fetch_decrypt_key(sec); + monero_io_fetch_decrypt_key(sec, sizeof(sec)); monero_io_discard(0); // pub @@ -704,7 +704,7 @@ int monero_apdu_get_subaddress_secret_key(/*const crypto::secret_key& sec, const unsigned char index[8]; unsigned char sub_sec[32]; - monero_io_fetch_decrypt_key(sec); + monero_io_fetch_decrypt_key(sec, sizeof(sec)); monero_io_fetch(index, 8); monero_io_discard(0); @@ -740,7 +740,7 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se unsigned char derivation[32]; monero_io_fetch_u32(); // skip tx_version - monero_io_fetch_decrypt_key(tx_key); + monero_io_fetch_decrypt_key(tx_key, sizeof(tx_key)); txkey_pub = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; monero_io_skip(32); Aout = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; @@ -752,7 +752,7 @@ int monero_apu_generate_txout_keys(/*size_t tx_version, crypto::secret_key tx_se is_subaddress = monero_io_fetch_u8(); need_additional_txkeys = monero_io_fetch_u8(); if (need_additional_txkeys) { - monero_io_fetch_decrypt_key(additional_txkey_sec); + monero_io_fetch_decrypt_key(additional_txkey_sec, sizeof(additional_txkey_sec)); } else { monero_io_skip(32); } diff --git a/src/monero_proof.c b/src/monero_proof.c index f4941fc..b6c82de 100644 --- a/src/monero_proof.c +++ b/src/monero_proof.c @@ -48,7 +48,7 @@ int monero_apdu_get_tx_proof() { monero_io_skip(32); D = G_monero_vstate.io_buffer + G_monero_vstate.io_offset; monero_io_skip(32); - monero_io_fetch_decrypt_key(r); + monero_io_fetch_decrypt_key(r, sizeof(r)); monero_io_discard(0); diff --git a/src/monero_stealth.c b/src/monero_stealth.c index 7d82e2a..a53d7ff 100644 --- a/src/monero_stealth.c +++ b/src/monero_stealth.c @@ -35,7 +35,7 @@ int monero_apdu_stealth() { // fetch pub monero_io_fetch(pub, 32); // fetch sec - monero_io_fetch_decrypt_key(sec); + monero_io_fetch_decrypt_key(sec, sizeof(sec)); // fetch paymentID monero_io_fetch(payID, 8); From 7dd7d59c28b5e62ec7c229ba80752693a63517d2 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 19 Oct 2023 15:00:43 +0200 Subject: [PATCH 102/142] monero_types: change MONERO_APDU_LENGTH --- src/monero_types.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/monero_types.h b/src/monero_types.h index d83c4d5..183e216 100644 --- a/src/monero_types.h +++ b/src/monero_types.h @@ -30,9 +30,9 @@ #endif /* cannot send more that F0 bytes in CCID, why? do not know for now - * So set up length to F0 minus 2 bytes for SW + * So set up length to F0 */ -#define MONERO_APDU_LENGTH 0xFE +#define MONERO_APDU_LENGTH 0xF0 /* big private DO */ #define MONERO_EXT_PRIVATE_DO_LENGTH 512 From 0d68462c29c293f10ce08f8ff7ff1c72be604d87 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 19 Oct 2023 15:06:43 +0200 Subject: [PATCH 103/142] monero_io: explicit cast --- src/monero_io.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/monero_io.c b/src/monero_io.c index ca17b36..30a2529 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -156,25 +156,25 @@ void monero_io_insert_encrypt(unsigned char* buffer, size_t len, int type) { void monero_io_insert_u32(unsigned int v32) { monero_io_hole(4); - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] = v32 >> 24; - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 1] = v32 >> 16; - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 2] = v32 >> 8; - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 3] = v32 >> 0; + G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] = (unsigned char)(v32 >> 24) & 0xFF; + G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 1] = (unsigned char)(v32 >> 16) & 0xFF; + G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 2] = (unsigned char)(v32 >> 8) & 0xFF; + G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 3] = (unsigned char)(v32 >> 0) & 0xFF; G_monero_vstate.io_offset += 4; } void monero_io_insert_u24(unsigned int v24) { monero_io_hole(3); - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] = v24 >> 16; - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 1] = v24 >> 8; - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 2] = v24 >> 0; + G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] = (unsigned char)(v24 >> 16) & 0xFF; + G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 1] = (unsigned char)(v24 >> 8) & 0xFF; + G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 2] = (unsigned char)(v24 >> 0) & 0xFF; G_monero_vstate.io_offset += 3; } void monero_io_insert_u16(unsigned int v16) { monero_io_hole(2); - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] = v16 >> 8; - G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 1] = v16 >> 0; + G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] = (unsigned char)(v16 >> 8) & 0xFF; + G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 1] = (unsigned char)(v16 >> 0) & 0xFF; G_monero_vstate.io_offset += 2; } From 3017fbb44ddd56a973e95f96ec2c3de6a14bf398 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Thu, 19 Oct 2023 15:14:56 +0200 Subject: [PATCH 104/142] monero_io: explicit void parameter --- src/monero_io.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/monero_io.c b/src/monero_io.c index 30a2529..30a5b13 100644 --- a/src/monero_io.c +++ b/src/monero_io.c @@ -50,7 +50,7 @@ void monero_io_set_offset(unsigned int offset) { } } -void monero_io_mark() { +void monero_io_mark(void) { G_monero_vstate.io_mark = G_monero_vstate.io_offset; } @@ -68,7 +68,7 @@ void monero_io_discard(int clear) { } } -void monero_io_clear() { +void monero_io_clear(void) { memset(G_monero_vstate.io_buffer, 0, MONERO_IO_BUFFER_LENGTH); } @@ -364,7 +364,7 @@ int monero_io_fetch_decrypt_key(unsigned char* buffer, size_t buffer_size) { } } -uint64_t monero_io_fetch_varint() { +uint64_t monero_io_fetch_varint(void) { uint64_t v64; G_monero_vstate.io_offset += monero_decode_varint(G_monero_vstate.io_buffer + G_monero_vstate.io_offset, @@ -372,7 +372,7 @@ uint64_t monero_io_fetch_varint() { return v64; } -unsigned int monero_io_fetch_u32() { +unsigned int monero_io_fetch_u32(void) { unsigned int v32; monero_io_assert_available(4); v32 = ((G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] << 24) | @@ -383,7 +383,7 @@ unsigned int monero_io_fetch_u32() { return v32; } -unsigned int monero_io_fetch_u24() { +unsigned int monero_io_fetch_u24(void) { unsigned int v24; monero_io_assert_available(3); v24 = ((G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] << 16) | @@ -393,7 +393,7 @@ unsigned int monero_io_fetch_u24() { return v24; } -unsigned int monero_io_fetch_u16() { +unsigned int monero_io_fetch_u16(void) { unsigned int v16; monero_io_assert_available(2); v16 = ((G_monero_vstate.io_buffer[G_monero_vstate.io_offset + 0] << 8) | @@ -402,7 +402,7 @@ unsigned int monero_io_fetch_u16() { return v16; } -unsigned int monero_io_fetch_u8() { +unsigned int monero_io_fetch_u8(void) { unsigned int v8; monero_io_assert_available(1); v8 = G_monero_vstate.io_buffer[G_monero_vstate.io_offset]; From 5447842bf27e7ee34baf68a2a163cb6c8d89c7d8 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Tue, 24 Oct 2023 16:51:51 +0200 Subject: [PATCH 105/142] nanos: use same ui as other nanos --- Makefile | 8 +- src/monero_ux_nanos.c | 819 ----------------------- tests/monero_client/monero_cmd.py | 4 +- tests/monero_client/monero_crypto_cmd.py | 2 +- 4 files changed, 7 insertions(+), 826 deletions(-) delete mode 100644 src/monero_ux_nanos.c diff --git a/Makefile b/Makefile index 7cd1383..007dd6c 100644 --- a/Makefile +++ b/Makefile @@ -68,12 +68,12 @@ DEFINES += SPEC_VERSION=$(SPECVERSION) #DEFINES += MONERO_BETA -ifeq ($(TARGET_NAME),TARGET_NANOS) -DEFINES += UI_NANO_S +ifeq ($(TARGET_NAME),$(filter $(TARGET_NAME),TARGET_NANOS TARGET_NANOS2)) +DEFINES += UI_NANO_SX +else ifeq ($(TARGET_NAME),TARGET_NANOX) +DEFINES += UI_NANO_X else ifeq ($(TARGET_NAME),TARGET_STAX) DEFINES += UI_STAX -else -DEFINES += UI_NANO_X endif #DEFINES += IOCRYPT diff --git a/src/monero_ux_nanos.c b/src/monero_ux_nanos.c deleted file mode 100644 index c4519e0..0000000 --- a/src/monero_ux_nanos.c +++ /dev/null @@ -1,819 +0,0 @@ -/***************************************************************************** - * Ledger Monero App. - * (c) 2017-2020 Cedric Mesnil , Ledger SAS. - * (c) 2020 Ledger SAS. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - *****************************************************************************/ - -#ifdef UI_NANO_S - -#include "os.h" -#include "cx.h" -#include "monero_types.h" -#include "monero_api.h" -#include "monero_vars.h" - -#include "monero_ux_msg.h" -#include "os_io_seproxyhal.h" -#include "string.h" -#include "glyphs.h" - -/* ----------------------------------------------------------------------- */ -/* --- NanoS UI layout --- */ -/* ----------------------------------------------------------------------- */ - -const ux_menu_entry_t ui_menu_reset[]; -void ui_menu_reset_action(unsigned int value); - -const ux_menu_entry_t ui_menu_settings[]; - -const ux_menu_entry_t ui_menu_main[]; -void ui_menu_main_display_value(unsigned int value); -const bagl_element_t* ui_menu_main_preprocessor(const ux_menu_entry_t* entry, - bagl_element_t* element); - -void ui_menu_settings_display(unsigned int value); - -/* -------------------------------------- LOCK--------------------------------------- */ - -void ui_menu_pinlock_display() { - struct { - bolos_ux_t ux_id; - // length of parameters in the u union to be copied during the syscall - unsigned int len; - union { - struct { - unsigned int cancellable; - } validate_pin; - } u; - } ux_params; - - os_global_pin_invalidate(); - G_monero_vstate.protocol_barrier = PROTOCOL_LOCKED_UNLOCKABLE; - ux_params.ux_id = BOLOS_UX_VALIDATE_PIN; - ux_params.len = sizeof(ux_params.u.validate_pin); - ux_params.u.validate_pin.cancellable = 0; - os_ux((bolos_ux_params_t*)&ux_params); - ui_menu_main_display_value(0); -} - -/* -------------------------------------- 25 WORDS --------------------------------------- */ -void ui_menu_words_clear(unsigned int value); -void ui_menu_words_back(unsigned int value); -#define WORDS N_monero_pstate->words -const ux_menu_entry_t ui_menu_words[] = { - {NULL, ui_menu_words_back, 0, NULL, "", "", 0, 0}, - {NULL, ui_menu_words_back, 2, NULL, "", "", 0, 0}, - {NULL, ui_menu_words_back, 4, NULL, "", "", 0, 0}, - {NULL, ui_menu_words_back, 6, NULL, "", "", 0, 0}, - {NULL, ui_menu_words_back, 8, NULL, "", "", 0, 0}, - {NULL, ui_menu_words_back, 10, NULL, "", "", 0, 0}, - {NULL, ui_menu_words_back, 12, NULL, "", "", 0, 0}, - {NULL, ui_menu_words_back, 14, NULL, "", "", 0, 0}, - {NULL, ui_menu_words_back, 16, NULL, "", "", 0, 0}, - {NULL, ui_menu_words_back, 18, NULL, "", "", 0, 0}, - {NULL, ui_menu_words_back, 20, NULL, "", "", 0, 0}, - {NULL, ui_menu_words_back, 22, NULL, "", "", 0, 0}, - {NULL, ui_menu_words_back, 24, NULL, "", "", 0, 0}, - {NULL, ui_menu_words_clear, -1, NULL, "CLEAR WORDS", "(NO WIPE)", 0, 0}, - UX_MENU_END}; - -const bagl_element_t* ui_menu_words_preprocessor(const ux_menu_entry_t* entry, - bagl_element_t* element) { - if (entry->userid < 25) { - if (element->component.userid == 0x21) { - element->text = N_monero_pstate->words[entry->userid]; - } - - if ((element->component.userid == 0x22) && (entry->userid < 24)) { - element->text = N_monero_pstate->words[entry->userid + 1]; - } - } - - return element; -} - -void ui_menu_words_display(unsigned int value __attribute__((unused))) { - UX_MENU_DISPLAY(0, ui_menu_words, ui_menu_words_preprocessor); -} - -void ui_menu_words_clear(unsigned int value __attribute__((unused))) { - monero_clear_words(); - ui_menu_main_display_value(0); -} - -void ui_menu_words_back(unsigned int value __attribute__((unused))) { - ui_menu_settings_display(1); -} - -/* -------------------------------- INFO UX --------------------------------- */ -unsigned int ui_menu_info_button(unsigned int button_mask, unsigned int button_mask_counter); - -const bagl_element_t ui_menu_info[] = { - // type userid x y w h str rad fill fg bg - // font_id icon_id - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, 0, 0}, NULL}, - - {{BAGL_LABELINE, 0x01, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - G_monero_vstate.ux_info1}, - - {{BAGL_LABELINE, 0x02, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - G_monero_vstate.ux_info2}, -}; - -unsigned int ui_menu_info_button(unsigned int button_mask, - unsigned int button_mask_counter __attribute__((unused))) { - switch (button_mask) { - case BUTTON_EVT_RELEASED | BUTTON_RIGHT: - case BUTTON_EVT_RELEASED | BUTTON_LEFT: - if (G_monero_vstate.protocol_barrier == PROTOCOL_LOCKED) { - ui_menu_pinlock_display(); - } else { - ui_menu_main_display_value(0); - } - break; - - default: - return 0; - } - return 0; -} - -static void ui_menu_info_display2(unsigned int value __attribute__((unused)), const char* line1, - const char* line2) { - snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "%s", line1); - snprintf(G_monero_vstate.ux_info2, sizeof(G_monero_vstate.ux_info2), "%s", line2); - UX_DISPLAY(ui_menu_info, NULL); -} - -static void ui_menu_info_display(unsigned int value __attribute__((unused))) { - UX_DISPLAY(ui_menu_info, NULL); -} - -void ui_menu_show_tx_aborted(void) { - ui_menu_info_display2(0, "TX", "Aborted"); -} - -void ui_menu_show_security_error(void) { - ui_menu_info_display(0); -} - -/* -------------------------------- OPEN TX UX --------------------------------- */ - -unsigned int ui_menu_transaction_signed(void) { - return SW_OK; -} - -unsigned int ui_menu_transaction_start(void) { - return SW_OK; -} - -unsigned int ui_menu_opentx_button(unsigned int button_mask, unsigned int button_mask_counter); - -const bagl_element_t ui_menu_opentx[] = { - // type userid x y w h str rad fill fg bg - // font_id icon_id - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, 0, 0}, NULL}, - - {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CROSS}, NULL}, - - {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CHECK}, NULL}, - - {{BAGL_LABELINE, 0x01, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "Process"}, - - {{BAGL_LABELINE, 0x02, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - "new TX ?"}, - -}; - -unsigned int ui_menu_opentx_button(unsigned int button_mask, - unsigned int button_mask_counter __attribute__((unused))) { - unsigned int sw = SW_OK; - unsigned char x[32]; - - monero_io_discard(0); - memset(x, 0, 32); - - switch (button_mask) { - case BUTTON_EVT_RELEASED | BUTTON_LEFT: // CANCEL - monero_abort_tx(); - sw = SW_DENY; - break; - - case BUTTON_EVT_RELEASED | BUTTON_RIGHT: // OK - sw = monero_apdu_open_tx_cont(); - break; - - default: - return 0; - } - monero_io_insert_u16(sw); - monero_io_do(IO_RETURN_AFTER_TX); - if (sw == SW_OK) { - ui_menu_info_display2(0, "Processing TX", "..."); - } else { - ui_menu_info_display2(0, "Transaction", "aborted"); - } - return 0; -} -#if 0 -void ui_menu_opentx_display(unsigned int value) { - if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { - UX_DISPLAY(ui_menu_opentx, (void*)NULL); - } else { - snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "Prepare new"); - snprintf(G_monero_vstate.ux_info2, sizeof(G_monero_vstate.ux_info2), "TX / %d", G_monero_vstate.tx_cnt); - ui_menu_info_display(0); - } -} -#else -void ui_menu_opentx_display(unsigned int value __attribute__((unused))) { - uint32_t i; - if (G_monero_vstate.tx_sig_mode == TRANSACTION_CREATE_REAL) { - snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "Processing TX"); - } else { - snprintf(G_monero_vstate.ux_info1, sizeof(G_monero_vstate.ux_info1), "Preparing TX"); - } - for (i = 0; (i < G_monero_vstate.tx_cnt) && (i < 12); i++) { - G_monero_vstate.ux_info2[i] = '.'; - } - G_monero_vstate.ux_info2[i] = 0; - ui_menu_info_display(0); -} -#endif - -/* ----------------- FEE/CHANGE/TIMELOCK VALIDATION ----------------- */ - -#define ACCEPT 0xACCE -#define REJECT ~ACCEPT - -void ui_menu_amount_validation_action(unsigned int value); - -const ux_menu_entry_t ui_menu_fee_validation[] = { - {NULL, NULL, 1, NULL, " Fee", "?xmr?", 0, 0}, - {NULL, ui_menu_amount_validation_action, REJECT, NULL, "Reject", "Fee", 0, 0}, - {NULL, ui_menu_amount_validation_action, ACCEPT, NULL, "Accept", "Fee", 0, 0}, - UX_MENU_END}; -const ux_menu_entry_t ui_menu_change_validation[] = { - {NULL, NULL, 1, NULL, " Change", "?xmr?", 0, 0}, - {NULL, ui_menu_amount_validation_action, REJECT, NULL, "Reject", "Change", 0, 0}, - {NULL, ui_menu_amount_validation_action, ACCEPT, NULL, "Accept", "Change", 0, 0}, - UX_MENU_END}; -const ux_menu_entry_t ui_menu_timelock_validation[] = { - {NULL, NULL, 1, NULL, " Timelock", "?...?", 0, 0}, - {NULL, ui_menu_amount_validation_action, REJECT, NULL, "Reject", "Timelock", 0, 0}, - {NULL, ui_menu_amount_validation_action, ACCEPT, NULL, "Accept", "Timelock", 0, 0}, - UX_MENU_END}; -const bagl_element_t* ui_menu_amount_validation_preprocessor(const ux_menu_entry_t* entry, - bagl_element_t* element) { - /* --- Amount --- */ - if ((entry == &ui_menu_fee_validation[0]) || (entry == &ui_menu_change_validation[0]) || - (entry == &ui_menu_timelock_validation[0])) { - if (element->component.userid == 0x22) { - element->text = G_monero_vstate.ux_amount; - } - } - return element; -} - -void ui_menu_amount_validation_action(unsigned int value) { - unsigned short sw; - if (value == ACCEPT) { - sw = SW_OK; - } else { - sw = SW_DENY; - monero_abort_tx(); - } - monero_io_insert_u16(sw); - monero_io_do(IO_RETURN_AFTER_TX); - ui_menu_info_display2(0, "Processing TX", "..."); -} - -void ui_menu_fee_validation_display(unsigned int value __attribute__((unused))) { - UX_MENU_DISPLAY(0, ui_menu_fee_validation, ui_menu_amount_validation_preprocessor); -} -void ui_menu_change_validation_display(unsigned int value __attribute__((unused))) { - UX_MENU_DISPLAY(0, ui_menu_change_validation, ui_menu_amount_validation_preprocessor); -} -void ui_menu_change_validation_display_last(unsigned int value __attribute__((unused))) { - UX_MENU_DISPLAY(0, ui_menu_change_validation, ui_menu_amount_validation_preprocessor); -} -void ui_menu_timelock_validation_display(unsigned int value __attribute__((unused))) { - UX_MENU_DISPLAY(0, ui_menu_timelock_validation, ui_menu_amount_validation_preprocessor); -} - -/* ----------------------------- USER DEST/AMOUNT VALIDATION ----------------------------- */ -void ui_menu_validation_action(unsigned int value); - -const ux_menu_entry_t ui_menu_validation[] = { - {NULL, NULL, 1, NULL, " Amount", "?xmr?", 0, 0}, - {NULL, NULL, 3, NULL, "Destination", "?dest.1?", 0, 0}, - {NULL, NULL, 4, NULL, "?dest.2?", "?dest.2?", 0, 0}, - {NULL, NULL, 5, NULL, "?dest.3?", "?dest.3?", 0, 0}, - {NULL, NULL, 6, NULL, "?dest.4?", "?dest.4?", 0, 0}, - {NULL, NULL, 7, NULL, "?dest.5?", "?dest.5?", 0, 0}, - {NULL, ui_menu_validation_action, REJECT, NULL, "Reject", "TX", 0, 0}, - {NULL, ui_menu_validation_action, ACCEPT, NULL, "Accept", "TX", 0, 0}, - UX_MENU_END}; - -const bagl_element_t* ui_menu_validation_preprocessor(const ux_menu_entry_t* entry, - bagl_element_t* element) { - /* --- Amount --- */ - if (entry == &ui_menu_validation[0]) { - if (element->component.userid == 0x22) { - element->text = G_monero_vstate.ux_amount; - } - } - - /* --- Destination --- */ - if (entry == &ui_menu_validation[1]) { - if (element->component.userid == 0x22) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 0, 11); - element->text = G_monero_vstate.ux_menu; - } - } - if (entry == &ui_menu_validation[2]) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - if (element->component.userid == 0x21) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 1, 11); - } - if (element->component.userid == 0x22) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 2, 11); - } - element->text = G_monero_vstate.ux_menu; - } - if (entry == &ui_menu_validation[3]) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - if (element->component.userid == 0x21) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 3, 11); - } - if (element->component.userid == 0x22) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 4, 11); - } - element->text = G_monero_vstate.ux_menu; - } - if (entry == &ui_menu_validation[4]) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - if (element->component.userid == 0x21) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 5, 11); - } - if (element->component.userid == 0x22) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 6, 11); - } - element->text = G_monero_vstate.ux_menu; - } - if (entry == &ui_menu_validation[5]) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - if (element->component.userid == 0x21) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 7, 11); - } - if (element->component.userid == 0x22) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 8, 7); - } - element->text = G_monero_vstate.ux_menu; - } - - return element; -} - -void ui_menu_validation_display(unsigned int value __attribute__((unused))) { - UX_MENU_DISPLAY(0, ui_menu_validation, ui_menu_validation_preprocessor); -} - -void ui_menu_validation_display_last(unsigned int value __attribute__((unused))) { - UX_MENU_DISPLAY(0, ui_menu_validation, ui_menu_validation_preprocessor); -} - -void ui_menu_validation_action(unsigned int value) { - unsigned short sw; - if (value == ACCEPT) { - sw = SW_OK; - } else { - sw = SW_DENY; - monero_abort_tx(); - } - monero_io_insert_u16(sw); - monero_io_do(IO_RETURN_AFTER_TX); - ui_menu_info_display2(0, "Processing TX", "..."); -} - -/* -------------------------------- EXPORT VIEW KEY UX --------------------------------- */ -unsigned int ui_export_viewkey_prepro(const bagl_element_t* element); -unsigned int ui_export_viewkey_button(unsigned int button_mask, unsigned int button_mask_counter); - -const bagl_element_t ui_export_viewkey[] = { - // type userid x y w h str rad fill fg bg - // font_id icon_id - {{BAGL_RECTANGLE, 0x00, 0, 0, 128, 32, 0, 0, BAGL_FILL, 0x000000, 0xFFFFFF, 0, 0}, NULL}, - - {{BAGL_ICON, 0x00, 3, 12, 7, 7, 0, 0, 0, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CROSS}, NULL}, - - {{BAGL_ICON, 0x00, 117, 13, 8, 6, 0, 0, 0, 0xFFFFFF, 0x000000, 0, BAGL_GLYPH_ICON_CHECK}, NULL}, - - {{BAGL_LABELINE, 0x01, 0, 12, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - G_monero_vstate.ux_menu}, - - {{BAGL_LABELINE, 0x02, 0, 26, 128, 32, 0, 0, 0, 0xFFFFFF, 0x000000, - BAGL_FONT_OPEN_SANS_EXTRABOLD_11px | BAGL_FONT_ALIGNMENT_CENTER, 0}, - G_monero_vstate.ux_menu}, -}; - -void ui_export_viewkey_display(unsigned int value __attribute__((unused))) { - UX_DISPLAY(ui_export_viewkey, (void*)ui_export_viewkey_prepro); -} - -unsigned int ui_export_viewkey_prepro(const bagl_element_t* element) { - if (element->component.userid == 1) { - snprintf(G_monero_vstate.ux_menu, sizeof(G_monero_vstate.ux_menu), "Export"); - return 1; - } - if (element->component.userid == 2) { - snprintf(G_monero_vstate.ux_menu, sizeof(G_monero_vstate.ux_menu), "View Key"); - return 1; - } - snprintf(G_monero_vstate.ux_menu, sizeof(G_monero_vstate.ux_menu), "Please Cancel"); - return 1; -} - -unsigned int ui_export_viewkey_button(unsigned int button_mask, - unsigned int button_mask_counter __attribute__((unused))) { - unsigned int sw; - unsigned char x[32]; - - monero_io_discard(0); - memset(x, 0, 32); - sw = SW_OK; - - switch (button_mask) { - case BUTTON_EVT_RELEASED | BUTTON_LEFT: // CANCEL - monero_io_insert(x, 32); - G_monero_vstate.export_view_key = 0; - break; - - case BUTTON_EVT_RELEASED | BUTTON_RIGHT: // OK - monero_io_insert(G_monero_vstate.a, 32); - G_monero_vstate.export_view_key = EXPORT_VIEW_KEY; - break; - - default: - return 0; - } - monero_io_insert_u16(sw); - monero_io_do(IO_RETURN_AFTER_TX); - ui_menu_main_display_value(0); - return 0; -} - -/* -------------------------------- ACCOUNT UX --------------------------------- */ - -void ui_menu_account_action(unsigned int value); -const ux_menu_entry_t ui_menu_account[] = { - {NULL, NULL, 0, NULL, "It will reset", "the application!", 0, 0}, - {NULL, ui_menu_main_display_value, 0, &C_badge_back, "Abort", NULL, 61, 40}, - {NULL, ui_menu_account_action, 0, NULL, "0", NULL, 0, 0}, - {NULL, ui_menu_account_action, 1, NULL, "1", NULL, 0, 0}, - {NULL, ui_menu_account_action, 2, NULL, "2", NULL, 0, 0}, - {NULL, ui_menu_account_action, 3, NULL, "3", NULL, 0, 0}, - {NULL, ui_menu_account_action, 4, NULL, "4", NULL, 0, 0}, - {NULL, ui_menu_account_action, 5, NULL, "5", NULL, 0, 0}, - {NULL, ui_menu_account_action, 6, NULL, "6", NULL, 0, 0}, - {NULL, ui_menu_account_action, 7, NULL, "7", NULL, 0, 0}, - {NULL, ui_menu_account_action, 8, NULL, "8", NULL, 0, 0}, - {NULL, ui_menu_account_action, 9, NULL, "9", NULL, 0, 0}, - UX_MENU_END}; - -const bagl_element_t* ui_menu_account_preprocessor(const ux_menu_entry_t* entry, - bagl_element_t* element) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - for (unsigned int i = 2; i < 12; i++) { - if ((entry == &ui_menu_account[i]) && (element->component.userid == 0x20) && - (N_monero_pstate->account_id == (i - 2))) { - G_monero_vstate.ux_menu[0] = '0' + (i - 2); - G_monero_vstate.ux_menu[1] = ' '; - G_monero_vstate.ux_menu[2] = '+'; - element->text = G_monero_vstate.ux_menu; - } - } - return element; -} - -void ui_menu_account_action(unsigned int value) { - monero_nvm_write((void*)&N_monero_pstate->account_id, &value, sizeof(unsigned int)); - monero_init(); - ui_menu_main_display_value(0); -} - -void ui_menu_account_display(unsigned int value) { - UX_MENU_DISPLAY(value, ui_menu_account, ui_menu_account_preprocessor); -} - -/* -------------------------------- NETWORK UX --------------------------------- */ -void ui_menu_network_action(unsigned int value); -const ux_menu_entry_t ui_menu_network[] = { - {NULL, NULL, 0, NULL, "It will reset", "the application!", 0, 0}, - {NULL, ui_menu_main_display_value, 0, &C_badge_back, "Abort", NULL, 61, 40}, - {NULL, ui_menu_network_action, TESTNET, NULL, "Test Network ", NULL, 0, 0}, - {NULL, ui_menu_network_action, STAGENET, NULL, "Stage Network", NULL, 0, 0}, -#ifndef MONERO_ALPHA - {NULL, ui_menu_network_action, MAINNET, NULL, "Main Network", NULL, 0, 0}, -#endif - UX_MENU_END}; - -const bagl_element_t* ui_menu_network_preprocessor(const ux_menu_entry_t* entry, - bagl_element_t* element) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - if ((entry == &ui_menu_network[2]) && (element->component.userid == 0x20) && - (N_monero_pstate->network_id == TESTNET)) { - memcpy(G_monero_vstate.ux_menu, "Test Network ", 14); - G_monero_vstate.ux_menu[13] = '+'; - element->text = G_monero_vstate.ux_menu; - } - if ((entry == &ui_menu_network[3]) && (element->component.userid == 0x20) && - (N_monero_pstate->network_id == STAGENET)) { - memcpy(G_monero_vstate.ux_menu, "Stage Network ", 14); - G_monero_vstate.ux_menu[13] = '+'; - element->text = G_monero_vstate.ux_menu; - } -#ifndef MONERO_ALPHA - if ((entry == &ui_menu_network[4]) && (element->component.userid == 0x20) && - (N_monero_pstate->network_id == MAINNET)) { - memcpy(G_monero_vstate.ux_menu, "Main Network ", 14); - G_monero_vstate.ux_menu[13] = '+'; - element->text = G_monero_vstate.ux_menu; - } -#endif - return element; -} - -void ui_menu_network_action(unsigned int value) { - monero_install(value); - monero_init(); - ui_menu_main_display_value(0); -} - -void ui_menu_network_display(unsigned int value) { - UX_MENU_DISPLAY(value, ui_menu_network, ui_menu_network_preprocessor); -} - -/* -------------------------------- RESET UX --------------------------------- */ - -const ux_menu_entry_t ui_menu_reset[] = { - {NULL, NULL, 0, NULL, "Really Reset ?", NULL, 0, 0}, - {NULL, ui_menu_main_display_value, 0, &C_badge_back, "No", NULL, 61, 40}, - {NULL, ui_menu_reset_action, 0, NULL, "Yes", NULL, 0, 0}, - UX_MENU_END}; - -void ui_menu_reset_action(unsigned int value __attribute__((unused))) { - unsigned char magic[4]; - magic[0] = 0; - magic[1] = 0; - magic[2] = 0; - magic[3] = 0; - monero_nvm_write(N_monero_pstate->magic, magic, 4); - monero_init(); - ui_menu_main_display_value(0); -} -/* ------------------------------- SETTINGS UX ------------------------------- */ - -const ux_menu_entry_t ui_menu_settings[] = { - {NULL, ui_menu_account_display, 0, NULL, "Select Wallet", NULL, 0, 0}, - {NULL, ui_menu_network_display, 0, NULL, "Select Network", NULL, 0, 0}, - {NULL, ui_menu_words_display, 0, NULL, "Show 25 words", NULL, 0, 0}, - {ui_menu_reset, NULL, 0, NULL, "Reset", NULL, 0, 0}, - {NULL, ui_menu_main_display_value, 2, &C_badge_back, "Back", NULL, 61, 40}, - UX_MENU_END}; - -void ui_menu_settings_display(unsigned int value) { - UX_MENU_DISPLAY(value, ui_menu_settings, NULL); -} - -/* --------------------------------- INFO UX --------------------------------- */ - -#define STR(x) #x -#define XSTR(x) STR(x) - -const ux_menu_entry_t ui_menu_about[] = { - {NULL, NULL, -1, NULL, "Monero", NULL, 0, 0}, - {NULL, NULL, -1, NULL, "(c) Ledger SAS", NULL, 0, 0}, - {NULL, NULL, -1, NULL, "Spec " XSTR(SPEC_VERSION), NULL, 0, 0}, - {NULL, NULL, -1, NULL, "App " XSTR(MONERO_VERSION), NULL, 0, 0}, - {NULL, ui_menu_main_display_value, 3, &C_badge_back, "Back", NULL, 61, 40}, - UX_MENU_END}; - -#undef STR -#undef XSTR - -/* ---------------------------- PUBLIC ADDRESS UX ---------------------------- */ - -void ui_menu_pubaddr_action(unsigned int value); - -const ux_menu_entry_t ui_menu_pubaddr[] = { - {NULL, NULL, 3, NULL, "t1.1", "t1.2", 0, 0}, - - {NULL, NULL, 3, NULL, "i1.1", "i1.2", 0, 0}, - - {NULL, NULL, 5, NULL, "l1.1", "l1.2", 0, 0}, - {NULL, NULL, 6, NULL, "l2.1", "l2.2", 0, 0}, - {NULL, NULL, 7, NULL, "l3.1", "l3.2", 0, 0}, - {NULL, NULL, 6, NULL, "l4.1", "l4.2", 0, 0}, - {NULL, NULL, 7, NULL, "l5.1", "l5.2", 0, 0}, - //{NULL, ui_menu_main_display_value, 0, &C_badge_back, "Back", NULL, 61, - // 40}, - {NULL, ui_menu_pubaddr_action, 0, &C_badge_back, "Ok", NULL, 61, 40}, - UX_MENU_END}; - -const bagl_element_t* ui_menu_pubaddr_preprocessor(const ux_menu_entry_t* entry, - bagl_element_t* element) { - /* --- address --- */ - if (entry == &ui_menu_pubaddr[0]) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - if (element->component.userid == 0x21) { - switch (G_monero_vstate.disp_addr_mode) { - case 0: - case DISP_MAIN: - memcpy(G_monero_vstate.ux_menu, "Main", 4); - break; - case DISP_SUB: - memcpy(G_monero_vstate.ux_menu, "Sub", 3); - break; - case DISP_INTEGRATED: - memcpy(G_monero_vstate.ux_menu, "Integrated", 10); - break; - } - element->text = G_monero_vstate.ux_menu; - } - if (element->component.userid == 0x22) { - memcpy(G_monero_vstate.ux_menu, "Address", 7); - element->text = G_monero_vstate.ux_menu; - } - } - - if (entry == &ui_menu_pubaddr[1]) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - if (element->component.userid == 0x21) { - switch (G_monero_vstate.disp_addr_mode) { - case 0: - case DISP_MAIN: - case DISP_SUB: - snprintf(G_monero_vstate.ux_menu, sizeof(G_monero_vstate.ux_menu), "Major: %d", - G_monero_vstate.disp_addr_M); - break; - case DISP_INTEGRATED: - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.payment_id, 8); - break; - } - element->text = G_monero_vstate.ux_menu; - } - if (element->component.userid == 0x22) { - switch (G_monero_vstate.disp_addr_mode) { - case 0: - case DISP_MAIN: - case DISP_SUB: - snprintf(G_monero_vstate.ux_menu, sizeof(G_monero_vstate.ux_menu), "minor: %d", - G_monero_vstate.disp_addr_m); - break; - case DISP_INTEGRATED: - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.payment_id + 8, 8); - break; - } - element->text = G_monero_vstate.ux_menu; - } - element->text = G_monero_vstate.ux_menu; - } - - if (entry == &ui_menu_pubaddr[2]) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - if (element->component.userid == 0x21) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 0, 11); - } - if (element->component.userid == 0x22) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 1, 11); - } - element->text = G_monero_vstate.ux_menu; - } - if (entry == &ui_menu_pubaddr[3]) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - if (element->component.userid == 0x21) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 2, 11); - } - if (element->component.userid == 0x22) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 3, 11); - } - element->text = G_monero_vstate.ux_menu; - } - if (entry == &ui_menu_pubaddr[4]) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - if (element->component.userid == 0x21) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 4, 11); - } - if (element->component.userid == 0x22) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 5, 11); - } - element->text = G_monero_vstate.ux_menu; - } - if (entry == &ui_menu_pubaddr[5]) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - if (element->component.userid == 0x21) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 6, 11); - } - if (element->component.userid == 0x22) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 7, 11); - } - element->text = G_monero_vstate.ux_menu; - } - - if (entry == &ui_menu_pubaddr[6]) { - memset(G_monero_vstate.ux_menu, 0, sizeof(G_monero_vstate.ux_menu)); - if (element->component.userid == 0x21) { - if (G_monero_vstate.disp_addr_mode == DISP_INTEGRATED) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 8, 11); - } else { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 8, 7); - } - } - if (element->component.userid == 0x22) { - if (G_monero_vstate.disp_addr_mode == DISP_INTEGRATED) { - memcpy(G_monero_vstate.ux_menu, G_monero_vstate.ux_address + 11 * 9, 7); - } - } - element->text = G_monero_vstate.ux_menu; - } - - return element; -} - -void ui_menu_pubaddr_action(unsigned int value __attribute__((unused))) { - if (G_monero_vstate.disp_addr_mode) { - monero_io_insert_u16(SW_OK); - monero_io_do(IO_RETURN_AFTER_TX); - } - G_monero_vstate.disp_addr_mode = 0; - G_monero_vstate.disp_addr_M = 0; - G_monero_vstate.disp_addr_m = 0; - ui_menu_main_display_value(0); -} - -void ui_menu_any_pubaddr_display(unsigned int value, unsigned char* pub_view, - unsigned char* pub_spend, unsigned char is_subbadress, - unsigned char* paymanetID) { - monero_base58_public_key(G_monero_vstate.ux_address, pub_view, pub_spend, is_subbadress, - paymanetID); - UX_MENU_DISPLAY(value, ui_menu_pubaddr, ui_menu_pubaddr_preprocessor); -} - -void ui_menu_pubaddr_display(unsigned int value) { - monero_base58_public_key(G_monero_vstate.ux_address, G_monero_vstate.A, G_monero_vstate.B, 0, - NULL); - G_monero_vstate.disp_addr_mode = 0; - G_monero_vstate.disp_addr_M = 0; - G_monero_vstate.disp_addr_m = 0; - UX_MENU_DISPLAY(value, ui_menu_pubaddr, ui_menu_pubaddr_preprocessor); -} - -/* --------------------------------- MAIN UX --------------------------------- */ - -const ux_menu_entry_t ui_menu_main[] = { - {NULL, ui_menu_pubaddr_display, 0, NULL, G_monero_vstate.ux_wallet_account_name, - G_monero_vstate.ux_wallet_public_short_address, 0, 0}, - {ui_menu_settings, NULL, 0, NULL, "Settings", NULL, 0, 0}, - {ui_menu_about, NULL, 0, NULL, "About", NULL, 0, 0}, - {NULL, (void*)os_sched_exit, 0, &C_icon_dashboard, "Quit app", NULL, 50, 29}, - UX_MENU_END}; - -void ui_menu_main_display_value(unsigned int value) { - UX_MENU_DISPLAY(value, ui_menu_main, NULL); -} - -void ui_menu_main_display(void) { - ui_menu_main_display_value(0); -} - -void ui_init(void) { - ui_menu_main_display_value(0); - // setup the first screen changing - UX_CALLBACK_SET_INTERVAL(1000); -} - -void io_seproxyhal_display(const bagl_element_t* element) { - io_seproxyhal_display_default((bagl_element_t*)element); -} - -#endif diff --git a/tests/monero_client/monero_cmd.py b/tests/monero_client/monero_cmd.py index 3be68f0..f35228d 100644 --- a/tests/monero_client/monero_cmd.py +++ b/tests/monero_client/monero_cmd.py @@ -213,7 +213,7 @@ def prefix_hash_init(self, backend, test_name, firmware, navigator, version: int ]) if firmware.device == "nanos": - instructions = get_nano_review_instructions(2) + instructions = get_nano_review_instructions(1) elif firmware.device.startswith("nano"): instructions = get_nano_review_instructions(1) else: @@ -368,7 +368,7 @@ def validate_prehash_init(self, payload: bytes = struct.pack("B", txntype) + encode_varint(txnfee) if firmware.device == "nanos": - instructions = get_nano_review_instructions(2) + instructions = get_nano_review_instructions(1) elif firmware.device.startswith("nano"): instructions = get_nano_review_instructions(1) else: diff --git a/tests/monero_client/monero_crypto_cmd.py b/tests/monero_client/monero_crypto_cmd.py index 88680dd..eb12aea 100644 --- a/tests/monero_client/monero_crypto_cmd.py +++ b/tests/monero_client/monero_crypto_cmd.py @@ -115,7 +115,7 @@ def display_address(self, test_name, firmware, navigator, derivation: bytes, out ]) if firmware.device == "nanos": - instructions = get_nano_review_instructions(7) + instructions = get_nano_review_instructions(8) elif firmware.device.startswith("nano"): instructions = get_nano_review_instructions(4) else: From fc8714844714a21bfbe4808894be6caf4a929f74 Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Fri, 20 Oct 2023 13:41:54 +0200 Subject: [PATCH 106/142] tests: update snapshots --- .../nanos/test_display_address/00000.png | Bin 340 -> 299 bytes .../nanos/test_display_address/00001.png | Bin 343 -> 297 bytes .../nanos/test_display_address/00002.png | Bin 514 -> 531 bytes .../nanos/test_display_address/00003.png | Bin 485 -> 500 bytes .../nanos/test_display_address/00004.png | Bin 524 -> 506 bytes .../nanos/test_display_address/00005.png | Bin 467 -> 515 bytes .../nanos/test_display_address/00006.png | Bin 257 -> 504 bytes .../nanos/test_display_address/00007.png | Bin 271 -> 417 bytes .../nanos/test_display_address/00008.png | Bin 413 -> 242 bytes .../nanos/test_display_address/00009.png | Bin 0 -> 457 bytes .../nanos/test_display_subaddress/00000.png | Bin 329 -> 298 bytes .../nanos/test_display_subaddress/00001.png | Bin 340 -> 308 bytes .../nanos/test_display_subaddress/00002.png | Bin 499 -> 509 bytes .../nanos/test_display_subaddress/00003.png | Bin 482 -> 508 bytes .../nanos/test_display_subaddress/00004.png | Bin 496 -> 515 bytes .../nanos/test_display_subaddress/00005.png | Bin 515 -> 516 bytes .../nanos/test_display_subaddress/00006.png | Bin 279 -> 520 bytes .../nanos/test_display_subaddress/00007.png | Bin 271 -> 403 bytes .../nanos/test_display_subaddress/00008.png | Bin 413 -> 242 bytes .../nanos/test_display_subaddress/00009.png | Bin 0 -> 457 bytes .../test_prefix_hash_hash_init/00000.png | Bin 411 -> 389 bytes .../test_prefix_hash_hash_init/00001.png | Bin 367 -> 324 bytes .../test_prefix_hash_hash_init/00002.png | Bin 359 -> 340 bytes .../nanos/test_private_view_key/00000.png | Bin 409 -> 340 bytes .../nanos/test_private_view_key/00001.png | Bin 413 -> 324 bytes .../nanos/test_private_view_key/00002.png | Bin 340 -> 457 bytes .../test_validate_prehash_init/00000.png | Bin 276 -> 261 bytes .../test_validate_prehash_init/00001.png | Bin 326 -> 324 bytes .../test_validate_prehash_init/00002.png | Bin 319 -> 340 bytes .../test_validate_prehash_update/00000.png | Bin 402 -> 399 bytes .../test_validate_prehash_update/00001.png | Bin 433 -> 578 bytes .../test_validate_prehash_update/00002.png | Bin 532 -> 598 bytes .../test_validate_prehash_update/00003.png | Bin 503 -> 562 bytes .../test_validate_prehash_update/00004.png | Bin 473 -> 590 bytes .../test_validate_prehash_update/00005.png | Bin 455 -> 544 bytes .../test_validate_prehash_update/00006.png | Bin 307 -> 501 bytes .../test_validate_prehash_update/00007.png | Bin 299 -> 324 bytes .../nanosp/test_display_address/00005.png | Bin 546 -> 510 bytes .../nanosp/test_display_subaddress/00005.png | Bin 546 -> 510 bytes .../nanosp/test_private_view_key/00002.png | Bin 546 -> 510 bytes .../nanox/test_display_address/00001.png | Bin 317 -> 323 bytes .../nanox/test_display_address/00002.png | Bin 1001 -> 1005 bytes .../nanox/test_display_address/00003.png | Bin 891 -> 881 bytes .../nanox/test_display_subaddress/00001.png | Bin 329 -> 331 bytes .../nanox/test_display_subaddress/00002.png | Bin 1002 -> 1010 bytes .../nanox/test_display_subaddress/00003.png | Bin 912 -> 909 bytes .../test_validate_prehash_update/00001.png | Bin 1030 -> 1031 bytes .../test_validate_prehash_update/00002.png | Bin 947 -> 939 bytes .../stax/test_display_address/00000.png | Bin 7134 -> 7222 bytes .../stax/test_display_address/00001.png | Bin 23021 -> 23444 bytes .../stax/test_display_address/00002.png | Bin 15238 -> 15409 bytes .../stax/test_display_address/00003.png | Bin 23021 -> 23444 bytes .../stax/test_display_address/00004.png | Bin 7169 -> 7232 bytes .../stax/test_display_address/00005.png | Bin 4494 -> 4615 bytes .../stax/test_display_address/00006.png | Bin 12223 -> 12284 bytes .../stax/test_display_subaddress/00000.png | Bin 7134 -> 7222 bytes .../stax/test_display_subaddress/00001.png | Bin 22542 -> 23242 bytes .../stax/test_display_subaddress/00002.png | Bin 15226 -> 15553 bytes .../stax/test_display_subaddress/00003.png | Bin 22542 -> 23242 bytes .../stax/test_display_subaddress/00004.png | Bin 9078 -> 9104 bytes .../stax/test_display_subaddress/00005.png | Bin 4494 -> 4615 bytes .../stax/test_display_subaddress/00006.png | Bin 12223 -> 12284 bytes .../stax/test_prefix_hash_hash_init/00000.png | Bin 9669 -> 3901 bytes .../stax/test_private_view_key/00000.png | Bin 8022 -> 8075 bytes .../stax/test_private_view_key/00001.png | Bin 4832 -> 4982 bytes .../test_validate_prehash_update/00000.png | Bin 8399 -> 8444 bytes .../test_validate_prehash_update/00001.png | Bin 23767 -> 23917 bytes .../test_validate_prehash_update/00002.png | Bin 7318 -> 7514 bytes 68 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/monero_client/snapshots/nanos/test_display_address/00009.png create mode 100644 tests/monero_client/snapshots/nanos/test_display_subaddress/00009.png diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00000.png b/tests/monero_client/snapshots/nanos/test_display_address/00000.png index 4d3eebdf37c5a157bcfc7407f409e8da15dd326e..8392c0068dc86c8845ac57c4985992606a403d3d 100644 GIT binary patch delta 273 zcmV+s0q*|P0;>X$BYyz$Nkll&D&7KGq$$RfyI-IBc=*zy;g+zJ@-hUqV&U8EYJCG*wnL>n6JG zk-TLExaDC0LM*XvHbgc{O~I@H5ec#Uo_oH!DFavs!MXz?(wmIq%f-QEq-wyIFcA?E5u`6% X2#YujBVPLe015yANkvXXu0mjfZrgjM delta 314 zcmV-A0mc5S0@MPKBYy!KNklTr>4gyt*w&PnSNQAkLX{=*wR#ZJ zn@98nejqQ$CndukK|BCvgbe7>6MZP)GeF0$zAj4*c7VSH-hTjLieNVx#DJEv^v~-J zA%t9j{{}<;fmWRA#~`{>{YY@tcTSV$PZOO!0p0_Ol(T615x}(|(+@KnO3AY=%$*+z zB02*qL91-2r0F$V+B1e(C2b2w0Hq|145-998T;S;gIUpwBRT_w%Qw~1DiCpf(L?v1 zPy=+YO1HGkkTX0Jr_Mc)>rV=9%KK}A({a>;eni7>!h{e)2qE`m2d&D3_iR%kcmMzZ M07*qoM6N<$f)!SeI{*Lx diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00001.png b/tests/monero_client/snapshots/nanos/test_display_address/00001.png index 4d8b084fe4a2b07111e79c4950cf2c2926e7a8d2..beed0ae3c763b16878eeeea2428a3246ec61b701 100644 GIT binary patch delta 271 zcmV+q0r39U0;vL!BYyz!Nkl`A@1q<0gvjUPTxKxfZrFw`(QLCbehn^22tbrx)yAU*ZefS%ath$K9^cp}f zNFw}BajIjZZ)~lwOcAEPydAfH6Lr@H?F5h7v*uA%y$|FHL@! V{aSFO1^@s600>D%PDHLkV1jZ@cXDT<=*IeJd-&6+=uZ_Ey=I?kv+0nuHEl;nF-&hx!X2T1m zBt0m=R8lgi2Y6sBV9(Hcl4|GbHGWCm1cm}ioI24IP0I9qfPV*o0Dmm&+Im(kajG8x^_cPx$hqlqZK+T`ZMnRN%#H@O_fm(Oz)TrN;A1lRJ;Qq zs(q&WX!VtPMm7SsLIu4WS|@%hR3H>EHjx7mzZEL610ZaL5<&uvtH0SsyEf$ z8U=w%S|6U|08Qqq)_))vQ-}2@BYbctA`9J#ZzFHa>(sEL=9=ZnIoX9EOkmjS5|V=` z6*nwalj6uo;(w8JmK0{iI<}yUR$L<*mvFZ6w~H-)!o>i>PIC%n@aQ>f8d@ERk~Aa% zzAwNPx9*Cyml{%@u!$`>z@k=CLRX!pkvwJP#N57gu0Y3Uh+a|2*tNZqiOQxrfaY{G z+C(F1DKuM?h{}0X~IWR-1HUyHuZuL$v1{t&< zBd3%kNs{Eh^6(M!esverV>g^(5o`1rsQ?%dUR;Bm-LTQi- ze0!i^!!#Ebe7R0ZFscnF13aGe0&siNd%rsmE(6vb@>!zAUQvPtP z=2h75&`Ywt7}qaet|pT4rwmHDB!?$s>|-F<0Gz+urOnD0%-PpOL3;_0fXH(IS9jAK zgUR4nDEX0>q=fQ2Pwx6M5oQ44$j+5QEzcsi{yV%<$6=p@tGcJ^%s_F&`r5GDg$Xl& zC4_;&hM%ZhzF}?I@iCD}xP3TnmnAYS3(){(k`NqGkmjMm6U%DoVYZ)yG0MLq1U>iY eF*r$*KLaOd z22?MgauEegpG+mOv_?56!OK-T0KmST_i>VGbiG`!W1u+*@UdPPbad3XRiXjD5DQ3?i~Yx40&7{2s+*@>(w(4>?d z<>;b`c5UQntJI*LrxY%ThJZAYpc;cwxsYvc%TZ-6Rx)7tM9x~%sb%M=&8jFlnXGy{ zFolfEF`e&q!EuTaU2rrVoy_v^G8KLSSw`&XGe8Ug+f(Q|!>)N@p!BjJDsOQ#LMDUr z&9Yn3HmZd+!11mOd6n*0xTR~>(ghYFuV=q z+&au(y$wwsNuuwI>*Dd=0q>L~vr@CQ;Xs(W;Jl9DtVhsgpaSsO#L0b#W?(C~H1%9z z1^RRB{jpqOXMdd86AzQZ1m(|wZm6jnqY)NLK(Y+&KU({yP;$L%D-zR;gDZbNSc|#! zaP1wWjTDnxL$W=+d_3L(kkMo!dUj2SDcxu7o5qkB0KuXC6PJ^0kYebflg}ljM`@}z zSr4&cpHitoBT4qdSNf)r?DG=d{GTt5tN@(tWqTTXazx8euE^_!;gQW1f?yH002ovPDHLkV1f&G BV8X_QL z1mHN1<2bhLTiKMb{?6|Ec7Bu#+Nv>(;~3mwdOCm{5zKAxfVcGqEK0kFk!3CZ>YU&k zkPSfPVB#>1Q*jEy`G-^0fS0Ls0Dyfv<8fIV97Zr7`4zLQ7k^EHdhu*Wx}>0nL6lf0 zWS-z-KsKEl`x^k?u(C5sa<`gXwO%Z?;&CvBk;G(SHW^GL)cpwKO}V>rEQs~#eVKkI zb_%FIRC8-&1U}OGFp~o$nNPL;gb=27>vzU|FcQx~Be@zGm7!eOcP>XY8CgvNRnNt1 zlua8=Rf>z+WPcY!8?L`Z-MSTdeZy|S?DiC_TWb6A%c`G8` zk91~sfh_r8NH2kmR_;G`Rzv(aMY#hGp~Cj$0<5?2pOcKuI+w)CV2dQe@nWnqnZ7XU zRHJr4Hsrb4cq*IIxd)B7-*QNLz2!pG4iIjWGAKq7G+8(DCHF(cb-b^%Ye(0Hz+6;# zi>vg)peRaofDrXXTH;e-UAeu;G#yL6!_8ZZU*;74102V3{+AD9 W+G>yjv>#gl0000r{|E1|9ZVPjL{zX{#=F%bqKH;( zDM^wf$-i>=sCmDb;`3X0oK&oqkXj(NVuPrJyu$6aY}>`tM-3j((GFl&O#>RFymc`;eM7dCQp#gp#eXWe+qj?H8Sqx0mT)5)?u(jw0OOVUN92#XFD~hDCFmXn7lHGG=ZV&PV*#d?81Z zWw~UW{>&bWlz(I#X*`{>p<)~Q7olBJtkun8S~8%DNkl9xTNjgz>l(T_`)F)V^cH?p zGE1|>XG4t{#MTT|%3B#$d)n1vSTHf?0DfRm?nyuZ(gr*~Y)_wcuVqB56y-{))dOz_ zbVsVSG*_Q3euj1LUMB7&KtoK3Tz3-2gMw%JP~Bo)I%`B945j>Hz6rNGzI4crJJ4q|KJ{+Lnp2UL}LNF)-8K$P89CCGber-iko?4MtRF$BM%>;M2|hwb(GUj(f85A&wm86N-^)=^o# zqkk1t9|PjQ;OJ`GVfOh#A#$Q7sKd5({plI(jh{GbfM!O!41YT07tqB(L)%W8?KN{1 znvw&&fc%11?cpMh=HeP@DLw$TlR*<1Wq2Xsw}oqXKNy;=9$ISUEg-EGUIjCtpA3L3 zbhFd-_iYbu_GrSPBud#LSSkP#;a7TpO)#!b?@va?;7Q~v^d!zs-k55%U;dLl@93@j zXqM`-7;Qq$rhm=bOShqxo=ne0t$zego8Oe%>T6VY#84CV#2}EHw9sRLAGz@)+^QFb zlJ8)bRcHp3#v@4P<~iA9-hgO$I;GFOLV*g2^^6g0K($sanhsKOmd$dI9?by9n;a!o zJF(~_^8(ePK{;RUwii%stpyK#kQoA9Uuz;!o9MlOv|_Ny9I<(ihE)Ub2sDxNzT6!J zK$A>Z8Fq7K5@S_VVSSckzXi!!Sk6Me+myX)iCYpLLgOz}+eaWL-be(0l1z+{IRF4U fIX{s|B)%PQi3F)Pnkn<600000NkvXXu0mjfVT|R( delta 441 zcmV;q0Y?6V1k(eMB!8MoL_t(|ob8#>7J@JchOv|H|G-|657K-MN$V%V!R z4zXJ+Y;q_U;^iLURH7_H2#{&1`f6)Ak4bGMF%=H2tct@?|)zycA;Y+-+!4jyK7V;hDvn8pDpdg>p5ueSmbqu-B~X)eAUfldKf zm%oqF1f-1sr$*#xAik!qPsKtmNa*P_hjT|G|uT|@)b{$QD4VtqrQS0H({z&nk!oey6d!K zoZKnk@}R1FBO~yY-iIdzK$H1a?>`X6)#3fdL=1Wot58qQPA11t>14KdKc5%%%7LWb z__~C$!LFK>%zsLgY$!U6vIbDIEuu1@s$r@|`fZVB=|BsXMI}tvLaeSXC+$)x!X88V zW~3+G1r@sXtQ_`LPMQJsiEhRmfD3bnwOfLX5RKnaX2=#ejRqsV+485+PBZn2agrBG zg`nCbYG=2QYzdm$S+T&t?ndU2*aBe5CN|l7RV9@~Zdg;QGY`CWHT2H#>Q=r6sfl`i z4@g~L*?2+N5?Pt{k6fSzqjdRZj}=7{Ix|96Vw5BAZJKQ3yMBjp#Vcn z(Cnw?D}YUEAp4qSH>Ubh{Zdc?^y$z~J0;C!XwS~sF!Vw^0$j2V}i{r!kCm8KuQ|20;H7@3jxW+xi1V8vPzy!nFJG z4h#ywGXH#(CLnJl`fJP_P0ZKa^{H8^1u5$dQ~r8yUUsH8;(r3x#hkZR+P=j{PMGp| zq>ovzJuVf{aVHh?J&iFjpI#gL3ZQRV**PVvtuCeJMX)u`lTqKtd859AHy*+&0000c diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00008.png b/tests/monero_client/snapshots/nanos/test_display_address/00008.png index 1018f1a05aa3472213d5e781f1a8cb5bbf290bde..bb6d52f8fd3aaf57489803b53dcf4a8a38cd44a5 100644 GIT binary patch delta 215 zcmV;|04V>R1M&foBYyz7NklWJI=ucv>B3` z2s1M?o_UISsy@V9L-hfk;+MW-29VWnW9d0Q01QB=`VrBp4{+1@;Nsa4hXdo z1nhvUyTp&sE&#->v@%#>-A7^(Tamg9j;mkK8PszI^_+qI3Q%nm-ZbcDApq{is7*Ml z+`mv5n5Y1*plxSb0ia6XX$8=sUIN7cP_zO7zRaiqvcCD!9!(om24-gVQw!YGJH%lV RJYxU=002ovPDHLkV1kf0T;Biy delta 387 zcmV-}0et@Q0i6SoBYy#8NklwEdzAB+Ql zvP9qQOdeGjq`K@oj^jLuJRjb9*Kki##a(?HMoM~T4wU)|ZYbw9%8f~MqD?!+d_c+h zRJWvR2I_m_SbuOre@`rQx-qYozGVtJ28$a_(TYORpca6+|-Uy8*WDe@1 zAAmIBaQhq~NS7Ea-lCz^m@&vX6UG}q7uzn%4J*NK) hk~2~pJC5Tx3_pD0(~LT^JrV!_002ovPDHLkV1fa?uQvby diff --git a/tests/monero_client/snapshots/nanos/test_display_address/00009.png b/tests/monero_client/snapshots/nanos/test_display_address/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..925ee999cd98ddad86a292d1f6110f4b4bc150fc GIT binary patch literal 457 zcmV;)0XF`LP)(uCw#;#h?J~YTO$a+>GWANeNEiQ0Du&nso&adG9`$s;Z_FtMt)tr z$6b@)CBqQBmcgL~VLAcL39x5Yc$5v6kCigbk9)AXAYrrQ?IX>VXx8`8+1)q581rGq zKrjm8C2ZT7?IjGdy!PGf=K*9XY?yq`rCy!)i^$@Rg2LkiKlCbNOR3yO8M0vn(UGkh16y1(^&WC@yCS zGiE~L0+i zy~QkT4!!MscYuF)%qj|FyWa)r^YdkKB95!(0U0G#W%-Dd{F1qt0kFd{*Y&#bP8G&? zIBft{BeuR2QkW!%fE|-GY8G4+MNt$*QEc)D-oM@7YKgAg00000NkvXXu0mjfAZ5>x literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00000.png b/tests/monero_client/snapshots/nanos/test_display_subaddress/00000.png index 613d8fb81cec81961801cd08eaaf62f5840a28b6..b4ba0791c62ba902c147b2b50cd4a987c4611e15 100644 GIT binary patch delta 272 zcmV+r0q_3F0;&R#BYyz#NklS|Nn#cuszT?gVwOF3m0}zd{EmM z!Yx##6ha6g|4Q{Xz{d0O?$>Sg+TtlBcW(pCMDwhXo3{aH>0?6mr3E3507jqIZEry| z2$F&%|A<)SzdP_nsR2qi#9f~25nLSIj23>We>LAC~|p??PcPy>IcfhY97C(zzs z7-!#!A_Hx(74`N2YtMk`KL$WhQz_fp2QVE6>H!ycWt(bMmP4ZY0K-B;# z1zqSAm0McoX&U!KS70KbbhVVg!0C9j(lpjCFHZv{9kCSQz{)7o3gb+foc>%gn WeRVh$y`TU900{s|MNUMnLSTZbzIPD- delta 303 zcmV+~0nq-c0?7i9BYy!9Nkl&84P=QFW?Mg6;jBc zdnbtjT~nh63zMBlVnA8-AUqiiSXMkkEy`d(>$GBPJ$6Cmdw-<}008_1FNr9US2HRO z^?hi%Lw!%;sy}{ZT85PQ*$D6-(51YKrl$zJ8!GxCW&_z1Lv?Kp5=EgCq@Pkv5c|5_6B}(@aPO^{Jp8R(Cz`Qi|*QcTn!la*T&suF(fT< zs>}&le~R;=yeM81#6CG|r?ZF---H1G0001<$p_swf!&;gUUL8d002ovPDHLkV1mZ+ Be+K{n diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00001.png b/tests/monero_client/snapshots/nanos/test_display_subaddress/00001.png index 9fbb210720cf8c3556a5cbe6a49a44c4ff33d11e..f5eefd43a50b38e327aa3c33b4c03a4431ff82f8 100644 GIT binary patch delta 282 zcmV+#0p zT52Z*A%qYD$&tg6CzkUg-+d#92ik#MV%mT9$RVZ>lZPBU(GD!ohN;HA1ko($TH2MO zPl;EJnz=R0%=OfG^}6Y@zra=jx5HBc>Y;o-F^c7mnV@aLcYncC1q>K``|Zz6x7nVX z@SxQ2u#`EApN5IsM7tt#)o|%K%a+Oz%i?X9j`P&}VMIAVLVpTT!`Fv@;S#EgI1Dd< zE3FBEk3r1noo2AAlT=q0ZS9L{sK@yW%UID|7e3#TIek=sv>-4_02n0zjE^S#2^(st g5JCtcgh2BGnG-FQ1M#+p;{X5v07*qoM6N<$f;}dOa{vGU delta 314 zcmV-A0mc5b0@MPKBYy!KNklPMp8CpP#B2`TMcbOHIz)Uc><`0>T^vEC4>+{2qCJx0KeF&L4j5(_W%F@ M07*qoM6N<$g52t<8 diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00002.png b/tests/monero_client/snapshots/nanos/test_display_subaddress/00002.png index a7b616f755657c12db85c822a102f9354ff17fe8..6b9a13dcf2dfe5c1c910c9db05e8b419898cbad1 100644 GIT binary patch delta 483 zcmV<90UZAG1N{S#B!9$7L_t(|ob6f5uEZb+rIXwL|KKiq7oBMcC?KM33}-b`1?43& z0Et8*kw}cid9-~J=66azj{@_Xa(%_a6>uG+c9@w4DDFg1_jm*RjTTUaQSUcp+na|R zHTvS^`G7CM4hI?436lD&=gWghT+EHwB$aQ2>r_)%` z;zPCe`%F-qFn_`pYs5eU05h;SItd($dsc|VpVJm5$(ju7!e(p8LTuCzyh8o9NjVh--D_pA-% z#@kJJh>fR-&?h6 zIb;HFCJU>4w~M_&-G6)aNO!_r&&?6-V>RndI{qKAK?!OQ+v(W4RrrB!9X|L_t(|ob8#x4#OY_K<%>q{|E1|9hx``h%i81#>)TV=SE>!QZdKY!<-P>IS!{Yf-P1Pp`? z00?ON@fp%aN2uTK;UXrk05I=r;}=Lq(FoXqOVof({{)fU_^xk4c`|$1WBQk1hx|NdXq2d`(4F&eJMMSbDQK%Fi=ZJjeQl1C%z0hi4`GqWqFBy>s zYz!Gki$6|89>kbOy+9aeYimVP^B~Vz=exs&=tRH@U>xn;rGP*9b>=%}Pamc3nn(H~EQuW(_K&+@lt}%LLgFWECi987pS$^HI&AnKXB*_xqjBXRRJ=k?U P00000NkvXXu0mjf{|4Y& diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00003.png b/tests/monero_client/snapshots/nanos/test_display_subaddress/00003.png index 95fcf486c89cf6c020a0c522d99dada2279f403e..360229149709d4e981695822583d3b814c74a072 100644 GIT binary patch delta 482 zcmV<80UiG01N;M!B!9z6L_t(|ob6fLl7lb^#hv>9AMAtsur|{|fRjj~<8r1CZA`d> zgc2nZi9{kX7W>xr$k=~|`@S6?a6_yZm*GzhO_`YvsID019`AtHXa*`kyO)(^ZT^`! zATz)XKyZ;c3{NJFtgKOkli+74bt0mDJK}L!1C)^!9PxoB5`X(nM9Vrkd#042z#wAQ zDV3-An1oHGFn20Y<1>KXVKq)|mRm-u-OTz#w2UP$6)r2xWaTMaWEA>d!Wz@6cubzz z4tq%F`;Bg;!mZ&De5Cd1P7bhWKGpg+M8(u;{mDolT#2kgSK`~qq77xY#A6rSid8R} zHl1qg$yVGWu75D>tZZ#HQSo-!5b4ttJ$)^n8TKI8rh^Y7!C8$xb_Q95%uV&DjiU%V z9Ps-~(-9`U9rErTxnJf)6o9~Op9NJ-#xfd7d{<#M;n66|{dm4sFT)^=VkN81sSIcp zv8t6_0TCAVOoA=ibdWtRFDY=BBRvQ71xQn5X&GZ5uUkHKIRYVRMb7}3)6g@csF3M@ zh$K;rVl{dL$biCLThUPRz&(QWsV8mJoqznxf{xf3)>q@g%sq$92J_^?K*?Gh~@GQy&{kA*||5R$RpWv zYB$tvF*a5OHh<-EyRF+pS`mCXdv#IX=fPB>fQuM^$Sx^8^6A0h%cdiJ0x}5&+#5 z;NRv5sb06vfjIyNsql=Hd%c#<1-hYaM_0LPjyX9#P(e$`!9{0)IRNo_>>Oa2Kodsn y<;Fd7Y-fKSxGJ!3;-_x`lpg^n|x3O)bwwaL*P)7`N_jkZg?**!Wb}u8-+v6CPlsD(}4_0L4iTU ztWz>i@i7UTKAZk0fd0a&pHbM^3OQ<{nEFmHgRzV-la;4zkj-%JM_4XeJ1d*OQJ>L= z>2qSIfzz7`w}vy}S6ZK*AQ6BhmSbl(!U#d#P?i}%-E`Wb$HM$w*f00000NkvXXu0mjf#7N_N delta 470 zcmV;{0V)221n>ipB!9O_L_t(|ob8#*62l+}MMHS!#-obNxPZJ->*v+{zQGHG{;&w>&YDFBNdQA+x9=e`T>t<8 M07*qoM6N<$f(3`=nE(I) diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00005.png b/tests/monero_client/snapshots/nanos/test_display_subaddress/00005.png index 7c9bca240d4521c239e6a23c3665df2d390d8ef5..11691f5150a77507ad7acb8b2be6190f7fd59d34 100644 GIT binary patch delta 490 zcmVI4cWi~ti|G|B59y&3Gn`pthT}~#GRw*JN zC;}uBi9{k1h;oc|DfC{W)5h9Tj_)r*7=qtW?f?MgfY8 zTb-_-w>`KxqXmbOsKGYDRtC@*K2rO8f>Cv9e=*VqcOs+Eov`L%cBg3MXlG*FHR?3% za9(v*_V~@#SAV3!$>gTiNJ>SKm|USj^g5Z+>uUfI6pbF#K}Tvq%Hc(#lzMd~Dit2~ z1Z$B;(xc*`*8{TQu&tINss!$*cAa5cPG~hgS3f`;SXQOEv?$~PgUUl~IeVQT8-NO3 z2c{ZPDln`S+3C&c_mAUpF|NB#(QOGB%9hGNk_$(JI%D5DNVx^%h}k7z$&_3teK`86 zq%q4}Eb|)N*U2lOn*a*A$1r*&V!Z07*qoM6N<$f|kAO^#A|> delta 489 zcmVFnPKuM>)|ADhe7fm%pd<+6?wc$-xj)V~c z84y6zG)?oa+|ndH?f?L{ul2cjI(~vBPa~(7QXSX<1D9|~?X@NU@)4PQ5|ecXx^d}~ zF@F5)!X?FG)(3#k;Cuj1d-fr9E7oC$R|a)h5Mq?C1e~961b?tfu)ZewqZf7xbw$>blD9Ut0Y=}af91NT7uT+1oeR|7=^KFULfsi&w=E<5eZr@JP9nAe(rKVP z#0ya3eIHWIO$kQ;dn}HJiD63(;WZ7`$|byFIZXl?`?1qEpn1|!X2I_Mz8dA{zutpf zXo?jZ*Z4X1?0@QNzTxbd*A10kvru-@DN?(XZGpgRay+#>^%qG4r~*l3XF*dJ2$1T_ zNgLZSc0o0PBU9pnF|L42MmN*~UA!JBc+I+{q)?!Z1ndFy0zkP8s4Rxhssq?o1PE)h zds)yQrejGsSJ316O%m0~Gy(FPoT071S}TN^1|s<=L| z1qW322GGXg)O?(vu*d=T z^|nzSfVeS)e~rM<0ofXxK3_JJoCJE06Hf2V&$y*uBn6@}?SHFr>6`osIL_CDx0er? z$dnV%F_V(%KlnO3(TCa*SOb2cw+Faig5Ul`ml|lshYN0DkMt z<2kWopjxT!)+j9ak=748IY3(TQ?0)tgsI*7lW`xc#Iw*!%whoRT=f(*7Vqt4Nc(E`WRfQssJMdCOt_0ws=5$eTT(6EggahCG=Yhy z1mscflxR#=yfDW`u2yK0rK5K(D8F-(H80cFK{1lF3+^iJZ713s050yD!6P6o%SAwr zrrMkiiZHCfwQa>Xlhkn~Ih;(eMU)k~IMGzjYdcu|s%W7gn#O<1Af!h)xkAzxkX_QO zqdf)H6?^kpTq*!9iIf5Kq6JyP-s%Df$dYy03ofRr=T4*FCZ~LmG4ZI+DFqa|totZ0 luS*IXp3Bd=q;gDHtA!o0a zTI=P0q;vWIy0LcXSAVkmb_)6tPXGV_00000_w@l9VsV&FRd|#D0000Eq~xx%yVl}`eq*~VZr{0 zA5pJ9O?E)VOv=W4>|-FB+D3l|z$dKqL_vG2%2sPd&^1qkF`dV0V>*Lp9>Vl=k@ia5 z%MMUyoY*Pg??qKtVqW*q-@TrzCjqNUH!(m4|?KRs3#WBVOp)ET{&YUoAF!p zF5MElA&v^dsB#fFPh{3O*%mWGG`R^kAQ9STv}Wm7j%JDP$wgOC>F#R2E@aFBnPdjF zRA~T19}EU`09!bcM$&4tG0dC+NUU04Ld;i22iyT{8nKsKro(n1Pfg#eljAs!<0!EM XE=c&Y1nF$I00000NkvXXu0mjfVF|6# delta 244 zcmV+&0000G5L diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00008.png b/tests/monero_client/snapshots/nanos/test_display_subaddress/00008.png index 1018f1a05aa3472213d5e781f1a8cb5bbf290bde..bb6d52f8fd3aaf57489803b53dcf4a8a38cd44a5 100644 GIT binary patch delta 215 zcmV;|04V>R1M&foBYyz7NklWJI=ucv>B3` z2s1M?o_UISsy@V9L-hfk;+MW-29VWnW9d0Q01QB=`VrBp4{+1@;Nsa4hXdo z1nhvUyTp&sE&#->v@%#>-A7^(Tamg9j;mkK8PszI^_+qI3Q%nm-ZbcDApq{is7*Ml z+`mv5n5Y1*plxSb0ia6XX$8=sUIN7cP_zO7zRaiqvcCD!9!(om24-gVQw!YGJH%lV RJYxU=002ovPDHLkV1kf0T;Biy delta 387 zcmV-}0et@Q0i6SoBYy#8NklwEdzAB+Ql zvP9qQOdeGjq`K@oj^jLuJRjb9*Kki##a(?HMoM~T4wU)|ZYbw9%8f~MqD?!+d_c+h zRJWvR2I_m_SbuOre@`rQx-qYozGVtJ28$a_(TYORpca6+|-Uy8*WDe@1 zAAmIBaQhq~NS7Ea-lCz^m@&vX6UG}q7uzn%4J*NK) hk~2~pJC5Tx3_pD0(~LT^JrV!_002ovPDHLkV1fa?uQvby diff --git a/tests/monero_client/snapshots/nanos/test_display_subaddress/00009.png b/tests/monero_client/snapshots/nanos/test_display_subaddress/00009.png new file mode 100644 index 0000000000000000000000000000000000000000..925ee999cd98ddad86a292d1f6110f4b4bc150fc GIT binary patch literal 457 zcmV;)0XF`LP)(uCw#;#h?J~YTO$a+>GWANeNEiQ0Du&nso&adG9`$s;Z_FtMt)tr z$6b@)CBqQBmcgL~VLAcL39x5Yc$5v6kCigbk9)AXAYrrQ?IX>VXx8`8+1)q581rGq zKrjm8C2ZT7?IjGdy!PGf=K*9XY?yq`rCy!)i^$@Rg2LkiKlCbNOR3yO8M0vn(UGkh16y1(^&WC@yCS zGiE~L0+i zy~QkT4!!MscYuF)%qj|FyWa)r^YdkKB95!(0U0G#W%-Dd{F1qt0kFd{*Y&#bP8G&? zIBft{BeuR2QkW!%fE|-GY8G4+MNt$*QEc)D-oM@7YKgAg00000NkvXXu0mjfAZ5>x literal 0 HcmV?d00001 diff --git a/tests/monero_client/snapshots/nanos/test_prefix_hash_hash_init/00000.png b/tests/monero_client/snapshots/nanos/test_prefix_hash_hash_init/00000.png index 6e08000ae245052176f2fae4ce42f27c6bf85048..b9a2e0dd68e54a4b6ef78d1c0e9f0dc9570f96cf 100644 GIT binary patch delta 362 zcmV-w0hRun1BC;SB!5gvL_t(|ob8y)5`!=ZMM0)^0rNSeAN-v8B?Vt7*5tV6`Nvc76xAp3&63&$}z<&t~s9|7?NRkTR4F#zD z#GY~C64YZDcWJA83#dG{^+e&tx6_ zkZ!2amg%)|oIM}brC`sr+d=a9&m7PA(35SIP*@kCcNljb(wU{vqVU}E7@t7WhgfeF z_!mg>QaX$)^<#pJn95S4_8VmB=#9{*QbiFcz}ah7ZC@KB?Ii^j97$9O8b-hF3UYf; zcUsl*hJ<8*XYCIw%m&Ll5LJQ#>a5%Y4udcVMRA$`|G_@E2aQ1rSf>;l@5vsPN?Qe? z?Ue`s0Ki)r(q^6~*)oi4<1k(t^HleXGhXJKHSzk);`#F&kwsnrRCqk*X_pgQ#%w|2 zIiyCe?BeuFN`+73`OdM#fdAo_h-eshnWP%4iU4kqQ{azY~nxooh6rw%@K+I*!&oQ84m*w=zTMPgIAcX(6WZ+J?$Km}P7Qe&$ znP}dRR6|uMh78q3G>UsY96?oh9I>cUSvr)PE)#YRP^B0$a!{3~t)r78`-tiIAmu%% zlE4B!3G@L_t(|ob8y~4uUWcL>D9f|G_-qLrv540j0z(x_}jNunQffVr5yMR7YW#QF#bR{fi0Ry~6Bh7+ZL!MIB@k+cd zFRGt)1*`>`*|Jv5rW~vsw-=<&6TxdiGn!!j*Zsge0qJBvo%@$gdseDI#sjkl^tAQB v%qEN0E@o;iw55y6!JY4FiL?^_ z1}r5)2q9Nx@m8QL37kZD_9J z$@YS^zl6)1Qy32cgV$4@0KNoWkq}`ODEy_KJtr3e=SeJY)y@jGQh}iKYFg4a4LWS9gz8pcLs0?YB99C6sT&BD(_T?0y-eQfB8}k m*Xgo4r#SZzLI@#*{E8hdAhCvJg@uIx00000?~E_&igM#?#L~IOHR(-<@sYotiy&C*Y&G zII0yeh-p3zW9cv$Q0k>6Y_)5~SfP=mSMUtz)%Ex|-o}7!H9hbQ(8{%C?kQVa?C`*U zj-J(h>P7(Y#xl^nkBhIt`kQe1WT9~g7`&Ns0r)K_0Og4C5BBp0_v3}4{b+)F00000 LNkvXXu0mjfdQ+C! delta 332 zcmV-S0ki(p0_OsdB!4bRL_t(|ob8#x4ul{KMC)e#{}1-y9!Q$5luC4$jymsTh&5yi zg^nVG5JCtF>muutJ&AF=vM2D3O8>tcfF<~yJ%K)~WYc_PqzrBnTwY6M%ASCsUYJ%# zD^@(B&-H^Fn+jM75|L?kl(hsSad|UO00I+b;`fN^S($jnf6D1U(fm0r0El))e)bgB+~x%)w}SS|0LilCGhy>u}N} zI1mnCOC)u|t}XM(TRD;yvFW^OH%+`|N*bASyRBAK-c|ta1JsA84GGoD?RcfpMcb&@ z?;8lx4(Md}r$x=N+eA_UykG*9TbvodC8))&?yg-LM78SJ5H6SiF_N|Hw&0c(M6vH7 egb+dq8N~6w85 diff --git a/tests/monero_client/snapshots/nanos/test_private_view_key/00000.png b/tests/monero_client/snapshots/nanos/test_private_view_key/00000.png index 094f8125e071a754d8034d070fe5aae9f8fc1b3a..0384a5a22aadc82a7997511608bdf681020df494 100644 GIT binary patch delta 313 zcmV-90mlBB1JnYLB!3%8L_t(|ob8y~4#OY_hU>Dv{{wqrFKnn&ai*>V^#8Ifj9EfC zHD%iX0069tlXjpW_)B)XoFB`QCcuj20p8LMbP)X63aLP(T|#MTb0*CYcYoo$qwK%fZ3VlYe_;AH zOgn#K{T{6QKLf~tB#6EwilSe-5;cP^YFK1HNFdz-v_B{dHd2jdzu9q952JDylyZA-6LXMWjulXy#(d|7 zdsS{9;7&^SgffB-C`&c_i{ugG5`-WKMRjNU{}1k=eQ<{*5pu_h>%@6#)Qq@D zi75p^5Cl&pdmFH4TYuMi@w4MT-rfeZxX$%OU?gcF1t4fa%mmRLB=lmZ;}97q8u z=SYt?lY4=Sq zV@`XjD?!}}CwEq0pt4$jRax`CHm6^K+G7Rq0%uaH%1OzacCQ>F9q3kw6w2%8Y1=7<_fL{WKIIu9^^I4@d&Lx+8{rs!542m@KR9lAiTpr c2!gD9f|G_-qLrv540j0z(x_}jNunQffVr5yMR7YW#QF#bR{fi0Ry~6Bh7+ZL!MIB@k+cd zFRGt)1*`>`*|Jv5rW~vsw-=<&6TxdiGn!!j*Zsge0qJBvo%@$gdseDI#sjkl^tAQB v%qEZRj01qO zMBnX99#t5my6iiS<2;ExAKrP_a8FXjU40uyN_uAwl==#8DCafGjY)K(O*_SWK*{-3 zx1?$Y>U-i?e{e#7Pb_r0F|U@sWePe5iyKYRibBz#7J#|r53gPUwf1d+S|uDyP2kJa za#5O&koM1e&U+>JB3ywzdlgl90ysw@Z=arm3doIzs*N#~gATgK3_XQTXEg_sv!h1x1hxZR_On#5ej&3xrvD3) gGg2Enj^j8CKYZfTj5@PD5&!@I07*qoM6N<$g1Wu02><{9 diff --git a/tests/monero_client/snapshots/nanos/test_private_view_key/00002.png b/tests/monero_client/snapshots/nanos/test_private_view_key/00002.png index 4d3eebdf37c5a157bcfc7407f409e8da15dd326e..925ee999cd98ddad86a292d1f6110f4b4bc150fc 100644 GIT binary patch delta 431 zcmV;g0Z{(b0?7lAB!7@eL_t(|ob8#*k^>l&n}=BM86g^jS20 zP29%-fE1jm-`Z_5C5WrxRtES+eqFuCU6bG?!w|fd!J!3VI)4Gp39x5Yc$5v6kCigb zk9)AXAYrrQ?IX>VXx8`8+1)q581rGqKrjm8C2ZT7?IjGdy!PGf=K*9XY?yq`rCy!) zi^$@Rg2LkiKlC zbNOR3yO8M0vwtijw~(^v5CxeGASfV0nk! zJt#{44*=sRMa(i`!-{eFXm+v7Noi~Ws=dW5Z4SNde0P9GShtaUzbZ z<^dTcRb}~zl>Cypm;tcEG1v9F@lF-ScQ|bTRwK5)6ev=dB!_?N Z@(13(-QQ}7uG|0s002ovPDHLkV1nHj&J_Rv delta 313 zcmV-90mlBx1JnYLB!3%8L_t(|ob8!W4}%~KgkhQg{|Eb^4>hcT(z(s72i})GIHn7^ zYXRGo2qA>rl^i{RKHGX+1jA!%&u4WwRg%J$c)|8i5`0MdPl_m1EdJxi^ zNAv`KATP%!CBq&;JOE~d4Cv7leJJ2FK*z7XE=vt|fWHOa0DobMU^f}WfR?iK&+82# zgj|6C21EXVR-Ed`Ai7iiNO0A6PLt+O6P-Q*-UEu1vuOGez_lRL4>KD|$+IoYogWDz zIs+;}t8A#G=`~y0Glp3uZ3{;Lr6i0DsKh!M```V8S<#ClIs=5uH`UTA5OICcL-(Fg z19Y!Sx3tWVJTeof&OMOpPYQ0z`)h*Janyr;M8j{wgb+dqA@^hlt;&PFr$%jvK= zX`8EeK=U@=XZ|7Zyaa`9e{(A4n_hCY1ZB+@yXt%9a|tRZ6Job7VLZ#jzToZ1K#vUc z$UuqiEBWYt`Pbp_)U_E23pE_8e)#O4IzKRZ@jkzVdl~*B8zTV22tbSg#0UUQ)vmD` jU)yw=+ywyu0E}q`xKw9SaW#%h00000NkvXXu0mjfJ1yES@|3BCV_kii@EHh2E^%m}VQeq6b z9avo{L_{>J8a)AzeLJ1jHE15+v_wz9Z;0GQ!UDX}%R*{n4nlfFPrz^AUir3zx*jRF zQ*#hi!e@Z_Gye>D5#-;3$~j-D3UKIJ!YxRc5huxAWZr`GU~!Z1AxuQ{Ti0$4yE7h< zPMqn-&@YJ;!%82i4ZZChdlz`eOQ)la0P`Yt`vIqSfp^@zc^sGm{0&n2WyS)?n!qq$ y0l=^T!Qcy^|9%+}d>g9!#Sz<3A|fK9IXwYpPFeUCtH*2r0000lE4B!3G@L_t(|ob8y~4uUWcL>D9f|G_-qLrv540j0z(x_}jNunQffVr5yMR7YW#QF#bR{fi0Ry~6Bh7+ZL!MIB@k+cd zFRGt)1*`>`*|Jv5rW~vsw-=<&6TxdiGn!!j*Zsge0qJBvo%@$gdseDI#sjkl^tAQB v%qE%Q6B!3M_L_t(|obA}n4uc>N1Ym61_kUmydZ3{jSa50DIHU8OjG>k+ z%kqci_lu+^2pB0B;*w z>UfGRu<=FMemT*M5HP$wc~v6;b-P{T%hYoJHk_qWfdQeKd{Z%$}PmGS7=A z(l&IU>iUItka#EIfeXdGpc;Tm@Z^P!>KtIVp5+*9&$sSNY*cH&_?F)VKM9yiQ0iQN x!Ux@=DnSMF^(1G7vjo|f8SNr0A|fJkPdfkvi;f{7z!(4k002ovPDHLkV1l@UkJA7E diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_init/00002.png b/tests/monero_client/snapshots/nanos/test_validate_prehash_init/00002.png index a65895af4fc9649a56ed4a9d86267ff5e625fe8a..9c7e7049cb3e9bcfb1601ec510ee465d38229d4d 100644 GIT binary patch delta 313 zcmV-90mlBn0@MPKB!3%8L_t(|ob8#x4#OY}L(^&d{}1NS9Wo(C00pE8o8_HWEv-^J zkf?|RK@bEU?j(0w{1=tS?gZv(s!S-oLS?}9`uwQm&X+lW2Py-k0?~E_&igM#?#L~IOHR(-<@sYotiy&C*Y&G zII0yeh-p3zW9cv$Q0k>6Y_)5~SfP=mSMUtz)%Ex|-o}7!H9hbQ(8{%C?kQVa?C`*U zj-J(h>P7(Y#xl^nkBhIt`kQe1WT9~g7`&Ns0r)K_0Og4C5BBp0_v3}4{b+)F00000 LNkvXXu0mjfNo$s| delta 292 zcmV+<0o(r60>1)~B!31;L_t(|obA}r4udcV1yH)o|Nr1V=tC326q{yla;f(`8L}-6 zv{WWSL_~yQt+LkWMcn5Vy?{@e`v27ctibQ+1&pyNE6X>L7TguMeJoUoUVw4jm^P0# zS^bDUA0OQBh5~CrB2pG7vsNe4Z!bulN8z=gD`|q+*W+MLfPd!Qo`AJFIUR|(Aj<=D z2aL4!=E@~(e_23FG7+#hP8UoIdMd8~@VjPeE&HrN44Ze>;BF%$5B(aj0>(mB}1X&syo2l=6&#oAae^6@4q8SkaR0m3sP>1 qQ{`RdY(X~Iq#eD4iHL}Zo@oQVu6NYNqexi*0000L~bN_mfT!=*jY0E%pKAV-IA?sXjS<+sEmyJ5F4A=iEqkU z%%26xP)37d7H#0WTE(!I(~Yhe>LuAe>8>dp~t;T$!;dkf*Ks%+1I-yKRq3fz(Z_Bl z%nqpDM0%NHM+enoJ|MIXaO=qvEUK+&L;+frGKCYMsSiCJAkHUp4=t) zUh&H$W@0Qrh9>19k>*#Fe=s`Y|F`o10RO^IRBI2XI@SOOa@-MpPg>DmX4N&@0L@yy zKgo4UY9(>r6ymoeJsS56b`@9`K(fkLr9al_)QBq^YNxX1v9+UTYDL6MWG=_xX``l- zu(D-Voiq7+*KllkDxu=#`!;{3?fd)%E^S3LGk968X2ZvzRuboi`g(?Z9`bO67`>pX zM2nf?B<8%0(T?UX;3eGotIKNTqB4|U(#gZrcp2K6(de|*PD5p=RLcSY0001hE+5v& V;nuDwpi}?=002ovPDHLkV1idhw>AI( diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00001.png b/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00001.png index c5849f701c05dcc76cde3362bc6c4c4ee85a3c87..05135fd1d51f9a1c046e787bdec20493d73e702a 100644 GIT binary patch delta 554 zcmV+_0@eMo1HuH5BYy%3NklFC-%L`xy z(Qthd$E>&q9zVFf{d<TiHSmbHHjo*Pr?|A!nS(aT6|t# zE6|G2+>VEhg{QM0$-9_hXnO)`C^MTGsW2U&S(EfNaevhkO(RN90erweZ8%e2EE;j} zJ~@Nlioi`^GU@5@&Z-#XfrbY!yK8I^WWjnnQs9Jc=q(Tv%YW$cIKApZ80&_n=d1y2 zP0g}AV4WeX<@))%(=)(0PI0*5N#_|$AX@XJ02D8*?YIk~49tk$9WoaNn7W(JiaC(_ spYU@KKO>xhDTU>KqpC-tPh*>ZbcNpWFM~e<3?1v}D%m)z_%|!0Qq<><5 zbEvjvzdwEjFf|-=&gLbv;+qRyp_t7p%4>gdV&3S;11l9zQBYy%NNklEy(VwEA9r08^fl>d_MuB8_?Px?#RG8BmRny0q2E56E>8H zr-jEva~OLLQhz}Z>vpFKV{HN60$G<@kDiXe1EYT+YXhdl9vl7j5JFwiUyRy=D^XqO zN_+;Hv7zL-Um57NQF2mpMq9G^eIw0mDFGc4=N}}U^zdd4vd-2O?hC;VGL)ail zx>GzXOH?^RoQg0~c)^ReTajAjIn@GsF!~=>+B?y96@LKw8^AjQXMG_f`k`JYCO!_F z;jKuZiiOX~-6XU{|pZ7``ad%K0@^)bBfW z^Kge`*EbN_mFUD7d4}wN#Qp_Ri2EG&f8K+;VUpax=b{RQLg5^|0J%V_*4GSt!T#XLQIaG{@>E{aN7y$aqSsq^_&1BU^}Nv_{>g_hrcuAbpEojGIXEK5*Lf8dWv=!2 zl)B5p6LBY=OMOWzLK!@g1V2wIIcK2ZUxLO+eg{Cx1sgLFf)BGZX!qFOpZY z=>Gfm`_m@F=P+zRd&D6ohaigEt(uZ1ULkhDZ6``-wjBS=gptBJYLH-b)=!h&hX0$jSfvlawVv^Y_?i?5c89; z&CLSBJs2=YsejCF<#ach44;EFE4-LXaCjr&oLu6k@7cbclK7GAIjtLtcZclKQ-z z?Kz-nri+&Z^y#5u46*l$%Tk)E`ntla)5F3As4r(U|8(kF7R(R`NQY{En7ZO5T%61J zur;B1WtUK4;Q|cU)a8KPj52m@FxeH>CSfBV2419Ssf9j^BD)-@1EwbP&jC9*qS$a3 xXnFhS>Tc-cS$+-xLE>+0aCmO0Ns{Eb`~Y~YGnavhUUUEe002ovPDHLkV1i!1{Z#+} diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00003.png b/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00003.png index 53be236996f7b6ac9a8e17ca4f248219d6e2d4b7..24848774695625326ae2e7c9fd1e72919fdbe883 100644 GIT binary patch delta 537 zcmV+!0_Oeq1F{5=B!BryL_t(|ob6f7dc+_IwEf!mf8ZQ;54M&#fa6a#-Gn(MEQ|_B z#7!v>2m}Im#YeZrW7`vaPmQ11PA7S6Kjw0E6=5|>(Ug+Og;02Ge`Cw%0rMqun1{-S zLitLX5cujf@PO%4No3@tq$o=rD~8v3v$j0OM;Wyw=KCP_`H)`X?(kf>h^W(aG-&JgOye>PMX z-RT}y9cme#hJV5hy`Qlv08?tW_5SOjxH`Q5VnhtiL{yEm@-EzUx&Y(aOC{xRU=|ObdBQccdccQ z=}uS;a<7Rmx0uORE<1wHyXp!LpRw6Y;O>!3XC`F*WPeTCc_rl*Ij&!QO`2<(n@p0Z z{KIPjbY8}->9$Wr?_I^g=qy3_tt$y-r4?i1P?3AtDm7VBeR~tQeqqI6+#)b>9gPQ! zVH2JT|NlAy@&tvasitiKVMqi3)8}1K#TbvF1F#tWO-(x$|AD(`7tUCtK;&mLDQ}e+K?ULm z0g@z1l7D4$)AW7;0Bk#6{%vqazShF_RV2tOq?Dlj9A&p1X^!fEkf%}p1iqJ@b-J3A z5z&%Ug_Ou7#Ru=#Avny|2Y`oN#evdG^=K`!x+caJ%PZx}T7Tce`rz*XCfLW3>&8F{ zPAY6e*wvIeyd6NH9;AznE?{ViRSxLre)IWhhY}PiWITZ`LXiY7!W8JX$0Ddu$kasr z*X_{MQ|OW4KcHKt`Qo6EDrzqgXH(y?R~JA?f_)2 zm&iGfY}ucZ$bZ4?>6Z;1+o(yzwnVCm7h#gAXdOPm*@;LytitsmHV(-v8Oc~yfyk-B zEI$d4@kl*)A~0t{@<|9jb8aBu959oIK}}4h+S~JI`%6(KU}lx^6Y38tsXk^t z%(yy$nsE5gTe6rEsjnpg^B)KXdDmp7g T9%;5d00000NkvXXu0mjfks{;q diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00004.png b/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00004.png index 5f6fc30b1d2992ff38fc1bcb183cbee8344a2489..6146bbd30adfbbf78c21b9f2aff3405b5cdfcf8e 100644 GIT binary patch delta 566 zcmV-60?GZ^1I`4HBYy%FNkl8O zl9d!-u~;k?Z{;hzV&9GeepC9JwA+R38(*%2v|h>qY#w4QFGna3`j2;0Y)O{M0aJCDPgT7!JD9eNs_WHO(Hj{G46P1^{axvz3)a`jMUqRyuq1 zCL2Q3r-es_fq$Vzeg3CHb^f7y9L{Vg5j9ZsLhm;U128}5wcfuT#nsFE7qen;C#wqG z$K%^`;@|dNAIu+TMu&BH(KiMSU9xe63$bw|{orwqVfk>$K#Ck>%@*hK z;T(32m@sUp%X8ONCl9ymHwFM)y`WwS%U~vxT_xG&pMQ{JC#gIK(~1DV6#(`4s8;r7 zvTyB@RYA`r1whU*PGV+(cMPP%WsPsv+qy2U;3K}MESoqa5 zaapfWBi9X86U4JBRFNOZ+{QK1FJ$aI}?mRdS)a8hY+9 zMm~as*)P>^#FEqv`?g&%k3F*IW=b&+m(OT1 zPLU_|o0Jp^DSrp1x*%0e9dFUvOmc3*sBN^VP9a*4tf-+wQ-fEK7J6k1;ua~wuPvKq z)c$hSx|$7N#;P(u+?BGyz!AE1V^Tl595&eSRaw`jCon>nRHQ~|;BaevYP00005+Qku88E zVkwD4B9XW&9z8<)_Nn7<$c3uybS3-t6345<3W*6|!<4~Qc(HG9^Z2?$e2Nd_@T>?E zMV>B~exm{n@bV!PyiQC3X3V3Nq^+dr<;m$C>*~{>;Ae`K7k?lMV&Ezf{00hFLg$H`Sj2fCbKPGDBTWYtf8-ItLj2jI1jDE$G1Prm=Ir;}f2z5sPU}O%?M0TMw@fl<`4He&SW> zk6c8LJ!|CWxv04&JX0WT?L?|Ms?r2C69L!cL9 z=Xe`BO526tj1jpuZZ%Cz@4fCakI#a%Nw0W49d)uK{(pjX@fP?4Z{tMD4^KC9Bc1^N z2OzO;ih{>%{)6G>dN@x!B@3pZHu(CNJ~4xE`u1Jp=+(g8gESfAmZqmHoOF6Hum=F5 zpZc_8+|ocet&lS%mpUhHU)UV3f~ntx6LGX!P}Y7Tkw{z@Pk7ymx*pw1@Bjb+07*qo IM6N<$f+yekUH||9 delta 429 zcmV;e0aE^;1jhrAB!7-cL_t(|ob8!WkHa7cfbHe_|9@~FdJk&|L!hWw*^MvDlD2{d z1rbY0k|asKmCae-c_7{UeM{0t5rmMGQ`hV@k+XG4|=kaD`yqx>2 z53-MKLj-)ZLk)R&t!rJ)U;+J z<9Ul^JTdV00DBrr+LQ2tWnWvO@2)sQXObi?L`o9=1GPOh3*&@6@uEJ}kF`tMxnJ3B zo|3e~+0(lkYJZ2VW!5Kvjx&K&C7pe|=wi_XC>6T#N^)zVdnv(65k)v6NfV}A2^d*@ z7JH-=F^*nRWo?INQL5k7-u5^jG66$t;=xeD|WHJ;vy4S=vNrtv^y~^emQ(#u>6P2qqAMmL?&~iLnWPulpxSlC0zp XR;kzo-ayQE00000NkvXXu0mjf8L7)q diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00006.png b/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00006.png index 5eebeda449645be684915c86fe09b57674ab6f67..3084b7caca5efc2808d2c6ece14e32fe704beb00 100644 GIT binary patch delta 476 zcmV<20VDpi0`&usBYy$BNklwuZHD1Y|Pb%|d}7TCmPW7%=B zph#uUo>Ws8sZLZ;M*nh|3t6dU$qnPSFggIeDXnyjW-i!mD3%_ujM&!11TGb@$zgD`pml*~%qW(OF^F!Y|gm_2~f7HCIK&@t#GeGPPW70Fo2z zpx}^)+HsKCA6*Hw>9>p1xO9h(GG@RJb0MhFs~K32A~NjUks75b>0EWNQ&k!lBaX7T zLszO9BpN4t@DfFI&7O$V$ofl57TEIy{3GyLEF%+-epUU911OoANSXAHf)|fC00jRg z8(N!jISH==FnrTeOS)FQ-Zz>XsMZ#>_02zxiQ0_cn8uiVh8mVGtm$ zm$z_UyJAdUXr$76@C2y&y3sm{F<`Bx2A%-kxw*|Pw$05B&wpcf0zF3SKJ-NZ@Yc}K z$DM7!+J|ubW=EqCFnBxV4d7eQicr{!$o_ert<1xJQSn8r`!V4jO+(+=V<$z7Q>rJ@ z8rr312<*#-zatsH@kgS`e8Inl#uspo&-?rWkRt&mBLODEFF%_ivpEt00000NkvXXu0mjfOGJf` diff --git a/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00007.png b/tests/monero_client/snapshots/nanos/test_validate_prehash_update/00007.png index 9af91ea0364d70462b19d207fe7b2507f3cababf..1e284f082ac82ce25a1a8f68870b8152aa91a8ec 100644 GIT binary patch delta 298 zcmV+_0oDGi0>lE4BYy!4NklktXVL zMz&?mgb+dqA*R_k+c)nb#&~!a@IBbn2d)x8w7;ybbqqrlK&!*h+BdQQ0$B#k_Khrn zs5nX|w{K>PcLC#+U5M7cRh|I+vqYww%l?U8eESi?BmbLb*?*+>!$?K7?Ee{M;EB4B zC)e4B8IfLb2JiXuBfv%x<&5DMKYv*6~Wb zE-$K|bp@;inc1>d%%&Wy9Jd#w&J)3FK{J|Q{@4A$JOSxsKb`xRPJ33WK*j^J2lTY{ wz|1C`ezSo_aw8$YPMlR>TF_ll0OH=f0Ch@(bnyFoegFUf07*qoM6N<$f=g77VgLXD delta 273 zcmV+s0q*|90;>X$BYyz$NklVyj9^3;7>9CS!I(w`4JUOy0 zq!$Y+LPSJ_Vy&{)=t*4X6+MA(z4ZUf04(5l^aOl#$;$G}NE;jiZeI&kq9>qi7pAVG zF4lacUvDqW--ZHfK_XHXqq5p$WZqtoI!}k!f{v64W?lQi+NNOjpRnaPMju~7W7nB0Pw5k)>`$MK@44YW^gsnBM+So<{0X+w;<+k zDd=Rw;ZlFhaPA!BKZf>auAFN>e*nobfM5(DSpEQd>o;G(!Al;%u<_>1fQX2Q=z%`f Xuyvl!t6{+a015yANkvXXu0mjf@9%?h diff --git a/tests/monero_client/snapshots/nanosp/test_display_address/00005.png b/tests/monero_client/snapshots/nanosp/test_display_address/00005.png index 960d4c51d4d333c8c9525a85215778294ea14093..b26ed0cf8cd249df5bf6fb849fdd332874f2fe46 100644 GIT binary patch delta 484 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 FV1f;r?41Ar delta 979 zcmV;^11$XQ2k8fpB!93;L_t(|ob6gsw%s5Iv_0L4`(IM_(vN%Up#lR6CcP>1^4xk6_^l(Zp&)GU;v`&!=n05!m7J!m;4#D;EXqNYt`<+c^>IYTL1ZLX=-2!O|}i8lsf?e7gM5)~h9 zRG9Axe#>o2RGbj!;+OKDhgb{+fS>8ZDqp6_C!81C*ncPk)E{u5^RR6f9&Q?FSU!TB z`Q<6FV6G-i1HXi6Cvhbk^fk{*(JmHP4uIC`_$LOj9fN^*Qk$(2m)FGR0Eowk7{;O0 zSp#@EiPTIFc>U0v;RQU)H@t?bbS`)mJz?brqIkzq^2tY0uEvP!ZC>Oy|L*If2 zVo(@(;C~b<3>b@CF*pjoyeb55(oz~6eS_WnTwTCHI zw!0=LZ@Q#^l`-|t`XGmj7_6C?SsHn{YS%;EV24ek;{7Xlh1|T;iH)QAx0r(Ud@ z5j!7d;cX=faK8bmAm-*?NILw|RJ_pgvrZ)YuwDPj;|+kB^4cgJGS75v;vvL2r7>}v z7xD%G>?UVYJcXnDVABf~EjGY(8XKBI4NN|cjcDPY$;>q|evrY9kkd<%MxK1tY+>Fp z81FcwegpMUgTk&fBWnNv002ovPDHLkV1jsJ B*r)&i diff --git a/tests/monero_client/snapshots/nanox/test_display_address/00003.png b/tests/monero_client/snapshots/nanox/test_display_address/00003.png index 74a8cafbc8de0148c512665ca51d412b028d5641..c4ba4822fb25fea63e9fa15777220d75198acb19 100644 GIT binary patch delta 858 zcmV-g1Eu`?2Jr@vB!4(bL_t(|ob8)ia-=W}MM)|=<~RqVT>ejE=8SVLu9Q$9>;7DZH_q z*Qt1&pLB}`;tPnGxbM5x3V4Z#_7nJcI{71jG$n8MLPY#Aa~6Pnn$DJd`(8m34!Ef^yP@@v!!@`BvB zXifWD#2Eo%QqKXJvadw4m{S+7$^8^Ct_Lq`6ZwAYg?|hVkv5T@5LKO!7jZEcWu-*k zv;$s3NS)2<3EBbf9*ZN^5jSV+)vllLRZhGo0D~cqjOEuX6f)&ZQ*&FuX*(5@`yBSd zTk7k3{Gr9}8z3X{cMAH?TVGuBtKCsA?=vAh9<`~v4{pF|!~D~^Eb-I3n`6FXEfdJ*vwgC8U9uXk+q2JtKJ3xh$5xYZK0AVfTH zEs#?_DHoRz`@%~MGAo6}Szc@h*Q3(`NJ42}oPXI*RbV8ts0gKdpLi1va_0=@=lVb~sRK*@I9Q6Zm|m0NHtxkAbRh&4FnH)5Zg`%Tj{O+M}g zESLN?cILd$N)She!P|KKXDQ_P3hLFo4sJmUBl<`RukU~f78|Qt;0*EB9Z)nO;8NNR zyi-L7j2}5^QX+nngUbUX1~lAMo^ujDW&MiErF>)u7^9)pPzb&Z+ILbTXH8_nF+R6) k71^d~nx<)*rg<{|0I#OIuKB_exBvhE07*qoM6N<$f*y63TL1t6 delta 868 zcmV-q1DpKu2Kxq(B!5ClL_t(|ob8-ja-=W}MLntPg#9mxz060aD36|3wnVxaov*|g zN!Y@VYmzaVrfHg{X`1FSoacF-Cw|GOpA`@BWyiql6ovOyVRU|s3j0xbJ08a|r10i) zUZ>)5zSAulhz}rU;&B{WE8ry}+9mMzbn@Q-(xBvRAkQWi4u2(Q#fB#L@)FHO6z!$i zr0NYI;exrpW?^nzu(?UKP;%r_G6#%;N%fc*UZdNtk-%=7y^=fNihCXkUSm41j3k#m zn!DoDi0^615zSsnx<)* zADm^Vv2cto$bWFLW!_BSmXZDNyd!bFXaSRL4Y#B1dsYyYvMf_O)yOSefU?DpkQXjY zB^r-uL9_eN-pa7HRxR|FENBm#DI9%?EkopJLK8cOk^*y~VTx4Kf-zzsSEF8#2js>@ zYue8u&Kn>m^%|fl`$!~n4iA>VI3kbl9sB%15j0rXt7L5UY}G8bi~ zMBcOmeua=ao7EGv1Kc$hN30_*&i1Qam+)DRqvM1YEXLF}SZ` zPrRkRzUB)pcHaPbBY%dV|Gf3ZIltN+_3}Og!sAh!y8GY;oJQ_GD1|q#e<*KAF;Ven zOp}c}>wjqCjO$voELziI;4VT^Rn>H&i7m#@h&7}F7iu)=1}rhkqho;WZdVHu35h4< z7CY${T-e@SJ0!w6w|LAIsf~8P!a7xqTSM$2-hcLIJhqI3_>~uk@i=kPv>-%6K#Y*> zJ}DQc5c}jyj5Bd)7H1>8OP~%wvPt{y46&b%k$=ddG*l4)STp(C(4EK2-HqSV(EAk1 z(XM9cij=$pJ_l%#*dAR#`SyMJh^!jdg#%bAIPv6)Xs= z1zq9n>S!sv(GWEL{n|;CMMvZ$2R{r51)0kOcfv1OzoK#lpWOk*+t6yLfFUJbh3=Wu uT>m^zWWX`LyK)uTrfHg{X_}^aAb$bK>!%!|wrK1C0000)j{#=y2ykras#Ux0C$0PUt+X%h9^)KErRDQOLj?sVDkOjS#UxcW&jk2EVG!XFlo_hM6||Us>(4Ff8=Z`Ae#?73@W!j|?RaaI6l9o2z2X zw%u#yJ?kd9WaX2qLbHnm7l|akn)@s#lu!TmrWKWc5*$q)cwW9)7x=m2?dR2A=@TR! vbWcb!Kj>jB5YtQ&-uKAGQ3T;NhCj{xq5ICc>I5^|gG4=D{an^LB{Ts57FdJ| delta 302 zcmX@jbdqU;O1*%mi(^Q|oVPau`I-!P8WNNCc)qV+a_=bnqfJvbDt6>P|8M)!$SG5{ zI97}S0Sxp*L$Cfj@om!kdlye1wr-g0^5o0bRa#0)LJQga-!mM0WioZodQTJKS;}91 zwygcB6=@uQ*5q@g#g6jb54YU+*v9lscm>1LrF&}Ylh-H*hbg^Qv*F#%l#~}a_kP{q z^ktGizja!9zs+m@q89bI)5)|<`TSRpor_GR4ysql)qduCGU<-#iM&bM1A>}Wf}5k4 z`n;EQ^xx2}vh8|yk>DcH#9wotC4}cf(kYwlmPx%cDGinEd_tQWY8 t+!*HsGNdb-Jyh5BD{*E-c+QpbFPp1Cg_1gJzf1=);T3K0RVEegg^iQ diff --git a/tests/monero_client/snapshots/nanox/test_display_subaddress/00002.png b/tests/monero_client/snapshots/nanox/test_display_subaddress/00002.png index 2801466ceb0093560747e51129d3659c82dcf808..d7e397564b3383c0d02954da263403935593375d 100644 GIT binary patch delta 988 zcmV<210($E2l5AyB!9U{L_t(|ob6m&a^xTk^lt464xRwzF}e5GG{}HP83mZy8M!!^fb`8`ce>2YYhPy>eeBhhe+6~d>HgT#7k{7NTRGW*rTf0nDDY^or3AY50Cgk9g@8^%gev@&!P5FH6Cm_p{ zLZMJ76bLi{HGeoY%hrxjf6Kq?UXs8uTwjv)-Wb8Jz&;_1Lwq$*8Bw%Sf%P@TMZg|B+zxy~S7` zgm<}O9Zt-tg^%exQn_=sa;)MyFMU1fI-g8{uYYInpLX{dsBZQFbHq^L436AF1rmcG zR}PNChJW`DBh8m(s_$nQ67;lGR%WCy7Q38DMDdgfmpHq;+kbqhhmjfDvJS5$a*%+v4KlT}q7#Fs zN37h?v96!@XZB!C0ezad^X}#;Fb2C-M24Z<6?KeHKsO(aMCj*WIEATGhe}*Ss%l`I zCl@%3%#nmuo0g7KUq=^6R00ZxLgDuUv7s(V+RrxP(XUcH6za zI(!090wO+dmQ2P>oP?Vd*9xgk`K+cakbqc#47$Y1mvKk;6myK^y-%iu*#ykRB58({ zI3#?UsIEoQv#FEeLZ)g#iJB6fb$e(QTvY|g`8KrwEIqzgKiT}rU!T$Sg zDlsG@3%p7pLG6iY@E=r=B?gP)K^ZJWsmQoDqY_Xk6bgmHoA4h}DW*b*mlUS}0000< KMNUMnLSTY?N$P$8 delta 980 zcmV;_11tRU2kHlqB!96nEPs4+bYy(Nnx2K%GsX z^s_(f1b@;s`cT)PRzvUI+6a7P&j)92I<8cJm2PxH*;Bb@nSXk{cXgxLTsgu_NC5=W zbP6t30P`5k{XGqIL#>E9SjvoC+@H zGJYOR9C1P8dw)BOb~l`eXl4Sd4UwNQNQby;@x|tbv*G|aTBr>ww(WGN+4l#TA`4FK znPn$G2N_R(h~)|hE7w{o)v)dQ$=pP3GX_)@eM-fA6MsPf)C6fj7(j*Zh1{U+)ZSjy z>F)z_>(SQ?9)|MA(27bOra;yT0}p`jH*&a#GE9KE=+D}FyM()7`IZ7|JxGhagJt_Z zcaB80$v1b{P=ZN+BD)c1Azkfb0nn9i=l)ek9|r4YZ`%Tf3U`oy3Keh!n_Mxt3c0<% z5NZ5Q#($cAgieun(C}7@Tw9xQ=aXFv9g(i8wpM*UZ9nm{0GUY8ibG}~Ivs_+pO%0# zYjtT8Yn`y44oJ(oF@<@5*e6Q)OPzef5_g%3P`4~(E9D}?1ylCX(JbZhdc_$F)!bB~ zjtrZEr8uIaRj8{{S>h!VDr?rX(>&CJ$b`0}!+(2$Tw_B)EM=BeG5&P*X=o8iNhf=J z<$LhHnt1Z=#`!M4w?-_?ItZsA_ta2{YKYw$5a+=KhC6d5VAZCj zZId&tY$})O~>8DZ*PnmH&F6g;v|Wxir557PufawLw1F zC*!2|D(%Ib!I_^%w!>PT1%z6chZuhBY<@HDURohFM9+ONBuEAz2MeVcQZ^yyUlp*E z5p)i(3>6*!#+hqKLJ$D!KsbNJ;ei1eS;wUm z5>!^qYsBB8%xo(vG{nXh6&d$tQ~(NvLZMK26aE5*mZan;B)}U00000(w3j}(@u*yWz($Uo@;!7C zSptM4Y;f9IQ4~c{6h%>d488Z>yZ;jCpJflxg>B${CYkp&L+Ch-8Sh!YTZ;%6W3} zSM{6x)r{e5$xZcx7J!@16Zbqq1deNh2zukpekya(P7Ig~#kD9ihad*At9_ld|M_qp?V9IC5p4Q{}2a;?Es zxO?rF@_#%c6DcI3X{j<7E54U+kw-&N8UhA@QUs99FKJ2sxw**j6v<4Ew44R2&_qSY zdW2{-xRBX?U3jcf4NZJ7?Jth6X8*>PlL#T5Jpy+?g2s=6_92DjU&eK%G{}#w36E@A z$nrcxFPr6DS^(z*``9@h(X*a_?yP^9mAH#bdw=Pti6OZSs&AH>XCeFFs`afbj*sOKWZ2aV{JeQ&$Xw9mp zdT&06(!`c^)?ls2(9?jey^gO%-tZWT(dwxf?e)vDMbLxg7Qll)7d79Py`ASRfc92E z>`B&O9lswebPt$OPhG#Z@w^ithLHth%crsUM*d_fbt;OYD2ieN-+taaSfZcsaR2}S M07*qoM6N<$f(a437ytkO delta 889 zcmV-<1BU#K2apGlB!5>)L_t(|ob8)iax5VThE3}1r1!rh_mYP`(`5laprUamd=IIK zt$;TadZv^lNs=T#XR`zi^2PVh6;PcwHA71%HVMdgN>#PW%oa14?!S>6=(sz<-(*2b#3yB}hdtXwyux zY6lQ=oojzgLOZz5;U?9(7Dp^g&VaJuP`w(8HR!r(k73(Ruiy!I>~3Ab?bCT>&*IX( zx#@rWl7}svHDpn!oUA9ST1 zk+7bY5o@BS`XHhOUO-Uou?LMKTDcyvCZ4EGOU6AGgol5+z&kp9;!iWBp+h8yqUtLF zPW~c$_*`;poxlm;M)Ros(MK#M#u0(UP_fT{huL(rxqnZU)J@lL6MwpSw#1atCeYbZ zu*Wnjh}D#{4mIrkS2@N!eev{5m&~C%pmk?=iSiDwedPBcT=G)?!(BEh+_|WYZqA?k zfpYvpqRid{vG%)t@CVPp{g55`-vvdDe&E{g@@DUa>~i0YRfO7=xU1uoOPL z_Dgy0k$;I4;?YpFEJ_w%&6l35A(zkZmtq~1iclo;M<~u8>x-<3NHl{Z6tI|DkhI>m z9w8_P*K4^`m(tM4h6Y|t>x;I;Y*N^aayd?Eq>d7xiCeSFazDXeO{^d<$oH%V?%a^e z@?4|O40NU@z<*&cp{s^V7GDyW4&9Ri@ucBqrhj(otBGA&uNN~Kkz{j2hz^HyH*{7; zy1EGaZm9ASV*~AwA-!f+PDG!Q`95~Lpsv*+wnDCelsumw58zj==u&JOTR=pY-j}mL zYihXdHUf=Y_4|Nf#&+15c>1#SH)0RES?BKA{+)MnUy>wAj)0_D^fZ}L2gz((iFu@? z<8s>{&djBrtvhE9j=P4Ap)Bol##-ceuAvB&Of^C8Ue3&bwwyHqPW*wW`LgWSdA|uj zuLQ)JWDd?5_lHx?fJMpF^Aj8Iw*y2sa-eVdG!9?LpG<~MNs=T;yk{h4!7et z25(55=P586=vgom_h{_ido`=)^6`VFRt8fEs8G)$;}}M4F=&Z1V5my-ZLD^dqSBqitMj09 zP?EBBwe%&ZDW8UAXVqh`oS%zCPtukkklD>0a?_0z)25OX&G7-~=McGi_I6qILr>Xl zYQ^gel$g5(V}HU6(`y;RB+V5JkkxRhhEK=-0AzVmC=?2XPl3yZ0tP1Qu%+*1v0JN2 z)R@ZU4eADva1A#U;~&skk5ub1?I#eXG!}#vt`Q-*kVJ|=PZECrk7b=uw)5)bNzJ1on?J4&<+j#?t~^YoVO+@>3MlC@!5lNq4*qG^gf`Vjj^ zZh9u+$_zQ!V01*oQm!{1le;B%-Auefv3m&YC5+T&e~mx#i`WwQ^X1h_cJZ1sV29Uy z&3}jrg+k#XEU=*u;2YqS^3)WH(D~?dYFfFr(MFCdI9z2J(BI7avi++*k)4% z8`6KL{!GKsSh$G2#MNUPn9;l+3rmpR>uP#6c{Rm|09E8f_LiE{`J$~^WKPy#Fqx4E zQW1e4!aNaP)zYt2J2;5%P=Rd!pAlr)(6__6$Y_%A67o80+O>GoY5++7L8kC$LEdW$ fg+ifFcpH2J8&J4i+`Uy{00000NkvXXu0mjf+6wO2 delta 1008 zcmVr1!rh_L2`*C|S>opdX2KKBlHI z2uVEq+G(vQilQirq9`usU!qO#ojxANvEsqY+U-Vq@3grzNJ~ZrMg`U!=PT=QJC1{S z1JZk^O@^K8jZkaOBkiRbBjL32`JZUxz>*?M#^VTs#Y5|;7Jq1oYNXjSRF?Z8IC1SF zzXBv93u@wCg~NMm&dRlX{LsYCpc-*zsMRClm``pqXd71mo0aOPxw$hHm8_iJotaH$ zWXsXjwr@dA_{6rIS&yyhd@mb4*|r5anO!^~7v0#>wQ6LG<@^AQdkEb(DKtR}4% z_F`3bjHsst(tm{&rd7hi1iLE~z}axBg->UF0Css&6h%>d3Z@$BC@{M&Tk^du_tvTk zHL7v?7A8<|#No!OPK7jFQpY%*PQL};Z(tvTi87z6pQ-+vHX`0A#yj?~E|rW8R%U{;7| zyt6JY+8Kh!(zYuavS1U04(wM$Z$VvH;3{eFE1Q;Fz>*reea$-1Y+9L>6BeAp)>^+H zI=%wrHZ6}+T7edVXDma_=1CJ!y|A|TD3~*&L>=AGvUI@9%m*q;Q+LzZYIAKrF#9b# z08=%gwtt_Q{TH2ZWv4(=j#|AZsv$a3 z=zM5o&l}S0oy^e={W?}hp##2J>3@W%p`nv$&j-^|gfoRNcyA0>WKIr}K_NPt+PsNH z>{|#1K<*5x&b*%esl85}_)?`%y_NQ@pd1GnpnnFe5)1&S9^9$i?w~2Lunz8fe>D!%KapOv*wk>SJ-U^ThQJ7*&JM^6cPdrs^ zMTXozU}R8iEAP=CcXS~Phc0d436tGoYE)($uGE+Ok#EGN!0(r58(HF+D_~L7d}dHZ zQGXOC0sWd?q98=(0wzirM{HP7@1p!G5B`-xJ zzId{l;HIX&s7iAHze9D}j{hSK;{kYx$ef^0ikb*kHlDMmoz5?v4Hi4UkSYE+;Hynh e6h%?|4!!}=Qn+25J^{)A0000hi=hxI2 zL`9-+($=ja3K41cV{T7V_2ktTCPP)28E5}kZ zyQGvyLYU+f)QCeU?ReeQGx8=Z4P`l#mV)%GnwT`bZiJhrkz{GkOMC*xJ_KguQ4XUX z)r8fitw@y>BY*7E!qUWW7O>M3W+<5T^6F80;)r^0M8I9;b92*c(zTYZJh}YJXsDNj1^c_7<&KWK1>G+K>x~*(s zzu<)z=6}TWrTtj=o*w9Y2kdU^7?uMd+vV5HL2)Avbtn@m>GD;IIh}BYb{Vx&pl7FQCemA0A8vei|cT9^7AEAxuXfgrz zq$a)0qBov-&Myu(wL|NqoLlq14TaGDZ(T8q7=6pt3-(UHIxu^nB%@rC?6hY{&=Bi0 zU;w2IOJ}5Q+}43Gwu1JQ^sdKFTTv86Q540y6Zud19Y|6rTP}&O>ur7db~8~`wYLHb z&wroKw@VTC5A-J5dzz!rBNDqTB>CRRnPcNFlyH{f*S-Q85v5tPmPTQrOXW`C=~~bx z=yEh_O6k1o1cded8|h`_dERvbSXQ*NSLx&%Cm``j3rpJXsGlZ{sSoJ(VQ}65KSeAs rANbnmjmg^b7w4!6D2k#ep365p)a`IJpbn(K00000NkvXXu0mjf$1%!e delta 925 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 bwe|cr?|Z%bi5c*}otmSq%lWE*_$L1oHV-Sl diff --git a/tests/monero_client/snapshots/stax/test_display_address/00001.png b/tests/monero_client/snapshots/stax/test_display_address/00001.png index d27964b2982bd7b2d2ca5607cb50fc6d3cb99a44..a793ded99c8bb7778f490bacf38948d03b737450 100644 GIT binary patch literal 23444 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 literal 23021 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