From 979099e1dd837fc8680033fb10eb2a834b6e8946 Mon Sep 17 00:00:00 2001 From: GroM Date: Mon, 7 Oct 2024 17:29:50 +0200 Subject: [PATCH] Use buffer to store data to be sent back through comm object --- Cargo.lock | 2 +- starknet/Cargo.toml | 2 +- starknet/src/display.rs | 2 +- starknet/src/main.rs | 69 ++++++++++-------- .../flex/test_app_mainmenu/00001.png | Bin 7948 -> 7709 bytes .../nanosp/test_app_mainmenu/00001.png | Bin 353 -> 353 bytes .../nanox/test_app_mainmenu/00001.png | Bin 353 -> 353 bytes .../stax/test_app_mainmenu/00001.png | Bin 7340 -> 7111 bytes 8 files changed, 43 insertions(+), 32 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0edc8dc..d9da724 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1988,7 +1988,7 @@ dependencies = [ [[package]] name = "starknet" -version = "2.1.0" +version = "2.1.1" dependencies = [ "hex", "include_gif", diff --git a/starknet/Cargo.toml b/starknet/Cargo.toml index a3f9d79..001e8cf 100644 --- a/starknet/Cargo.toml +++ b/starknet/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "starknet" -version = "2.1.0" +version = "2.1.1" edition = "2021" authors = ["Ledger"] diff --git a/starknet/src/display.rs b/starknet/src/display.rs index 03c44e3..14b3804 100644 --- a/starknet/src/display.rs +++ b/starknet/src/display.rs @@ -258,7 +258,7 @@ pub fn show_status(flag: bool, ctx: &mut Ctx) { #[cfg(any(target_os = "stax", target_os = "flex"))] { let status = NbglReviewStatus::new(); - status.show_and_return(flag); + status.show(flag); ctx.home.show_and_return(); } } diff --git a/starknet/src/main.rs b/starknet/src/main.rs index b2209b2..bb3a776 100644 --- a/starknet/src/main.rs +++ b/starknet/src/main.rs @@ -34,7 +34,10 @@ extern "C" fn sample_main() { // or an APDU command if let io::Event::Command(ins) = display::main_ui(&mut comm) { match handle_apdu(&mut comm, &ins, &mut ctx) { - Ok(()) => comm.reply_ok(), + Ok(data) => { + comm.append(data.as_slice()); + comm.reply_ok() + } Err(sw) => comm.reply(sw), } } @@ -54,7 +57,10 @@ extern "C" fn sample_main() { // Wait for an APDU command let ins: Ins = comm.next_command(); match handle_apdu(&mut comm, &ins, &mut ctx) { - Ok(()) => comm.reply_ok(), + Ok(data) => { + comm.append(data.as_slice()); + comm.reply_ok() + } Err(sw) => comm.reply(sw), } } @@ -108,12 +114,16 @@ fn handle_apdu(comm: &mut io::Comm, ins: &Ins, ctx: &mut Ctx) -> Result, let apdu_header = comm.get_apdu_metadata(); + let mut rdata: Vec = Vec::new(); + match ins { Ins::GetVersion => { let version_major = env!("CARGO_PKG_VERSION_MAJOR").parse::().unwrap(); let version_minor = env!("CARGO_PKG_VERSION_MINOR").parse::().unwrap(); let version_patch = env!("CARGO_PKG_VERSION_PATCH").parse::().unwrap(); - comm.append([version_major, version_minor, version_patch].as_slice()); + + rdata.extend_from_slice([version_major, version_minor, version_patch].as_slice()); + //comm.append([version_major, version_minor, version_patch].as_slice()); } Ins::GetPubkey { display } => { ctx.reset(); @@ -138,7 +148,8 @@ fn handle_apdu(comm: &mut io::Comm, ins: &Ins, ctx: &mut Ctx) -> Result, true => display::pkey_ui(key.as_ref(), ctx), }; if ret { - comm.append(key.as_ref()); + //comm.append(key.as_ref()); + rdata.extend_from_slice(key.as_ref()); } else { return Err(io::StatusWords::UserCancelled.into()); } @@ -164,10 +175,10 @@ fn handle_apdu(comm: &mut io::Comm, ins: &Ins, ctx: &mut Ctx) -> Result, match display::show_hash(ctx, false) { true => { crypto::sign_hash(ctx).unwrap(); - comm.append([0x41].as_slice()); - comm.append(ctx.hash.r.as_ref()); - comm.append(ctx.hash.s.as_ref()); - comm.append([ctx.hash.v].as_slice()); + rdata.extend_from_slice([0x41].as_slice()); + rdata.extend_from_slice(ctx.hash.r.as_ref()); + rdata.extend_from_slice(ctx.hash.s.as_ref()); + rdata.extend_from_slice([ctx.hash.v].as_slice()); } false => { return Err(io::StatusWords::UserCancelled.into()); @@ -213,12 +224,12 @@ fn handle_apdu(comm: &mut io::Comm, ins: &Ins, ctx: &mut Ctx) -> Result, true => { display::show_pending(); ctx.hash.m_hash = crypto::tx_hash(&ctx.tx); - comm.append(ctx.hash.m_hash.value.as_ref()); + rdata.extend_from_slice(ctx.hash.m_hash.value.as_ref()); crypto::sign_hash(ctx).unwrap(); - comm.append([SIG_LENGTH].as_slice()); - comm.append(ctx.hash.r.as_ref()); - comm.append(ctx.hash.s.as_ref()); - comm.append([ctx.hash.v].as_slice()); + rdata.extend_from_slice([SIG_LENGTH].as_slice()); + rdata.extend_from_slice(ctx.hash.r.as_ref()); + rdata.extend_from_slice(ctx.hash.s.as_ref()); + rdata.extend_from_slice([ctx.hash.v].as_slice()); display::show_status(true, ctx); } false => { @@ -231,12 +242,12 @@ fn handle_apdu(comm: &mut io::Comm, ins: &Ins, ctx: &mut Ctx) -> Result, ctx.hash.m_hash = crypto::tx_hash(&ctx.tx); match display::show_hash(ctx, true) { true => { - comm.append(ctx.hash.m_hash.value.as_ref()); + rdata.extend_from_slice(ctx.hash.m_hash.value.as_ref()); crypto::sign_hash(ctx).unwrap(); - comm.append([SIG_LENGTH].as_slice()); - comm.append(ctx.hash.r.as_ref()); - comm.append(ctx.hash.s.as_ref()); - comm.append([ctx.hash.v].as_slice()); + rdata.extend_from_slice([SIG_LENGTH].as_slice()); + rdata.extend_from_slice(ctx.hash.r.as_ref()); + rdata.extend_from_slice(ctx.hash.s.as_ref()); + rdata.extend_from_slice([ctx.hash.v].as_slice()); display::show_status(true, ctx); } false => { @@ -284,12 +295,12 @@ fn handle_apdu(comm: &mut io::Comm, ins: &Ins, ctx: &mut Ctx) -> Result, true => { display::show_pending(); ctx.hash.m_hash = crypto::tx_hash(&ctx.tx); - comm.append(ctx.hash.m_hash.value.as_ref()); + rdata.extend_from_slice(ctx.hash.m_hash.value.as_ref()); crypto::sign_hash(ctx).unwrap(); - comm.append([0x41].as_slice()); - comm.append(ctx.hash.r.as_ref()); - comm.append(ctx.hash.s.as_ref()); - comm.append([ctx.hash.v].as_slice()); + rdata.extend_from_slice([0x41].as_slice()); + rdata.extend_from_slice(ctx.hash.r.as_ref()); + rdata.extend_from_slice(ctx.hash.s.as_ref()); + rdata.extend_from_slice([ctx.hash.v].as_slice()); display::show_status(true, ctx); } false => { @@ -302,12 +313,12 @@ fn handle_apdu(comm: &mut io::Comm, ins: &Ins, ctx: &mut Ctx) -> Result, ctx.hash.m_hash = crypto::tx_hash(&ctx.tx); match display::show_hash(ctx, true) { true => { - comm.append(ctx.hash.m_hash.value.as_ref()); + rdata.extend_from_slice(ctx.hash.m_hash.value.as_ref()); crypto::sign_hash(ctx).unwrap(); - comm.append([0x41].as_slice()); - comm.append(ctx.hash.r.as_ref()); - comm.append(ctx.hash.s.as_ref()); - comm.append([ctx.hash.v].as_slice()); + rdata.extend_from_slice([0x41].as_slice()); + rdata.extend_from_slice(ctx.hash.r.as_ref()); + rdata.extend_from_slice(ctx.hash.s.as_ref()); + rdata.extend_from_slice([ctx.hash.v].as_slice()); display::show_status(true, ctx); } false => { @@ -375,5 +386,5 @@ fn handle_apdu(comm: &mut io::Comm, ins: &Ins, ctx: &mut Ctx) -> Result, } } } - Ok(()) + Ok(rdata) } diff --git a/tests/snapshots/flex/test_app_mainmenu/00001.png b/tests/snapshots/flex/test_app_mainmenu/00001.png index ae54aa8357a5653884d6ad7295d49250e71c6799..38aa87118501bd850d016d48d8735d0cc7839d1e 100644 GIT binary patch literal 7709 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 ZY&7D&CHwas;I%L0sBiFL^1-v${tLd#!D9db literal 7948 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 O0000j(ht0|8jOpnlRV*r70VL`#n z{{J;AL-(u^FIXb6_^VLev+WG2`pZ*XRgTR#_q_R4Q@|9(_<(tu>Qx#yE>|(uTAnhx zxnZr>r1g?}olLc_KA02wKJh=Nhi+uqQlavUTiag!y6BR>vp)SBYru<%p-Vr_d_U!Q z^o8$%eedkwdTxJO7}zk!uT(+)ZsgM!8Xqre03DHIyGGn#;rrVf{xfYFQL}hi7jUK!f^`YI`E5YHmSeK28bXNU>7ckkvNog(@{xR^hlV|^3#dy` z=E=%;SE6)H>l2Duu?N>weT4ltATG&#Rd(W*&9W_4eQTn(+ix-G8=&ZrkIc0V$p0KtHOp^0TePTW0|P0ATB3UBEzp-=_1H$qVSos=Eu-ap~?I zdE?@T*fDFY?ui?)hB+EA?_S%`1Pxd?ec3j^+f!??^at^JOJA}r&(@1g@o!f#@tz`g zX;$U4+$B|_CN=$=(F04|g)GhY99{|W0ssI2000000000000000mw5v)6~;Yy+rtz9 O0000*t#`hU6P(ZkYeN*2eJkkNbZ$KlhcI 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 Ang9R* delta 5030 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