bitbox02_rust/hal: add ui confirm/font
What changed, and why it matters
This commit is a routine internal code cleanup. It moves the definitions of confirmation-screen parameters and fonts out of the workflow layer and into the hardware-abstraction (HAL) layer, then updates all call sites to use the new names. There is no change to user-facing behavior, no bug fix, and no security vulnerability being addressed.
No security action required. Treat as normal refactoring; standard code review and CI testing are sufficient.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch refactors the Rust firmware’s UI abstraction. It introduces hal::ui::ConfirmParams and hal::ui::Font, replacing the previous workflow::confirm::Params re-export of bitbox02::ui::ConfirmParams. The HAL’s Ui::confirm trait method now takes the new HAL-local type. A conversion function maps the HAL type to the underlying bitbox02::ui::ConfirmParams in the real implementation, and the testing mock records the new type. All call sites across backup, Bitcoin, Cardano, Ethereum, system, and workflow modules are updated to import and use ConfirmParams from crate::hal::ui. The old workflow/confirm.rs re-export module is deleted. Exhaustive unit tests for font and confirm-params mapping are added.
Changed components
src/rust/bitbox02-rust/src/hal/bitbox02/ui.rssrc/rust/bitbox02-rust/src/hal/testing/ui.rssrc/rust/bitbox02-rust/src/hal/ui.rssrc/rust/bitbox02-rust/src/hww/api/backup.rssrc/rust/bitbox02-rust/src/hww/api/bip85.rssrc/rust/bitbox02-rust/src/hww/api/bitcoin.rssrc/rust/bitbox02-rust/src/hww/api/bitcoin/multisig.rssrc/rust/bitbox02-rust/src/hww/api/bitcoin/payment_request.rssrc/rust/bitbox02-rust/src/hww/api/bitcoin/policies.rssrc/rust/bitbox02-rust/src/hww/api/bitcoin/registration.rssrc/rust/bitbox02-rust/src/hww/api/bitcoin/signmsg.rssrc/rust/bitbox02-rust/src/hww/api/bitcoin/signtx.rssrc/rust/bitbox02-rust/src/hww/api/bluetooth.rssrc/rust/bitbox02-rust/src/hww/api/cardano/address.rssrc/rust/bitbox02-rust/src/hww/api/cardano/sign_transaction.rssrc/rust/bitbox02-rust/src/hww/api/cardano/sign_transaction/certificates.rssrc/rust/bitbox02-rust/src/hww/api/change_password.rssrc/rust/bitbox02-rust/src/hww/api/ethereum/keypath.rssrc/rust/bitbox02-rust/src/hww/api/ethereum/params.rssrc/rust/bitbox02-rust/src/hww/api/ethereum/pubrequest.rssrc/rust/bitbox02-rust/src/hww/api/ethereum/sign.rssrc/rust/bitbox02-rust/src/hww/api/ethereum/sign_typed_msg.rssrc/rust/bitbox02-rust/src/hww/api/reset.rssrc/rust/bitbox02-rust/src/hww/api/restore.rssrc/rust/bitbox02-rust/src/hww/api/set_device_name.rssrc/rust/bitbox02-rust/src/hww/api/set_mnemonic_passphrase_enabled.rssrc/rust/bitbox02-rust/src/hww/api/show_mnemonic.rssrc/rust/bitbox02-rust/src/hww/api/system.rssrc/rust/bitbox02-rust/src/hww/noise.rssrc/rust/bitbox02-rust/src/workflow.rssrc/rust/bitbox02-rust/src/workflow/confirm.rssrc/rust/bitbox02-rust/src/workflow/mnemonic.rssrc/rust/bitbox02-rust/src/workflow/pairing.rssrc/rust/bitbox02-rust/src/workflow/password.rssrc/rust/bitbox02-rust/src/workflow/transaction.rssrc/rust/bitbox02-rust/src/workflow/u2f_c_api.rssrc/rust/bitbox02-rust/src/workflow/unlock.rssrc/rust/bitbox02-rust/src/workflow/verify_message.rsInspect captured patch +239 / −130
diff --git a/src/rust/bitbox02-rust/src/hal/bitbox02/ui.rs b/src/rust/bitbox02-rust/src/hal/bitbox02/ui.rs
index 30379cd..7f19aa4 100644
--- a/src/rust/bitbox02-rust/src/hal/bitbox02/ui.rs
+++ b/src/rust/bitbox02-rust/src/hal/bitbox02/ui.rs
@@ -3,15 +3,40 @@
use alloc::string::String;
use crate::hal::Ui;
-use crate::hal::ui::UserAbort;
-use crate::workflow::{confirm, trinary_input_string};
+use crate::hal::ui::{ConfirmParams, Font, UserAbort};
+use crate::workflow::trinary_input_string;
pub struct BitBox02Ui;
+fn to_bitbox02_font(font: Font) -> bitbox02::ui::Font {
+ match font {
+ Font::Default => bitbox02::ui::Font::Default,
+ Font::Password11X12 => bitbox02::ui::Font::Password11X12,
+ Font::Monogram5X9 => bitbox02::ui::Font::Monogram5X9,
+ }
+}
+
+fn to_bitbox02_confirm_params<'a>(
+ params: &'a ConfirmParams<'a>,
+) -> bitbox02::ui::ConfirmParams<'a> {
+ bitbox02::ui::ConfirmParams {
+ title: params.title,
+ title_autowrap: params.title_autowrap,
+ body: params.body,
+ font: to_bitbox02_font(params.font),
+ scrollable: params.scrollable,
+ longtouch: params.longtouch,
+ accept_only: params.accept_only,
+ accept_is_nextarrow: params.accept_is_nextarrow,
+ display_size: params.display_size,
+ }
+}
+
impl Ui for BitBox02Ui {
#[inline(always)]
- async fn confirm(&mut self, params: &confirm::Params<'_>) -> Result<(), UserAbort> {
- match bitbox02::ui::confirm(params).await {
+ async fn confirm(&mut self, params: &ConfirmParams<'_>) -> Result<(), UserAbort> {
+ let params = to_bitbox02_confirm_params(params);
+ match bitbox02::ui::confirm(¶ms).await {
bitbox02::ui::ConfirmResponse::Approved => Ok(()),
bitbox02::ui::ConfirmResponse::Cancelled => Err(UserAbort),
}
@@ -127,3 +152,52 @@ impl Ui for BitBox02Ui {
}
}
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_to_bitbox02_font() {
+ let cases = [
+ (Font::Default, bitbox02::ui::Font::Default),
+ (Font::Password11X12, bitbox02::ui::Font::Password11X12),
+ (Font::Monogram5X9, bitbox02::ui::Font::Monogram5X9),
+ ];
+ for (input, expected) in cases {
+ assert_eq!(to_bitbox02_font(input) as i32, expected as i32);
+ }
+ }
+
+ #[test]
+ fn test_to_bitbox02_confirm_params() {
+ let fonts = [
+ (Font::Default, bitbox02::ui::Font::Default),
+ (Font::Password11X12, bitbox02::ui::Font::Password11X12),
+ (Font::Monogram5X9, bitbox02::ui::Font::Monogram5X9),
+ ];
+ for (font, expected_font) in fonts {
+ let input = ConfirmParams {
+ title: "title",
+ title_autowrap: true,
+ body: "body",
+ font,
+ scrollable: true,
+ longtouch: true,
+ accept_only: true,
+ accept_is_nextarrow: true,
+ display_size: 42,
+ };
+ let output = to_bitbox02_confirm_params(&input);
+ assert_eq!(output.title, "title");
+ assert!(output.title_autowrap);
+ assert_eq!(output.body, "body");
+ assert_eq!(output.font as i32, expected_font as i32);
+ assert!(output.scrollable);
+ assert!(output.longtouch);
+ assert!(output.accept_only);
+ assert!(output.accept_is_nextarrow);
+ assert_eq!(output.display_size, 42);
+ }
+ }
+}
diff --git a/src/rust/bitbox02-rust/src/hal/testing/ui.rs b/src/rust/bitbox02-rust/src/hal/testing/ui.rs
index 7e1461c..1c352fb 100644
--- a/src/rust/bitbox02-rust/src/hal/testing/ui.rs
+++ b/src/rust/bitbox02-rust/src/hal/testing/ui.rs
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: Apache-2.0
use crate::hal::Ui;
-use crate::hal::ui::UserAbort;
-use crate::workflow::{confirm, trinary_input_string};
+use crate::hal::ui::{ConfirmParams, UserAbort};
+use crate::workflow::trinary_input_string;
use alloc::boxed::Box;
use alloc::string::String;
@@ -48,7 +48,7 @@ pub struct TestingUi<'a> {
}
impl Ui for TestingUi<'_> {
- async fn confirm(&mut self, params: &confirm::Params<'_>) -> Result<(), UserAbort> {
+ async fn confirm(&mut self, params: &ConfirmParams<'_>) -> Result<(), UserAbort> {
self.screens.push(Screen::Confirm {
title: params.title.into(),
body: params.body.into(),
diff --git a/src/rust/bitbox02-rust/src/hal/ui.rs b/src/rust/bitbox02-rust/src/hal/ui.rs
index 53dbe3c..abdb9bf 100644
--- a/src/rust/bitbox02-rust/src/hal/ui.rs
+++ b/src/rust/bitbox02-rust/src/hal/ui.rs
@@ -1,15 +1,44 @@
// SPDX-License-Identifier: Apache-2.0
-use crate::workflow::{confirm, mnemonic, trinary_input_string};
+use crate::workflow::{mnemonic, trinary_input_string};
use alloc::string::String;
pub struct UserAbort;
+#[derive(Copy, Clone, Default)]
+pub enum Font {
+ #[default]
+ Default,
+ Password11X12,
+ Monogram5X9,
+}
+
+#[derive(Default)]
+pub struct ConfirmParams<'a> {
+ /// The confirmation title of the screen. Max 200 chars, otherwise **panic**.
+ pub title: &'a str,
+ pub title_autowrap: bool,
+ /// The confirmation body of the screen. Max 200 chars, otherwise **panic**.
+ pub body: &'a str,
+ pub font: Font,
+ /// If true, the body is horizontally scrollable.
+ pub scrollable: bool,
+ /// If true, require the hold gesture to confirm instead of tap.
+ pub longtouch: bool,
+ /// If true, the user can only confirm, not reject.
+ pub accept_only: bool,
+ /// if true, the accept icon is a right arrow instead of a checkmark (indicating going to the
+ /// "next" screen).
+ pub accept_is_nextarrow: bool,
+ /// Print the value of this variable in the corner. Will not print when 0
+ pub display_size: usize,
+}
+
#[allow(async_fn_in_trait)]
pub trait Ui {
/// Returns `Ok(())` if the user accepts, `Err(UserAbort)` if the user rejects.
- async fn confirm(&mut self, params: &confirm::Params<'_>) -> Result<(), UserAbort>;
+ async fn confirm(&mut self, params: &ConfirmParams<'_>) -> Result<(), UserAbort>;
async fn verify_recipient(&mut self, recipient: &str, amount: &str) -> Result<(), UserAbort>;
diff --git a/src/rust/bitbox02-rust/src/hww/api/backup.rs b/src/rust/bitbox02-rust/src/hww/api/backup.rs
index 550e7e1..542dab3 100644
--- a/src/rust/bitbox02-rust/src/hww/api/backup.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/backup.rs
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: Apache-2.0
use super::Error;
+use crate::hal::ui::ConfirmParams;
use crate::pb;
use alloc::vec::Vec;
@@ -8,7 +9,7 @@ use pb::response::Response;
use crate::backup;
use crate::hal::{Memory, Sd, Ui};
-use crate::workflow::{confirm, unlock};
+use crate::workflow::unlock;
pub async fn check(
hal: &mut impl crate::hal::Hal,
@@ -29,7 +30,7 @@ pub async fn check(
}
if !silent {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Name?",
body: &metadata.name,
scrollable: true,
@@ -39,7 +40,7 @@ pub async fn check(
.await?;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "ID?",
body: &id,
scrollable: true,
@@ -68,7 +69,7 @@ pub async fn create(
}: &pb::CreateBackupRequest,
) -> Result<Response, Error> {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Is today?",
body: &util::datetime::format_datetime(timestamp, timezone_offset, true)
.map_err(|_| Error::InvalidInput)?,
diff --git a/src/rust/bitbox02-rust/src/hww/api/bip85.rs b/src/rust/bitbox02-rust/src/hww/api/bip85.rs
index fe3db2b..4b13884 100644
--- a/src/rust/bitbox02-rust/src/hww/api/bip85.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/bip85.rs
@@ -2,11 +2,11 @@
use super::Error;
use super::pb;
+use crate::hal::ui::ConfirmParams;
use pb::response::Response;
use crate::hal::Ui;
-use crate::workflow::confirm;
use crate::keystore;
@@ -35,7 +35,7 @@ async fn process_bip39(hal: &mut impl crate::hal::Hal) -> Result<(), Error> {
use bitbox02::ui::TrinaryChoice;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "BIP-85",
body: "Derive BIP-39\nmnemonic?",
accept_is_nextarrow: true,
@@ -44,7 +44,7 @@ async fn process_bip39(hal: &mut impl crate::hal::Hal) -> Result<(), Error> {
.await?;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "BIP-85",
body: "This is an advanced feature. Proceed only if you know what you are doing.",
scrollable: true,
@@ -100,7 +100,7 @@ async fn process_bip39(hal: &mut impl crate::hal::Hal) -> Result<(), Error> {
hal.ui().status(&format!("Index: {}", index), true).await;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Keypath",
body: &format!("m/83696968'/39'/0'/{}'/{}'", num_words, index),
scrollable: true,
@@ -134,7 +134,7 @@ async fn process_ln(
return Err(Error::InvalidInput);
}
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "",
body: "Create\nLightning wallet\non host device?",
longtouch: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/bitcoin.rs b/src/rust/bitbox02-rust/src/hww/api/bitcoin.rs
index 23f6d3f..1e394b7 100644
--- a/src/rust/bitbox02-rust/src/hww/api/bitcoin.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/bitcoin.rs
@@ -1,5 +1,6 @@
// SPDX-License-Identifier: Apache-2.0
+use crate::hal::ui::ConfirmParams;
#[cfg(not(feature = "app-bitcoin"))]
compile_error!("Bitcoin code is being compiled even though the app-bitcoin feature is not enabled");
@@ -22,7 +23,6 @@ use super::Error;
use super::pb;
use crate::hal::Ui;
-use crate::workflow::confirm;
use util::bip32::HARDENED;
@@ -102,7 +102,7 @@ async fn xpub(
if is_unusual {
// For unusual keypaths, we allow export after a confirmation.
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: if display { "xpub" } else { "Export xpub" },
body: &format!(
"Warning: unusual keypath {}. Proceed only if you know what you are doing.",
@@ -126,7 +126,7 @@ async fn xpub(
format!("{}\naccount #{}", params.name, keypath[2] - HARDENED + 1)
};
- let confirm_params = confirm::Params {
+ let confirm_params = ConfirmParams {
title: &title,
body: &xpub,
scrollable: true,
@@ -172,7 +172,7 @@ async fn address_simple(
) -> Result<Response, Error> {
let address = derive_address_simple(hal, coin, simple_type, keypath)?;
if display {
- let confirm_params = confirm::Params {
+ let confirm_params = ConfirmParams {
title: params::get(coin).name,
body: &address,
scrollable: true,
@@ -213,7 +213,7 @@ pub async fn address_multisig(
.address(coin_params)?;
if display {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title,
body: &address,
scrollable: true,
@@ -253,7 +253,7 @@ async fn address_policy(
common::Payload::from_policy(coin_params, &parsed, keypath)?.address(coin_params)?;
if display {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title,
body: &address,
scrollable: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/bitcoin/multisig.rs b/src/rust/bitbox02-rust/src/hww/api/bitcoin/multisig.rs
index b1c943d..93c408f 100644
--- a/src/rust/bitbox02-rust/src/hww/api/bitcoin/multisig.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/bitcoin/multisig.rs
@@ -3,6 +3,7 @@
use super::Error;
use super::params::Params;
use super::pb;
+use crate::hal::ui::ConfirmParams;
use pb::BtcCoin;
use pb::btc_register_script_config_request::XPubType;
@@ -11,7 +12,6 @@ use pb::btc_script_config::{Multisig, multisig::ScriptType};
use crate::bip32;
use crate::hal::{Memory, Ui};
-use crate::workflow::confirm;
use alloc::string::String;
use alloc::vec::Vec;
@@ -128,7 +128,7 @@ pub async fn confirm(
multisig: &Multisig,
) -> Result<(), Error> {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title,
body: &format!(
"{}-of-{}\n{} multisig",
@@ -141,7 +141,7 @@ pub async fn confirm(
})
.await?;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title,
body: name,
scrollable: true,
@@ -177,7 +177,7 @@ pub async fn confirm_extended(
confirm(hal, title, params, name, multisig).await?;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title,
body: &format!(
"{}\nat\n{}",
@@ -215,7 +215,7 @@ pub async fn confirm_extended(
.serialize_str(output_xpub_type)
.or(Err(Error::InvalidInput))?;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title,
body: (if i == multisig.our_xpub_index as usize {
format!(
diff --git a/src/rust/bitbox02-rust/src/hww/api/bitcoin/payment_request.rs b/src/rust/bitbox02-rust/src/hww/api/bitcoin/payment_request.rs
index 2fa1037..e51e35e 100644
--- a/src/rust/bitbox02-rust/src/hww/api/bitcoin/payment_request.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/bitcoin/payment_request.rs
@@ -2,6 +2,7 @@
use super::Error;
use super::pb;
+use crate::hal::ui::ConfirmParams;
use alloc::vec::Vec;
@@ -14,7 +15,7 @@ use pb::btc_sign_init_request::FormatUnit;
use crate::hal::Ui;
use crate::secp256k1::SECP256K1;
-use crate::workflow::{confirm, verify_message};
+use crate::workflow::verify_message;
use sha2::{Digest, Sha256};
@@ -73,7 +74,7 @@ pub async fn user_verify(
return Err(Error::InvalidInput);
}
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "",
body: &format!("Memo from\n\n{}", payment_request.recipient_name),
accept_is_nextarrow: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/bitcoin/policies.rs b/src/rust/bitbox02-rust/src/hww/api/bitcoin/policies.rs
index 57fbbfe..0fe280f 100644
--- a/src/rust/bitbox02-rust/src/hww/api/bitcoin/policies.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/bitcoin/policies.rs
@@ -3,6 +3,7 @@
use super::Error;
use super::params::Params;
use super::pb;
+use crate::hal::ui::ConfirmParams;
use pb::BtcCoin;
use pb::btc_script_config::Policy;
@@ -16,7 +17,6 @@ use util::bip32::HARDENED;
use crate::bip32;
use crate::hal::{Memory, Ui};
-use crate::workflow::confirm;
use crate::xpubcache::Bip32XpubCache;
use bitcoin::taproot::{LeafVersion, TapLeafHash, TapTweakHash};
@@ -385,7 +385,7 @@ impl ParsedPolicy<'_> {
) -> Result<(), Error> {
let policy = self.policy;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title,
body: &format!("{}\npolicy with\n{} keys", params.name, policy.keys.len(),),
accept_is_nextarrow: true,
@@ -394,7 +394,7 @@ impl ParsedPolicy<'_> {
.await?;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Name",
body: name,
scrollable: true,
@@ -406,7 +406,7 @@ impl ParsedPolicy<'_> {
if matches!(mode, Mode::Basic) {
if let Err(crate::hal::ui::UserAbort) = hal
.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
body: "Show policy\ndetails?",
accept_is_nextarrow: true,
..Default::default()
@@ -418,7 +418,7 @@ impl ParsedPolicy<'_> {
}
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Policy",
body: &policy.policy,
scrollable: true,
@@ -466,7 +466,7 @@ impl ParsedPolicy<'_> {
key_str = format!("Provably unspendable: {}", key_str)
}
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: &format!("Key {}/{}", i + 1, num_keys),
body: key_str.as_str(),
scrollable: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/bitcoin/registration.rs b/src/rust/bitbox02-rust/src/hww/api/bitcoin/registration.rs
index af75115..f68520b 100644
--- a/src/rust/bitbox02-rust/src/hww/api/bitcoin/registration.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/bitcoin/registration.rs
@@ -3,6 +3,7 @@
use super::Error;
use super::params;
use super::pb;
+use crate::hal::ui::ConfirmParams;
use alloc::string::String;
@@ -14,7 +15,7 @@ use pb::btc_script_config::Config;
use super::multisig::SortXpubs;
use crate::hal::{Memory, Ui};
-use crate::workflow::{confirm, trinary_input_string};
+use crate::workflow::trinary_input_string;
pub fn process_is_script_config_registered(
hal: &mut impl crate::hal::Hal,
@@ -63,7 +64,7 @@ async fn get_name(
) -> Result<String, Error> {
let name = if request.name.is_empty() {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Register",
body: "Please name this\naccount",
accept_is_nextarrow: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/bitcoin/signmsg.rs b/src/rust/bitbox02-rust/src/hww/api/bitcoin/signmsg.rs
index 9b60184..c2b9d8e 100644
--- a/src/rust/bitbox02-rust/src/hww/api/bitcoin/signmsg.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/bitcoin/signmsg.rs
@@ -1,5 +1,6 @@
// SPDX-License-Identifier: Apache-2.0
+use crate::hal::ui::ConfirmParams;
use alloc::vec::Vec;
use sha2::{Digest, Sha256};
@@ -15,7 +16,7 @@ use pb::btc_response::Response;
use crate::keystore;
use crate::hal::Ui;
-use crate::workflow::{confirm, verify_message};
+use crate::workflow::verify_message;
const MAX_MESSAGE_SIZE: usize = 1024;
@@ -52,7 +53,7 @@ pub async fn process(
let address = super::derive_address_simple(hal, coin, simple_type, keypath)?;
let basic_info = format!("Coin: {}", super::params::get(coin).name);
- let confirm_params = confirm::Params {
+ let confirm_params = ConfirmParams {
title: "Sign message",
body: &basic_info,
accept_is_nextarrow: true,
@@ -60,7 +61,7 @@ pub async fn process(
};
hal.ui().confirm(&confirm_params).await?;
- let confirm_params = confirm::Params {
+ let confirm_params = ConfirmParams {
title: "Address",
body: &address,
scrollable: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/bitcoin/signtx.rs b/src/rust/bitbox02-rust/src/hww/api/bitcoin/signtx.rs
index 46e44aa..8a39a7e 100644
--- a/src/rust/bitbox02-rust/src/hww/api/bitcoin/signtx.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/bitcoin/signtx.rs
@@ -2,6 +2,7 @@
use super::Error;
use super::pb;
+use crate::hal::ui::ConfirmParams;
use super::common::format_amount;
use super::payment_request;
@@ -12,7 +13,7 @@ use super::{bip143, bip341, common, keypath};
use crate::hal::Ui;
use crate::secp256k1::SECP256K1;
-use crate::workflow::{confirm, transaction};
+use crate::workflow::transaction;
use crate::xpubcache::{Bip32XpubCache, Compute};
use alloc::string::String;
@@ -1047,7 +1048,7 @@ async fn _process(
if num_changes > 1 {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Warning",
body: &format!("There are {}\nchange outputs.\nProceed?", num_changes),
accept_is_nextarrow: true,
@@ -1066,7 +1067,7 @@ async fn _process(
// The RBF nsequence bytes are often set in conjunction with a locktime,
// so verify both simultaneously.
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
body: &format!(
"Locktime on block:\n{}\n{}",
request.locktime,
diff --git a/src/rust/bitbox02-rust/src/hww/api/bluetooth.rs b/src/rust/bitbox02-rust/src/hww/api/bluetooth.rs
index 3538c4d..4e31343 100644
--- a/src/rust/bitbox02-rust/src/hww/api/bluetooth.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/bluetooth.rs
@@ -2,6 +2,7 @@
use super::Error;
use super::pb;
+use crate::hal::ui::ConfirmParams;
use hex_lit::hex;
@@ -11,7 +12,6 @@ use pb::bluetooth_response::Response;
use sha2::{Digest, Sha256};
use crate::hal::{Memory, Ui, memory as hal_memory};
-use crate::workflow::confirm;
use alloc::vec::Vec;
@@ -143,7 +143,7 @@ async fn process_upgrade(
}
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Bluetooth",
body: "Upgrade\nfirmware?",
longtouch: true,
@@ -177,7 +177,7 @@ async fn process_toggle_enabled(hal: &mut impl crate::hal::Hal) -> Result<Respon
};
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
body,
longtouch: true,
..Default::default()
diff --git a/src/rust/bitbox02-rust/src/hww/api/cardano/address.rs b/src/rust/bitbox02-rust/src/hww/api/cardano/address.rs
index 343f0d0..ade0a7d 100644
--- a/src/rust/bitbox02-rust/src/hww/api/cardano/address.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/cardano/address.rs
@@ -2,12 +2,12 @@
use super::Error;
use super::pb;
+use crate::hal::ui::ConfirmParams;
use alloc::string::String;
use alloc::vec::Vec;
use crate::hal::Ui;
-use crate::workflow::confirm;
use pb::CardanoNetwork;
use pb::cardano_response::Response;
@@ -377,7 +377,7 @@ pub async fn process(
if request.display {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: params.name,
body: &encoded_address,
scrollable: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/cardano/sign_transaction.rs b/src/rust/bitbox02-rust/src/hww/api/cardano/sign_transaction.rs
index 37c9c38..66b89aa 100644
--- a/src/rust/bitbox02-rust/src/hww/api/cardano/sign_transaction.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/cardano/sign_transaction.rs
@@ -1,5 +1,6 @@
// SPDX-License-Identifier: Apache-2.0
+use crate::hal::ui::ConfirmParams;
mod cbor;
mod certificates;
@@ -17,7 +18,7 @@ use blake2::{
};
use crate::hal::Ui;
-use crate::workflow::{confirm, transaction};
+use crate::workflow::transaction;
use pb::cardano_response::Response;
use pb::cardano_sign_transaction_response::ShelleyWitness;
@@ -73,7 +74,7 @@ async fn verify_slot(
let epoch = SHELLEY_START_EPOCH + (slot - SHELLEY_START_SLOT) / SHELLEY_SLOTS_IN_EPOCH;
let slot_in_epoch = (slot - SHELLEY_START_SLOT) % SHELLEY_SLOTS_IN_EPOCH;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: params.name,
body: &format!("{}\nslot {} in\nepoch {}", title, slot_in_epoch, epoch),
accept_is_nextarrow: true,
@@ -158,7 +159,7 @@ async fn _process(
|| (ttl_present && request.ttl < SHELLEY_START_SLOT);
if cannot_be_mined {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: params.name,
body: "Transaction\ncannot be\nmined",
accept_is_nextarrow: true,
@@ -196,7 +197,7 @@ async fn _process(
}
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: params.name,
body: &format!(
"Withdraw {} in staking rewards for account #{}?",
@@ -246,7 +247,7 @@ async fn _process(
for asset_group in output.asset_groups.iter() {
for token in asset_group.tokens.iter() {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Send token",
body: &format!(
"Amount: {}. Asset: {}",
@@ -266,7 +267,7 @@ async fn _process(
if total == 0 {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: params.name,
body: &format!("Fee\n{}", format_value(params, request.fee)),
longtouch: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/cardano/sign_transaction/certificates.rs b/src/rust/bitbox02-rust/src/hww/api/cardano/sign_transaction/certificates.rs
index 682af23..5c2420a 100644
--- a/src/rust/bitbox02-rust/src/hww/api/cardano/sign_transaction/certificates.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/cardano/sign_transaction/certificates.rs
@@ -4,6 +4,7 @@ use super::super::Error;
use super::super::keypath::validate_address_shelley_stake;
use super::super::params;
use super::super::pb;
+use crate::hal::ui::ConfirmParams;
use alloc::vec::Vec;
@@ -13,7 +14,6 @@ use pb::cardano_sign_transaction_request::{
};
use crate::hal::Ui;
-use crate::workflow::confirm;
use util::bip32::HARDENED;
pub async fn verify<'a>(
@@ -31,7 +31,7 @@ pub async fn verify<'a>(
signing_keypaths.push(keypath);
// 2 ADA will be deposited and refunded once delegation stops, independent of the staking rewards.
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: params.name,
body: &format!(
"Register staking key for account #{}?",
@@ -48,7 +48,7 @@ pub async fn verify<'a>(
signing_keypaths.push(keypath);
// 2 ADA will be refunded back, independent of the staking rewards.
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: params.name,
body: &format!(
"Stop stake delegation for account #{}?",
@@ -67,7 +67,7 @@ pub async fn verify<'a>(
validate_address_shelley_stake(keypath, Some(bip44_account))?;
signing_keypaths.push(keypath);
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: params.name,
body: &format!(
"Delegate staking for account #{} to pool {}?",
@@ -101,7 +101,7 @@ pub async fn verify<'a>(
match drep_credhash {
Some(hash) => {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: params.name,
body: &format!(
"Delegate voting for account #{} to type {} and drep {}?",
@@ -117,7 +117,7 @@ pub async fn verify<'a>(
}
None => {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: params.name,
body: &format!(
"Delegate voting for account #{} to type {}?",
diff --git a/src/rust/bitbox02-rust/src/hww/api/change_password.rs b/src/rust/bitbox02-rust/src/hww/api/change_password.rs
index 26e92bb..ab47f9f 100644
--- a/src/rust/bitbox02-rust/src/hww/api/change_password.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/change_password.rs
@@ -1,18 +1,19 @@
// SPDX-License-Identifier: Apache-2.0
use super::Error;
+use crate::hal::ui::ConfirmParams;
use crate::pb;
use pb::response::Response;
use crate::hal::Ui;
use crate::keystore;
-use crate::workflow::{confirm, password, unlock};
+use crate::workflow::{password, unlock};
pub async fn process(hal: &mut impl crate::hal::Hal) -> Result<Response, Error> {
// Process confirmation and instruction for user
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "",
body: "Proceed to\nchange password?",
accept_is_nextarrow: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/ethereum/keypath.rs b/src/rust/bitbox02-rust/src/hww/api/ethereum/keypath.rs
index a7126a3..a9a5ced 100644
--- a/src/rust/bitbox02-rust/src/hww/api/ethereum/keypath.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/ethereum/keypath.rs
@@ -3,7 +3,7 @@
use super::Error;
use super::params::Params;
use crate::hal::Ui;
-use crate::workflow::confirm;
+use crate::hal::ui::ConfirmParams;
use util::bip32::HARDENED;
const ACCOUNT_MAX: u32 = 99; // 100 accounts
@@ -33,7 +33,7 @@ pub async fn warn_unusual_keypath(
);
return Ok(hal
.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title,
body: &body,
title_autowrap: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/ethereum/params.rs b/src/rust/bitbox02-rust/src/hww/api/ethereum/params.rs
index 80fa77b..702a7e9 100644
--- a/src/rust/bitbox02-rust/src/hww/api/ethereum/params.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/ethereum/params.rs
@@ -2,10 +2,10 @@
use super::Error;
use super::pb;
+use crate::hal::ui::ConfirmParams;
use pb::EthCoin;
use crate::hal::Ui;
-use crate::workflow::confirm;
use util::bip32::HARDENED;
@@ -139,7 +139,7 @@ pub async fn get_and_warn_unknown(
Err(Error::InvalidInput)
} else {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Warning",
body: &format!("Unknown network\nwith chain ID:\n{}", chain_id),
accept_is_nextarrow: true,
@@ -147,7 +147,7 @@ pub async fn get_and_warn_unknown(
})
.await?;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Warning",
body: "Only proceed if\nyou recognize\nthis chain ID.",
accept_is_nextarrow: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/ethereum/pubrequest.rs b/src/rust/bitbox02-rust/src/hww/api/ethereum/pubrequest.rs
index d873496..95b2870 100644
--- a/src/rust/bitbox02-rust/src/hww/api/ethereum/pubrequest.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/ethereum/pubrequest.rs
@@ -2,6 +2,7 @@
use super::Error;
use super::pb;
+use crate::hal::ui::ConfirmParams;
use pb::eth_pub_request::OutputType;
use pb::eth_response::Response;
@@ -9,7 +10,6 @@ use pb::eth_response::Response;
use crate::bip32;
use crate::hal::Ui;
use crate::keystore;
-use crate::workflow::confirm;
async fn process_address(
hal: &mut impl crate::hal::Hal,
@@ -45,7 +45,7 @@ async fn process_address(
};
super::keypath::warn_unusual_keypath(hal, ¶ms, &title, &request.keypath).await?;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: &title,
title_autowrap: true,
body: &address,
diff --git a/src/rust/bitbox02-rust/src/hww/api/ethereum/sign.rs b/src/rust/bitbox02-rust/src/hww/api/ethereum/sign.rs
index a016365..40b6392 100644
--- a/src/rust/bitbox02-rust/src/hww/api/ethereum/sign.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/ethereum/sign.rs
@@ -4,11 +4,12 @@ use super::Error;
use super::amount::{Amount, calculate_percentage};
use super::params::Params;
use super::pb;
+use crate::hal::ui::ConfirmParams;
use crate::keystore;
use crate::hal::Ui;
-use crate::workflow::{confirm, transaction};
+use crate::workflow::transaction;
use alloc::vec::Vec;
use pb::eth_response::Response;
@@ -259,7 +260,7 @@ async fn verify_standard_transaction(
if !request.data().is_empty() || data_length > 0 {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Unknown\ncontract",
body: if data_length > 0 {
"You are signing a\ncontract interaction\nwith large data."
@@ -271,7 +272,7 @@ async fn verify_standard_transaction(
})
.await?;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Unknown\ncontract",
body: if data_length > 0 {
"Only proceed if you\nfully understand\nthe risks involved."
@@ -286,7 +287,7 @@ async fn verify_standard_transaction(
if data_length > 0 {
// Streaming mode: data is too large to display, show size instead
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Transaction\ndata",
body: &alloc::format!("{} bytes\n(too large to\ndisplay)", data_length),
accept_is_nextarrow: true,
@@ -296,7 +297,7 @@ async fn verify_standard_transaction(
} else {
// Nonstreaming mode: show hex data
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Transaction\ndata",
body: &hex::encode(request.data()),
scrollable: true,
@@ -345,7 +346,7 @@ pub async fn _process(
// Show chain confirmation only for known networks
if super::params::is_known_network(request.coin()?, request.chain_id()) {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
body: &format!("Sign transaction on\n\n{}", params.name),
accept_is_nextarrow: true,
..Default::default()
diff --git a/src/rust/bitbox02-rust/src/hww/api/ethereum/sign_typed_msg.rs b/src/rust/bitbox02-rust/src/hww/api/ethereum/sign_typed_msg.rs
index f17fcb8..ab6ff0f 100644
--- a/src/rust/bitbox02-rust/src/hww/api/ethereum/sign_typed_msg.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/ethereum/sign_typed_msg.rs
@@ -11,8 +11,8 @@ use super::Error;
use super::pb;
use crate::hal::Ui;
+use crate::hal::ui::ConfirmParams;
use crate::keystore;
-use crate::workflow::confirm;
use pb::eth_request::Request;
use pb::eth_response::Response;
@@ -305,7 +305,7 @@ async fn encode_member<U: sha3::digest::Update>(
let lines: Vec<&str> = value_formatted.split('\n').collect();
for (i, &line) in lines.iter().enumerate() {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: &format!(
"{}{}",
confirm_title(root_object),
@@ -351,7 +351,7 @@ async fn hash_array(
let array_type = member_type.array_type.as_ref().ok_or(Error::InvalidInput)?;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: &format!(
"{}{}",
confirm_title(root_object),
@@ -541,7 +541,7 @@ pub async fn process(
let sighash: [u8; 32] = eip712_sighash(hal, &request.types, &request.primary_type).await?;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
body: "Sign data?",
longtouch: true,
..Default::default()
diff --git a/src/rust/bitbox02-rust/src/hww/api/reset.rs b/src/rust/bitbox02-rust/src/hww/api/reset.rs
index 1d506c9..5a3d0b4 100644
--- a/src/rust/bitbox02-rust/src/hww/api/reset.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/reset.rs
@@ -1,15 +1,15 @@
// SPDX-License-Identifier: Apache-2.0
use super::Error;
+use crate::hal::ui::ConfirmParams;
use crate::pb;
use pb::response::Response;
use crate::hal::Ui;
-use crate::workflow::confirm;
pub async fn process(hal: &mut impl crate::hal::Hal) -> Result<Response, Error> {
- let params = confirm::Params {
+ let params = ConfirmParams {
title: "RESET",
body: "Proceed to\nfactory reset?",
longtouch: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/restore.rs b/src/rust/bitbox02-rust/src/hww/api/restore.rs
index 6ba33f7..96678f8 100644
--- a/src/rust/bitbox02-rust/src/hww/api/restore.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/restore.rs
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: Apache-2.0
use super::Error;
+use crate::hal::ui::ConfirmParams;
use crate::pb;
use pb::response::Response;
@@ -8,7 +9,7 @@ use pb::response::Response;
#[cfg(feature = "app-u2f")]
use crate::hal::SecureChip;
use crate::hal::{Memory, Ui};
-use crate::workflow::{confirm, password, unlock};
+use crate::workflow::{password, unlock};
pub async fn from_file(
hal: &mut impl crate::hal::Hal,
@@ -16,7 +17,7 @@ pub async fn from_file(
) -> Result<Response, Error> {
// This is a separate screen because 'Restore backup?' does not fit in the title field.
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
body: "Restore backup?",
accept_is_nextarrow: true,
..Default::default()
@@ -32,7 +33,7 @@ pub async fn from_file(
};
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
body: &format!("Name: {}. ID: {}", &metadata.name, &request.id),
scrollable: true,
accept_is_nextarrow: true,
@@ -45,7 +46,7 @@ pub async fn from_file(
let datetime_string =
util::datetime::format_datetime(request.timestamp, request.timezone_offset, false)
.map_err(|_| Error::InvalidInput)?;
- let params = confirm::Params {
+ let params = ConfirmParams {
title: "Is now?",
body: &datetime_string,
accept_is_nextarrow: true,
@@ -95,7 +96,7 @@ pub async fn from_mnemonic(
let datetime_string = util::datetime::format_datetime(timestamp, timezone_offset, false)
.map_err(|_| Error::InvalidInput)?;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Is now?",
body: &datetime_string,
accept_is_nextarrow: true,
@@ -120,7 +121,7 @@ pub async fn from_mnemonic(
match password::enter_twice(hal).await {
Err(password::EnterTwiceError::DoNotMatch) => {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "",
body: "Passwords\ndo not match.\nTry again?",
..Default::default()
diff --git a/src/rust/bitbox02-rust/src/hww/api/set_device_name.rs b/src/rust/bitbox02-rust/src/hww/api/set_device_name.rs
index 2fa6973..1e0bc89 100644
--- a/src/rust/bitbox02-rust/src/hww/api/set_device_name.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/set_device_name.rs
@@ -1,12 +1,12 @@
// SPDX-License-Identifier: Apache-2.0
use super::Error;
+use crate::hal::ui::ConfirmParams;
use crate::pb;
use pb::response::Response;
use crate::hal::{Memory, Ui};
-use crate::workflow::confirm;
pub async fn process(
hal: &mut impl crate::hal::Hal,
@@ -16,7 +16,7 @@ pub async fn process(
return Err(Error::InvalidInput);
}
- let params = confirm::Params {
+ let params = ConfirmParams {
title: "Name",
body: name,
scrollable: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/set_mnemonic_passphrase_enabled.rs b/src/rust/bitbox02-rust/src/hww/api/set_mnemonic_passphrase_enabled.rs
index c94d210..c9024a6 100644
--- a/src/rust/bitbox02-rust/src/hww/api/set_mnemonic_passphrase_enabled.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/set_mnemonic_passphrase_enabled.rs
@@ -1,18 +1,18 @@
// SPDX-License-Identifier: Apache-2.0
use super::Error;
+use crate::hal::ui::ConfirmParams;
use crate::pb;
use pb::response::Response;
use crate::hal::{Memory, Ui};
-use crate::workflow::confirm;
pub async fn process(
hal: &mut impl crate::hal::Hal,
&pb::SetMnemonicPassphraseEnabledRequest { enabled }: &pb::SetMnemonicPassphraseEnabledRequest,
) -> Result<Response, Error> {
- let params = confirm::Params {
+ let params = ConfirmParams {
title: if enabled { "Enable" } else { "Disable" },
body: "Optional\npassphrase",
longtouch: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/show_mnemonic.rs b/src/rust/bitbox02-rust/src/hww/api/show_mnemonic.rs
index d2c739e..3a56d46 100644
--- a/src/rust/bitbox02-rust/src/hww/api/show_mnemonic.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/show_mnemonic.rs
@@ -1,5 +1,6 @@
// SPDX-License-Identifier: Apache-2.0
+use crate::hal::ui::ConfirmParams;
use alloc::vec::Vec;
use super::Error;
@@ -8,7 +9,7 @@ use crate::pb;
use pb::response::Response;
use crate::hal::{Memory, Ui};
-use crate::workflow::{confirm, unlock};
+use crate::workflow::unlock;
/// Handle the ShowMnemonic API call. This shows the seed encoded as
/// 12/18/24 BIP39 English words. Afterwards, for each word, the user
@@ -26,7 +27,7 @@ pub async fn process(hal: &mut impl crate::hal::Hal) -> Result<Response, Error>
};
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Warning",
body: "DO NOT share your\nrecovery words with\nanyone!",
accept_is_nextarrow: true,
@@ -35,7 +36,7 @@ pub async fn process(hal: &mut impl crate::hal::Hal) -> Result<Response, Error>
.await?;
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "Recovery\nwords",
body: "Please write down\nthe following words",
accept_is_nextarrow: true,
diff --git a/src/rust/bitbox02-rust/src/hww/api/system.rs b/src/rust/bitbox02-rust/src/hww/api/system.rs
index 7360236..b466556 100644
--- a/src/rust/bitbox02-rust/src/hww/api/system.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/system.rs
@@ -1,20 +1,20 @@
// SPDX-License-Identifier: Apache-2.0
use super::Error;
+use crate::hal::ui::ConfirmParams;
use crate::pb;
use pb::reboot_request::Purpose;
use pb::response::Response;
use crate::hal::{System, Ui};
-use crate::workflow::confirm;
pub async fn reboot_to_bootloader(
hal: &mut impl crate::hal::Hal,
&pb::RebootRequest { purpose }: &pb::RebootRequest,
) -> Result<Response, Error> {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "",
body: match Purpose::try_from(purpose) {
Ok(Purpose::Upgrade) => "Proceed to upgrade?",
diff --git a/src/rust/bitbox02-rust/src/hww/noise.rs b/src/rust/bitbox02-rust/src/hww/noise.rs
index b0d48a1..d07172f 100644
--- a/src/rust/bitbox02-rust/src/hww/noise.rs
+++ b/src/rust/bitbox02-rust/src/hww/noise.rs
@@ -121,7 +121,7 @@ pub(crate) async fn process(
};
Ok(())
}
- Err(pairing::UserAbort) => {
+ Err(crate::hal::ui::UserAbort) => {
let mut state = NOISE_STATE.0.borrow_mut();
state.reset();
Err(Error)
diff --git a/src/rust/bitbox02-rust/src/workflow.rs b/src/rust/bitbox02-rust/src/workflow.rs
index dbc08df..8380a6f 100644
--- a/src/rust/bitbox02-rust/src/workflow.rs
+++ b/src/rust/bitbox02-rust/src/workflow.rs
@@ -1,6 +1,5 @@
// SPDX-License-Identifier: Apache-2.0
-pub mod confirm;
#[cfg_attr(
all(feature = "c-unit-testing", not(feature = "testing")),
path = "workflow/mnemonic_c_unit_tests.rs"
diff --git a/src/rust/bitbox02-rust/src/workflow/confirm.rs b/src/rust/bitbox02-rust/src/workflow/confirm.rs
deleted file mode 100644
index 89ecf90..0000000
--- a/src/rust/bitbox02-rust/src/workflow/confirm.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-
-pub use bitbox02::ui::{ConfirmParams as Params, Font};
diff --git a/src/rust/bitbox02-rust/src/workflow/mnemonic.rs b/src/rust/bitbox02-rust/src/workflow/mnemonic.rs
index b45e0a3..2ed6a12 100644
--- a/src/rust/bitbox02-rust/src/workflow/mnemonic.rs
+++ b/src/rust/bitbox02-rust/src/workflow/mnemonic.rs
@@ -1,8 +1,7 @@
// SPDX-License-Identifier: Apache-2.0
-use super::confirm;
use super::trinary_input_string;
-use crate::hal::ui::UserAbort;
+use crate::hal::ui::{ConfirmParams, UserAbort};
use alloc::string::String;
use alloc::vec::Vec;
@@ -69,7 +68,7 @@ pub async fn show_and_confirm_mnemonic(
words: &[&str],
) -> Result<(), UserAbort> {
hal_ui
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "",
body: &format!("{} words follow", words.len()),
accept_is_nextarrow: true,
@@ -83,7 +82,7 @@ pub async fn show_and_confirm_mnemonic(
// Can only succeed due to `accept_only`.
let _ = hal_ui
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "",
body: "Please confirm\neach word",
accept_only: true,
@@ -194,7 +193,7 @@ async fn get_24th_word(
match hal_ui.menu(&as_str_vec(&choices), Some(title)).await {
Err(UserAbort) => return Err(UserAbort),
Ok(choice_idx) if choice_idx as usize == none_of_them_idx => {
- let params = confirm::Params {
+ let params = ConfirmParams {
title: "",
body: "Invalid. Check\nrecovery words.\nRestart?",
..Default::default()
@@ -208,7 +207,7 @@ async fn get_24th_word(
// Double checking is also safer, as the user might not even realize they made a typo.
let word = choices[choice_idx as usize].clone();
if let Ok(()) = hal_ui
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title,
body: &word,
..Default::default()
@@ -251,7 +250,7 @@ async fn get_12th_18th_word(
// Confirm word picked again, as a typo here would be extremely annoying. Double checking
// is also safer, as the user might not even realize they made a typo.
if let Ok(()) = hal_ui
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title,
body: &word,
..Default::default()
@@ -355,7 +354,7 @@ pub async fn get(
match cancel_choice {
GetWordError::EditPrevious => word_idx -= 1,
GetWordError::Cancel => {
- let params = confirm::Params {
+ let params = ConfirmParams {
title: "Restore",
body: "Do you really\nwant to cancel?",
..Default::default()
diff --git a/src/rust/bitbox02-rust/src/workflow/pairing.rs b/src/rust/bitbox02-rust/src/workflow/pairing.rs
index 0fa0362..2a42810 100644
--- a/src/rust/bitbox02-rust/src/workflow/pairing.rs
+++ b/src/rust/bitbox02-rust/src/workflow/pairing.rs
@@ -1,8 +1,7 @@
// SPDX-License-Identifier: Apache-2.0
use crate::hal::Ui;
-pub use crate::hal::ui::UserAbort;
-use crate::workflow::confirm;
+use crate::hal::ui::{ConfirmParams, Font, UserAbort};
use alloc::string::String;
@@ -22,10 +21,10 @@ pub fn format_hash(hash: &[u8; 32]) -> String {
}
pub async fn confirm(hal: &mut impl crate::hal::Hal, hash: &[u8; 32]) -> Result<(), UserAbort> {
- let params = confirm::Params {
+ let params = ConfirmParams {
title: "Pairing code",
body: &format_hash(hash),
- font: confirm::Font::Monogram5X9,
+ font: Font::Monogram5X9,
..Default::default()
};
diff --git a/src/rust/bitbox02-rust/src/workflow/password.rs b/src/rust/bitbox02-rust/src/workflow/password.rs
index b20b670..6087771 100644
--- a/src/rust/bitbox02-rust/src/workflow/password.rs
+++ b/src/rust/bitbox02-rust/src/workflow/password.rs
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: Apache-2.0
-use super::{confirm, trinary_input_string};
+use super::trinary_input_string;
use crate::hal::Ui;
-use crate::hal::ui::UserAbort;
+use crate::hal::ui::{ConfirmParams, UserAbort};
use crate::hal::{Memory, memory::SecurechipType};
@@ -12,7 +12,7 @@ use alloc::string::String;
async fn prompt_cancel(hal: &mut impl crate::hal::Hal) -> Result<(), crate::hal::ui::UserAbort> {
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
body: "Do you really\nwant to cancel?",
..Default::default()
})
@@ -125,7 +125,7 @@ pub async fn enter_twice(
loop {
match hal
.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "WARNING",
body: "Your password\n has fewer than\n 4 characters.\nContinue?",
longtouch: true,
diff --git a/src/rust/bitbox02-rust/src/workflow/transaction.rs b/src/rust/bitbox02-rust/src/workflow/transaction.rs
index 282654f..ad77271 100644
--- a/src/rust/bitbox02-rust/src/workflow/transaction.rs
+++ b/src/rust/bitbox02-rust/src/workflow/transaction.rs
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: Apache-2.0
use crate::hal::Ui;
+use crate::hal::ui::ConfirmParams;
use crate::hal::ui::UserAbort;
use alloc::string::String;
@@ -23,7 +24,7 @@ pub async fn verify_total_fee_maybe_warn(
if let Some(fee_percentage) = fee_percentage {
hal.ui()
- .confirm(&super::confirm::Params {
+ .confirm(&ConfirmParams {
title: "High fee",
body: &format!(
"The fee is {}%\nthe send amount.\nProceed?",
diff --git a/src/rust/bitbox02-rust/src/workflow/u2f_c_api.rs b/src/rust/bitbox02-rust/src/workflow/u2f_c_api.rs
index 95f5777..d03b8ce 100644
--- a/src/rust/bitbox02-rust/src/workflow/u2f_c_api.rs
+++ b/src/rust/bitbox02-rust/src/workflow/u2f_c_api.rs
@@ -6,8 +6,8 @@
extern crate alloc;
+use crate::hal::ui::ConfirmParams;
use crate::hal::{Hal, Ui};
-use crate::workflow::confirm;
use alloc::boxed::Box;
use alloc::string::String;
use core::ffi::CStr;
@@ -100,7 +100,7 @@ pub unsafe extern "C" fn rust_workflow_spawn_confirm(
CONFIRM_STATE.get().write(TaskState::Running(token));
}
crate::main_loop::spawn(Box::pin(async move {
- let params = confirm::Params {
+ let params = ConfirmParams {
title: &title,
body: &body,
accept_only: true,
diff --git a/src/rust/bitbox02-rust/src/workflow/unlock.rs b/src/rust/bitbox02-rust/src/workflow/unlock.rs
index 523ae38..314aa4d 100644
--- a/src/rust/bitbox02-rust/src/workflow/unlock.rs
+++ b/src/rust/bitbox02-rust/src/workflow/unlock.rs
@@ -1,8 +1,9 @@
// SPDX-License-Identifier: Apache-2.0
use crate::general::abort;
+use crate::hal::ui::ConfirmParams;
use crate::hal::{Memory, Ui};
-use crate::workflow::{confirm, password};
+use crate::workflow::password;
pub use password::CanCancel;
@@ -19,7 +20,7 @@ async fn confirm_mnemonic_passphrase(
return Ok(());
}
- let params = confirm::Params {
+ let params = ConfirmParams {
title: "",
body: "You will be asked to\nvisually confirm your\npassphrase now.",
accept_only: true,
@@ -29,10 +30,10 @@ async fn confirm_mnemonic_passphrase(
hal.ui().confirm(¶ms).await?;
- let params = confirm::Params {
+ let params = ConfirmParams {
title: "Confirm",
body: passphrase,
- font: bitbox02::ui::Font::Password11X12,
+ font: crate::hal::ui::Font::Password11X12,
scrollable: true,
longtouch: true,
..Default::default()
@@ -80,7 +81,7 @@ async fn maybe_confirm_remaining_unlock_attempts(
};
hal.ui()
- .confirm(&confirm::Params {
+ .confirm(&ConfirmParams {
title: "WARNING",
body: &body,
accept_is_nextarrow: true,
diff --git a/src/rust/bitbox02-rust/src/workflow/verify_message.rs b/src/rust/bitbox02-rust/src/workflow/verify_message.rs
index 02b446f..c9d3e6d 100644
--- a/src/rust/bitbox02-rust/src/workflow/verify_message.rs
+++ b/src/rust/bitbox02-rust/src/workflow/verify_message.rs
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: Apache-2.0
+use crate::hal::ui::ConfirmParams;
use alloc::vec::Vec;
-use super::confirm;
use crate::hal::Ui;
use util::ascii;
@@ -51,7 +51,7 @@ pub async fn verify(
} else {
format!("{} {}/{}", title_short, i + 1, pages.len())
};
- let params = confirm::Params {
+ let params = ConfirmParams {
title: &title,
body: page,
scrollable: true,
@@ -63,7 +63,7 @@ pub async fn verify(
}
Ok(())
} else {
- let params = confirm::Params {
+ let params = ConfirmParams {
title: &format!("{}\ndata (hex)", title_long),
body: &hex::encode(msg),
scrollable: true,
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.