diff --git a/app/Makefile b/app/Makefile index 85229075..85cef5ca 100755 --- a/app/Makefile +++ b/app/Makefile @@ -68,7 +68,6 @@ endif APP_LOAD_PARAMS = --curve secp256k1 $(COMMON_LOAD_PARAMS) --path $(APPPATH) -APP_STACK_MIN_SIZE := 2050 include $(CURDIR)/../deps/ledger-zxlib/makefiles/Makefile.devices RUST_TARGET := thumbv6m-none-eabi diff --git a/app/Makefile.version b/app/Makefile.version index 318b9aaa..a7cef82d 100644 --- a/app/Makefile.version +++ b/app/Makefile.version @@ -3,4 +3,4 @@ APPVERSION_M=3 # This is the minor version of this release APPVERSION_N=2 # This is the patch version of this release -APPVERSION_P=1 +APPVERSION_P=2 diff --git a/app/rust/Cargo.toml b/app/rust/Cargo.toml index 2199cba1..bfca31ef 100644 --- a/app/rust/Cargo.toml +++ b/app/rust/Cargo.toml @@ -36,10 +36,13 @@ serde = { version = "1.0.215", features = ["derive"] } no-std-compat = { version = "0.4.1", features = ["std"] } [profile.release] -lto = false codegen-units = 1 debug = false opt-level = "z" +lto = "thin" +overflow-checks = false +strip = "symbols" +panic = "abort" [profile.dev] panic = "abort" diff --git a/app/rust/build.rs b/app/rust/build.rs new file mode 100644 index 00000000..71e9ec11 --- /dev/null +++ b/app/rust/build.rs @@ -0,0 +1,10 @@ +fn main() { + let target = std::env::var("RUST_TARGET_NAME").unwrap_or_default(); + match target.as_str() { + "TARGET_STAX" => println!("cargo:rustc-cfg=device_stax"), + "TARGET_FLEX" => println!("cargo:rustc-cfg=device_flex"), + "TARGET_NANOS2" => println!("cargo:rustc-cfg=device_nanos2"), + "TARGET_NANOX" => println!("cargo:rustc-cfg=device_nanox"), + _ => println!("cargo:rustc-cfg=device_nanos"), // default + } +} diff --git a/app/rust/src/constants.rs b/app/rust/src/constants.rs index e5aff86b..b38d9c02 100644 --- a/app/rust/src/constants.rs +++ b/app/rust/src/constants.rs @@ -13,13 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. ********************************************************************************/ + +pub const MAX_PAGES: usize = 10; +// Configuration constants based on target device +// means max number of lines per page +pub const MAX_LINES: usize = 3; +// means max characteres per line +// this is a limit of the device +// intended to control the already formatted +// message response comming +// from canisters +pub const MAX_CHARS_PER_LINE: usize = 35; + pub const BLS_PUBLIC_KEY_SIZE: usize = 96; pub const BLS_SIGNATURE_SIZE: usize = 48; -// means max characteres per line -pub const MAX_LINES: usize = 3; -// means mx number of lines per page -pub const MAX_PAGES: usize = 10; -pub const MAX_CHARS_PER_LINE: usize = 25; pub const REPLY_PATH: &str = "reply"; pub const CANISTER_RANGES_PATH: &str = "canister_ranges"; diff --git a/app/rust/src/error.rs b/app/rust/src/error.rs index 7fda996d..f2ff8984 100644 --- a/app/rust/src/error.rs +++ b/app/rust/src/error.rs @@ -81,6 +81,9 @@ pub enum ParserError { FieldNotFound, LEB128Overflow, InvalidTime, + TooManyLines, + TooManyPages, + LineTooLong, } // minicibor error provides a reach diff --git a/app/rust/src/ffi.rs b/app/rust/src/ffi.rs index a2292933..32b29c53 100644 --- a/app/rust/src/ffi.rs +++ b/app/rust/src/ffi.rs @@ -34,11 +34,15 @@ mod ffi_verify_cert { const CONSENT: &str = "d9d9f7a167636f6e74656e74a76361726758d84449444c086d7b6e766c02aeaeb1cc0501d880c6d007716c02cbaeb581017ab183e7f1077a6b028beabfc2067f8ef1c1ee0d036e046c02efcee7800402c4fbf2db05056c03d6fca70200e1edeb4a7184f7fee80a060107684449444c066e7d6d7b6e016e786c02b3b0dac30368ad86ca8305026c08c6fcb60200ba89e5c20402a2de94eb060282f3f3910c03d8a38ca80d7d919c9cbf0d00dea7f7da0d03cb96dcb40e04010501904e0000008094ebdc030000010a00000000000000070101000d69637263325f617070726f76650002656e0101230003006b63616e69737465725f69644a000000000000000201016e696e67726573735f6578706972791b18072a6f7894d0006b6d6574686f645f6e616d6578246963726332315f63616e69737465725f63616c6c5f636f6e73656e745f6d657373616765656e6f6e636550369f1914fd64438f5e6329fcb66b1d4d6c726571756573745f747970656463616c6c6673656e6465724104"; const ROOT_KEY: &str = "b354faa40626ebc91ed7e55b2307feff70d119ef37f89915bd4561a1ed8c5c26c8c2cb8c4711eec681bf213a75cb988008fb1f4d7aa278cd4fad6f295c83bab04b8cabcb32640cf926083daf865551f9f3b76fd800dac027a583858b9d1d3f64"; + const CERT2: &str = "d9d9f7a264747265658301830182045820f7ce39e353276ef7eac40214d6294a53d45c840988b3ad8d0655230bac1893d483018204582045c8d9bed81048bbe60926bf8585350ba6bbe6523d6f5f994fff922edbdef96e83024e726571756573745f737461747573830183018301820458202d1afceef6681d8b8a48dbc7dcde236ad09ff53487b5f65c86f402c4019c81e08301830183018301830182045820bda400ec9debeeaf0e8e4dc6308cf1d0ccc2f6861984ffe8cb5c0f7ddd006bdd830183018301830182045820c3a04b54583072b58beab029efcbd9d9f2191c061fda4c79dfcd554f57534b598302582034a44c265c7ff6c8e4ed5c3d442f12b8b52580f800ffb892a89ad56b3167a62683018302457265706c7982035903304449444c0c6b02bc8a0101c5fed201096c02efcee7800402e29fdcc806046c02aeaeb1cc0503d880c6d007716e766b02d9e5b0980405fcdfd79a0f716c01c4d6b4ea0b066d076c01ffbb87a807086d716b04d1c4987c0aa3f2efe6020b9a8597e6030be3c581900f0b6c02fc91f4f80571c498b1b50d7d6c01fc91f4f805710100000002656e0007031e2320417574686f72697a6520616e6f74686572206164647265737320746f2077697468647261772066726f6d20796f7572206163636f756e74202a2a5468651f666f6c6c6f77696e67206164647265737320697320616c6c6f77656420746f031d77697468647261772066726f6d20796f7572206163636f756e743a2a2a2272646d78362d6a616161612d61616161612d61616164712d636169202a2a596f75720d7375626163636f756e743a2a2a032330303030303030303030303030303030303030303030303030303030303030303030301d3030303030303030303030303030303030303030303030303030303030232a2a526571756573746564207769746864726177616c20616c6c6f77616e63653a2a2a032031302049435020e29aa02054686520616c6c6f77616e63652077696c6c2062652273657420746f2031302049435020696e646570656e64656e746c79206f6620616e791e70726576696f757320616c6c6f77616e63652e20556e74696c207468697303217472616e73616374696f6e20686173206265656e206578656375746564207468651e7370656e6465722063616e207374696c6c206578657263697365207468652370726576696f757320616c6c6f77616e63652028696620616e792920746f2069742773032166756c6c20616d6f756e742e202a2a45787069726174696f6e20646174653a2a2a204e6f2065787069726174696f6e2e202a2a417070726f76616c206665653a2a2a23302e3030303120494350202a2a5472616e73616374696f6e206665657320746f206265031a7061696420627920796f7572207375626163636f756e743a2a2a2330303030303030303030303030303030303030303030303030303030303030303030301d30303030303030303030303030303030303030303030303030303030308302467374617475738203477265706c696564820458205c1a351ac2b7a24b96afcaf767521613b4fd3e577aee74769266cf9f36637d4e8204582068041707ea8d374da007bb1a7a0e0bed07ab24f04b026f7986fc2a85a8fe126282045820b1dcc25b9e681479a3a0c8e48f7ec659cba3a8d2432d9da3539993e3d07ca1be820458200a9b91be81767b301772430b1e4e3347c17b107de0fd585c88108d613550f1758204582035d8238a10e9bb5c4181e35da06ebebba1aea87bb3d144b2dda13c9fcba042f4820458205f41f1b3eda637ed957dbb173be06810a3518eeca57efee3538fbded7a146ef182045820642f92e0236f3dfa2becc643a3aa9703aa4c998360b67d57b03961fdf6c704fe82045820a2092115cfa051b579b9e20a04a9d711fe65e960e47a883a7971ae348af2100282045820175aaba4eea75ae431612394d2dc78fe5058c846466011f311b90b3b5df77000830182045820bc995b4159ff52ed2d587118a4260a039b6141b7af942d7f482c34b37d62e53c83024474696d65820349c18af7abc1d9fe8618697369676e61747572655830a272688e94dffcee62a658d41a6c19cf5f531bc5d1f238ffea80706fc8ffa878cb760a68bf32fa596c651652d2e00a2a"; + const CALL2: &str = "d9d9f7a167636f6e74656e74a76361726758684449444c066e7d6d7b6e016e786c02b3b0dac30368ad86ca8305026c08c6fcb60200ba89e5c20402a2de94eb060282f3f3910c03d8a38ca80d7d919c9cbf0d00dea7f7da0d03cb96dcb40e04010501904e0000008094ebdc030000010a00000000000000070101006b63616e69737465725f69644a000000000000000201016e696e67726573735f6578706972791b180dfaf93de928006b6d6574686f645f6e616d656d69637263325f617070726f7665656e6f6e63655007726649d5ee68e7bd09c853a5dac0fc6c726571756573745f747970656463616c6c6673656e646572581d052c5f6f270fc4a3a882a8075732cba90ad4bd25d30bd2cf7b0bfe7c02"; + const CONSENT2: &str = "d9d9f7a167636f6e74656e74a76361726758d84449444c086d7b6e766c02aeaeb1cc0501d880c6d007716c02cbaeb581017ab183e7f1077a6b028beabfc2067f8ef1c1ee0d036e046c02efcee7800402c4fbf2db05056c03d6fca70200e1edeb4a7184f7fee80a060107684449444c066e7d6d7b6e016e786c02b3b0dac30368ad86ca8305026c08c6fcb60200ba89e5c20402a2de94eb060282f3f3910c03d8a38ca80d7d919c9cbf0d00dea7f7da0d03cb96dcb40e04010501904e0000008094ebdc030000010a00000000000000070101000d69637263325f617070726f76650002656e0101230003006b63616e69737465725f69644a000000000000000201016e696e67726573735f6578706972791b180dfaf93de928006b6d6574686f645f6e616d6578246963726332315f63616e69737465725f63616c6c5f636f6e73656e745f6d657373616765656e6f6e636550b70f2ce7f8f414041610c3d3d4eab6d06c726571756573745f747970656463616c6c6673656e6465724104"; + const ROOT_KEY2: &str = "814c0e6ec71fab583b08bd81373c255c3c371b2e84863c98a4f1e08b74235d14fb5d9c0cd546d9685f913a0c0b2cc5341583bf4b4392e467db96d65b9bb4cb717112f8472e0d5a4d14505ffd7484b01291091c5f87b98883463f98091a0baaae"; - fn bls_flow(cert: &str, call: &str, consent: &str) -> u32 { + fn bls_flow(cert: &str, call: &str, consent: &str, root_key: &str) -> u32 { let cert_data = hex::decode(cert).unwrap(); let call_data = hex::decode(call).unwrap(); - let root_key = hex::decode(ROOT_KEY).unwrap(); + let root_key = hex::decode(root_key).unwrap(); let consent_data = hex::decode(consent).unwrap(); unsafe { @@ -74,10 +78,14 @@ mod ffi_verify_cert { #[test] fn test_bls_flow() { - let res = bls_flow(CERT, CALL, CONSENT); + let t1 = (CERT, CALL, CONSENT, ROOT_KEY); + let t2 = (CERT2, CALL2, CONSENT2, ROOT_KEY2); + let res = bls_flow(t1.0, t1.1, t1.2, t1.3); assert_eq!(res, ParserError::Ok as u32); unsafe { rs_clear_resources(); } + let res = bls_flow(t2.0, t2.1, t2.2, t2.3); + assert_eq!(res, ParserError::Ok as u32); } } diff --git a/app/rust/src/ffi/resources.rs b/app/rust/src/ffi/resources.rs index 0a054e79..1675df24 100644 --- a/app/rust/src/ffi/resources.rs +++ b/app/rust/src/ffi/resources.rs @@ -1,6 +1,6 @@ use bolos::{lazy_static, pic::PIC}; -use crate::Certificate; +use crate::{consent_message::msg_info::ConsentInfo, Certificate}; use super::{call_request::CanisterCallT, consent_request::ConsentRequestT}; @@ -17,10 +17,14 @@ pub static mut MEMORY_CALL_REQUEST: [u8; core::mem::size_of::()]; #[lazy_static] pub static mut CERTIFICATE: Option> = None; +#[lazy_static] +pub static mut UI: Option> = None; + #[no_mangle] pub unsafe extern "C" fn rs_clear_resources() { // zeroize data _ = MEMORY_CONSENT_REQUEST.write(0, &[0; core::mem::size_of::()]); _ = MEMORY_CALL_REQUEST.write(0, &[0; core::mem::size_of::()]); CERTIFICATE.take(); + UI.take(); } diff --git a/app/rust/src/ffi/ui.rs b/app/rust/src/ffi/ui.rs index edec92ca..e5d5d3fd 100644 --- a/app/rust/src/ffi/ui.rs +++ b/app/rust/src/ffi/ui.rs @@ -16,19 +16,19 @@ use crate::{error::ParserError, DisplayableItem}; -use super::resources::CERTIFICATE; +use super::resources::UI; #[no_mangle] pub unsafe extern "C" fn rs_getNumItems(num_items: *mut u8) -> u32 { crate::zlog("rs_getNumItems\x00"); - if num_items.is_null() || !CERTIFICATE.is_some() { + if num_items.is_null() || !UI.is_some() { return ParserError::ContextMismatch as u32; } // Safe to unwrap due to previous check - let cert = CERTIFICATE.as_ref().unwrap(); + let ui = UI.as_ref().unwrap(); - let Ok(num) = cert.num_items() else { + let Ok(num) = ui.num_items() else { crate::zlog("no_DATA\x00"); return ParserError::NoData as _; }; @@ -56,14 +56,14 @@ pub unsafe extern "C" fn rs_getItem( let key = core::slice::from_raw_parts_mut(out_key as *mut u8, key_len as usize); let value = core::slice::from_raw_parts_mut(out_value as *mut u8, out_len as usize); - if !CERTIFICATE.is_some() { + if !UI.is_some() { return ParserError::ContextMismatch as _; } // Safe to unwrap due to previous check - let cert = CERTIFICATE.as_ref().unwrap(); + let ui = UI.as_ref().unwrap(); - match cert.render_item(display_idx, key, value, page_idx) { + match ui.render_item(display_idx, key, value, page_idx) { Ok(page) => { *page_count = page; ParserError::Ok as _ diff --git a/app/rust/src/ffi/verify_certificate.rs b/app/rust/src/ffi/verify_certificate.rs index 45ca86ac..49795b6d 100644 --- a/app/rust/src/ffi/verify_certificate.rs +++ b/app/rust/src/ffi/verify_certificate.rs @@ -16,6 +16,7 @@ use crate::{ check_canary, + consent_message::msg_response::ConsentMessageResponse, constants::{BLS_PUBLIC_KEY_SIZE, DEFAULT_SENDER}, error::ParserError, Certificate, FromBytes, HashTree, LookupResult, Principal, @@ -30,7 +31,7 @@ use super::{ c_api::device_principal, call_request::CanisterCallT, consent_request::ConsentRequestT, - resources::{CERTIFICATE, MEMORY_CALL_REQUEST, MEMORY_CONSENT_REQUEST}, + resources::{CERTIFICATE, MEMORY_CALL_REQUEST, MEMORY_CONSENT_REQUEST, UI}, }; // This is use to check important fields in consent_msg_request and canister_call_request @@ -67,12 +68,10 @@ pub unsafe extern "C" fn rs_verify_certificate( } // Check values are set - crate::zlog("call_request****\x00"); let Ok(call_request) = CanisterCallT::from_bytes(&**MEMORY_CALL_REQUEST) else { return ParserError::NoData as u32; }; - crate::zlog("consent_request****\x00"); let Ok(consent_request) = ConsentRequestT::from_bytes(&**MEMORY_CONSENT_REQUEST) else { return ParserError::NoData as u32; }; @@ -81,7 +80,6 @@ pub unsafe extern "C" fn rs_verify_certificate( // for canister_call_t and consent_request_t // which ensures canister_id, method and args are the same in both if call_request != consent_request { - crate::zlog("call != consent mistmatch\x00"); return ParserError::InvalidCertificate as u32; } @@ -94,7 +92,6 @@ pub unsafe extern "C" fn rs_verify_certificate( let mut cert = MaybeUninit::uninit(); let Ok(_) = Certificate::from_bytes_into(data, &mut cert) else { - crate::zlog("Fail parsing certificate***\x00"); return ParserError::InvalidCertificate as u32; }; @@ -112,13 +109,11 @@ pub unsafe extern "C" fn rs_verify_certificate( let Ok(LookupResult::Found(_)) = HashTree::lookup_path(&consent_request.request_id[..].into(), cert.tree()) else { - crate::zlog("request_id mismatch****\x00"); return ParserError::InvalidCertificate as u32; }; - + // // Verify ingress_expiry aginst certificate timestamp if !cert.verify_time(call_request.ingress_expiry) { - crate::zlog("ingress_expiry mismatch****\x00"); return ParserError::InvalidCertificate as u32; } @@ -126,7 +121,6 @@ pub unsafe extern "C" fn rs_verify_certificate( let consent_sender = &consent_request.sender[..consent_request.sender_len as usize]; if !validate_sender(call_sender, consent_sender) { - crate::zlog("sender_id mismatch****\x00"); return ParserError::InvalidCertificate as u32; } @@ -136,11 +130,18 @@ pub unsafe extern "C" fn rs_verify_certificate( if !ranges.is_canister_in_range( &call_request.canister_id[..call_request.canister_id_len as usize], ) { - crate::zlog("canister_id mismatch****\x00"); return ParserError::InvalidCertificate as u32; } } + // Check for the response type embedded in the certificate + // an error response means we can not go further + let Ok(ConsentMessageResponse::Ok(ui)) = cert.msg_response() else { + return ParserError::InvalidCertificate as u32; + }; + + UI.replace(ui); + // Indicates certificate was valid CERTIFICATE.replace(cert); diff --git a/app/rust/src/lib.rs b/app/rust/src/lib.rs index abddf30d..a00891fb 100644 --- a/app/rust/src/lib.rs +++ b/app/rust/src/lib.rs @@ -35,7 +35,7 @@ fn panic(_info: &PanicInfo) -> ! { } pub fn zlog(_msg: &str) { - #[cfg(not(test))] + #[cfg(all(not(test), not(feature = "clippy"), not(feature = "fuzzing")))] unsafe { zemu_log_stack(_msg.as_bytes().as_ptr()); } @@ -43,15 +43,38 @@ pub fn zlog(_msg: &str) { std::println!("{}", _msg); } -#[cfg(not(test))] pub fn check_canary() { - unsafe { check_app_canary() } + #[cfg(all(not(test), not(feature = "clippy"), not(feature = "fuzzing")))] + unsafe { + _check_canary() + } } -#[cfg(test)] -pub fn check_canary() {} - extern "C" { fn zemu_log_stack(s: *const u8); - fn check_app_canary(); + fn _check_canary(); + fn log_number(e: *const u8, number: u32); +} + +#[cfg(all(not(test), not(feature = "clippy"), not(feature = "fuzzing")))] +extern "C" { + fn io_heartbeat(); +} + +// Lets the device breath between computations +pub(crate) fn heartbeat() { + #[cfg(all(not(test), not(feature = "clippy"), not(feature = "fuzzing")))] + unsafe { + io_heartbeat() + } +} + +// Lets the device breath between computations +pub(crate) fn log_num(s: &str, number: u32) { + #[cfg(all(not(test), not(feature = "clippy"), not(feature = "fuzzing")))] + unsafe { + log_number(s.as_bytes().as_ptr(), number); + } + #[cfg(test)] + std::println!("{s}: {number}"); } diff --git a/app/rust/src/parser/certificate/cert.rs b/app/rust/src/parser/certificate/cert.rs index 1404d677..c8bc3a34 100644 --- a/app/rust/src/parser/certificate/cert.rs +++ b/app/rust/src/parser/certificate/cert.rs @@ -24,8 +24,8 @@ use crate::{ CANISTER_RANGES_PATH, CBOR_CERTIFICATE_TAG, MAX_CERT_INGRESS_OFFSET, REPLY_PATH, SHA256_DIGEST_LENGTH, }, - error::{ParserError, ViewError}, - zlog, DisplayableItem, FromBytes, Signature, + error::ParserError, + zlog, FromBytes, Signature, }; use super::{ @@ -165,13 +165,11 @@ impl<'a> Certificate<'a> { // Step 4: Verify signature // separator_len(1-bytes) + separator(13-bytes) + hash(32-bytes) - crate::zlog("Certificate::separator****\x00"); let mut message = [0u8; BLS_MSG_SIZE]; message[0] = SEPARATOR_LEN as u8; // message[1..14].copy_from_slice(b"ic-state-root"); message[1..14].copy_from_slice(SEPARATOR); message[14..].copy_from_slice(&root_hash); - crate::zlog("Certificate::separator**** OK\x00"); Ok(message) } @@ -198,14 +196,11 @@ impl<'a> Certificate<'a> { None => Ok(true), Some(delegation) => { // Ensure the delegation's certificate contains the subnet's public key - zlog("delegation_pubkey\x00"); if delegation.public_key()?.is_none() { - zlog("delegation_without_key\x00"); return Ok(false); } // Ensure the delegation's certificate does not have another delegation - zlog("no_delegation\x00"); if delegation.cert().delegation().is_some() { return Ok(false); } @@ -230,7 +225,6 @@ impl<'a> Certificate<'a> { match &self.delegation { None => Ok(root_key), // Use root_public_key if no delegation Some(d) => { - zlog("using_delegation_key\x00"); let key = d.public_key()?.ok_or(ParserError::UnexpectedValue)?; Ok(key.as_bytes()) } @@ -270,12 +264,10 @@ impl<'a> Certificate<'a> { } // Safe to unwrap because this reply was parsed already - fn msg(&self) -> Result, ParserError> { + pub fn msg_response(&self) -> Result, ParserError> { let tree = self.tree(); let found = HashTree::lookup_path(&REPLY_PATH.into(), tree)?; let bytes = found.value().ok_or(ParserError::InvalidConsentMsg)?; - #[cfg(test)] - std::println!("\nConsent message bytes: {:?}\n", hex::encode(bytes)); let mut msg = MaybeUninit::uninit(); ConsentMessageResponse::from_bytes_into(bytes, &mut msg)?; @@ -308,27 +300,6 @@ impl<'a> TryFrom> for Certificate<'a> { } } -impl<'a> DisplayableItem for Certificate<'a> { - #[inline(never)] - fn num_items(&self) -> Result { - let msg = self.msg().map_err(|_| ViewError::Unknown)?; - msg.num_items() - } - - #[inline(never)] - fn render_item( - &self, - item_n: u8, - title: &mut [u8], - message: &mut [u8], - page: u8, - ) -> Result { - zlog("Certificate::render_item\x00"); - let msg = self.msg().map_err(|_| ViewError::Unknown)?; - msg.render_item(item_n, title, message, page) - } -} - #[cfg(test)] mod test_certificate { @@ -338,12 +309,15 @@ mod test_certificate { use ic_certification::Certificate as IcpCertificate; const REAL_CERT: &str = "d9d9f7a264747265658301830182045820d4cff6a25570a56ac14e743e694daa2aa88b80a4bea761116471b56e4945ed6d830182045820f26d51d511039fcb5058441e6204fec42a0da824541f57d0c1c3468a13e16cbf83024e726571756573745f737461747573830182045820198df32f6757100316e899c7a3afec26f6933c06bf5d2f6233f6b0f14ac5b96f83025820ea37fdc5229d7273d500dc8ae3c009f0421049c1f02cc5ad85ea838ae7dfc04583018302457265706c7982035903304449444c0c6b02bc8a0101c5fed201096c02efcee7800402e29fdcc806046c02aeaeb1cc0503d880c6d007716e766b02d9e5b0980405fcdfd79a0f716c01c4d6b4ea0b066d076c01ffbb87a807086d716b04d1c4987c0aa3f2efe6020b9a8597e6030be3c581900f0b6c02fc91f4f80571c498b1b50d7d6c01fc91f4f805710100000002656e0007031e2320417574686f72697a6520616e6f74686572206164647265737320746f2077697468647261772066726f6d20796f7572206163636f756e74202a2a5468651f666f6c6c6f77696e67206164647265737320697320616c6c6f77656420746f031d77697468647261772066726f6d20796f7572206163636f756e743a2a2a2272646d78362d6a616161612d61616161612d61616164712d636169202a2a596f75720d7375626163636f756e743a2a2a032330303030303030303030303030303030303030303030303030303030303030303030301d3030303030303030303030303030303030303030303030303030303030232a2a526571756573746564207769746864726177616c20616c6c6f77616e63653a2a2a032031302049435020e29aa02054686520616c6c6f77616e63652077696c6c2062652273657420746f2031302049435020696e646570656e64656e746c79206f6620616e791e70726576696f757320616c6c6f77616e63652e20556e74696c207468697303217472616e73616374696f6e20686173206265656e206578656375746564207468651e7370656e6465722063616e207374696c6c206578657263697365207468652370726576696f757320616c6c6f77616e63652028696620616e792920746f2069742773032166756c6c20616d6f756e742e202a2a45787069726174696f6e20646174653a2a2a204e6f2065787069726174696f6e2e202a2a417070726f76616c206665653a2a2a23302e3030303120494350202a2a5472616e73616374696f6e206665657320746f206265031a7061696420627920796f7572207375626163636f756e743a2a2a2330303030303030303030303030303030303030303030303030303030303030303030301d30303030303030303030303030303030303030303030303030303030308302467374617475738203477265706c6965648301820458206d8327eb52806a887c0e4f444261e7bde20005e64d9b31479b9af72f8f89886083024474696d65820349c8ccbcfea4c8ca8318697369676e61747572655830b9eb03718c42aa1926bab9956dcef37432045ba1122baf120b8fc3e9fb56f75df8eee419e4e6488e60db79dcaba8c153"; + const REAL_CERT2: &str = "d9d9f7a264747265658301830182045820f7ce39e353276ef7eac40214d6294a53d45c840988b3ad8d0655230bac1893d483018204582045c8d9bed81048bbe60926bf8585350ba6bbe6523d6f5f994fff922edbdef96e83024e726571756573745f737461747573830183018301820458202d1afceef6681d8b8a48dbc7dcde236ad09ff53487b5f65c86f402c4019c81e08301830183018301830182045820bda400ec9debeeaf0e8e4dc6308cf1d0ccc2f6861984ffe8cb5c0f7ddd006bdd830183018301830182045820c3a04b54583072b58beab029efcbd9d9f2191c061fda4c79dfcd554f57534b598302582034a44c265c7ff6c8e4ed5c3d442f12b8b52580f800ffb892a89ad56b3167a62683018302457265706c7982035903304449444c0c6b02bc8a0101c5fed201096c02efcee7800402e29fdcc806046c02aeaeb1cc0503d880c6d007716e766b02d9e5b0980405fcdfd79a0f716c01c4d6b4ea0b066d076c01ffbb87a807086d716b04d1c4987c0aa3f2efe6020b9a8597e6030be3c581900f0b6c02fc91f4f80571c498b1b50d7d6c01fc91f4f805710100000002656e0007031e2320417574686f72697a6520616e6f74686572206164647265737320746f2077697468647261772066726f6d20796f7572206163636f756e74202a2a5468651f666f6c6c6f77696e67206164647265737320697320616c6c6f77656420746f031d77697468647261772066726f6d20796f7572206163636f756e743a2a2a2272646d78362d6a616161612d61616161612d61616164712d636169202a2a596f75720d7375626163636f756e743a2a2a032330303030303030303030303030303030303030303030303030303030303030303030301d3030303030303030303030303030303030303030303030303030303030232a2a526571756573746564207769746864726177616c20616c6c6f77616e63653a2a2a032031302049435020e29aa02054686520616c6c6f77616e63652077696c6c2062652273657420746f2031302049435020696e646570656e64656e746c79206f6620616e791e70726576696f757320616c6c6f77616e63652e20556e74696c207468697303217472616e73616374696f6e20686173206265656e206578656375746564207468651e7370656e6465722063616e207374696c6c206578657263697365207468652370726576696f757320616c6c6f77616e63652028696620616e792920746f2069742773032166756c6c20616d6f756e742e202a2a45787069726174696f6e20646174653a2a2a204e6f2065787069726174696f6e2e202a2a417070726f76616c206665653a2a2a23302e3030303120494350202a2a5472616e73616374696f6e206665657320746f206265031a7061696420627920796f7572207375626163636f756e743a2a2a2330303030303030303030303030303030303030303030303030303030303030303030301d30303030303030303030303030303030303030303030303030303030308302467374617475738203477265706c696564820458205c1a351ac2b7a24b96afcaf767521613b4fd3e577aee74769266cf9f36637d4e8204582068041707ea8d374da007bb1a7a0e0bed07ab24f04b026f7986fc2a85a8fe126282045820b1dcc25b9e681479a3a0c8e48f7ec659cba3a8d2432d9da3539993e3d07ca1be820458200a9b91be81767b301772430b1e4e3347c17b107de0fd585c88108d613550f1758204582035d8238a10e9bb5c4181e35da06ebebba1aea87bb3d144b2dda13c9fcba042f4820458205f41f1b3eda637ed957dbb173be06810a3518eeca57efee3538fbded7a146ef182045820642f92e0236f3dfa2becc643a3aa9703aa4c998360b67d57b03961fdf6c704fe82045820a2092115cfa051b579b9e20a04a9d711fe65e960e47a883a7971ae348af2100282045820175aaba4eea75ae431612394d2dc78fe5058c846466011f311b90b3b5df77000830182045820bc995b4159ff52ed2d587118a4260a039b6141b7af942d7f482c34b37d62e53c83024474696d65820349c18af7abc1d9fe8618697369676e61747572655830a272688e94dffcee62a658d41a6c19cf5f531bc5d1f238ffea80706fc8ffa878cb760a68bf32fa596c651652d2e00a2a"; const CANISTER_ID: &str = "00000000000000020101"; const REQUEST_ID: &str = "ea37fdc5229d7273d500dc8ae3c009f0421049c1f02cc5ad85ea838ae7dfc045"; const INGRESS_EXPIRY: u64 = 1731399240000000000; + const INGRESS_EXPIRY2: u64 = 1731399240000000000; const CERT_GENERIC_DISPLAY: &str = "d9d9f7a2647472656583018301820458207970ca0b7b0c0e63228c4cf47ce6f4a94268cfc004a99ae8aba5e97f204126a183018204582080b175729756e05010ceab7db6bed386cc6db61d274fe7d38a5f0bcea7ef317783024e726571756573745f7374617475738301830258204b77e3e74aa91e7bf50f8cf1acc0cb1dbafa4ad45c050e2abcc5d910317862a383018302457265706c79820359032d4449444c0c6b02bc8a0101c5fed201096c02efcee7800402e29fdcc806046c02aeaeb1cc0503d880c6d007716e766b02d9e5b0980405fcdfd79a0f716c01c4d6b4ea0b066d076c01ffbb87a807086d716b04d1c4987c0aa3f2efe6020b9a8597e6030be3c581900f0b6c02fc91f4f80571c498b1b50d7d6c01fc91f4f805710100000002656e01a4052320417574686f72697a6520616e6f74686572206164647265737320746f2077697468647261772066726f6d20796f7572206163636f756e740a0a2a2a54686520666f6c6c6f77696e67206164647265737320697320616c6c6f77656420746f2077697468647261772066726f6d20796f7572206163636f756e743a2a2a0a72646d78362d6a616161612d61616161612d61616164712d6361690a0a2a2a596f7572207375626163636f756e743a2a2a0a303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300a0a2a2a526571756573746564207769746864726177616c20616c6c6f77616e63653a2a2a0a3130204943500ae29aa02054686520616c6c6f77616e63652077696c6c2062652073657420746f2031302049435020696e646570656e64656e746c79206f6620616e792070726576696f757320616c6c6f77616e63652e20556e74696c2074686973207472616e73616374696f6e20686173206265656e20657865637574656420746865207370656e6465722063616e207374696c6c206578657263697365207468652070726576696f757320616c6c6f77616e63652028696620616e792920746f20697427732066756c6c20616d6f756e742e0a0a2a2a45787069726174696f6e20646174653a2a2a0a4e6f2065787069726174696f6e2e0a0a2a2a417070726f76616c206665653a2a2a0a302e30303031204943500a0a2a2a5472616e73616374696f6e206665657320746f206265207061696420627920796f7572207375626163636f756e743a2a2a0a303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030308302467374617475738203477265706c696564820458203c45af0e5805729f1d07fbce20047198017873e787c5a27744ca20c71ad357b8830182045820d4fdd3b69be601a88a9412234c7940446d55dbc09bd3f28eb96d8548a2fe885283024474696d65820349889893d986e3d58218697369676e61747572655830b60f55093dc0835939589c2a3dcb5313248b13b5d965f3019fb9f5f3d34503443100b5103386a9d2df229fa82fe0440c"; const ROOT_KEY: &str = "b354faa40626ebc91ed7e55b2307feff70d119ef37f89915bd4561a1ed8c5c26c8c2cb8c4711eec681bf213a75cb988008fb1f4d7aa278cd4fad6f295c83bab04b8cabcb32640cf926083daf865551f9f3b76fd800dac027a583858b9d1d3f64"; + const DER_ROOT_KEY: &str = "308182301d060d2b0601040182dc7c0503010201060c2b0601040182dc7c05030201036100814c0e6ec71fab583b08bd81373c255c3c371b2e84863c98a4f1e08b74235d14fb5d9c0cd546d9685f913a0c0b2cc5341583bf4b4392e467db96d65b9bb4cb717112f8472e0d5a4d14505ffd7484b01291091c5f87b98883463f98091a0baaae"; use std::vec::Vec; @@ -377,7 +351,7 @@ mod test_certificate { let cert = Certificate::from_bytes(&data).unwrap(); // Check we parse the message(reply field) - assert!(cert.msg().is_ok()); + assert!(cert.msg_response().is_ok()); } #[test] @@ -448,7 +422,32 @@ mod test_certificate { let cert = Certificate::from_bytes(&data).unwrap(); // Check we parse the message(reply field) - let msg = cert.msg().unwrap(); + let msg = cert.msg_response().unwrap(); assert_eq!(msg.response_type(), ResponseType::Ok); } + + #[test] + fn verify2() { + let data = hex::decode(REAL_CERT2).unwrap(); + let cert = Certificate::from_bytes(&data).unwrap(); + let cert_signature = hex::encode(cert.signature()); + let root_hash = hex::encode(cert.hash().unwrap()); + // Verify delegation.cert root_hash + assert!(cert.delegation.is_none()); + + // compare our root hash with the hash icp library computes + let icp_cert: IcpCertificate = serde_cbor::from_slice(&data).unwrap(); + let icp_tree = icp_cert.tree; + let icp_hash = icp_tree.digest(); + let icp_hash = hex::encode(icp_hash); + let icp_signature = hex::encode(icp_cert.signature); + + assert_eq!(root_hash, icp_hash); + assert_eq!(cert_signature, icp_signature); + + let root_key = extract_bls_from_der(&hex::decode(DER_ROOT_KEY).unwrap()).unwrap(); + std::println!("rootykey: {}", hex::encode(&root_key)); + cert.msg_response().unwrap(); + assert!(cert.verify(&root_key).unwrap()); + } } diff --git a/app/rust/src/parser/consent_message.rs b/app/rust/src/parser/consent_message.rs index 823f37b6..057a63a1 100644 --- a/app/rust/src/parser/consent_message.rs +++ b/app/rust/src/parser/consent_message.rs @@ -13,8 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. ********************************************************************************/ +mod buffer_writer; pub mod msg; pub mod msg_error; pub mod msg_info; +pub mod msg_iter; pub mod msg_metadata; pub mod msg_response; diff --git a/app/rust/src/parser/consent_message/buffer_writer.rs b/app/rust/src/parser/consent_message/buffer_writer.rs new file mode 100644 index 00000000..9c143a73 --- /dev/null +++ b/app/rust/src/parser/consent_message/buffer_writer.rs @@ -0,0 +1,57 @@ +use crate::{constants::MAX_CHARS_PER_LINE, error::ViewError}; + +// New helper struct to manage buffer writing +pub struct BufferWriter<'a> { + buffer: &'a mut [u8], + position: usize, +} + +impl<'a> BufferWriter<'a> { + pub fn new(buffer: &'a mut [u8]) -> Self { + Self { + buffer, + position: 0, + } + } + + pub fn write_byte(&mut self, byte: u8) -> Result<(), ViewError> { + if self.position >= self.buffer.len() - 1 { + return Err(ViewError::Unknown); + } + self.buffer[self.position] = byte; + self.position += 1; + Ok(()) + } + + pub fn write_line(&mut self, line: &str, add_newline: bool) -> Result<(), ViewError> { + // Process each character + let mut num_chars = 0; + for (chars_written, c) in line.chars().enumerate() { + if chars_written >= MAX_CHARS_PER_LINE { + break; + } + + self.write_byte(if c.is_ascii() { c as u8 } else { b' ' })?; + num_chars += 1; + } + + // // Pad with spaces if needed + while num_chars < MAX_CHARS_PER_LINE { + self.write_byte(b' ')?; + num_chars += 1; + } + + // Add newline if not the last line + if add_newline { + self.write_byte(b'\n')?; + } + + Ok(()) + } + + pub fn finalize(mut self) -> Result { + // Null-terminate the buffer + self.write_byte(0)?; + Ok(self.position as u8) + } +} diff --git a/app/rust/src/parser/consent_message/msg.rs b/app/rust/src/parser/consent_message/msg.rs index 005d96ce..84e30d7e 100644 --- a/app/rust/src/parser/consent_message/msg.rs +++ b/app/rust/src/parser/consent_message/msg.rs @@ -13,19 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. ********************************************************************************/ -use core::ptr::addr_of_mut; +use core::{mem::MaybeUninit, ptr::addr_of_mut}; use nom::bytes::complete::take; use crate::{ candid_header::CandidHeader, candid_utils::parse_text, + check_canary, constants::{MAX_CHARS_PER_LINE, MAX_LINES}, error::{ParserError, ViewError}, utils::{decompress_leb128, handle_ui_message}, DisplayableItem, FromCandidHeader, }; +use super::{ + buffer_writer::BufferWriter, + msg_iter::{LineDisplayIterator, ScreenPage}, +}; + #[repr(C)] struct GenericDisplayMessageVariant<'a>(MessageType, &'a str); #[repr(C)] @@ -38,6 +44,13 @@ pub enum MessageType { LineDisplayMessage, } +#[repr(C)] +#[cfg_attr(any(feature = "derive-debug", test), derive(Debug))] +pub struct Msg<'a, const PAGES: usize, const LINES: usize> { + num_items: u8, + msg: ConsentMessage<'a, PAGES, LINES>, +} + // ( // record { // arg = blob "\44\49\44\4c\00\01\71\04\74\6f\62\69"; @@ -62,8 +75,8 @@ pub enum MessageType { // }, // }, // ], -#[derive(Debug)] #[repr(u8)] // Important: same representation as MessageType +#[cfg_attr(any(feature = "derive-debug", test), derive(Debug))] pub enum ConsentMessage<'a, const PAGES: usize, const LINES: usize> { GenericDisplayMessage(&'a str), LineDisplayMessage(&'a [u8]), @@ -78,8 +91,7 @@ impl<'a, const PAGES: usize, const LINES: usize> ConsentMessage<'a, PAGES, LINES // We got this after printing the type table // using candid_utils::print_type_table function - // TODO: Check that this holds true - // the idea snprintf(buffer, "%s\n%s\n", line1, line2) + // The idea snprintf(buffer, "%s\n%s\n", line1, line2) // but in bytes plus null terminator fn render_buffer() -> [u8; MAX_CHARS_PER_LINE * MAX_LINES + MAX_LINES + 1] { // Unfortunate we can not use const generic parameters in expresion bellow @@ -89,205 +101,16 @@ impl<'a, const PAGES: usize, const LINES: usize> ConsentMessage<'a, PAGES, LINES fn format_page_content( &self, page: &ScreenPage<'_, LINES>, - output: &mut [u8], + out: &mut [u8], ) -> Result { - crate::zlog("ConsentMessage::format_page_content\x00"); - let mut output_idx = 0; - let mut current_line = 0; - - // Process each segment (which is already pre-formatted to screen width) - for segment in page.segments.iter().take(page.num_segments) { - if current_line >= MAX_LINES { - break; - } - - let input = segment.as_bytes(); - if input.is_empty() { - continue; - } - - // Copy the pre-formatted segment - let remaining_space = MAX_CHARS_PER_LINE.min(output.len() - output_idx); - if remaining_space == 0 { - break; - } - - let copy_len = remaining_space.min(input.len()); - output[output_idx..output_idx + copy_len].copy_from_slice(&input[..copy_len]); - output_idx += copy_len; - - // Add newline if we're not at the last line - if current_line < MAX_LINES - 1 && output_idx < output.len() - 1 { - output[output_idx] = b'\n'; - output_idx += 1; - current_line += 1; - } - } - - // Null-terminate the output if there's space - if output_idx < output.len() { - output[output_idx] = 0; - output_idx += 1; - } - - Ok(output_idx as u8) - } -} - -#[derive(Clone, Copy)] -#[cfg_attr(any(feature = "derive-debug", test), derive(Debug))] -pub struct Page<'a, const L: usize> { - lines: [&'a str; L], - num_lines: usize, -} - -impl<'a, const L: usize> Iterator for Page<'a, L> { - type Item = &'a str; - - fn next(&mut self) -> Option { - todo!() - } -} - -impl<'a, const L: usize> Page<'a, L> { - pub fn lines(&self) -> &[&str] { - &self.lines[..self.num_lines] - } -} - -impl<'a, const L: usize> Default for Page<'a, L> { - fn default() -> Self { - Self { - lines: [""; L], - num_lines: 0, - } - } -} - -#[cfg_attr(any(feature = "derive-debug", test), derive(Debug))] -struct LineDisplayIterator<'b, const L: usize> { - current: &'b [u8], - page_idx: usize, - page_count: u64, - screen_width: usize, - current_line_offset: usize, - current_line_in_page: usize, - current_line_count: usize, - current_line: &'b str, // Store current line being processed -} + let mut writer = BufferWriter::new(out); -#[cfg_attr(any(feature = "derive-debug", test), derive(Debug))] -pub struct ScreenPage<'b, const L: usize> { - segments: [&'b str; L], - num_segments: usize, -} - -impl<'b, const L: usize> LineDisplayIterator<'b, L> { - fn new(data: &'b [u8], screen_width: usize) -> Self { - let (rem, page_count) = decompress_leb128(data).unwrap(); - Self { - current: rem, - page_idx: 0, - page_count, - screen_width, - current_line_offset: 0, - current_line_in_page: 0, - current_line_count: 0, - current_line: "", + for (i, &line) in page.segments.iter().take(page.num_segments).enumerate() { + // Format each line + writer.write_line(line, i < page.num_segments - 1)?; } - } - fn get_line_segment<'a>(&self, line: &'a str) -> Option<&'a str> { - let start = self.current_line_offset * self.screen_width; - if start >= line.len() { - return None; - } - let end = (start + self.screen_width).min(line.len()); - Some(&line[start..end]) - } -} - -impl<'b, const L: usize> Iterator for LineDisplayIterator<'b, L> { - type Item = ScreenPage<'b, L>; - - fn next(&mut self) -> Option { - if self.page_idx >= self.page_count as usize { - return None; - } - - let mut screen_segments = [""; L]; - let mut segment_count = 0; - - // If we're starting a new page, read its line count - if self.current_line_in_page == 0 { - let (rem, line_count) = decompress_leb128(self.current).ok()?; - self.current = rem; - self.current_line_count = line_count as usize; - if line_count > L as u64 { - return None; - } - } - - // Process lines in the current page - while self.current_line_in_page < self.current_line_count { - // Parse the line text if we're at offset 0 - if self.current_line_offset == 0 { - let (new_rem, line) = parse_text(self.current).ok()?; - self.current = new_rem; - self.current_line = line; - } - - // Get the current segment of this line - if let Some(segment) = self.get_line_segment(self.current_line) { - screen_segments[segment_count] = segment; - segment_count += 1; - - let line_finished = - (self.current_line_offset + 1) * self.screen_width >= self.current_line.len(); - - if segment_count >= L || line_finished { - // If line is finished, move to next line - if line_finished { - self.current_line_offset = 0; - self.current_line_in_page += 1; - } else { - // Otherwise continue with next segment of current line - self.current_line_offset += 1; - } - - // Return screen if full - if segment_count >= L { - // Check if we need to move to next page - if self.current_line_in_page >= self.current_line_count - && self.current_line_offset == 0 - { - self.page_idx += 1; - self.current_line_in_page = 0; - } - return Some(ScreenPage { - segments: screen_segments, - num_segments: segment_count, - }); - } - } else { - // Move to next segment of current line - self.current_line_offset += 1; - } - } - } - - // Return any remaining segments if we finished the page - if segment_count > 0 { - self.page_idx += 1; - self.current_line_in_page = 0; - self.current_line_offset = 0; - Some(ScreenPage { - segments: screen_segments, - num_segments: segment_count, - }) - } else { - None - } + writer.finalize() } } @@ -296,45 +119,12 @@ impl<'a, const PAGES: usize, const LINES: usize> ConsentMessage<'a, PAGES, LINES &self, screen_width: usize, ) -> Option>> { - crate::zlog("ConsentMessage::pages_iter\x00"); if let ConsentMessage::LineDisplayMessage(data) = self { Some(LineDisplayIterator::new(data, screen_width)) } else { None } } - - #[inline(never)] - fn render_item( - &self, - item_n: u8, - title: &mut [u8], - message: &mut [u8], - page: u8, - ) -> Result { - // Title handling remains the same - let title_bytes = b"ConsentMsg"; - let title_len = title_bytes.len().min(title.len() - 1); - title[..title_len].copy_from_slice(&title_bytes[..title_len]); - title[title_len] = 0; - - match self { - ConsentMessage::GenericDisplayMessage(content) => { - let msg = content.as_bytes(); - handle_ui_message(msg, message, page) - } - ConsentMessage::LineDisplayMessage(bytes) => { - // Use screen width of 35 characters - let mut pages = LineDisplayIterator::new(bytes, 35); - let current_page = pages.nth(item_n as usize).ok_or(ViewError::NoData)?; - let mut output = Self::render_buffer(); - - // Format the screen page content - self.format_page_content(¤t_page, &mut output)?; - handle_ui_message(&output, message, page) - } - } - } } impl TryFrom for MessageType { @@ -350,6 +140,42 @@ impl TryFrom for MessageType { } } +impl<'a, const PAGES: usize, const LINES: usize> FromCandidHeader<'a> for Msg<'a, PAGES, LINES> { + fn from_candid_header( + input: &'a [u8], + out: &mut core::mem::MaybeUninit, + header: &CandidHeader, + ) -> Result<&'a [u8], ParserError> { + crate::zlog("Msg::from_candid_header\x00"); + + let out = out.as_mut_ptr(); + + let consent_msg: &mut MaybeUninit> = + unsafe { &mut *addr_of_mut!((*out).msg).cast() }; + + let rem = ConsentMessage::from_candid_header(input, consent_msg, header)?; + + // Precompute number of items + unsafe { + let m = consent_msg.assume_init_ref(); + match m { + ConsentMessage::GenericDisplayMessage(_) => { + addr_of_mut!((*out).num_items).write(1); + } + ConsentMessage::LineDisplayMessage(_) => { + addr_of_mut!((*out).num_items).write( + m.pages_iter(MAX_CHARS_PER_LINE) + .ok_or(ParserError::NoData)? + .count() as u8, + ); + } + } + } + + Ok(rem) + } +} + impl<'a, const PAGES: usize, const LINES: usize> FromCandidHeader<'a> for ConsentMessage<'a, PAGES, LINES> { @@ -402,7 +228,6 @@ impl<'a, const PAGES: usize, const LINES: usize> FromCandidHeader<'a> return Err(ParserError::ValueOutOfRange); } - // Debug: intenta leer la primera página let mut raw_line = rem; for _page in 0..page_count { let (rem, line_count) = decompress_leb128(raw_line)?; @@ -414,9 +239,17 @@ impl<'a, const PAGES: usize, const LINES: usize> FromCandidHeader<'a> std::println!("Page: {_page} line count: {line_count}"); let mut current = rem; for _i in 0..line_count { - if let Ok((new_rem, _text)) = parse_text(current) { + if let Ok((new_rem, text)) = parse_text(current) { + // Check at least that all lines fit into our screen + // current limit is based on nano devices + // stax/flex support longer lines + if text.len() > MAX_CHARS_PER_LINE { + crate::log_num("line length unsupported: \x00", text.len() as _); + return Err(ParserError::ValueOutOfRange); + } + #[cfg(test)] - std::println!("Line {}: {:?}", _i, _text); + std::println!("Line {}: {:?}", _i, text); current = new_rem; } } @@ -425,8 +258,6 @@ impl<'a, const PAGES: usize, const LINES: usize> FromCandidHeader<'a> // Store raw bytes for lazy parsing let data_len = start.len() - raw_line.len(); let (rem, data) = take(data_len)(start)?; - #[cfg(test)] - std::println!("LineDisplayContent****\n {}", hex::encode(data)); let out = out.as_mut_ptr() as *mut LineDisplayMessageVariant; unsafe { @@ -452,25 +283,38 @@ impl<'a, const PAGES: usize, const LINES: usize> FromCandidHeader<'a> } } +impl<'a, const PAGES: usize, const LINES: usize> DisplayableItem for Msg<'a, PAGES, LINES> { + #[inline(never)] + fn num_items(&self) -> Result { + Ok(self.num_items) + } + + #[inline(never)] + fn render_item( + &self, + item_n: u8, + title: &mut [u8], + message: &mut [u8], + page: u8, + ) -> Result { + check_canary(); + self.msg.render_item(item_n, title, message, page) + } +} + impl<'a, const PAGES: usize, const LINES: usize> DisplayableItem for ConsentMessage<'a, PAGES, LINES> { #[inline(never)] fn num_items(&self) -> Result { - crate::zlog("ConsentMessage::num_items\x00"); + check_canary(); match self { ConsentMessage::GenericDisplayMessage(_) => Ok(1), ConsentMessage::LineDisplayMessage(_) => { // Get an iterator using our standard screen width - if let Some(mut pages) = self.pages_iter(MAX_CHARS_PER_LINE) { - let mut total_screens = 0u8; - while pages.next().is_some() { - total_screens = total_screens.saturating_add(1); - } - Ok(total_screens) - } else { - Err(ViewError::NoData) - } + self.pages_iter(MAX_CHARS_PER_LINE) + .ok_or(ViewError::NoData) + .map(|pages| pages.count() as u8) } } } @@ -483,7 +327,7 @@ impl<'a, const PAGES: usize, const LINES: usize> DisplayableItem message: &mut [u8], page: u8, ) -> Result { - crate::zlog("ConsentMessage::render_item\x00"); + check_canary(); let title_bytes = b"ConsentMsg"; let title_len = title_bytes.len().min(title.len() - 1); title[..title_len].copy_from_slice(&title_bytes[..title_len]); @@ -500,10 +344,11 @@ impl<'a, const PAGES: usize, const LINES: usize> DisplayableItem .pages_iter(MAX_CHARS_PER_LINE) .ok_or(ViewError::NoData)?; let current_screen = pages.nth(item_n as usize).ok_or(ViewError::NoData)?; + let mut output = Self::render_buffer(); - self.format_page_content(¤t_screen, &mut output)?; - handle_ui_message(&output, message, page) + let written = self.format_page_content(¤t_screen, &mut output)? as usize; + handle_ui_message(&output[..written], message, page) } } } @@ -512,44 +357,49 @@ impl<'a, const PAGES: usize, const LINES: usize> DisplayableItem #[cfg(test)] mod tests_msg_display { use super::*; - use std::string::String; const SCREEN_WIDTH: usize = 35; const SMALL_SCREEN_WIDTH: usize = 15; const LINES: usize = 3; // Each page has exactly 3 lines const MSG_DATA: &str = "07031e2320417574686f72697a6520616e6f74686572206164647265737320746f2077697468647261772066726f6d20796f7572206163636f756e74202a2a5468651f666f6c6c6f77696e67206164647265737320697320616c6c6f77656420746f031d77697468647261772066726f6d20796f7572206163636f756e743a2a2a2272646d78362d6a616161612d61616161612d61616164712d636169202a2a596f75720d7375626163636f756e743a2a2a032330303030303030303030303030303030303030303030303030303030303030303030301d3030303030303030303030303030303030303030303030303030303030232a2a526571756573746564207769746864726177616c20616c6c6f77616e63653a2a2a032031302049435020e29aa02054686520616c6c6f77616e63652077696c6c2062652273657420746f2031302049435020696e646570656e64656e746c79206f6620616e791e70726576696f757320616c6c6f77616e63652e20556e74696c207468697303217472616e73616374696f6e20686173206265656e206578656375746564207468651e7370656e6465722063616e207374696c6c206578657263697365207468652370726576696f757320616c6c6f77616e63652028696620616e792920746f2069742773032166756c6c20616d6f756e742e202a2a45787069726174696f6e20646174653a2a2a204e6f2065787069726174696f6e2e202a2a417070726f76616c206665653a2a2a23302e3030303120494350202a2a5472616e73616374696f6e206665657320746f206265031a7061696420627920796f7572207375626163636f756e743a2a2a2330303030303030303030303030303030303030303030303030303030303030303030301d3030303030303030303030303030303030303030303030303030303030"; - // Expected content per page const EXPECTED_PAGES: &[&[&str]] = &[ + // Page 0 &[ "# Authorize another address to", "withdraw from your account **The", "following address is allowed to", ], + // Page 1 &[ "withdraw from your account:**", "rdmx6-jaaaa-aaaaa-aaadq-cai **Your", "subaccount:**", ], + // Page 2 &[ "00000000000000000000000000000000000", "00000000000000000000000000000", "**Requested withdrawal allowance:**", ], + // Page 3 &[ - "10 ICP ⚠ The allowance will be", + "10 ICP ⚠ The allowance will be", // Non-ASCII '⚠' replaced with ' ' "set to 10 ICP independently of any", "previous allowance. Until this", ], + // Page 4 &[ "transaction has been executed the", "spender can still exercise the", "previous allowance (if any) to it's", ], + // Page 5 &[ "full amount. **Expiration date:**", "No expiration. **Approval fee:**", "0.0001 ICP **Transaction fees to be", ], + // Page 6 &[ "paid by your subaccount:**", "00000000000000000000000000000000000", @@ -562,13 +412,13 @@ mod tests_msg_display { let msg_bytes = hex::decode(MSG_DATA).unwrap(); // Create iterator - let mut iterator = LineDisplayIterator::::new(&msg_bytes, SCREEN_WIDTH); + let iterator = LineDisplayIterator::::new(&msg_bytes, SCREEN_WIDTH); // Track which page we're on let mut page_idx = 0; // Test each page - while let Some(screen_page) = iterator.next() { + for screen_page in iterator { assert!(page_idx < EXPECTED_PAGES.len(), "Too many pages produced"); // Verify number of segments matches expected @@ -616,62 +466,7 @@ mod tests_msg_display { fn test_line_segments_within_width() { let msg_bytes = hex::decode(MSG_DATA).unwrap(); let mut iterator = LineDisplayIterator::::new(&msg_bytes, SMALL_SCREEN_WIDTH); - let mut page_idx = 0; - - let mut current_page = 0; - let mut current_line = 0; - let mut accumulated = String::new(); - - while let Some(screen_page) = iterator.next() { - std::println!( - "Page {} with {} segments:", - page_idx, - screen_page.num_segments - ); - - for segment in screen_page.segments.iter().take(screen_page.num_segments) { - std::println!(" Segment: '{}' (len: {})", segment, segment.len()); - - // Core requirements check - assert!( - segment.len() <= SMALL_SCREEN_WIDTH, - "Found segment exceeding screen width: '{}' (length: {})", - segment, - segment.len() - ); - - assert!( - screen_page.num_segments <= LINES, - "Too many segments on page {}: {}", - page_idx, - screen_page.num_segments - ); - - // Optional: Verify segments reconstruct original content - accumulated.push_str(segment); - - // If this was the last segment of a line, verify it matches original - if accumulated.len() >= EXPECTED_PAGES[current_page][current_line].len() { - assert!( - EXPECTED_PAGES[current_page][current_line].contains(&accumulated), - "Reconstructed line doesn't match original.\nOriginal: '{}'\nReconstructed: '{}'", - EXPECTED_PAGES[current_page][current_line], - accumulated - ); - - accumulated.clear(); - current_line += 1; - if current_line >= EXPECTED_PAGES[current_page].len() { - current_page += 1; - current_line = 0; - } - } - } - - page_idx += 1; - } - // Verify all content was processed - assert!(current_page > 0, "No pages were processed"); + assert!(iterator.next().is_none()); } } diff --git a/app/rust/src/parser/consent_message/msg_info.rs b/app/rust/src/parser/consent_message/msg_info.rs index 80ef7836..960759ea 100644 --- a/app/rust/src/parser/consent_message/msg_info.rs +++ b/app/rust/src/parser/consent_message/msg_info.rs @@ -22,12 +22,12 @@ use crate::{ }; use core::{mem::MaybeUninit, ptr::addr_of_mut}; -use super::{msg::ConsentMessage, msg_metadata::ConsentMessageMetadata}; +use super::{msg::Msg, msg_metadata::ConsentMessageMetadata}; #[repr(C)] #[cfg_attr(any(feature = "derive-debug", test), derive(Debug))] pub struct ConsentInfo<'a> { - pub message: ConsentMessage<'a, MAX_PAGES, MAX_LINES>, + pub message: Msg<'a, MAX_PAGES, MAX_LINES>, pub metadata: ConsentMessageMetadata<'a>, } @@ -68,9 +68,9 @@ impl<'a> FromCandidHeader<'a> for ConsentInfo<'a> { let metadata = unsafe { &mut *addr_of_mut!((*out).metadata).cast() }; let mut rem = ConsentMessageMetadata::from_candid_header(input, metadata, header)?; - let message: &mut MaybeUninit> = + let message: &mut MaybeUninit> = unsafe { &mut *addr_of_mut!((*out).message).cast() }; - rem = ConsentMessage::from_candid_header(rem, message, header)?; + rem = Msg::from_candid_header(rem, message, header)?; Ok(rem) } @@ -79,7 +79,6 @@ impl<'a> FromCandidHeader<'a> for ConsentInfo<'a> { impl<'a> DisplayableItem for ConsentInfo<'a> { #[inline(never)] fn num_items(&self) -> Result { - crate::zlog("ConsentInfo::num_items\x00"); self.message.num_items() } diff --git a/app/rust/src/parser/consent_message/msg_iter.rs b/app/rust/src/parser/consent_message/msg_iter.rs new file mode 100644 index 00000000..1ddc7bf1 --- /dev/null +++ b/app/rust/src/parser/consent_message/msg_iter.rs @@ -0,0 +1,145 @@ +/******************************************************************************* +* (c) 2018 - 2024 Zondax AG +* +* 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. +********************************************************************************/ +use crate::{ + candid_utils::parse_text, check_canary, error::ParserError, heartbeat, utils::decompress_leb128, +}; + +#[cfg_attr(any(feature = "derive-debug", test), derive(Debug))] +pub struct LineDisplayIterator<'b, const L: usize> { + data: PageData<'b>, + current_state: IteratorState, + config: DisplayConfig, +} + +#[cfg_attr(any(feature = "derive-debug", test), derive(Debug))] +struct PageData<'b> { + current: &'b [u8], + current_line: &'b str, +} + +#[cfg_attr(any(feature = "derive-debug", test), derive(Debug))] +struct IteratorState { + page_idx: usize, + page_count: usize, + current_line_in_page: usize, + current_line_count: usize, +} + +#[cfg_attr(any(feature = "derive-debug", test), derive(Debug))] +struct DisplayConfig { + screen_width: usize, +} + +#[cfg_attr(any(feature = "derive-debug", test), derive(Debug))] +pub struct ScreenPage<'b, const L: usize> { + pub(crate) segments: [&'b str; L], + pub(crate) num_segments: usize, +} + +impl<'b, const L: usize> LineDisplayIterator<'b, L> { + pub fn new(data: &'b [u8], screen_width: usize) -> Self { + let (rem, page_count) = decompress_leb128(data).unwrap(); + + Self { + data: PageData { + current: rem, + current_line: "", + }, + current_state: IteratorState { + page_idx: 0, + page_count: page_count as usize, + current_line_in_page: 0, + current_line_count: 0, + }, + config: DisplayConfig { screen_width }, + } + } + + fn process_new_page(&mut self) -> Result<(), ParserError> { + let (rem, line_count) = decompress_leb128(self.data.current)?; + self.data.current = rem; + + if line_count as usize > L { + return Err(ParserError::TooManyLines); + } + + self.current_state.current_line_count = line_count.min(L as u64) as usize; + Ok(()) + } + + fn process_new_line(&mut self) -> Result<(), ParserError> { + let (new_rem, line) = parse_text(self.data.current)?; + + // Add check for line length + if line.len() > self.config.screen_width { + crate::log_num("Line too large\x00", line.len() as _); + return Err(ParserError::LineTooLong); + } + + self.data.current = new_rem; + self.data.current_line = line; + Ok(()) + } + + pub fn page_count(&self) -> usize { + self.current_state.page_count + } +} + +impl<'b, const L: usize> Iterator for LineDisplayIterator<'b, L> { + type Item = ScreenPage<'b, L>; + + fn next(&mut self) -> Option { + check_canary(); + heartbeat(); + + // Initialize a new ScreenPage + let mut screen_segments = [""; L]; + let mut segment_count = 0; + + // Check if we're starting a new page + if self.current_state.current_line_in_page == 0 { + self.process_new_page().ok()?; + } + + // Process lines for this page + while segment_count < L + && self.current_state.current_line_in_page < self.current_state.current_line_count + { + self.process_new_line().ok()?; + + screen_segments[segment_count] = self.data.current_line; + segment_count += 1; + self.current_state.current_line_in_page += 1; + } + + // If we completed a page + if segment_count > 0 { + // Update state for next iteration + if self.current_state.current_line_in_page >= self.current_state.current_line_count { + self.current_state.page_idx += 1; + self.current_state.current_line_in_page = 0; + } + + Some(ScreenPage { + segments: screen_segments, + num_segments: segment_count, + }) + } else { + None + } + } +} diff --git a/app/rust/src/parser/consent_message/msg_response.rs b/app/rust/src/parser/consent_message/msg_response.rs index fb94303f..bd3485f6 100644 --- a/app/rust/src/parser/consent_message/msg_response.rs +++ b/app/rust/src/parser/consent_message/msg_response.rs @@ -133,7 +133,6 @@ impl<'a> FromBytes<'a> for ConsentMessageResponse<'a> { impl<'a> DisplayableItem for ConsentMessageResponse<'a> { #[inline(never)] fn num_items(&self) -> Result { - crate::zlog("ContentMessageResponse::num_items\x00"); match self { Self::Ok(msg) => msg.num_items(), Self::Err(err) => err.num_items(), @@ -148,10 +147,12 @@ impl<'a> DisplayableItem for ConsentMessageResponse<'a> { message: &mut [u8], page: u8, ) -> Result { - crate::zlog("ContentMessageResponse::render_item\x00"); match self { Self::Ok(msg) => msg.render_item(item_n, title, message, page), - Self::Err(err) => err.render_item(item_n, title, message, page), + Self::Err(_) => { + crate::zlog("ContentMessageResponse::render_item::Err\x00"); + Err(ViewError::NoData) + } } } } @@ -160,7 +161,6 @@ impl<'a> DisplayableItem for ConsentMessageResponse<'a> { mod msg_response_test { use serde::{Deserialize, Serialize}; use std::string::String; - use std::vec::Vec; use zemu_sys::Viewable; use crate::{parser::snapshots_common::ReducedPage, test_ui::with_leaked}; diff --git a/app/rust/src/parser/consent_message/snapshots/rslib__parser__consent_message__msg_response__msg_response_test__ui.snap b/app/rust/src/parser/consent_message/snapshots/rslib__parser__consent_message__msg_response__msg_response_test__ui.snap index 84dcef8d..895664ed 100644 --- a/app/rust/src/parser/consent_message/snapshots/rslib__parser__consent_message__msg_response__msg_response_test__ui.snap +++ b/app/rust/src/parser/consent_message/snapshots/rslib__parser__consent_message__msg_response__msg_response_test__ui.snap @@ -4,18 +4,11 @@ expression: reduced input_file: src/parser/consent_message/testvectors/ui_data.json --- [ - "ConsentMsg": "# Authorize another addre\nss to\nwithdraw from your accoun", - "ConsentMsg": "t **The\nfollowing address is allo\nwed to", - "ConsentMsg": "withdraw from your accoun\nt:**\nrdmx6-jaaaa-aaaaa-aaadq-c", - "ConsentMsg": "ai **Your\nsubaccount:**\n", - "ConsentMsg": "0000000000000000000000000\n0000000000\n0000000000000000000000000", - "ConsentMsg": "0000\n**Requested withdrawal al\nlowance:**", - "ConsentMsg": "10 ICP ⚠ The allowance \nwill be\nset to 10 ICP independent", - "ConsentMsg": "ly of any\nprevious allowance. Until\n this", - "ConsentMsg": "transaction has been exec\nuted the\nspender can still exercis", - "ConsentMsg": "e the\nprevious allowance (if an\ny) to it's", - "ConsentMsg": "full amount. **Expiration\n date:**\nNo expiration. **Approval", - "ConsentMsg": " fee:**\n0.0001 ICP **Transaction \nfees to be", - "ConsentMsg": "paid by your subaccount:*\n*\n0000000000000000000000000", - "ConsentMsg": "0000000000\n0000000000000000000000000\n0000", + "ConsentMsg": "# Authorize another address to \nwithdraw from your account **The \nfollowing address is allowed to ", + "ConsentMsg": "withdraw from your account:** \nrdmx6-jaaaa-aaaaa-aaadq-cai **Your \nsubaccount:** ", + "ConsentMsg": "00000000000000000000000000000000000\n00000000000000000000000000000 \n**Requested withdrawal allowance:**", + "ConsentMsg": "10 ICP The allowance will be \nset to 10 ICP independently of any \nprevious allowance. Until this ", + "ConsentMsg": "transaction has been executed the \nspender can still exercise the \nprevious allowance (if any) to it's", + "ConsentMsg": "full amount. **Expiration date:** \nNo expiration. **Approval fee:** \n0.0001 ICP **Transaction fees to be", + "ConsentMsg": "paid by your subaccount:** \n00000000000000000000000000000000000\n00000000000000000000000000000 ", ] diff --git a/app/src/apdu_handler.c b/app/src/apdu_handler.c index fbceca9b..6a3d3717 100644 --- a/app/src/apdu_handler.c +++ b/app/src/apdu_handler.c @@ -146,11 +146,9 @@ void handleApdu(volatile uint32_t *flags, volatile uint32_t *tx, uint32_t rx) { if (rx < APDU_MIN_LENGTH) { THROW(APDU_CODE_WRONG_LENGTH); } - ZEMU_LOGF(50, "***INS: %d\n", G_io_apdu_buffer[OFFSET_INS]) switch (G_io_apdu_buffer[OFFSET_INS]) { case INS_GET_VERSION: { - zemu_log("version******\n"); handle_getversion(flags, tx, rx); break; } diff --git a/app/src/c_api/api.c b/app/src/c_api/api.c index 318f2809..bf961dc0 100644 --- a/app/src/c_api/api.c +++ b/app/src/c_api/api.c @@ -14,6 +14,10 @@ * limitations under the License. ********************************************************************************/ #if defined(BLS_SIGNATURE) +#include +#include +#include "zxcanary.h" +#include "zxmacros.h" #include "crypto.h" #include "coin.h" @@ -37,4 +41,18 @@ int8_t c_fill_principal(uint8_t *output, uint16_t output_len, uint16_t *response return 0; } + +void io_heartbeat() { + io_seproxyhal_io_heartbeat(); +} + +void log_number(const char *str, int number) { + ZEMU_LOGF(50, "%s: %d\n", str, number); + (void)str; + (void)number; +} + +void _check_canary() { + CHECK_APP_CANARY(); +} #endif diff --git a/deps/ledger-rust b/deps/ledger-rust index d840e1a4..6436845c 160000 --- a/deps/ledger-rust +++ b/deps/ledger-rust @@ -1 +1 @@ -Subproject commit d840e1a4e6124a4844a4a84220d5ee0e5cf3d29b +Subproject commit 6436845c8ec241d235b798d240f66a49ff3301fa diff --git a/deps/ledger-zxlib b/deps/ledger-zxlib index eebf9d53..fec0d14a 160000 --- a/deps/ledger-zxlib +++ b/deps/ledger-zxlib @@ -1 +1 @@ -Subproject commit eebf9d533a497f01e60f7a6f8bd5465b1379882c +Subproject commit fec0d14a886c9ce711867022d1eae52e95cdc19b diff --git a/tests_zemu/package.json b/tests_zemu/package.json index ee1406e3..04e144d1 100644 --- a/tests_zemu/package.json +++ b/tests_zemu/package.json @@ -23,7 +23,7 @@ "@ledgerhq/hw-transport-node-hid": "^6.29.3", "@ledgerhq/logs": "^6.12.0", "@zondax/ledger-icp": "link:../js", - "@zondax/zemu": "^0.52.0" + "@zondax/zemu": "^0.53.0" }, "devDependencies": { "@matteoh2o1999/github-actions-jest-reporter": "^3.0.0", diff --git a/tests_zemu/snapshots/fl-bls-cert-custom-key/00000.png b/tests_zemu/snapshots/fl-bls-cert-custom-key/00000.png deleted file mode 100644 index 74936fef..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert-custom-key/00000.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert-custom-key/00001.png b/tests_zemu/snapshots/fl-bls-cert-custom-key/00001.png deleted file mode 100644 index 7861b986..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert-custom-key/00001.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert-custom-key/00002.png b/tests_zemu/snapshots/fl-bls-cert-custom-key/00002.png deleted file mode 100644 index b4e2d27b..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert-custom-key/00002.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert-default-key/00000.png b/tests_zemu/snapshots/fl-bls-cert-default-key/00000.png deleted file mode 100644 index 74936fef..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert-default-key/00000.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert-default-key/00001.png b/tests_zemu/snapshots/fl-bls-cert-default-key/00001.png deleted file mode 100644 index 7861b986..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert-default-key/00001.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert-default-key/00002.png b/tests_zemu/snapshots/fl-bls-cert-default-key/00002.png deleted file mode 100644 index b4e2d27b..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert-default-key/00002.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert-default-key/00003.png b/tests_zemu/snapshots/fl-bls-cert-default-key/00003.png deleted file mode 100644 index f4e76bde..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert-default-key/00003.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert_custom_key/00000.png b/tests_zemu/snapshots/fl-bls-cert_custom_key/00000.png deleted file mode 100644 index 74936fef..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert_custom_key/00000.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert_custom_key/00001.png b/tests_zemu/snapshots/fl-bls-cert_custom_key/00001.png deleted file mode 100644 index 7861b986..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert_custom_key/00001.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert_custom_key/00002.png b/tests_zemu/snapshots/fl-bls-cert_custom_key/00002.png deleted file mode 100644 index b4e2d27b..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert_custom_key/00002.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert_custom_key/00003.png b/tests_zemu/snapshots/fl-bls-cert_custom_key/00003.png deleted file mode 100644 index f4e76bde..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert_custom_key/00003.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert_default_key/00000.png b/tests_zemu/snapshots/fl-bls-cert_default_key/00000.png index 74936fef..c4e10236 100644 Binary files a/tests_zemu/snapshots/fl-bls-cert_default_key/00000.png and b/tests_zemu/snapshots/fl-bls-cert_default_key/00000.png differ diff --git a/tests_zemu/snapshots/fl-bls-cert_default_key/00001.png b/tests_zemu/snapshots/fl-bls-cert_default_key/00001.png index 7861b986..ae4a8ab1 100644 Binary files a/tests_zemu/snapshots/fl-bls-cert_default_key/00001.png and b/tests_zemu/snapshots/fl-bls-cert_default_key/00001.png differ diff --git a/tests_zemu/snapshots/fl-bls-cert_default_key/00002.png b/tests_zemu/snapshots/fl-bls-cert_default_key/00002.png index b4e2d27b..5b461233 100644 Binary files a/tests_zemu/snapshots/fl-bls-cert_default_key/00002.png and b/tests_zemu/snapshots/fl-bls-cert_default_key/00002.png differ diff --git a/tests_zemu/snapshots/fl-bls-cert_default_key/00003.png b/tests_zemu/snapshots/fl-bls-cert_default_key/00003.png index f4e76bde..62ce1a89 100644 Binary files a/tests_zemu/snapshots/fl-bls-cert_default_key/00003.png and b/tests_zemu/snapshots/fl-bls-cert_default_key/00003.png differ diff --git a/tests_zemu/snapshots/fl-bls-cert_default_key/00004.png b/tests_zemu/snapshots/fl-bls-cert_default_key/00004.png new file mode 100644 index 00000000..20236ef0 Binary files /dev/null and b/tests_zemu/snapshots/fl-bls-cert_default_key/00004.png differ diff --git a/tests_zemu/snapshots/fl-bls-cert_default_key/00005.png b/tests_zemu/snapshots/fl-bls-cert_default_key/00005.png new file mode 100644 index 00000000..0f3f5b2f Binary files /dev/null and b/tests_zemu/snapshots/fl-bls-cert_default_key/00005.png differ diff --git a/tests_zemu/snapshots/fl-bls-cert_default_key/00006.png b/tests_zemu/snapshots/fl-bls-cert_default_key/00006.png new file mode 100644 index 00000000..79715ffd Binary files /dev/null and b/tests_zemu/snapshots/fl-bls-cert_default_key/00006.png differ diff --git a/tests_zemu/snapshots/fl-bls-cert_default_key/00007.png b/tests_zemu/snapshots/fl-bls-cert_default_key/00007.png new file mode 100644 index 00000000..ac4946ef Binary files /dev/null and b/tests_zemu/snapshots/fl-bls-cert_default_key/00007.png differ diff --git a/tests_zemu/snapshots/fl-bls-cert_default_key/00008.png b/tests_zemu/snapshots/fl-bls-cert_default_key/00008.png new file mode 100644 index 00000000..9bf48f38 Binary files /dev/null and b/tests_zemu/snapshots/fl-bls-cert_default_key/00008.png differ diff --git a/tests_zemu/snapshots/fl-bls-cert-custom-key/00003.png b/tests_zemu/snapshots/fl-bls-cert_default_key/00009.png similarity index 100% rename from tests_zemu/snapshots/fl-bls-cert-custom-key/00003.png rename to tests_zemu/snapshots/fl-bls-cert_default_key/00009.png diff --git a/tests_zemu/snapshots/fl-bls-cert_device_id/00000.png b/tests_zemu/snapshots/fl-bls-cert_device_id/00000.png deleted file mode 100644 index 74936fef..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert_device_id/00000.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert_device_id/00001.png b/tests_zemu/snapshots/fl-bls-cert_device_id/00001.png deleted file mode 100644 index 7861b986..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert_device_id/00001.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert_device_id/00002.png b/tests_zemu/snapshots/fl-bls-cert_device_id/00002.png deleted file mode 100644 index b4e2d27b..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert_device_id/00002.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-bls-cert_device_id/00003.png b/tests_zemu/snapshots/fl-bls-cert_device_id/00003.png deleted file mode 100644 index f4e76bde..00000000 Binary files a/tests_zemu/snapshots/fl-bls-cert_device_id/00003.png and /dev/null differ diff --git a/tests_zemu/snapshots/fl-mainmenu/00004.png b/tests_zemu/snapshots/fl-mainmenu/00004.png index ef300557..a752c1d5 100644 Binary files a/tests_zemu/snapshots/fl-mainmenu/00004.png and b/tests_zemu/snapshots/fl-mainmenu/00004.png differ diff --git a/tests_zemu/snapshots/s-mainmenu/00004.png b/tests_zemu/snapshots/s-mainmenu/00004.png index f253ad1c..2878f1cd 100644 Binary files a/tests_zemu/snapshots/s-mainmenu/00004.png and b/tests_zemu/snapshots/s-mainmenu/00004.png differ diff --git a/tests_zemu/snapshots/s-mainmenu/00010.png b/tests_zemu/snapshots/s-mainmenu/00010.png index f253ad1c..2878f1cd 100644 Binary files a/tests_zemu/snapshots/s-mainmenu/00010.png and b/tests_zemu/snapshots/s-mainmenu/00010.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert-custom-key/00000.png b/tests_zemu/snapshots/sp-bls-cert-custom-key/00000.png deleted file mode 100644 index 8d0c3cbd..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert-custom-key/00000.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert-custom-key/00001.png b/tests_zemu/snapshots/sp-bls-cert-custom-key/00001.png deleted file mode 100644 index ad051f23..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert-custom-key/00001.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert-custom-key/00002.png b/tests_zemu/snapshots/sp-bls-cert-custom-key/00002.png deleted file mode 100644 index 5acbbd41..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert-custom-key/00002.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert-default-key/00000.png b/tests_zemu/snapshots/sp-bls-cert-default-key/00000.png deleted file mode 100644 index 8d0c3cbd..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert-default-key/00000.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert-default-key/00001.png b/tests_zemu/snapshots/sp-bls-cert-default-key/00001.png deleted file mode 100644 index ad051f23..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert-default-key/00001.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert-default-key/00002.png b/tests_zemu/snapshots/sp-bls-cert-default-key/00002.png deleted file mode 100644 index 5acbbd41..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert-default-key/00002.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert-default-key/00003.png b/tests_zemu/snapshots/sp-bls-cert-default-key/00003.png deleted file mode 100644 index 1e4be699..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert-default-key/00003.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert-default-key/00004.png b/tests_zemu/snapshots/sp-bls-cert-default-key/00004.png deleted file mode 100644 index 4c3747ed..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert-default-key/00004.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert_custom_key/00000.png b/tests_zemu/snapshots/sp-bls-cert_custom_key/00000.png deleted file mode 100644 index 8d0c3cbd..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert_custom_key/00000.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert_custom_key/00001.png b/tests_zemu/snapshots/sp-bls-cert_custom_key/00001.png deleted file mode 100644 index ad051f23..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert_custom_key/00001.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert_custom_key/00002.png b/tests_zemu/snapshots/sp-bls-cert_custom_key/00002.png deleted file mode 100644 index 5acbbd41..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert_custom_key/00002.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert_custom_key/00003.png b/tests_zemu/snapshots/sp-bls-cert_custom_key/00003.png deleted file mode 100644 index 1e4be699..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert_custom_key/00003.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert_custom_key/00004.png b/tests_zemu/snapshots/sp-bls-cert_custom_key/00004.png deleted file mode 100644 index 4c3747ed..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert_custom_key/00004.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00001.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00001.png index ad051f23..7480205a 100644 Binary files a/tests_zemu/snapshots/sp-bls-cert_default_key/00001.png and b/tests_zemu/snapshots/sp-bls-cert_default_key/00001.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00002.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00002.png index 5acbbd41..ed91e28b 100644 Binary files a/tests_zemu/snapshots/sp-bls-cert_default_key/00002.png and b/tests_zemu/snapshots/sp-bls-cert_default_key/00002.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00003.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00003.png index 1e4be699..cb4fe0c5 100644 Binary files a/tests_zemu/snapshots/sp-bls-cert_default_key/00003.png and b/tests_zemu/snapshots/sp-bls-cert_default_key/00003.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00004.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00004.png index 4c3747ed..af452feb 100644 Binary files a/tests_zemu/snapshots/sp-bls-cert_default_key/00004.png and b/tests_zemu/snapshots/sp-bls-cert_default_key/00004.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00005.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00005.png new file mode 100644 index 00000000..eda54c8f Binary files /dev/null and b/tests_zemu/snapshots/sp-bls-cert_default_key/00005.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00006.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00006.png new file mode 100644 index 00000000..ad60e91c Binary files /dev/null and b/tests_zemu/snapshots/sp-bls-cert_default_key/00006.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00007.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00007.png new file mode 100644 index 00000000..404c5981 Binary files /dev/null and b/tests_zemu/snapshots/sp-bls-cert_default_key/00007.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00008.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00008.png new file mode 100644 index 00000000..e2b71077 Binary files /dev/null and b/tests_zemu/snapshots/sp-bls-cert_default_key/00008.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00009.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00009.png new file mode 100644 index 00000000..f0dbc5cc Binary files /dev/null and b/tests_zemu/snapshots/sp-bls-cert_default_key/00009.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00010.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00010.png new file mode 100644 index 00000000..b7c7c6ec Binary files /dev/null and b/tests_zemu/snapshots/sp-bls-cert_default_key/00010.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00011.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00011.png new file mode 100644 index 00000000..08d0549a Binary files /dev/null and b/tests_zemu/snapshots/sp-bls-cert_default_key/00011.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00012.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00012.png new file mode 100644 index 00000000..8479b860 Binary files /dev/null and b/tests_zemu/snapshots/sp-bls-cert_default_key/00012.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00013.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00013.png new file mode 100644 index 00000000..a454baa2 Binary files /dev/null and b/tests_zemu/snapshots/sp-bls-cert_default_key/00013.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00014.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00014.png new file mode 100644 index 00000000..e3d671aa Binary files /dev/null and b/tests_zemu/snapshots/sp-bls-cert_default_key/00014.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00015.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00015.png new file mode 100644 index 00000000..19a44015 Binary files /dev/null and b/tests_zemu/snapshots/sp-bls-cert_default_key/00015.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00016.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00016.png new file mode 100644 index 00000000..b92382e4 Binary files /dev/null and b/tests_zemu/snapshots/sp-bls-cert_default_key/00016.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert_default_key/00017.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00017.png new file mode 100644 index 00000000..654097d2 Binary files /dev/null and b/tests_zemu/snapshots/sp-bls-cert_default_key/00017.png differ diff --git a/tests_zemu/snapshots/sp-bls-cert-custom-key/00003.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00018.png similarity index 100% rename from tests_zemu/snapshots/sp-bls-cert-custom-key/00003.png rename to tests_zemu/snapshots/sp-bls-cert_default_key/00018.png diff --git a/tests_zemu/snapshots/sp-bls-cert-custom-key/00004.png b/tests_zemu/snapshots/sp-bls-cert_default_key/00019.png similarity index 100% rename from tests_zemu/snapshots/sp-bls-cert-custom-key/00004.png rename to tests_zemu/snapshots/sp-bls-cert_default_key/00019.png diff --git a/tests_zemu/snapshots/sp-bls-cert_device_id/00000.png b/tests_zemu/snapshots/sp-bls-cert_device_id/00000.png deleted file mode 100644 index 8d0c3cbd..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert_device_id/00000.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert_device_id/00001.png b/tests_zemu/snapshots/sp-bls-cert_device_id/00001.png deleted file mode 100644 index ad051f23..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert_device_id/00001.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert_device_id/00002.png b/tests_zemu/snapshots/sp-bls-cert_device_id/00002.png deleted file mode 100644 index 5acbbd41..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert_device_id/00002.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert_device_id/00003.png b/tests_zemu/snapshots/sp-bls-cert_device_id/00003.png deleted file mode 100644 index 1e4be699..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert_device_id/00003.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-bls-cert_device_id/00004.png b/tests_zemu/snapshots/sp-bls-cert_device_id/00004.png deleted file mode 100644 index 4c3747ed..00000000 Binary files a/tests_zemu/snapshots/sp-bls-cert_device_id/00004.png and /dev/null differ diff --git a/tests_zemu/snapshots/sp-candid_auto_stake_maturity/00001.png b/tests_zemu/snapshots/sp-candid_auto_stake_maturity/00001.png index 7f54ba24..21afb5b6 100644 Binary files a/tests_zemu/snapshots/sp-candid_auto_stake_maturity/00001.png and b/tests_zemu/snapshots/sp-candid_auto_stake_maturity/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_auto_stake_maturity/00003.png b/tests_zemu/snapshots/sp-candid_auto_stake_maturity/00003.png index 7847be1b..6743db0d 100644 Binary files a/tests_zemu/snapshots/sp-candid_auto_stake_maturity/00003.png and b/tests_zemu/snapshots/sp-candid_auto_stake_maturity/00003.png differ diff --git a/tests_zemu/snapshots/sp-candid_disburse/00001.png b/tests_zemu/snapshots/sp-candid_disburse/00001.png index d3d8670a..ce62d6d8 100644 Binary files a/tests_zemu/snapshots/sp-candid_disburse/00001.png and b/tests_zemu/snapshots/sp-candid_disburse/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_disburse/00003.png b/tests_zemu/snapshots/sp-candid_disburse/00003.png index 27ac1752..dca8aae3 100644 Binary files a/tests_zemu/snapshots/sp-candid_disburse/00003.png and b/tests_zemu/snapshots/sp-candid_disburse/00003.png differ diff --git a/tests_zemu/snapshots/sp-candid_disburse/00004.png b/tests_zemu/snapshots/sp-candid_disburse/00004.png index 54dcc00c..07c96a89 100644 Binary files a/tests_zemu/snapshots/sp-candid_disburse/00004.png and b/tests_zemu/snapshots/sp-candid_disburse/00004.png differ diff --git a/tests_zemu/snapshots/sp-candid_disburse/00005.png b/tests_zemu/snapshots/sp-candid_disburse/00005.png index 6110245f..56c0c614 100644 Binary files a/tests_zemu/snapshots/sp-candid_disburse/00005.png and b/tests_zemu/snapshots/sp-candid_disburse/00005.png differ diff --git a/tests_zemu/snapshots/sp-candid_follow/00001.png b/tests_zemu/snapshots/sp-candid_follow/00001.png index 0541da93..38ac47c2 100644 Binary files a/tests_zemu/snapshots/sp-candid_follow/00001.png and b/tests_zemu/snapshots/sp-candid_follow/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_follow/00004.png b/tests_zemu/snapshots/sp-candid_follow/00004.png index f5a6e5aa..c0849e10 100644 Binary files a/tests_zemu/snapshots/sp-candid_follow/00004.png and b/tests_zemu/snapshots/sp-candid_follow/00004.png differ diff --git a/tests_zemu/snapshots/sp-candid_follow/00005.png b/tests_zemu/snapshots/sp-candid_follow/00005.png index 498d0234..ad1a2321 100644 Binary files a/tests_zemu/snapshots/sp-candid_follow/00005.png and b/tests_zemu/snapshots/sp-candid_follow/00005.png differ diff --git a/tests_zemu/snapshots/sp-candid_follow/00006.png b/tests_zemu/snapshots/sp-candid_follow/00006.png index e9e83817..06931f6d 100644 Binary files a/tests_zemu/snapshots/sp-candid_follow/00006.png and b/tests_zemu/snapshots/sp-candid_follow/00006.png differ diff --git a/tests_zemu/snapshots/sp-candid_increase_dissolve_delay/00001.png b/tests_zemu/snapshots/sp-candid_increase_dissolve_delay/00001.png index 814335b0..bb7dc027 100644 Binary files a/tests_zemu/snapshots/sp-candid_increase_dissolve_delay/00001.png and b/tests_zemu/snapshots/sp-candid_increase_dissolve_delay/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_increase_dissolve_delay/00003.png b/tests_zemu/snapshots/sp-candid_increase_dissolve_delay/00003.png index 79bac100..7a58767c 100644 Binary files a/tests_zemu/snapshots/sp-candid_increase_dissolve_delay/00003.png and b/tests_zemu/snapshots/sp-candid_increase_dissolve_delay/00003.png differ diff --git a/tests_zemu/snapshots/sp-candid_list_neurons/00001.png b/tests_zemu/snapshots/sp-candid_list_neurons/00001.png index 5d2a4a1f..58c95f0e 100644 Binary files a/tests_zemu/snapshots/sp-candid_list_neurons/00001.png and b/tests_zemu/snapshots/sp-candid_list_neurons/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_merge_neuron/00001.png b/tests_zemu/snapshots/sp-candid_merge_neuron/00001.png index d1596832..16fd6786 100644 Binary files a/tests_zemu/snapshots/sp-candid_merge_neuron/00001.png and b/tests_zemu/snapshots/sp-candid_merge_neuron/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_merge_neuron/00003.png b/tests_zemu/snapshots/sp-candid_merge_neuron/00003.png index 288a177b..b60d7e3e 100644 Binary files a/tests_zemu/snapshots/sp-candid_merge_neuron/00003.png and b/tests_zemu/snapshots/sp-candid_merge_neuron/00003.png differ diff --git a/tests_zemu/snapshots/sp-candid_register_vote/00001.png b/tests_zemu/snapshots/sp-candid_register_vote/00001.png index b497a360..a2c41b4f 100644 Binary files a/tests_zemu/snapshots/sp-candid_register_vote/00001.png and b/tests_zemu/snapshots/sp-candid_register_vote/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_send_icp/00001.png b/tests_zemu/snapshots/sp-candid_send_icp/00001.png index 76706da3..64850f70 100644 Binary files a/tests_zemu/snapshots/sp-candid_send_icp/00001.png and b/tests_zemu/snapshots/sp-candid_send_icp/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_send_icp/00002.png b/tests_zemu/snapshots/sp-candid_send_icp/00002.png index 9abb0616..f8eb5edb 100644 Binary files a/tests_zemu/snapshots/sp-candid_send_icp/00002.png and b/tests_zemu/snapshots/sp-candid_send_icp/00002.png differ diff --git a/tests_zemu/snapshots/sp-candid_send_icp/00003.png b/tests_zemu/snapshots/sp-candid_send_icp/00003.png index 872adcf3..498b7516 100644 Binary files a/tests_zemu/snapshots/sp-candid_send_icp/00003.png and b/tests_zemu/snapshots/sp-candid_send_icp/00003.png differ diff --git a/tests_zemu/snapshots/sp-candid_send_icp/00004.png b/tests_zemu/snapshots/sp-candid_send_icp/00004.png index f2f42cdd..d66076d5 100644 Binary files a/tests_zemu/snapshots/sp-candid_send_icp/00004.png and b/tests_zemu/snapshots/sp-candid_send_icp/00004.png differ diff --git a/tests_zemu/snapshots/sp-candid_send_icp/00005.png b/tests_zemu/snapshots/sp-candid_send_icp/00005.png index a02ad65e..10ec551a 100644 Binary files a/tests_zemu/snapshots/sp-candid_send_icp/00005.png and b/tests_zemu/snapshots/sp-candid_send_icp/00005.png differ diff --git a/tests_zemu/snapshots/sp-candid_send_icp/00006.png b/tests_zemu/snapshots/sp-candid_send_icp/00006.png index 57c10fc3..b6bbd033 100644 Binary files a/tests_zemu/snapshots/sp-candid_send_icp/00006.png and b/tests_zemu/snapshots/sp-candid_send_icp/00006.png differ diff --git a/tests_zemu/snapshots/sp-candid_set_dissolve_delay/00001.png b/tests_zemu/snapshots/sp-candid_set_dissolve_delay/00001.png index 9417ed69..0399075b 100644 Binary files a/tests_zemu/snapshots/sp-candid_set_dissolve_delay/00001.png and b/tests_zemu/snapshots/sp-candid_set_dissolve_delay/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_spawn_neuron/00001.png b/tests_zemu/snapshots/sp-candid_spawn_neuron/00001.png index 827476c4..f12a5509 100644 Binary files a/tests_zemu/snapshots/sp-candid_spawn_neuron/00001.png and b/tests_zemu/snapshots/sp-candid_spawn_neuron/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_spawn_neuron/00003.png b/tests_zemu/snapshots/sp-candid_spawn_neuron/00003.png index 70827c96..28e1514b 100644 Binary files a/tests_zemu/snapshots/sp-candid_spawn_neuron/00003.png and b/tests_zemu/snapshots/sp-candid_spawn_neuron/00003.png differ diff --git a/tests_zemu/snapshots/sp-candid_split_neuron/00001.png b/tests_zemu/snapshots/sp-candid_split_neuron/00001.png index e072195e..3c1219d0 100644 Binary files a/tests_zemu/snapshots/sp-candid_split_neuron/00001.png and b/tests_zemu/snapshots/sp-candid_split_neuron/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_split_neuron/00003.png b/tests_zemu/snapshots/sp-candid_split_neuron/00003.png index 1da9ce14..77f37bab 100644 Binary files a/tests_zemu/snapshots/sp-candid_split_neuron/00003.png and b/tests_zemu/snapshots/sp-candid_split_neuron/00003.png differ diff --git a/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00001.png b/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00001.png index efc4171b..48299996 100644 Binary files a/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00001.png and b/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00002.png b/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00002.png index c9269b6f..99499795 100644 Binary files a/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00002.png and b/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00002.png differ diff --git a/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00003.png b/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00003.png index 66e009be..5b7cc638 100644 Binary files a/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00003.png and b/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00003.png differ diff --git a/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00004.png b/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00004.png index 98b4504e..f9eb7673 100644 Binary files a/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00004.png and b/tests_zemu/snapshots/sp-candid_stake_icrc_expert/00004.png differ diff --git a/tests_zemu/snapshots/sp-candid_stake_maturity/00001.png b/tests_zemu/snapshots/sp-candid_stake_maturity/00001.png index 6f20d3a8..ca81b953 100644 Binary files a/tests_zemu/snapshots/sp-candid_stake_maturity/00001.png and b/tests_zemu/snapshots/sp-candid_stake_maturity/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_stake_maturity/00003.png b/tests_zemu/snapshots/sp-candid_stake_maturity/00003.png index 0ee14f4a..15faa7cf 100644 Binary files a/tests_zemu/snapshots/sp-candid_stake_maturity/00003.png and b/tests_zemu/snapshots/sp-candid_stake_maturity/00003.png differ diff --git a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00001.png b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00001.png index efc4171b..48299996 100644 Binary files a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00001.png and b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00001.png differ diff --git a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00002.png b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00002.png index d0010466..b8a4b392 100644 Binary files a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00002.png and b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00002.png differ diff --git a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00004.png b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00004.png index ccf3ccb9..4c0f03fc 100644 Binary files a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00004.png and b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00004.png differ diff --git a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00005.png b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00005.png index b7879476..8048cb16 100644 Binary files a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00005.png and b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00005.png differ diff --git a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00006.png b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00006.png index 9abb0616..f8eb5edb 100644 Binary files a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00006.png and b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00006.png differ diff --git a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00007.png b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00007.png index 872adcf3..498b7516 100644 Binary files a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00007.png and b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00007.png differ diff --git a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00008.png b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00008.png index 57c10fc3..b6bbd033 100644 Binary files a/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00008.png and b/tests_zemu/snapshots/sp-candid_stake_neuron_expert/00008.png differ diff --git a/tests_zemu/snapshots/sp-icrc_transfer/00001.png b/tests_zemu/snapshots/sp-icrc_transfer/00001.png index 76706da3..64850f70 100644 Binary files a/tests_zemu/snapshots/sp-icrc_transfer/00001.png and b/tests_zemu/snapshots/sp-icrc_transfer/00001.png differ diff --git a/tests_zemu/snapshots/sp-icrc_transfer/00002.png b/tests_zemu/snapshots/sp-icrc_transfer/00002.png index 7e7543f8..09d359c6 100644 Binary files a/tests_zemu/snapshots/sp-icrc_transfer/00002.png and b/tests_zemu/snapshots/sp-icrc_transfer/00002.png differ diff --git a/tests_zemu/snapshots/sp-icrc_transfer/00003.png b/tests_zemu/snapshots/sp-icrc_transfer/00003.png index bdf7f9eb..699c3c4f 100644 Binary files a/tests_zemu/snapshots/sp-icrc_transfer/00003.png and b/tests_zemu/snapshots/sp-icrc_transfer/00003.png differ diff --git a/tests_zemu/snapshots/sp-icrc_transfer/00004.png b/tests_zemu/snapshots/sp-icrc_transfer/00004.png index e0eebadd..c78324fe 100644 Binary files a/tests_zemu/snapshots/sp-icrc_transfer/00004.png and b/tests_zemu/snapshots/sp-icrc_transfer/00004.png differ diff --git a/tests_zemu/snapshots/sp-icrc_transfer/00005.png b/tests_zemu/snapshots/sp-icrc_transfer/00005.png index 1eec87d0..9ff1369c 100644 Binary files a/tests_zemu/snapshots/sp-icrc_transfer/00005.png and b/tests_zemu/snapshots/sp-icrc_transfer/00005.png differ diff --git a/tests_zemu/snapshots/sp-icrc_transfer/00006.png b/tests_zemu/snapshots/sp-icrc_transfer/00006.png index 9ae7153f..9ec16889 100644 Binary files a/tests_zemu/snapshots/sp-icrc_transfer/00006.png and b/tests_zemu/snapshots/sp-icrc_transfer/00006.png differ diff --git a/tests_zemu/snapshots/sp-icrc_transfer/00007.png b/tests_zemu/snapshots/sp-icrc_transfer/00007.png index 9652ab9d..9492c68d 100644 Binary files a/tests_zemu/snapshots/sp-icrc_transfer/00007.png and b/tests_zemu/snapshots/sp-icrc_transfer/00007.png differ diff --git a/tests_zemu/snapshots/sp-icrc_transfer/00008.png b/tests_zemu/snapshots/sp-icrc_transfer/00008.png index 98b4504e..f9eb7673 100644 Binary files a/tests_zemu/snapshots/sp-icrc_transfer/00008.png and b/tests_zemu/snapshots/sp-icrc_transfer/00008.png differ diff --git a/tests_zemu/snapshots/sp-mainmenu/00001.png b/tests_zemu/snapshots/sp-mainmenu/00001.png index 8472e5d9..e10e0049 100644 Binary files a/tests_zemu/snapshots/sp-mainmenu/00001.png and b/tests_zemu/snapshots/sp-mainmenu/00001.png differ diff --git a/tests_zemu/snapshots/sp-mainmenu/00002.png b/tests_zemu/snapshots/sp-mainmenu/00002.png index f7921677..7e236da6 100644 Binary files a/tests_zemu/snapshots/sp-mainmenu/00002.png and b/tests_zemu/snapshots/sp-mainmenu/00002.png differ diff --git a/tests_zemu/snapshots/sp-mainmenu/00003.png b/tests_zemu/snapshots/sp-mainmenu/00003.png index 8472e5d9..e10e0049 100644 Binary files a/tests_zemu/snapshots/sp-mainmenu/00003.png and b/tests_zemu/snapshots/sp-mainmenu/00003.png differ diff --git a/tests_zemu/snapshots/sp-mainmenu/00004.png b/tests_zemu/snapshots/sp-mainmenu/00004.png index 5e352af9..0a2f87e6 100644 Binary files a/tests_zemu/snapshots/sp-mainmenu/00004.png and b/tests_zemu/snapshots/sp-mainmenu/00004.png differ diff --git a/tests_zemu/snapshots/sp-mainmenu/00005.png b/tests_zemu/snapshots/sp-mainmenu/00005.png index 1adff7ee..b6232856 100644 Binary files a/tests_zemu/snapshots/sp-mainmenu/00005.png and b/tests_zemu/snapshots/sp-mainmenu/00005.png differ diff --git a/tests_zemu/snapshots/sp-mainmenu/00009.png b/tests_zemu/snapshots/sp-mainmenu/00009.png index 1adff7ee..b6232856 100644 Binary files a/tests_zemu/snapshots/sp-mainmenu/00009.png and b/tests_zemu/snapshots/sp-mainmenu/00009.png differ diff --git a/tests_zemu/snapshots/sp-mainmenu/00010.png b/tests_zemu/snapshots/sp-mainmenu/00010.png index 5e352af9..0a2f87e6 100644 Binary files a/tests_zemu/snapshots/sp-mainmenu/00010.png and b/tests_zemu/snapshots/sp-mainmenu/00010.png differ diff --git a/tests_zemu/snapshots/sp-mainmenu/00011.png b/tests_zemu/snapshots/sp-mainmenu/00011.png index 8472e5d9..e10e0049 100644 Binary files a/tests_zemu/snapshots/sp-mainmenu/00011.png and b/tests_zemu/snapshots/sp-mainmenu/00011.png differ diff --git a/tests_zemu/snapshots/sp-pb_add_hotkey/00001.png b/tests_zemu/snapshots/sp-pb_add_hotkey/00001.png index 5a1d3274..1bf78ad1 100644 Binary files a/tests_zemu/snapshots/sp-pb_add_hotkey/00001.png and b/tests_zemu/snapshots/sp-pb_add_hotkey/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_add_hotkey/00003.png b/tests_zemu/snapshots/sp-pb_add_hotkey/00003.png index 54c6f669..0f81cda7 100644 Binary files a/tests_zemu/snapshots/sp-pb_add_hotkey/00003.png and b/tests_zemu/snapshots/sp-pb_add_hotkey/00003.png differ diff --git a/tests_zemu/snapshots/sp-pb_check_status/00001.png b/tests_zemu/snapshots/sp-pb_check_status/00001.png index 030585c6..21459ebb 100644 Binary files a/tests_zemu/snapshots/sp-pb_check_status/00001.png and b/tests_zemu/snapshots/sp-pb_check_status/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_claim_neurons/00001.png b/tests_zemu/snapshots/sp-pb_claim_neurons/00001.png index 3006c983..3f2de051 100644 Binary files a/tests_zemu/snapshots/sp-pb_claim_neurons/00001.png and b/tests_zemu/snapshots/sp-pb_claim_neurons/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_disburse/00001.png b/tests_zemu/snapshots/sp-pb_disburse/00001.png index d3d8670a..ce62d6d8 100644 Binary files a/tests_zemu/snapshots/sp-pb_disburse/00001.png and b/tests_zemu/snapshots/sp-pb_disburse/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_disburse/00003.png b/tests_zemu/snapshots/sp-pb_disburse/00003.png index 4646209c..b872e9c1 100644 Binary files a/tests_zemu/snapshots/sp-pb_disburse/00003.png and b/tests_zemu/snapshots/sp-pb_disburse/00003.png differ diff --git a/tests_zemu/snapshots/sp-pb_disburse/00004.png b/tests_zemu/snapshots/sp-pb_disburse/00004.png index efc1bff1..17a60d04 100644 Binary files a/tests_zemu/snapshots/sp-pb_disburse/00004.png and b/tests_zemu/snapshots/sp-pb_disburse/00004.png differ diff --git a/tests_zemu/snapshots/sp-pb_disburse/00005.png b/tests_zemu/snapshots/sp-pb_disburse/00005.png index 82752ad0..d89c0380 100644 Binary files a/tests_zemu/snapshots/sp-pb_disburse/00005.png and b/tests_zemu/snapshots/sp-pb_disburse/00005.png differ diff --git a/tests_zemu/snapshots/sp-pb_follow/00001.png b/tests_zemu/snapshots/sp-pb_follow/00001.png index 0541da93..38ac47c2 100644 Binary files a/tests_zemu/snapshots/sp-pb_follow/00001.png and b/tests_zemu/snapshots/sp-pb_follow/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_follow/00004.png b/tests_zemu/snapshots/sp-pb_follow/00004.png index 4844ee2b..f22b053b 100644 Binary files a/tests_zemu/snapshots/sp-pb_follow/00004.png and b/tests_zemu/snapshots/sp-pb_follow/00004.png differ diff --git a/tests_zemu/snapshots/sp-pb_follow/00005.png b/tests_zemu/snapshots/sp-pb_follow/00005.png index c0cdca5e..58f4dc38 100644 Binary files a/tests_zemu/snapshots/sp-pb_follow/00005.png and b/tests_zemu/snapshots/sp-pb_follow/00005.png differ diff --git a/tests_zemu/snapshots/sp-pb_follow/00006.png b/tests_zemu/snapshots/sp-pb_follow/00006.png index 92ed5961..e95f1f2f 100644 Binary files a/tests_zemu/snapshots/sp-pb_follow/00006.png and b/tests_zemu/snapshots/sp-pb_follow/00006.png differ diff --git a/tests_zemu/snapshots/sp-pb_increase_dissolve_delay/00001.png b/tests_zemu/snapshots/sp-pb_increase_dissolve_delay/00001.png index 814335b0..bb7dc027 100644 Binary files a/tests_zemu/snapshots/sp-pb_increase_dissolve_delay/00001.png and b/tests_zemu/snapshots/sp-pb_increase_dissolve_delay/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_increase_dissolve_delay/00003.png b/tests_zemu/snapshots/sp-pb_increase_dissolve_delay/00003.png index f8b98202..c5dc879c 100644 Binary files a/tests_zemu/snapshots/sp-pb_increase_dissolve_delay/00003.png and b/tests_zemu/snapshots/sp-pb_increase_dissolve_delay/00003.png differ diff --git a/tests_zemu/snapshots/sp-pb_join_community_fund/00001.png b/tests_zemu/snapshots/sp-pb_join_community_fund/00001.png index 890d0a4c..32bd4a30 100644 Binary files a/tests_zemu/snapshots/sp-pb_join_community_fund/00001.png and b/tests_zemu/snapshots/sp-pb_join_community_fund/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_list_neurons/00001.png b/tests_zemu/snapshots/sp-pb_list_neurons/00001.png index 5d2a4a1f..58c95f0e 100644 Binary files a/tests_zemu/snapshots/sp-pb_list_neurons/00001.png and b/tests_zemu/snapshots/sp-pb_list_neurons/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_register_vote/00001.png b/tests_zemu/snapshots/sp-pb_register_vote/00001.png index b497a360..a2c41b4f 100644 Binary files a/tests_zemu/snapshots/sp-pb_register_vote/00001.png and b/tests_zemu/snapshots/sp-pb_register_vote/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_remove_hotkey/00001.png b/tests_zemu/snapshots/sp-pb_remove_hotkey/00001.png index 0d62dfcc..f69a19b2 100644 Binary files a/tests_zemu/snapshots/sp-pb_remove_hotkey/00001.png and b/tests_zemu/snapshots/sp-pb_remove_hotkey/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_remove_hotkey/00003.png b/tests_zemu/snapshots/sp-pb_remove_hotkey/00003.png index 54c6f669..0f81cda7 100644 Binary files a/tests_zemu/snapshots/sp-pb_remove_hotkey/00003.png and b/tests_zemu/snapshots/sp-pb_remove_hotkey/00003.png differ diff --git a/tests_zemu/snapshots/sp-pb_sign_update_call/00001.png b/tests_zemu/snapshots/sp-pb_sign_update_call/00001.png index 76706da3..64850f70 100644 Binary files a/tests_zemu/snapshots/sp-pb_sign_update_call/00001.png and b/tests_zemu/snapshots/sp-pb_sign_update_call/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_sign_update_call/00002.png b/tests_zemu/snapshots/sp-pb_sign_update_call/00002.png index 41e9e067..e0acb147 100644 Binary files a/tests_zemu/snapshots/sp-pb_sign_update_call/00002.png and b/tests_zemu/snapshots/sp-pb_sign_update_call/00002.png differ diff --git a/tests_zemu/snapshots/sp-pb_sign_update_call/00003.png b/tests_zemu/snapshots/sp-pb_sign_update_call/00003.png index 167a57eb..1d2c762d 100644 Binary files a/tests_zemu/snapshots/sp-pb_sign_update_call/00003.png and b/tests_zemu/snapshots/sp-pb_sign_update_call/00003.png differ diff --git a/tests_zemu/snapshots/sp-pb_sign_update_call/00004.png b/tests_zemu/snapshots/sp-pb_sign_update_call/00004.png index dc782e8f..f4fcaaae 100644 Binary files a/tests_zemu/snapshots/sp-pb_sign_update_call/00004.png and b/tests_zemu/snapshots/sp-pb_sign_update_call/00004.png differ diff --git a/tests_zemu/snapshots/sp-pb_sign_update_call/00005.png b/tests_zemu/snapshots/sp-pb_sign_update_call/00005.png index 8b3176ea..e052fdc8 100644 Binary files a/tests_zemu/snapshots/sp-pb_sign_update_call/00005.png and b/tests_zemu/snapshots/sp-pb_sign_update_call/00005.png differ diff --git a/tests_zemu/snapshots/sp-pb_sign_update_call/00006.png b/tests_zemu/snapshots/sp-pb_sign_update_call/00006.png index d38d11c6..b835239b 100644 Binary files a/tests_zemu/snapshots/sp-pb_sign_update_call/00006.png and b/tests_zemu/snapshots/sp-pb_sign_update_call/00006.png differ diff --git a/tests_zemu/snapshots/sp-pb_spawn_neuron/00001.png b/tests_zemu/snapshots/sp-pb_spawn_neuron/00001.png index 827476c4..f12a5509 100644 Binary files a/tests_zemu/snapshots/sp-pb_spawn_neuron/00001.png and b/tests_zemu/snapshots/sp-pb_spawn_neuron/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_stake_neuron/00001.png b/tests_zemu/snapshots/sp-pb_stake_neuron/00001.png index efc4171b..48299996 100644 Binary files a/tests_zemu/snapshots/sp-pb_stake_neuron/00001.png and b/tests_zemu/snapshots/sp-pb_stake_neuron/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_stake_neuron/00002.png b/tests_zemu/snapshots/sp-pb_stake_neuron/00002.png index 41e9e067..e0acb147 100644 Binary files a/tests_zemu/snapshots/sp-pb_stake_neuron/00002.png and b/tests_zemu/snapshots/sp-pb_stake_neuron/00002.png differ diff --git a/tests_zemu/snapshots/sp-pb_stake_neuron/00003.png b/tests_zemu/snapshots/sp-pb_stake_neuron/00003.png index 167a57eb..1d2c762d 100644 Binary files a/tests_zemu/snapshots/sp-pb_stake_neuron/00003.png and b/tests_zemu/snapshots/sp-pb_stake_neuron/00003.png differ diff --git a/tests_zemu/snapshots/sp-pb_stake_neuron/00004.png b/tests_zemu/snapshots/sp-pb_stake_neuron/00004.png index 1da9ce14..77f37bab 100644 Binary files a/tests_zemu/snapshots/sp-pb_stake_neuron/00004.png and b/tests_zemu/snapshots/sp-pb_stake_neuron/00004.png differ diff --git a/tests_zemu/snapshots/sp-pb_start_dissolve/00001.png b/tests_zemu/snapshots/sp-pb_start_dissolve/00001.png index df8203cb..de5016d0 100644 Binary files a/tests_zemu/snapshots/sp-pb_start_dissolve/00001.png and b/tests_zemu/snapshots/sp-pb_start_dissolve/00001.png differ diff --git a/tests_zemu/snapshots/sp-pb_stop_dissolve/00001.png b/tests_zemu/snapshots/sp-pb_stop_dissolve/00001.png index 4c841e1d..caa9e381 100644 Binary files a/tests_zemu/snapshots/sp-pb_stop_dissolve/00001.png and b/tests_zemu/snapshots/sp-pb_stop_dissolve/00001.png differ diff --git a/tests_zemu/snapshots/sp-show_address/00001.png b/tests_zemu/snapshots/sp-show_address/00001.png index 6e991bee..d1de3f78 100644 Binary files a/tests_zemu/snapshots/sp-show_address/00001.png and b/tests_zemu/snapshots/sp-show_address/00001.png differ diff --git a/tests_zemu/snapshots/sp-show_address/00002.png b/tests_zemu/snapshots/sp-show_address/00002.png index 50e57c82..8a15042e 100644 Binary files a/tests_zemu/snapshots/sp-show_address/00002.png and b/tests_zemu/snapshots/sp-show_address/00002.png differ diff --git a/tests_zemu/snapshots/sp-show_address/00003.png b/tests_zemu/snapshots/sp-show_address/00003.png index 54c6f669..0f81cda7 100644 Binary files a/tests_zemu/snapshots/sp-show_address/00003.png and b/tests_zemu/snapshots/sp-show_address/00003.png differ diff --git a/tests_zemu/snapshots/sp-show_address_reject/00001.png b/tests_zemu/snapshots/sp-show_address_reject/00001.png index 6e991bee..d1de3f78 100644 Binary files a/tests_zemu/snapshots/sp-show_address_reject/00001.png and b/tests_zemu/snapshots/sp-show_address_reject/00001.png differ diff --git a/tests_zemu/snapshots/sp-show_address_reject/00002.png b/tests_zemu/snapshots/sp-show_address_reject/00002.png index 50e57c82..8a15042e 100644 Binary files a/tests_zemu/snapshots/sp-show_address_reject/00002.png and b/tests_zemu/snapshots/sp-show_address_reject/00002.png differ diff --git a/tests_zemu/snapshots/sp-show_address_reject/00003.png b/tests_zemu/snapshots/sp-show_address_reject/00003.png index 54c6f669..0f81cda7 100644 Binary files a/tests_zemu/snapshots/sp-show_address_reject/00003.png and b/tests_zemu/snapshots/sp-show_address_reject/00003.png differ diff --git a/tests_zemu/snapshots/sp-show_address_reject/00007.png b/tests_zemu/snapshots/sp-show_address_reject/00007.png index de8a2912..d9b5efc5 100644 Binary files a/tests_zemu/snapshots/sp-show_address_reject/00007.png and b/tests_zemu/snapshots/sp-show_address_reject/00007.png differ diff --git a/tests_zemu/snapshots/sp-sns_add_permissions/00001.png b/tests_zemu/snapshots/sp-sns_add_permissions/00001.png index f87538eb..3cad3055 100644 Binary files a/tests_zemu/snapshots/sp-sns_add_permissions/00001.png and b/tests_zemu/snapshots/sp-sns_add_permissions/00001.png differ diff --git a/tests_zemu/snapshots/sp-sns_add_permissions/00003.png b/tests_zemu/snapshots/sp-sns_add_permissions/00003.png index ec74130d..4c04b100 100644 Binary files a/tests_zemu/snapshots/sp-sns_add_permissions/00003.png and b/tests_zemu/snapshots/sp-sns_add_permissions/00003.png differ diff --git a/tests_zemu/snapshots/sp-sns_add_permissions/00005.png b/tests_zemu/snapshots/sp-sns_add_permissions/00005.png index 9315690f..977e35a7 100644 Binary files a/tests_zemu/snapshots/sp-sns_add_permissions/00005.png and b/tests_zemu/snapshots/sp-sns_add_permissions/00005.png differ diff --git a/tests_zemu/snapshots/sp-sns_disburse/00001.png b/tests_zemu/snapshots/sp-sns_disburse/00001.png index d3d8670a..ce62d6d8 100644 Binary files a/tests_zemu/snapshots/sp-sns_disburse/00001.png and b/tests_zemu/snapshots/sp-sns_disburse/00001.png differ diff --git a/tests_zemu/snapshots/sp-sns_disburse/00003.png b/tests_zemu/snapshots/sp-sns_disburse/00003.png index ec74130d..4c04b100 100644 Binary files a/tests_zemu/snapshots/sp-sns_disburse/00003.png and b/tests_zemu/snapshots/sp-sns_disburse/00003.png differ diff --git a/tests_zemu/snapshots/sp-sns_disburse/00005.png b/tests_zemu/snapshots/sp-sns_disburse/00005.png index c30eb711..5032b738 100644 Binary files a/tests_zemu/snapshots/sp-sns_disburse/00005.png and b/tests_zemu/snapshots/sp-sns_disburse/00005.png differ diff --git a/tests_zemu/snapshots/sp-sns_disburse/00006.png b/tests_zemu/snapshots/sp-sns_disburse/00006.png index 347f17e9..3bd7c37d 100644 Binary files a/tests_zemu/snapshots/sp-sns_disburse/00006.png and b/tests_zemu/snapshots/sp-sns_disburse/00006.png differ diff --git a/tests_zemu/snapshots/sp-sns_disburse/00007.png b/tests_zemu/snapshots/sp-sns_disburse/00007.png index 957ffe01..ac7bb7c0 100644 Binary files a/tests_zemu/snapshots/sp-sns_disburse/00007.png and b/tests_zemu/snapshots/sp-sns_disburse/00007.png differ diff --git a/tests_zemu/snapshots/sp-sns_remove_permissions/00001.png b/tests_zemu/snapshots/sp-sns_remove_permissions/00001.png index f5fb7ce4..b0905365 100644 Binary files a/tests_zemu/snapshots/sp-sns_remove_permissions/00001.png and b/tests_zemu/snapshots/sp-sns_remove_permissions/00001.png differ diff --git a/tests_zemu/snapshots/sp-sns_remove_permissions/00005.png b/tests_zemu/snapshots/sp-sns_remove_permissions/00005.png index 9315690f..977e35a7 100644 Binary files a/tests_zemu/snapshots/sp-sns_remove_permissions/00005.png and b/tests_zemu/snapshots/sp-sns_remove_permissions/00005.png differ diff --git a/tests_zemu/snapshots/sp-sns_stake_maturity/00001.png b/tests_zemu/snapshots/sp-sns_stake_maturity/00001.png index 6f20d3a8..ca81b953 100644 Binary files a/tests_zemu/snapshots/sp-sns_stake_maturity/00001.png and b/tests_zemu/snapshots/sp-sns_stake_maturity/00001.png differ diff --git a/tests_zemu/snapshots/sp-sns_stake_maturity/00005.png b/tests_zemu/snapshots/sp-sns_stake_maturity/00005.png index b62f7046..7036618f 100644 Binary files a/tests_zemu/snapshots/sp-sns_stake_maturity/00005.png and b/tests_zemu/snapshots/sp-sns_stake_maturity/00005.png differ diff --git a/tests_zemu/snapshots/sp-sns_start_dissolve/00001.png b/tests_zemu/snapshots/sp-sns_start_dissolve/00001.png index df8203cb..de5016d0 100644 Binary files a/tests_zemu/snapshots/sp-sns_start_dissolve/00001.png and b/tests_zemu/snapshots/sp-sns_start_dissolve/00001.png differ diff --git a/tests_zemu/snapshots/sp-sns_stop_dissolve/00001.png b/tests_zemu/snapshots/sp-sns_stop_dissolve/00001.png index 4c841e1d..caa9e381 100644 Binary files a/tests_zemu/snapshots/sp-sns_stop_dissolve/00001.png and b/tests_zemu/snapshots/sp-sns_stop_dissolve/00001.png differ diff --git a/tests_zemu/snapshots/sp-sns_stop_dissolve/00003.png b/tests_zemu/snapshots/sp-sns_stop_dissolve/00003.png index ec74130d..4c04b100 100644 Binary files a/tests_zemu/snapshots/sp-sns_stop_dissolve/00003.png and b/tests_zemu/snapshots/sp-sns_stop_dissolve/00003.png differ diff --git a/tests_zemu/snapshots/st-bls-cert-custom-key/00000.png b/tests_zemu/snapshots/st-bls-cert-custom-key/00000.png deleted file mode 100644 index 98a949b2..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert-custom-key/00000.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert-custom-key/00001.png b/tests_zemu/snapshots/st-bls-cert-custom-key/00001.png deleted file mode 100644 index 1f121216..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert-custom-key/00001.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert-custom-key/00002.png b/tests_zemu/snapshots/st-bls-cert-custom-key/00002.png deleted file mode 100644 index 60a3488e..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert-custom-key/00002.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert-default-key/00000.png b/tests_zemu/snapshots/st-bls-cert-default-key/00000.png deleted file mode 100644 index 98a949b2..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert-default-key/00000.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert-default-key/00001.png b/tests_zemu/snapshots/st-bls-cert-default-key/00001.png deleted file mode 100644 index 1f121216..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert-default-key/00001.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert-default-key/00002.png b/tests_zemu/snapshots/st-bls-cert-default-key/00002.png deleted file mode 100644 index 60a3488e..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert-default-key/00002.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert-default-key/00003.png b/tests_zemu/snapshots/st-bls-cert-default-key/00003.png deleted file mode 100644 index 4320cd45..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert-default-key/00003.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert_custom_key/00000.png b/tests_zemu/snapshots/st-bls-cert_custom_key/00000.png deleted file mode 100644 index 98a949b2..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert_custom_key/00000.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert_custom_key/00001.png b/tests_zemu/snapshots/st-bls-cert_custom_key/00001.png deleted file mode 100644 index 1f121216..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert_custom_key/00001.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert_custom_key/00002.png b/tests_zemu/snapshots/st-bls-cert_custom_key/00002.png deleted file mode 100644 index 60a3488e..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert_custom_key/00002.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert_custom_key/00003.png b/tests_zemu/snapshots/st-bls-cert_custom_key/00003.png deleted file mode 100644 index 4320cd45..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert_custom_key/00003.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert_default_key/00000.png b/tests_zemu/snapshots/st-bls-cert_default_key/00000.png index 98a949b2..1bdf92b1 100644 Binary files a/tests_zemu/snapshots/st-bls-cert_default_key/00000.png and b/tests_zemu/snapshots/st-bls-cert_default_key/00000.png differ diff --git a/tests_zemu/snapshots/st-bls-cert_default_key/00001.png b/tests_zemu/snapshots/st-bls-cert_default_key/00001.png index 1f121216..2730bb19 100644 Binary files a/tests_zemu/snapshots/st-bls-cert_default_key/00001.png and b/tests_zemu/snapshots/st-bls-cert_default_key/00001.png differ diff --git a/tests_zemu/snapshots/st-bls-cert_default_key/00002.png b/tests_zemu/snapshots/st-bls-cert_default_key/00002.png index 60a3488e..accb779d 100644 Binary files a/tests_zemu/snapshots/st-bls-cert_default_key/00002.png and b/tests_zemu/snapshots/st-bls-cert_default_key/00002.png differ diff --git a/tests_zemu/snapshots/st-bls-cert_default_key/00003.png b/tests_zemu/snapshots/st-bls-cert_default_key/00003.png index 4320cd45..845ee588 100644 Binary files a/tests_zemu/snapshots/st-bls-cert_default_key/00003.png and b/tests_zemu/snapshots/st-bls-cert_default_key/00003.png differ diff --git a/tests_zemu/snapshots/st-bls-cert_default_key/00004.png b/tests_zemu/snapshots/st-bls-cert_default_key/00004.png new file mode 100644 index 00000000..e52c0ead Binary files /dev/null and b/tests_zemu/snapshots/st-bls-cert_default_key/00004.png differ diff --git a/tests_zemu/snapshots/st-bls-cert_default_key/00005.png b/tests_zemu/snapshots/st-bls-cert_default_key/00005.png new file mode 100644 index 00000000..21ef50fb Binary files /dev/null and b/tests_zemu/snapshots/st-bls-cert_default_key/00005.png differ diff --git a/tests_zemu/snapshots/st-bls-cert_default_key/00006.png b/tests_zemu/snapshots/st-bls-cert_default_key/00006.png new file mode 100644 index 00000000..3efdd674 Binary files /dev/null and b/tests_zemu/snapshots/st-bls-cert_default_key/00006.png differ diff --git a/tests_zemu/snapshots/st-bls-cert_default_key/00007.png b/tests_zemu/snapshots/st-bls-cert_default_key/00007.png new file mode 100644 index 00000000..d4f5deae Binary files /dev/null and b/tests_zemu/snapshots/st-bls-cert_default_key/00007.png differ diff --git a/tests_zemu/snapshots/st-bls-cert_default_key/00008.png b/tests_zemu/snapshots/st-bls-cert_default_key/00008.png new file mode 100644 index 00000000..554ac909 Binary files /dev/null and b/tests_zemu/snapshots/st-bls-cert_default_key/00008.png differ diff --git a/tests_zemu/snapshots/st-bls-cert-custom-key/00003.png b/tests_zemu/snapshots/st-bls-cert_default_key/00009.png similarity index 100% rename from tests_zemu/snapshots/st-bls-cert-custom-key/00003.png rename to tests_zemu/snapshots/st-bls-cert_default_key/00009.png diff --git a/tests_zemu/snapshots/st-bls-cert_device_id/00000.png b/tests_zemu/snapshots/st-bls-cert_device_id/00000.png deleted file mode 100644 index 98a949b2..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert_device_id/00000.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert_device_id/00001.png b/tests_zemu/snapshots/st-bls-cert_device_id/00001.png deleted file mode 100644 index 1f121216..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert_device_id/00001.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert_device_id/00002.png b/tests_zemu/snapshots/st-bls-cert_device_id/00002.png deleted file mode 100644 index 60a3488e..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert_device_id/00002.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-bls-cert_device_id/00003.png b/tests_zemu/snapshots/st-bls-cert_device_id/00003.png deleted file mode 100644 index 4320cd45..00000000 Binary files a/tests_zemu/snapshots/st-bls-cert_device_id/00003.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-candid_disburse/00004.png b/tests_zemu/snapshots/st-candid_disburse/00004.png deleted file mode 100644 index bf582528..00000000 Binary files a/tests_zemu/snapshots/st-candid_disburse/00004.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-candid_send_icp/00005.png b/tests_zemu/snapshots/st-candid_send_icp/00005.png deleted file mode 100644 index bf582528..00000000 Binary files a/tests_zemu/snapshots/st-candid_send_icp/00005.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-candid_stake_neuron_expert/00005.png b/tests_zemu/snapshots/st-candid_stake_neuron_expert/00005.png deleted file mode 100644 index 5325d61f..00000000 Binary files a/tests_zemu/snapshots/st-candid_stake_neuron_expert/00005.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-candid_stake_neuron_expert/00006.png b/tests_zemu/snapshots/st-candid_stake_neuron_expert/00006.png deleted file mode 100644 index bf582528..00000000 Binary files a/tests_zemu/snapshots/st-candid_stake_neuron_expert/00006.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-icrc_transfer/00006.png b/tests_zemu/snapshots/st-icrc_transfer/00006.png deleted file mode 100644 index bf582528..00000000 Binary files a/tests_zemu/snapshots/st-icrc_transfer/00006.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-mainmenu/00004.png b/tests_zemu/snapshots/st-mainmenu/00004.png index 1dd486f2..3e4c46da 100644 Binary files a/tests_zemu/snapshots/st-mainmenu/00004.png and b/tests_zemu/snapshots/st-mainmenu/00004.png differ diff --git a/tests_zemu/snapshots/st-sns_add_permissions/00005.png b/tests_zemu/snapshots/st-sns_add_permissions/00005.png deleted file mode 100644 index 5325d61f..00000000 Binary files a/tests_zemu/snapshots/st-sns_add_permissions/00005.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-sns_add_permissions/00006.png b/tests_zemu/snapshots/st-sns_add_permissions/00006.png deleted file mode 100644 index bf582528..00000000 Binary files a/tests_zemu/snapshots/st-sns_add_permissions/00006.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-sns_disburse/00005.png b/tests_zemu/snapshots/st-sns_disburse/00005.png deleted file mode 100644 index 5325d61f..00000000 Binary files a/tests_zemu/snapshots/st-sns_disburse/00005.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-sns_disburse/00006.png b/tests_zemu/snapshots/st-sns_disburse/00006.png deleted file mode 100644 index bf582528..00000000 Binary files a/tests_zemu/snapshots/st-sns_disburse/00006.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-sns_remove_permissions/00005.png b/tests_zemu/snapshots/st-sns_remove_permissions/00005.png deleted file mode 100644 index 5325d61f..00000000 Binary files a/tests_zemu/snapshots/st-sns_remove_permissions/00005.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-sns_remove_permissions/00006.png b/tests_zemu/snapshots/st-sns_remove_permissions/00006.png deleted file mode 100644 index bf582528..00000000 Binary files a/tests_zemu/snapshots/st-sns_remove_permissions/00006.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-sns_stake_maturity/00004.png b/tests_zemu/snapshots/st-sns_stake_maturity/00004.png deleted file mode 100644 index bf582528..00000000 Binary files a/tests_zemu/snapshots/st-sns_stake_maturity/00004.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-sns_start_dissolve/00004.png b/tests_zemu/snapshots/st-sns_start_dissolve/00004.png deleted file mode 100644 index bf582528..00000000 Binary files a/tests_zemu/snapshots/st-sns_start_dissolve/00004.png and /dev/null differ diff --git a/tests_zemu/snapshots/st-sns_stop_dissolve/00004.png b/tests_zemu/snapshots/st-sns_stop_dissolve/00004.png deleted file mode 100644 index bf582528..00000000 Binary files a/tests_zemu/snapshots/st-sns_stop_dissolve/00004.png and /dev/null differ diff --git a/tests_zemu/snapshots/x-bls-cert-default-key/00000.png b/tests_zemu/snapshots/x-bls-cert-default-key/00000.png deleted file mode 100644 index 8d0c3cbd..00000000 Binary files a/tests_zemu/snapshots/x-bls-cert-default-key/00000.png and /dev/null differ diff --git a/tests_zemu/snapshots/x-bls-cert-default-key/00001.png b/tests_zemu/snapshots/x-bls-cert-default-key/00001.png deleted file mode 100644 index ad051f23..00000000 Binary files a/tests_zemu/snapshots/x-bls-cert-default-key/00001.png and /dev/null differ diff --git a/tests_zemu/snapshots/x-bls-cert-default-key/00002.png b/tests_zemu/snapshots/x-bls-cert-default-key/00002.png deleted file mode 100644 index 5acbbd41..00000000 Binary files a/tests_zemu/snapshots/x-bls-cert-default-key/00002.png and /dev/null differ diff --git a/tests_zemu/snapshots/x-bls-cert-default-key/00003.png b/tests_zemu/snapshots/x-bls-cert-default-key/00003.png deleted file mode 100644 index 1e4be699..00000000 Binary files a/tests_zemu/snapshots/x-bls-cert-default-key/00003.png and /dev/null differ diff --git a/tests_zemu/snapshots/x-bls-cert-default-key/00004.png b/tests_zemu/snapshots/x-bls-cert-default-key/00004.png deleted file mode 100644 index 4c3747ed..00000000 Binary files a/tests_zemu/snapshots/x-bls-cert-default-key/00004.png and /dev/null differ diff --git a/tests_zemu/snapshots/x-candid_auto_stake_maturity/00001.png b/tests_zemu/snapshots/x-candid_auto_stake_maturity/00001.png index 7f54ba24..21afb5b6 100644 Binary files a/tests_zemu/snapshots/x-candid_auto_stake_maturity/00001.png and b/tests_zemu/snapshots/x-candid_auto_stake_maturity/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_auto_stake_maturity/00003.png b/tests_zemu/snapshots/x-candid_auto_stake_maturity/00003.png index 7847be1b..6743db0d 100644 Binary files a/tests_zemu/snapshots/x-candid_auto_stake_maturity/00003.png and b/tests_zemu/snapshots/x-candid_auto_stake_maturity/00003.png differ diff --git a/tests_zemu/snapshots/x-candid_disburse/00001.png b/tests_zemu/snapshots/x-candid_disburse/00001.png index d3d8670a..ce62d6d8 100644 Binary files a/tests_zemu/snapshots/x-candid_disburse/00001.png and b/tests_zemu/snapshots/x-candid_disburse/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_disburse/00003.png b/tests_zemu/snapshots/x-candid_disburse/00003.png index 27ac1752..dca8aae3 100644 Binary files a/tests_zemu/snapshots/x-candid_disburse/00003.png and b/tests_zemu/snapshots/x-candid_disburse/00003.png differ diff --git a/tests_zemu/snapshots/x-candid_disburse/00004.png b/tests_zemu/snapshots/x-candid_disburse/00004.png index 54dcc00c..07c96a89 100644 Binary files a/tests_zemu/snapshots/x-candid_disburse/00004.png and b/tests_zemu/snapshots/x-candid_disburse/00004.png differ diff --git a/tests_zemu/snapshots/x-candid_disburse/00005.png b/tests_zemu/snapshots/x-candid_disburse/00005.png index 6110245f..56c0c614 100644 Binary files a/tests_zemu/snapshots/x-candid_disburse/00005.png and b/tests_zemu/snapshots/x-candid_disburse/00005.png differ diff --git a/tests_zemu/snapshots/x-candid_follow/00001.png b/tests_zemu/snapshots/x-candid_follow/00001.png index 0541da93..38ac47c2 100644 Binary files a/tests_zemu/snapshots/x-candid_follow/00001.png and b/tests_zemu/snapshots/x-candid_follow/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_follow/00004.png b/tests_zemu/snapshots/x-candid_follow/00004.png index f5a6e5aa..c0849e10 100644 Binary files a/tests_zemu/snapshots/x-candid_follow/00004.png and b/tests_zemu/snapshots/x-candid_follow/00004.png differ diff --git a/tests_zemu/snapshots/x-candid_follow/00005.png b/tests_zemu/snapshots/x-candid_follow/00005.png index 498d0234..ad1a2321 100644 Binary files a/tests_zemu/snapshots/x-candid_follow/00005.png and b/tests_zemu/snapshots/x-candid_follow/00005.png differ diff --git a/tests_zemu/snapshots/x-candid_follow/00006.png b/tests_zemu/snapshots/x-candid_follow/00006.png index e9e83817..06931f6d 100644 Binary files a/tests_zemu/snapshots/x-candid_follow/00006.png and b/tests_zemu/snapshots/x-candid_follow/00006.png differ diff --git a/tests_zemu/snapshots/x-candid_increase_dissolve_delay/00001.png b/tests_zemu/snapshots/x-candid_increase_dissolve_delay/00001.png index 814335b0..bb7dc027 100644 Binary files a/tests_zemu/snapshots/x-candid_increase_dissolve_delay/00001.png and b/tests_zemu/snapshots/x-candid_increase_dissolve_delay/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_increase_dissolve_delay/00003.png b/tests_zemu/snapshots/x-candid_increase_dissolve_delay/00003.png index 79bac100..7a58767c 100644 Binary files a/tests_zemu/snapshots/x-candid_increase_dissolve_delay/00003.png and b/tests_zemu/snapshots/x-candid_increase_dissolve_delay/00003.png differ diff --git a/tests_zemu/snapshots/x-candid_list_neurons/00001.png b/tests_zemu/snapshots/x-candid_list_neurons/00001.png index 5d2a4a1f..58c95f0e 100644 Binary files a/tests_zemu/snapshots/x-candid_list_neurons/00001.png and b/tests_zemu/snapshots/x-candid_list_neurons/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_merge_neuron/00001.png b/tests_zemu/snapshots/x-candid_merge_neuron/00001.png index d1596832..16fd6786 100644 Binary files a/tests_zemu/snapshots/x-candid_merge_neuron/00001.png and b/tests_zemu/snapshots/x-candid_merge_neuron/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_merge_neuron/00003.png b/tests_zemu/snapshots/x-candid_merge_neuron/00003.png index 288a177b..b60d7e3e 100644 Binary files a/tests_zemu/snapshots/x-candid_merge_neuron/00003.png and b/tests_zemu/snapshots/x-candid_merge_neuron/00003.png differ diff --git a/tests_zemu/snapshots/x-candid_register_vote/00001.png b/tests_zemu/snapshots/x-candid_register_vote/00001.png index b497a360..a2c41b4f 100644 Binary files a/tests_zemu/snapshots/x-candid_register_vote/00001.png and b/tests_zemu/snapshots/x-candid_register_vote/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_send_icp/00001.png b/tests_zemu/snapshots/x-candid_send_icp/00001.png index 76706da3..64850f70 100644 Binary files a/tests_zemu/snapshots/x-candid_send_icp/00001.png and b/tests_zemu/snapshots/x-candid_send_icp/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_send_icp/00002.png b/tests_zemu/snapshots/x-candid_send_icp/00002.png index 9abb0616..f8eb5edb 100644 Binary files a/tests_zemu/snapshots/x-candid_send_icp/00002.png and b/tests_zemu/snapshots/x-candid_send_icp/00002.png differ diff --git a/tests_zemu/snapshots/x-candid_send_icp/00003.png b/tests_zemu/snapshots/x-candid_send_icp/00003.png index 872adcf3..498b7516 100644 Binary files a/tests_zemu/snapshots/x-candid_send_icp/00003.png and b/tests_zemu/snapshots/x-candid_send_icp/00003.png differ diff --git a/tests_zemu/snapshots/x-candid_send_icp/00004.png b/tests_zemu/snapshots/x-candid_send_icp/00004.png index f2f42cdd..d66076d5 100644 Binary files a/tests_zemu/snapshots/x-candid_send_icp/00004.png and b/tests_zemu/snapshots/x-candid_send_icp/00004.png differ diff --git a/tests_zemu/snapshots/x-candid_send_icp/00005.png b/tests_zemu/snapshots/x-candid_send_icp/00005.png index a02ad65e..10ec551a 100644 Binary files a/tests_zemu/snapshots/x-candid_send_icp/00005.png and b/tests_zemu/snapshots/x-candid_send_icp/00005.png differ diff --git a/tests_zemu/snapshots/x-candid_send_icp/00006.png b/tests_zemu/snapshots/x-candid_send_icp/00006.png index 57c10fc3..b6bbd033 100644 Binary files a/tests_zemu/snapshots/x-candid_send_icp/00006.png and b/tests_zemu/snapshots/x-candid_send_icp/00006.png differ diff --git a/tests_zemu/snapshots/x-candid_set_dissolve_delay/00001.png b/tests_zemu/snapshots/x-candid_set_dissolve_delay/00001.png index 9417ed69..0399075b 100644 Binary files a/tests_zemu/snapshots/x-candid_set_dissolve_delay/00001.png and b/tests_zemu/snapshots/x-candid_set_dissolve_delay/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_spawn_neuron/00001.png b/tests_zemu/snapshots/x-candid_spawn_neuron/00001.png index 827476c4..f12a5509 100644 Binary files a/tests_zemu/snapshots/x-candid_spawn_neuron/00001.png and b/tests_zemu/snapshots/x-candid_spawn_neuron/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_spawn_neuron/00003.png b/tests_zemu/snapshots/x-candid_spawn_neuron/00003.png index 70827c96..28e1514b 100644 Binary files a/tests_zemu/snapshots/x-candid_spawn_neuron/00003.png and b/tests_zemu/snapshots/x-candid_spawn_neuron/00003.png differ diff --git a/tests_zemu/snapshots/x-candid_split_neuron/00001.png b/tests_zemu/snapshots/x-candid_split_neuron/00001.png index e072195e..3c1219d0 100644 Binary files a/tests_zemu/snapshots/x-candid_split_neuron/00001.png and b/tests_zemu/snapshots/x-candid_split_neuron/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_split_neuron/00003.png b/tests_zemu/snapshots/x-candid_split_neuron/00003.png index 1da9ce14..77f37bab 100644 Binary files a/tests_zemu/snapshots/x-candid_split_neuron/00003.png and b/tests_zemu/snapshots/x-candid_split_neuron/00003.png differ diff --git a/tests_zemu/snapshots/x-candid_stake_icrc_expert/00001.png b/tests_zemu/snapshots/x-candid_stake_icrc_expert/00001.png index efc4171b..48299996 100644 Binary files a/tests_zemu/snapshots/x-candid_stake_icrc_expert/00001.png and b/tests_zemu/snapshots/x-candid_stake_icrc_expert/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_stake_icrc_expert/00002.png b/tests_zemu/snapshots/x-candid_stake_icrc_expert/00002.png index c9269b6f..99499795 100644 Binary files a/tests_zemu/snapshots/x-candid_stake_icrc_expert/00002.png and b/tests_zemu/snapshots/x-candid_stake_icrc_expert/00002.png differ diff --git a/tests_zemu/snapshots/x-candid_stake_icrc_expert/00003.png b/tests_zemu/snapshots/x-candid_stake_icrc_expert/00003.png index 66e009be..5b7cc638 100644 Binary files a/tests_zemu/snapshots/x-candid_stake_icrc_expert/00003.png and b/tests_zemu/snapshots/x-candid_stake_icrc_expert/00003.png differ diff --git a/tests_zemu/snapshots/x-candid_stake_icrc_expert/00004.png b/tests_zemu/snapshots/x-candid_stake_icrc_expert/00004.png index 98b4504e..f9eb7673 100644 Binary files a/tests_zemu/snapshots/x-candid_stake_icrc_expert/00004.png and b/tests_zemu/snapshots/x-candid_stake_icrc_expert/00004.png differ diff --git a/tests_zemu/snapshots/x-candid_stake_maturity/00001.png b/tests_zemu/snapshots/x-candid_stake_maturity/00001.png index 6f20d3a8..ca81b953 100644 Binary files a/tests_zemu/snapshots/x-candid_stake_maturity/00001.png and b/tests_zemu/snapshots/x-candid_stake_maturity/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_stake_maturity/00003.png b/tests_zemu/snapshots/x-candid_stake_maturity/00003.png index 0ee14f4a..15faa7cf 100644 Binary files a/tests_zemu/snapshots/x-candid_stake_maturity/00003.png and b/tests_zemu/snapshots/x-candid_stake_maturity/00003.png differ diff --git a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00001.png b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00001.png index efc4171b..48299996 100644 Binary files a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00001.png and b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00001.png differ diff --git a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00002.png b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00002.png index d0010466..b8a4b392 100644 Binary files a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00002.png and b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00002.png differ diff --git a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00004.png b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00004.png index ccf3ccb9..4c0f03fc 100644 Binary files a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00004.png and b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00004.png differ diff --git a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00005.png b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00005.png index b7879476..8048cb16 100644 Binary files a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00005.png and b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00005.png differ diff --git a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00006.png b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00006.png index 9abb0616..f8eb5edb 100644 Binary files a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00006.png and b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00006.png differ diff --git a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00007.png b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00007.png index 872adcf3..498b7516 100644 Binary files a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00007.png and b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00007.png differ diff --git a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00008.png b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00008.png index 57c10fc3..b6bbd033 100644 Binary files a/tests_zemu/snapshots/x-candid_stake_neuron_expert/00008.png and b/tests_zemu/snapshots/x-candid_stake_neuron_expert/00008.png differ diff --git a/tests_zemu/snapshots/x-icrc_transfer/00001.png b/tests_zemu/snapshots/x-icrc_transfer/00001.png index 76706da3..64850f70 100644 Binary files a/tests_zemu/snapshots/x-icrc_transfer/00001.png and b/tests_zemu/snapshots/x-icrc_transfer/00001.png differ diff --git a/tests_zemu/snapshots/x-icrc_transfer/00002.png b/tests_zemu/snapshots/x-icrc_transfer/00002.png index 7e7543f8..09d359c6 100644 Binary files a/tests_zemu/snapshots/x-icrc_transfer/00002.png and b/tests_zemu/snapshots/x-icrc_transfer/00002.png differ diff --git a/tests_zemu/snapshots/x-icrc_transfer/00003.png b/tests_zemu/snapshots/x-icrc_transfer/00003.png index bdf7f9eb..699c3c4f 100644 Binary files a/tests_zemu/snapshots/x-icrc_transfer/00003.png and b/tests_zemu/snapshots/x-icrc_transfer/00003.png differ diff --git a/tests_zemu/snapshots/x-icrc_transfer/00004.png b/tests_zemu/snapshots/x-icrc_transfer/00004.png index e0eebadd..c78324fe 100644 Binary files a/tests_zemu/snapshots/x-icrc_transfer/00004.png and b/tests_zemu/snapshots/x-icrc_transfer/00004.png differ diff --git a/tests_zemu/snapshots/x-icrc_transfer/00005.png b/tests_zemu/snapshots/x-icrc_transfer/00005.png index 1eec87d0..9ff1369c 100644 Binary files a/tests_zemu/snapshots/x-icrc_transfer/00005.png and b/tests_zemu/snapshots/x-icrc_transfer/00005.png differ diff --git a/tests_zemu/snapshots/x-icrc_transfer/00006.png b/tests_zemu/snapshots/x-icrc_transfer/00006.png index 9ae7153f..9ec16889 100644 Binary files a/tests_zemu/snapshots/x-icrc_transfer/00006.png and b/tests_zemu/snapshots/x-icrc_transfer/00006.png differ diff --git a/tests_zemu/snapshots/x-icrc_transfer/00007.png b/tests_zemu/snapshots/x-icrc_transfer/00007.png index 9652ab9d..9492c68d 100644 Binary files a/tests_zemu/snapshots/x-icrc_transfer/00007.png and b/tests_zemu/snapshots/x-icrc_transfer/00007.png differ diff --git a/tests_zemu/snapshots/x-icrc_transfer/00008.png b/tests_zemu/snapshots/x-icrc_transfer/00008.png index 98b4504e..f9eb7673 100644 Binary files a/tests_zemu/snapshots/x-icrc_transfer/00008.png and b/tests_zemu/snapshots/x-icrc_transfer/00008.png differ diff --git a/tests_zemu/snapshots/x-mainmenu/00001.png b/tests_zemu/snapshots/x-mainmenu/00001.png index 8472e5d9..e10e0049 100644 Binary files a/tests_zemu/snapshots/x-mainmenu/00001.png and b/tests_zemu/snapshots/x-mainmenu/00001.png differ diff --git a/tests_zemu/snapshots/x-mainmenu/00002.png b/tests_zemu/snapshots/x-mainmenu/00002.png index f7921677..7e236da6 100644 Binary files a/tests_zemu/snapshots/x-mainmenu/00002.png and b/tests_zemu/snapshots/x-mainmenu/00002.png differ diff --git a/tests_zemu/snapshots/x-mainmenu/00003.png b/tests_zemu/snapshots/x-mainmenu/00003.png index 8472e5d9..e10e0049 100644 Binary files a/tests_zemu/snapshots/x-mainmenu/00003.png and b/tests_zemu/snapshots/x-mainmenu/00003.png differ diff --git a/tests_zemu/snapshots/x-mainmenu/00004.png b/tests_zemu/snapshots/x-mainmenu/00004.png index 5e352af9..0a2f87e6 100644 Binary files a/tests_zemu/snapshots/x-mainmenu/00004.png and b/tests_zemu/snapshots/x-mainmenu/00004.png differ diff --git a/tests_zemu/snapshots/x-mainmenu/00005.png b/tests_zemu/snapshots/x-mainmenu/00005.png index 1adff7ee..b6232856 100644 Binary files a/tests_zemu/snapshots/x-mainmenu/00005.png and b/tests_zemu/snapshots/x-mainmenu/00005.png differ diff --git a/tests_zemu/snapshots/x-mainmenu/00009.png b/tests_zemu/snapshots/x-mainmenu/00009.png index 1adff7ee..b6232856 100644 Binary files a/tests_zemu/snapshots/x-mainmenu/00009.png and b/tests_zemu/snapshots/x-mainmenu/00009.png differ diff --git a/tests_zemu/snapshots/x-mainmenu/00010.png b/tests_zemu/snapshots/x-mainmenu/00010.png index 5e352af9..0a2f87e6 100644 Binary files a/tests_zemu/snapshots/x-mainmenu/00010.png and b/tests_zemu/snapshots/x-mainmenu/00010.png differ diff --git a/tests_zemu/snapshots/x-mainmenu/00011.png b/tests_zemu/snapshots/x-mainmenu/00011.png index 8472e5d9..e10e0049 100644 Binary files a/tests_zemu/snapshots/x-mainmenu/00011.png and b/tests_zemu/snapshots/x-mainmenu/00011.png differ diff --git a/tests_zemu/snapshots/x-pb_add_hotkey/00001.png b/tests_zemu/snapshots/x-pb_add_hotkey/00001.png index 5a1d3274..1bf78ad1 100644 Binary files a/tests_zemu/snapshots/x-pb_add_hotkey/00001.png and b/tests_zemu/snapshots/x-pb_add_hotkey/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_add_hotkey/00003.png b/tests_zemu/snapshots/x-pb_add_hotkey/00003.png index 54c6f669..0f81cda7 100644 Binary files a/tests_zemu/snapshots/x-pb_add_hotkey/00003.png and b/tests_zemu/snapshots/x-pb_add_hotkey/00003.png differ diff --git a/tests_zemu/snapshots/x-pb_check_status/00001.png b/tests_zemu/snapshots/x-pb_check_status/00001.png index 030585c6..21459ebb 100644 Binary files a/tests_zemu/snapshots/x-pb_check_status/00001.png and b/tests_zemu/snapshots/x-pb_check_status/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_claim_neurons/00001.png b/tests_zemu/snapshots/x-pb_claim_neurons/00001.png index 3006c983..3f2de051 100644 Binary files a/tests_zemu/snapshots/x-pb_claim_neurons/00001.png and b/tests_zemu/snapshots/x-pb_claim_neurons/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_disburse/00001.png b/tests_zemu/snapshots/x-pb_disburse/00001.png index d3d8670a..ce62d6d8 100644 Binary files a/tests_zemu/snapshots/x-pb_disburse/00001.png and b/tests_zemu/snapshots/x-pb_disburse/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_disburse/00003.png b/tests_zemu/snapshots/x-pb_disburse/00003.png index 4646209c..b872e9c1 100644 Binary files a/tests_zemu/snapshots/x-pb_disburse/00003.png and b/tests_zemu/snapshots/x-pb_disburse/00003.png differ diff --git a/tests_zemu/snapshots/x-pb_disburse/00004.png b/tests_zemu/snapshots/x-pb_disburse/00004.png index efc1bff1..17a60d04 100644 Binary files a/tests_zemu/snapshots/x-pb_disburse/00004.png and b/tests_zemu/snapshots/x-pb_disburse/00004.png differ diff --git a/tests_zemu/snapshots/x-pb_disburse/00005.png b/tests_zemu/snapshots/x-pb_disburse/00005.png index 82752ad0..d89c0380 100644 Binary files a/tests_zemu/snapshots/x-pb_disburse/00005.png and b/tests_zemu/snapshots/x-pb_disburse/00005.png differ diff --git a/tests_zemu/snapshots/x-pb_follow/00001.png b/tests_zemu/snapshots/x-pb_follow/00001.png index 0541da93..38ac47c2 100644 Binary files a/tests_zemu/snapshots/x-pb_follow/00001.png and b/tests_zemu/snapshots/x-pb_follow/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_follow/00004.png b/tests_zemu/snapshots/x-pb_follow/00004.png index 4844ee2b..f22b053b 100644 Binary files a/tests_zemu/snapshots/x-pb_follow/00004.png and b/tests_zemu/snapshots/x-pb_follow/00004.png differ diff --git a/tests_zemu/snapshots/x-pb_follow/00005.png b/tests_zemu/snapshots/x-pb_follow/00005.png index c0cdca5e..58f4dc38 100644 Binary files a/tests_zemu/snapshots/x-pb_follow/00005.png and b/tests_zemu/snapshots/x-pb_follow/00005.png differ diff --git a/tests_zemu/snapshots/x-pb_follow/00006.png b/tests_zemu/snapshots/x-pb_follow/00006.png index 92ed5961..e95f1f2f 100644 Binary files a/tests_zemu/snapshots/x-pb_follow/00006.png and b/tests_zemu/snapshots/x-pb_follow/00006.png differ diff --git a/tests_zemu/snapshots/x-pb_increase_dissolve_delay/00001.png b/tests_zemu/snapshots/x-pb_increase_dissolve_delay/00001.png index 814335b0..bb7dc027 100644 Binary files a/tests_zemu/snapshots/x-pb_increase_dissolve_delay/00001.png and b/tests_zemu/snapshots/x-pb_increase_dissolve_delay/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_increase_dissolve_delay/00003.png b/tests_zemu/snapshots/x-pb_increase_dissolve_delay/00003.png index f8b98202..c5dc879c 100644 Binary files a/tests_zemu/snapshots/x-pb_increase_dissolve_delay/00003.png and b/tests_zemu/snapshots/x-pb_increase_dissolve_delay/00003.png differ diff --git a/tests_zemu/snapshots/x-pb_join_community_fund/00001.png b/tests_zemu/snapshots/x-pb_join_community_fund/00001.png index 890d0a4c..32bd4a30 100644 Binary files a/tests_zemu/snapshots/x-pb_join_community_fund/00001.png and b/tests_zemu/snapshots/x-pb_join_community_fund/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_list_neurons/00001.png b/tests_zemu/snapshots/x-pb_list_neurons/00001.png index 5d2a4a1f..58c95f0e 100644 Binary files a/tests_zemu/snapshots/x-pb_list_neurons/00001.png and b/tests_zemu/snapshots/x-pb_list_neurons/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_register_vote/00001.png b/tests_zemu/snapshots/x-pb_register_vote/00001.png index b497a360..a2c41b4f 100644 Binary files a/tests_zemu/snapshots/x-pb_register_vote/00001.png and b/tests_zemu/snapshots/x-pb_register_vote/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_remove_hotkey/00001.png b/tests_zemu/snapshots/x-pb_remove_hotkey/00001.png index 0d62dfcc..f69a19b2 100644 Binary files a/tests_zemu/snapshots/x-pb_remove_hotkey/00001.png and b/tests_zemu/snapshots/x-pb_remove_hotkey/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_remove_hotkey/00003.png b/tests_zemu/snapshots/x-pb_remove_hotkey/00003.png index 54c6f669..0f81cda7 100644 Binary files a/tests_zemu/snapshots/x-pb_remove_hotkey/00003.png and b/tests_zemu/snapshots/x-pb_remove_hotkey/00003.png differ diff --git a/tests_zemu/snapshots/x-pb_sign_update_call/00001.png b/tests_zemu/snapshots/x-pb_sign_update_call/00001.png index 76706da3..64850f70 100644 Binary files a/tests_zemu/snapshots/x-pb_sign_update_call/00001.png and b/tests_zemu/snapshots/x-pb_sign_update_call/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_sign_update_call/00002.png b/tests_zemu/snapshots/x-pb_sign_update_call/00002.png index 41e9e067..e0acb147 100644 Binary files a/tests_zemu/snapshots/x-pb_sign_update_call/00002.png and b/tests_zemu/snapshots/x-pb_sign_update_call/00002.png differ diff --git a/tests_zemu/snapshots/x-pb_sign_update_call/00003.png b/tests_zemu/snapshots/x-pb_sign_update_call/00003.png index 167a57eb..1d2c762d 100644 Binary files a/tests_zemu/snapshots/x-pb_sign_update_call/00003.png and b/tests_zemu/snapshots/x-pb_sign_update_call/00003.png differ diff --git a/tests_zemu/snapshots/x-pb_sign_update_call/00004.png b/tests_zemu/snapshots/x-pb_sign_update_call/00004.png index dc782e8f..f4fcaaae 100644 Binary files a/tests_zemu/snapshots/x-pb_sign_update_call/00004.png and b/tests_zemu/snapshots/x-pb_sign_update_call/00004.png differ diff --git a/tests_zemu/snapshots/x-pb_sign_update_call/00005.png b/tests_zemu/snapshots/x-pb_sign_update_call/00005.png index 8b3176ea..e052fdc8 100644 Binary files a/tests_zemu/snapshots/x-pb_sign_update_call/00005.png and b/tests_zemu/snapshots/x-pb_sign_update_call/00005.png differ diff --git a/tests_zemu/snapshots/x-pb_sign_update_call/00006.png b/tests_zemu/snapshots/x-pb_sign_update_call/00006.png index d38d11c6..b835239b 100644 Binary files a/tests_zemu/snapshots/x-pb_sign_update_call/00006.png and b/tests_zemu/snapshots/x-pb_sign_update_call/00006.png differ diff --git a/tests_zemu/snapshots/x-pb_spawn_neuron/00001.png b/tests_zemu/snapshots/x-pb_spawn_neuron/00001.png index 827476c4..f12a5509 100644 Binary files a/tests_zemu/snapshots/x-pb_spawn_neuron/00001.png and b/tests_zemu/snapshots/x-pb_spawn_neuron/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_stake_neuron/00001.png b/tests_zemu/snapshots/x-pb_stake_neuron/00001.png index efc4171b..48299996 100644 Binary files a/tests_zemu/snapshots/x-pb_stake_neuron/00001.png and b/tests_zemu/snapshots/x-pb_stake_neuron/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_stake_neuron/00002.png b/tests_zemu/snapshots/x-pb_stake_neuron/00002.png index 41e9e067..e0acb147 100644 Binary files a/tests_zemu/snapshots/x-pb_stake_neuron/00002.png and b/tests_zemu/snapshots/x-pb_stake_neuron/00002.png differ diff --git a/tests_zemu/snapshots/x-pb_stake_neuron/00003.png b/tests_zemu/snapshots/x-pb_stake_neuron/00003.png index 167a57eb..1d2c762d 100644 Binary files a/tests_zemu/snapshots/x-pb_stake_neuron/00003.png and b/tests_zemu/snapshots/x-pb_stake_neuron/00003.png differ diff --git a/tests_zemu/snapshots/x-pb_stake_neuron/00004.png b/tests_zemu/snapshots/x-pb_stake_neuron/00004.png index 1da9ce14..77f37bab 100644 Binary files a/tests_zemu/snapshots/x-pb_stake_neuron/00004.png and b/tests_zemu/snapshots/x-pb_stake_neuron/00004.png differ diff --git a/tests_zemu/snapshots/x-pb_start_dissolve/00001.png b/tests_zemu/snapshots/x-pb_start_dissolve/00001.png index df8203cb..de5016d0 100644 Binary files a/tests_zemu/snapshots/x-pb_start_dissolve/00001.png and b/tests_zemu/snapshots/x-pb_start_dissolve/00001.png differ diff --git a/tests_zemu/snapshots/x-pb_stop_dissolve/00001.png b/tests_zemu/snapshots/x-pb_stop_dissolve/00001.png index 4c841e1d..caa9e381 100644 Binary files a/tests_zemu/snapshots/x-pb_stop_dissolve/00001.png and b/tests_zemu/snapshots/x-pb_stop_dissolve/00001.png differ diff --git a/tests_zemu/snapshots/x-show_address/00001.png b/tests_zemu/snapshots/x-show_address/00001.png index 6e991bee..d1de3f78 100644 Binary files a/tests_zemu/snapshots/x-show_address/00001.png and b/tests_zemu/snapshots/x-show_address/00001.png differ diff --git a/tests_zemu/snapshots/x-show_address/00002.png b/tests_zemu/snapshots/x-show_address/00002.png index 50e57c82..8a15042e 100644 Binary files a/tests_zemu/snapshots/x-show_address/00002.png and b/tests_zemu/snapshots/x-show_address/00002.png differ diff --git a/tests_zemu/snapshots/x-show_address/00003.png b/tests_zemu/snapshots/x-show_address/00003.png index 54c6f669..0f81cda7 100644 Binary files a/tests_zemu/snapshots/x-show_address/00003.png and b/tests_zemu/snapshots/x-show_address/00003.png differ diff --git a/tests_zemu/snapshots/x-show_address_reject/00001.png b/tests_zemu/snapshots/x-show_address_reject/00001.png index 6e991bee..d1de3f78 100644 Binary files a/tests_zemu/snapshots/x-show_address_reject/00001.png and b/tests_zemu/snapshots/x-show_address_reject/00001.png differ diff --git a/tests_zemu/snapshots/x-show_address_reject/00002.png b/tests_zemu/snapshots/x-show_address_reject/00002.png index 50e57c82..8a15042e 100644 Binary files a/tests_zemu/snapshots/x-show_address_reject/00002.png and b/tests_zemu/snapshots/x-show_address_reject/00002.png differ diff --git a/tests_zemu/snapshots/x-show_address_reject/00003.png b/tests_zemu/snapshots/x-show_address_reject/00003.png index 54c6f669..0f81cda7 100644 Binary files a/tests_zemu/snapshots/x-show_address_reject/00003.png and b/tests_zemu/snapshots/x-show_address_reject/00003.png differ diff --git a/tests_zemu/snapshots/x-show_address_reject/00007.png b/tests_zemu/snapshots/x-show_address_reject/00007.png index de8a2912..d9b5efc5 100644 Binary files a/tests_zemu/snapshots/x-show_address_reject/00007.png and b/tests_zemu/snapshots/x-show_address_reject/00007.png differ diff --git a/tests_zemu/snapshots/x-sns_add_permissions/00001.png b/tests_zemu/snapshots/x-sns_add_permissions/00001.png index f87538eb..3cad3055 100644 Binary files a/tests_zemu/snapshots/x-sns_add_permissions/00001.png and b/tests_zemu/snapshots/x-sns_add_permissions/00001.png differ diff --git a/tests_zemu/snapshots/x-sns_add_permissions/00003.png b/tests_zemu/snapshots/x-sns_add_permissions/00003.png index ec74130d..4c04b100 100644 Binary files a/tests_zemu/snapshots/x-sns_add_permissions/00003.png and b/tests_zemu/snapshots/x-sns_add_permissions/00003.png differ diff --git a/tests_zemu/snapshots/x-sns_add_permissions/00005.png b/tests_zemu/snapshots/x-sns_add_permissions/00005.png index 9315690f..977e35a7 100644 Binary files a/tests_zemu/snapshots/x-sns_add_permissions/00005.png and b/tests_zemu/snapshots/x-sns_add_permissions/00005.png differ diff --git a/tests_zemu/snapshots/x-sns_disburse/00001.png b/tests_zemu/snapshots/x-sns_disburse/00001.png index d3d8670a..ce62d6d8 100644 Binary files a/tests_zemu/snapshots/x-sns_disburse/00001.png and b/tests_zemu/snapshots/x-sns_disburse/00001.png differ diff --git a/tests_zemu/snapshots/x-sns_disburse/00003.png b/tests_zemu/snapshots/x-sns_disburse/00003.png index ec74130d..4c04b100 100644 Binary files a/tests_zemu/snapshots/x-sns_disburse/00003.png and b/tests_zemu/snapshots/x-sns_disburse/00003.png differ diff --git a/tests_zemu/snapshots/x-sns_disburse/00005.png b/tests_zemu/snapshots/x-sns_disburse/00005.png index c30eb711..5032b738 100644 Binary files a/tests_zemu/snapshots/x-sns_disburse/00005.png and b/tests_zemu/snapshots/x-sns_disburse/00005.png differ diff --git a/tests_zemu/snapshots/x-sns_disburse/00006.png b/tests_zemu/snapshots/x-sns_disburse/00006.png index 347f17e9..3bd7c37d 100644 Binary files a/tests_zemu/snapshots/x-sns_disburse/00006.png and b/tests_zemu/snapshots/x-sns_disburse/00006.png differ diff --git a/tests_zemu/snapshots/x-sns_disburse/00007.png b/tests_zemu/snapshots/x-sns_disburse/00007.png index 957ffe01..ac7bb7c0 100644 Binary files a/tests_zemu/snapshots/x-sns_disburse/00007.png and b/tests_zemu/snapshots/x-sns_disburse/00007.png differ diff --git a/tests_zemu/snapshots/x-sns_remove_permissions/00001.png b/tests_zemu/snapshots/x-sns_remove_permissions/00001.png index f5fb7ce4..b0905365 100644 Binary files a/tests_zemu/snapshots/x-sns_remove_permissions/00001.png and b/tests_zemu/snapshots/x-sns_remove_permissions/00001.png differ diff --git a/tests_zemu/snapshots/x-sns_remove_permissions/00005.png b/tests_zemu/snapshots/x-sns_remove_permissions/00005.png index 9315690f..977e35a7 100644 Binary files a/tests_zemu/snapshots/x-sns_remove_permissions/00005.png and b/tests_zemu/snapshots/x-sns_remove_permissions/00005.png differ diff --git a/tests_zemu/snapshots/x-sns_stake_maturity/00001.png b/tests_zemu/snapshots/x-sns_stake_maturity/00001.png index 6f20d3a8..ca81b953 100644 Binary files a/tests_zemu/snapshots/x-sns_stake_maturity/00001.png and b/tests_zemu/snapshots/x-sns_stake_maturity/00001.png differ diff --git a/tests_zemu/snapshots/x-sns_stake_maturity/00005.png b/tests_zemu/snapshots/x-sns_stake_maturity/00005.png index b62f7046..7036618f 100644 Binary files a/tests_zemu/snapshots/x-sns_stake_maturity/00005.png and b/tests_zemu/snapshots/x-sns_stake_maturity/00005.png differ diff --git a/tests_zemu/snapshots/x-sns_start_dissolve/00001.png b/tests_zemu/snapshots/x-sns_start_dissolve/00001.png index df8203cb..de5016d0 100644 Binary files a/tests_zemu/snapshots/x-sns_start_dissolve/00001.png and b/tests_zemu/snapshots/x-sns_start_dissolve/00001.png differ diff --git a/tests_zemu/snapshots/x-sns_stop_dissolve/00001.png b/tests_zemu/snapshots/x-sns_stop_dissolve/00001.png index 4c841e1d..caa9e381 100644 Binary files a/tests_zemu/snapshots/x-sns_stop_dissolve/00001.png and b/tests_zemu/snapshots/x-sns_stop_dissolve/00001.png differ diff --git a/tests_zemu/snapshots/x-sns_stop_dissolve/00003.png b/tests_zemu/snapshots/x-sns_stop_dissolve/00003.png index ec74130d..4c04b100 100644 Binary files a/tests_zemu/snapshots/x-sns_stop_dissolve/00003.png and b/tests_zemu/snapshots/x-sns_stop_dissolve/00003.png differ diff --git a/tests_zemu/tests/bls.test.ts b/tests_zemu/tests/bls.test.ts index b870c513..606b5bef 100644 --- a/tests_zemu/tests/bls.test.ts +++ b/tests_zemu/tests/bls.test.ts @@ -20,40 +20,8 @@ import { DEFAULT_OPTIONS, DEVICE_MODELS_BLS } from './common' jest.setTimeout(180000) +// describe.skip('Bls', function () { describe.skip('Bls', function () { - test.concurrent.each(DEVICE_MODELS_BLS)('verify_with_custom_key', async function (m) { - const sim = new Zemu(m.path) - try { - await sim.start({ ...DEFAULT_OPTIONS, model: m.name, startText: m.name === 'stax' ? '' : 'Computer' }) - const app = new InternetComputerApp(sim.getTransport()) - - let consent_request = - 'd9d9f7a167636f6e74656e74a76361726758d84449444c086d7b6e766c02aeaeb1cc0501d880c6d007716c02cbaeb581017ab183e7f1077a6b028beabfc2067f8ef1c1ee0d036e046c02efcee7800402c4fbf2db05056c03d6fca70200e1edeb4a7184f7fee80a060107684449444c066e7d6d7b6e016e786c02b3b0dac30368ad86ca8305026c08c6fcb60200ba89e5c20402a2de94eb060282f3f3910c03d8a38ca80d7d919c9cbf0d00dea7f7da0d03cb96dcb40e04010501904e0000008094ebdc030000010a00000000000000070101000d69637263325f617070726f76650002656e0101230003006b63616e69737465725f69644a000000000000000201016e696e67726573735f6578706972791b18072a6f7894d0006b6d6574686f645f6e616d6578246963726332315f63616e69737465725f63616c6c5f636f6e73656e745f6d657373616765656e6f6e636550369f1914fd64438f5e6329fcb66b1d4d6c726571756573745f747970656463616c6c6673656e6465724104' - let canister_call = - 'd9d9f7a167636f6e74656e74a76361726758684449444c066e7d6d7b6e016e786c02b3b0dac30368ad86ca8305026c08c6fcb60200ba89e5c20402a2de94eb060282f3f3910c03d8a38ca80d7d919c9cbf0d00dea7f7da0d03cb96dcb40e04010501904e0000008094ebdc030000010a00000000000000070101006b63616e69737465725f69644a000000000000000201016e696e67726573735f6578706972791b18072a6f7894d0006b6d6574686f645f6e616d656d69637263325f617070726f7665656e6f6e6365506b99f1c2338b4543152aae206d5286726c726571756573745f747970656463616c6c6673656e646572581d052c5f6f270fc4a3a882a8075732cba90ad4bd25d30bd2cf7b0bfe7c02' - let certificate = - 'd9d9f7a264747265658301830182045820d4cff6a25570a56ac14e743e694daa2aa88b80a4bea761116471b56e4945ed6d830182045820f26d51d511039fcb5058441e6204fec42a0da824541f57d0c1c3468a13e16cbf83024e726571756573745f737461747573830182045820198df32f6757100316e899c7a3afec26f6933c06bf5d2f6233f6b0f14ac5b96f83025820ea37fdc5229d7273d500dc8ae3c009f0421049c1f02cc5ad85ea838ae7dfc04583018302457265706c7982035903304449444c0c6b02bc8a0101c5fed201096c02efcee7800402e29fdcc806046c02aeaeb1cc0503d880c6d007716e766b02d9e5b0980405fcdfd79a0f716c01c4d6b4ea0b066d076c01ffbb87a807086d716b04d1c4987c0aa3f2efe6020b9a8597e6030be3c581900f0b6c02fc91f4f80571c498b1b50d7d6c01fc91f4f805710100000002656e0007031e2320417574686f72697a6520616e6f74686572206164647265737320746f2077697468647261772066726f6d20796f7572206163636f756e74202a2a5468651f666f6c6c6f77696e67206164647265737320697320616c6c6f77656420746f031d77697468647261772066726f6d20796f7572206163636f756e743a2a2a2272646d78362d6a616161612d61616161612d61616164712d636169202a2a596f75720d7375626163636f756e743a2a2a032330303030303030303030303030303030303030303030303030303030303030303030301d3030303030303030303030303030303030303030303030303030303030232a2a526571756573746564207769746864726177616c20616c6c6f77616e63653a2a2a032031302049435020e29aa02054686520616c6c6f77616e63652077696c6c2062652273657420746f2031302049435020696e646570656e64656e746c79206f6620616e791e70726576696f757320616c6c6f77616e63652e20556e74696c207468697303217472616e73616374696f6e20686173206265656e206578656375746564207468651e7370656e6465722063616e207374696c6c206578657263697365207468652370726576696f757320616c6c6f77616e63652028696620616e792920746f2069742773032166756c6c20616d6f756e742e202a2a45787069726174696f6e20646174653a2a2a204e6f2065787069726174696f6e2e202a2a417070726f76616c206665653a2a2a23302e3030303120494350202a2a5472616e73616374696f6e206665657320746f206265031a7061696420627920796f7572207375626163636f756e743a2a2a2330303030303030303030303030303030303030303030303030303030303030303030301d30303030303030303030303030303030303030303030303030303030308302467374617475738203477265706c6965648301820458206d8327eb52806a887c0e4f444261e7bde20005e64d9b31479b9af72f8f89886083024474696d65820349c8ccbcfea4c8ca8318697369676e61747572655830b9eb03718c42aa1926bab9956dcef37432045ba1122baf120b8fc3e9fb56f75df8eee419e4e6488e60db79dcaba8c153' - - let root_key = - 'b354faa40626ebc91ed7e55b2307feff70d119ef37f89915bd4561a1ed8c5c26c8c2cb8c4711eec681bf213a75cb988008fb1f4d7aa278cd4fad6f295c83bab04b8cabcb32640cf926083daf865551f9f3b76fd800dac027a583858b9d1d3f64' - - const respCert = app.signBls("m/44'/223'/0'/0/0", consent_request, canister_call, certificate, root_key) - - // Wait until we are not in the main menu - await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot()) - - await sim.compareSnapshotsAndApprove('.', `${m.prefix.toLowerCase()}-bls-cert_custom_key`) - - const signatureResponse = await respCert - console.log(respCert) - - expect(signatureResponse.returnCode).toEqual(0x9000) - expect(signatureResponse.errorMessage).toEqual('No errors') - } finally { - await sim.close() - } - }) - test.concurrent.each(DEVICE_MODELS_BLS)('verify_with_default_key', async function (m) { const sim = new Zemu(m.path) try { @@ -61,11 +29,11 @@ describe.skip('Bls', function () { const app = new InternetComputerApp(sim.getTransport()) let consent_request = - 'd9d9f7a167636f6e74656e74a763617267586b4449444c076d7b6c01d880c6d007716c02cbaeb581017ab183e7f1077a6b028beabfc2067f8ef1c1ee0d026e036c02efcee7800401c4fbf2db05046c03d6fca70200e1edeb4a7184f7fee80a0501060c4449444c00017104746f626905677265657402656e01011e0003006b63616e69737465725f69644a00000000006000fd01016e696e67726573735f657870697279c24817c49d49c5a920806b6d6574686f645f6e616d6578246963726332315f63616e69737465725f63616c6c5f636f6e73656e745f6d657373616765656e6f6e636550a3788c1805553fb69b20f08e87e23b136c726571756573745f747970656463616c6c6673656e6465724104' + 'd9d9f7a167636f6e74656e74a76361726758d84449444c086d7b6e766c02aeaeb1cc0501d880c6d007716c02cbaeb581017ab183e7f1077a6b028beabfc2067f8ef1c1ee0d036e046c02efcee7800402c4fbf2db05056c03d6fca70200e1edeb4a7184f7fee80a060107684449444c066e7d6d7b6e016e786c02b3b0dac30368ad86ca8305026c08c6fcb60200ba89e5c20402a2de94eb060282f3f3910c03d8a38ca80d7d919c9cbf0d00dea7f7da0d03cb96dcb40e04010501904e0000008094ebdc030000010a00000000000000070101000d69637263325f617070726f76650002656e0101230003006b63616e69737465725f69644a000000000000000201016e696e67726573735f6578706972791b180dfaf93de928006b6d6574686f645f6e616d6578246963726332315f63616e69737465725f63616c6c5f636f6e73656e745f6d657373616765656e6f6e636550b70f2ce7f8f414041610c3d3d4eab6d06c726571756573745f747970656463616c6c6673656e6465724104' let canister_call = - 'd9d9f7a167636f6e74656e74a6636172674c4449444c00017104746f62696b63616e69737465725f69644a00000000006000fd01016e696e67726573735f657870697279c24817c49d610e2008806b6d6574686f645f6e616d656567726565746c726571756573745f747970656571756572796673656e6465724104' + 'd9d9f7a167636f6e74656e74a76361726758684449444c066e7d6d7b6e016e786c02b3b0dac30368ad86ca8305026c08c6fcb60200ba89e5c20402a2de94eb060282f3f3910c03d8a38ca80d7d919c9cbf0d00dea7f7da0d03cb96dcb40e04010501904e0000008094ebdc030000010a00000000000000070101006b63616e69737465725f69644a000000000000000201016e696e67726573735f6578706972791b180dfaf93de928006b6d6574686f645f6e616d656d69637263325f617070726f7665656e6f6e63655007726649d5ee68e7bd09c853a5dac0fc6c726571756573745f747970656463616c6c6673656e646572581d052c5f6f270fc4a3a882a8075732cba90ad4bd25d30bd2cf7b0bfe7c02' let certificate = - 'd9d9f7a3647472656583018301820458200bbcc71092da3ce262b8154d398b9a6114bee87f1c0b72e16912757aa023626a8301820458200628a8e00432e8657ad99c4d1bf167dd54ace9199609bfc5d57d89f48d97565f83024e726571756573745f737461747573830258204ea057c46292fedb573d35319dd1ccab3fb5d6a2b106b785d1f7757cfa5a254283018302457265706c79820358b44449444c0b6b02bc8a0101c5fed201086c02efcee7800402e29fdcc806036c01d880c6d007716b02d9e5b0980404fcdfd79a0f716c01c4d6b4ea0b056d066c01ffbb87a807076d716b04d1c4987c09a3f2efe6020a9a8597e6030ae3c581900f0a6c02fc91f4f80571c498b1b50d7d6c01fc91f4f8057101000002656e0001021e50726f647563652074686520666f6c6c6f77696e67206772656574696e6714746578743a202248656c6c6f2c20746f626921228302467374617475738203477265706c696564830182045820891af3e8982f1ac3d295c29b9fdfedc52301c03fbd4979676c01059184060b0583024474696d65820349cbf7dd8ca1a2a7e217697369676e6174757265583088078c6fe75f32594bf4e322b14d47e5c849cf24a370e3bab0cab5daffb7ab6a2c49de18b7f2d631893217d0c716cd656a64656c65676174696f6ea2697375626e65745f6964581d2c55b347ecf2686c83781d6c59d1b43e7b4cba8deb6c1b376107f2cd026b6365727469666963617465590294d9d9f7a264747265658301820458200b0d62dc7b9d7de735bb9a6393b59c9f32ff7c4d2aacdfc9e6ffc70e341fb6f783018301820458204468514ca4af8224c055c386e3f7b0bfe018c2d9cfd5837e427b43e1ab0934f98302467375626e65748301830183018301820458208739fbbedd3dedaa8fef41870367c0905bde376b63dd37e2b176fb08b582052f830182045820f8c3eae0377ee00859223bf1c6202f5885c4dcdc8fd13b1d48c3c838688919bc83018302581d2c55b347ecf2686c83781d6c59d1b43e7b4cba8deb6c1b376107f2cd02830183024f63616e69737465725f72616e67657382035832d9d9f782824a000000000060000001014a00000000006000ae0101824a00000000006000b001014a00000000006fffff010183024a7075626c69635f6b657982035885308182301d060d2b0601040182dc7c0503010201060c2b0601040182dc7c0503020103610090075120778eb21a530a02bcc763e7f4a192933506966af7b54c10a4d2b24de6a86b200e3440bae6267bf4c488d9a11d0472c38c1b6221198f98e4e6882ba38a5a4e3aa5afce899b7f825ed95adfa12629688073556f2747527213e8d73e40ce8204582036f3cd257d90fb38e42597f193a5e031dbd585b6292793bb04db4794803ce06e82045820028fc5e5f70868254e7215e7fc630dbd29eefc3619af17ce231909e1faf97e9582045820696179fceb777eaed283265dd690241999eb3ede594091748b24456160edc1278204582081398069f9684da260cfb002eac42211d0dbf22c62d49aee61617d62650e793183024474696d65820349a5948992aaa195e217697369676e6174757265583094e5f544a7681b0c2c3c5dbf97950c96fd837f2d19342f1050d94d3068371b0a95a5ee20c36c4395c2dbb4204f2b4742' + 'd9d9f7a264747265658301830182045820f7ce39e353276ef7eac40214d6294a53d45c840988b3ad8d0655230bac1893d483018204582045c8d9bed81048bbe60926bf8585350ba6bbe6523d6f5f994fff922edbdef96e83024e726571756573745f737461747573830183018301820458202d1afceef6681d8b8a48dbc7dcde236ad09ff53487b5f65c86f402c4019c81e08301830183018301830182045820bda400ec9debeeaf0e8e4dc6308cf1d0ccc2f6861984ffe8cb5c0f7ddd006bdd830183018301830182045820c3a04b54583072b58beab029efcbd9d9f2191c061fda4c79dfcd554f57534b598302582034a44c265c7ff6c8e4ed5c3d442f12b8b52580f800ffb892a89ad56b3167a62683018302457265706c7982035903304449444c0c6b02bc8a0101c5fed201096c02efcee7800402e29fdcc806046c02aeaeb1cc0503d880c6d007716e766b02d9e5b0980405fcdfd79a0f716c01c4d6b4ea0b066d076c01ffbb87a807086d716b04d1c4987c0aa3f2efe6020b9a8597e6030be3c581900f0b6c02fc91f4f80571c498b1b50d7d6c01fc91f4f805710100000002656e0007031e2320417574686f72697a6520616e6f74686572206164647265737320746f2077697468647261772066726f6d20796f7572206163636f756e74202a2a5468651f666f6c6c6f77696e67206164647265737320697320616c6c6f77656420746f031d77697468647261772066726f6d20796f7572206163636f756e743a2a2a2272646d78362d6a616161612d61616161612d61616164712d636169202a2a596f75720d7375626163636f756e743a2a2a032330303030303030303030303030303030303030303030303030303030303030303030301d3030303030303030303030303030303030303030303030303030303030232a2a526571756573746564207769746864726177616c20616c6c6f77616e63653a2a2a032031302049435020e29aa02054686520616c6c6f77616e63652077696c6c2062652273657420746f2031302049435020696e646570656e64656e746c79206f6620616e791e70726576696f757320616c6c6f77616e63652e20556e74696c207468697303217472616e73616374696f6e20686173206265656e206578656375746564207468651e7370656e6465722063616e207374696c6c206578657263697365207468652370726576696f757320616c6c6f77616e63652028696620616e792920746f2069742773032166756c6c20616d6f756e742e202a2a45787069726174696f6e20646174653a2a2a204e6f2065787069726174696f6e2e202a2a417070726f76616c206665653a2a2a23302e3030303120494350202a2a5472616e73616374696f6e206665657320746f206265031a7061696420627920796f7572207375626163636f756e743a2a2a2330303030303030303030303030303030303030303030303030303030303030303030301d30303030303030303030303030303030303030303030303030303030308302467374617475738203477265706c696564820458205c1a351ac2b7a24b96afcaf767521613b4fd3e577aee74769266cf9f36637d4e8204582068041707ea8d374da007bb1a7a0e0bed07ab24f04b026f7986fc2a85a8fe126282045820b1dcc25b9e681479a3a0c8e48f7ec659cba3a8d2432d9da3539993e3d07ca1be820458200a9b91be81767b301772430b1e4e3347c17b107de0fd585c88108d613550f1758204582035d8238a10e9bb5c4181e35da06ebebba1aea87bb3d144b2dda13c9fcba042f4820458205f41f1b3eda637ed957dbb173be06810a3518eeca57efee3538fbded7a146ef182045820642f92e0236f3dfa2becc643a3aa9703aa4c998360b67d57b03961fdf6c704fe82045820a2092115cfa051b579b9e20a04a9d711fe65e960e47a883a7971ae348af2100282045820175aaba4eea75ae431612394d2dc78fe5058c846466011f311b90b3b5df77000830182045820bc995b4159ff52ed2d587118a4260a039b6141b7af942d7f482c34b37d62e53c83024474696d65820349c18af7abc1d9fe8618697369676e61747572655830a272688e94dffcee62a658d41a6c19cf5f531bc5d1f238ffea80706fc8ffa878cb760a68bf32fa596c651652d2e00a2a' const respCert = app.signBls("m/44'/223'/0'/0/0", consent_request, canister_call, certificate) @@ -83,34 +51,4 @@ describe.skip('Bls', function () { await sim.close() } }) - - test.concurrent.each(DEVICE_MODELS_BLS)('verify_with_device_canister_id', async function (m) { - const sim = new Zemu(m.path) - try { - await sim.start({ ...DEFAULT_OPTIONS, model: m.name, startText: m.name === 'stax' ? '' : 'Computer' }) - const app = new InternetComputerApp(sim.getTransport()) - - let consent_request = - 'd9d9f7a167636f6e74656e74a763617267586b4449444c076d7b6c01d880c6d007716c02cbaeb581017ab183e7f1077a6b028beabfc2067f8ef1c1ee0d026e036c02efcee7800401c4fbf2db05046c03d6fca70200e1edeb4a7184f7fee80a0501060c4449444c00017104746f626905677265657402656e01011e0003006b63616e69737465725f69644a00000000006000fd01016e696e67726573735f657870697279c24817c49d49c5a920806b6d6574686f645f6e616d6578246963726332315f63616e69737465725f63616c6c5f636f6e73656e745f6d657373616765656e6f6e636550a3788c1805553fb69b20f08e87e23b136c726571756573745f747970656463616c6c6673656e6465724104' - let canister_call = - 'd9d9f7a167636f6e74656e74a6636172674c4449444c00017104746f62696b63616e69737465725f69644a00000000006000fd01016e696e67726573735f657870697279c24817c49db0b64dfb806b6d6574686f645f6e616d656567726565746c726571756573745f747970656571756572796673656e646572581d19aa3d42c048dd7d14f0cfa0df69a1c1381780f6e9a137abaa6a82e302' - let certificate = - 'd9d9f7a3647472656583018301820458200bbcc71092da3ce262b8154d398b9a6114bee87f1c0b72e16912757aa023626a8301820458200628a8e00432e8657ad99c4d1bf167dd54ace9199609bfc5d57d89f48d97565f83024e726571756573745f737461747573830258204ea057c46292fedb573d35319dd1ccab3fb5d6a2b106b785d1f7757cfa5a254283018302457265706c79820358b44449444c0b6b02bc8a0101c5fed201086c02efcee7800402e29fdcc806036c01d880c6d007716b02d9e5b0980404fcdfd79a0f716c01c4d6b4ea0b056d066c01ffbb87a807076d716b04d1c4987c09a3f2efe6020a9a8597e6030ae3c581900f0a6c02fc91f4f80571c498b1b50d7d6c01fc91f4f8057101000002656e0001021e50726f647563652074686520666f6c6c6f77696e67206772656574696e6714746578743a202248656c6c6f2c20746f626921228302467374617475738203477265706c696564830182045820891af3e8982f1ac3d295c29b9fdfedc52301c03fbd4979676c01059184060b0583024474696d65820349cbf7dd8ca1a2a7e217697369676e6174757265583088078c6fe75f32594bf4e322b14d47e5c849cf24a370e3bab0cab5daffb7ab6a2c49de18b7f2d631893217d0c716cd656a64656c65676174696f6ea2697375626e65745f6964581d2c55b347ecf2686c83781d6c59d1b43e7b4cba8deb6c1b376107f2cd026b6365727469666963617465590294d9d9f7a264747265658301820458200b0d62dc7b9d7de735bb9a6393b59c9f32ff7c4d2aacdfc9e6ffc70e341fb6f783018301820458204468514ca4af8224c055c386e3f7b0bfe018c2d9cfd5837e427b43e1ab0934f98302467375626e65748301830183018301820458208739fbbedd3dedaa8fef41870367c0905bde376b63dd37e2b176fb08b582052f830182045820f8c3eae0377ee00859223bf1c6202f5885c4dcdc8fd13b1d48c3c838688919bc83018302581d2c55b347ecf2686c83781d6c59d1b43e7b4cba8deb6c1b376107f2cd02830183024f63616e69737465725f72616e67657382035832d9d9f782824a000000000060000001014a00000000006000ae0101824a00000000006000b001014a00000000006fffff010183024a7075626c69635f6b657982035885308182301d060d2b0601040182dc7c0503010201060c2b0601040182dc7c0503020103610090075120778eb21a530a02bcc763e7f4a192933506966af7b54c10a4d2b24de6a86b200e3440bae6267bf4c488d9a11d0472c38c1b6221198f98e4e6882ba38a5a4e3aa5afce899b7f825ed95adfa12629688073556f2747527213e8d73e40ce8204582036f3cd257d90fb38e42597f193a5e031dbd585b6292793bb04db4794803ce06e82045820028fc5e5f70868254e7215e7fc630dbd29eefc3619af17ce231909e1faf97e9582045820696179fceb777eaed283265dd690241999eb3ede594091748b24456160edc1278204582081398069f9684da260cfb002eac42211d0dbf22c62d49aee61617d62650e793183024474696d65820349a5948992aaa195e217697369676e6174757265583094e5f544a7681b0c2c3c5dbf97950c96fd837f2d19342f1050d94d3068371b0a95a5ee20c36c4395c2dbb4204f2b4742' - - const respCert = app.signBls("m/44'/223'/0'/0/0", consent_request, canister_call, certificate) - - // Wait until we are not in the main menu - await sim.waitUntilScreenIsNot(sim.getMainMenuSnapshot()) - - await sim.compareSnapshotsAndApprove('.', `${m.prefix.toLowerCase()}-bls-cert_device_id`) - - const signatureResponse = await respCert - console.log(respCert) - - expect(signatureResponse.returnCode).toEqual(0x9000) - expect(signatureResponse.errorMessage).toEqual('No errors') - } finally { - await sim.close() - } - }) })