chore: zcash review and add unit tests
What changed, and why it matters
This commit is mostly a routine cleanup and test-addition patch for Zcash support in the Keystone 3 firmware. It adds many Rust unit tests for error handling, PCZT parsing, and data structures, fixes a Cardano test that had an empty expected value, removes a stray blank line, and refactors the Zcash signing UI flow to use a shared internal helper. There is no direct evidence in the diff of a security vulnerability being fixed.
Treat as routine maintenance. Review the SignInternal refactor to confirm it preserves lock-screen disable/restore and secret-cache clearing behavior for Zcash signing. Run the new Zcash and Cardano unit tests in CI.
Security signals we found
Refactored Zcash signing UI to use shared SignInternal helper, centralizing seed handling and lock-screen management
Added unit tests for invalid UFVK, invalid PCZT, and error variants in Zcash app layer
Fixed Cardano test expected public key value that was previously asserted as empty string
No explicit security bug fix or vulnerability disclosure in commit message or diff
Evidence from the diff
The diff is dominated by new #[cfg(test)] modules in rust/apps/zcash (errors.rs, lib.rs, pczt/parse.rs, pczt/structs.rs). It also updates an existing Cardano test assertion and argument references in rust_c/src/cardano/mod.rs, removes a blank line in src/crypto/account_public_info.c, adds a trailing whitespace line in src/ui/gui_chain/gui_chain.c, and refactors GuiGetZcashSignQrCodeData in src/ui/gui_chain/multi/cypherpunk/gui_zcash.c to call SignInternal(sign_zcash_tx, data) instead of inline seed handling. The refactor centralizes lock-screen and secret-cache management, which is a defensive hardening pattern, but the commit message frames it as review/tests rather than a security fix.
Changed components
rust/apps/zcash/src/errors.rsrust/apps/zcash/src/lib.rsrust/apps/zcash/src/pczt/parse.rsrust/apps/zcash/src/pczt/structs.rsrust/rust_c/src/cardano/mod.rssrc/crypto/account_public_info.csrc/ui/gui_chain/gui_chain.csrc/ui/gui_chain/multi/cypherpunk/gui_zcash.cInspect captured patch +346 / −18
diff --git a/rust/apps/zcash/src/errors.rs b/rust/apps/zcash/src/errors.rs
index 24d7179..c020b5d 100644
--- a/rust/apps/zcash/src/errors.rs
+++ b/rust/apps/zcash/src/errors.rs
@@ -28,3 +28,49 @@ impl From<transparent::pczt::ParseError> for ZcashError {
Self::InvalidPczt(alloc::format!("Invalid transparent bundle: {e:?}"))
}
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ extern crate std;
+ use alloc::string::ToString;
+
+ #[test]
+ fn test_error_display() {
+ let error = ZcashError::GenerateAddressError("test error".to_string());
+ assert_eq!(
+ error.to_string(),
+ "failed to generate zcash address, test error"
+ );
+
+ let error = ZcashError::InvalidDataError("invalid data".to_string());
+ assert_eq!(error.to_string(), "invalid zcash data: invalid data");
+
+ let error = ZcashError::SigningError("signing failed".to_string());
+ assert_eq!(
+ error.to_string(),
+ "failed to sign zcash data, signing failed"
+ );
+
+ let error = ZcashError::InvalidPczt("invalid pczt".to_string());
+ assert_eq!(error.to_string(), "invalid pczt, invalid pczt");
+ }
+
+ #[test]
+ fn test_error_equality() {
+ let error1 = ZcashError::GenerateAddressError("test".to_string());
+ let error2 = ZcashError::GenerateAddressError("test".to_string());
+ let error3 = ZcashError::GenerateAddressError("different".to_string());
+
+ assert_eq!(error1, error2);
+ assert_ne!(error1, error3);
+ }
+
+ #[test]
+ fn test_error_debug() {
+ let error = ZcashError::InvalidDataError("debug test".to_string());
+ let debug_str = std::format!("{error:?}");
+ assert!(debug_str.contains("InvalidDataError"));
+ assert!(debug_str.contains("debug test"));
+ }
+}
diff --git a/rust/apps/zcash/src/lib.rs b/rust/apps/zcash/src/lib.rs
index 2217c10..5107d22 100644
--- a/rust/apps/zcash/src/lib.rs
+++ b/rust/apps/zcash/src/lib.rs
@@ -174,4 +174,79 @@ mod tests {
assert!(orchard.get_to().first().unwrap().get_is_change());
assert_eq!(parsed_pczt.get_fee_value(), "0.00015 ZEC");
}
+
+ #[test]
+ fn test_get_address_invalid_ufvk() {
+ let invalid_ufvk = "invalid_ufvk_string";
+ let result = get_address(&MainNetwork, invalid_ufvk);
+ assert!(result.is_err());
+ assert!(matches!(
+ result.unwrap_err(),
+ ZcashError::GenerateAddressError(_)
+ ));
+ }
+
+ #[test]
+ fn test_check_pczt_invalid_data() {
+ let invalid_pczt = b"invalid_pczt_data";
+ let seed = hex::decode("d561f5aba9db8b100a9a84197322e522f952171a388ad74eaab1ab9db815be3335c3099a0a2bb0fee57e630db5ed7251412b6bd4b905cf518627411fee3f32dd").unwrap();
+ let ufvk = derive_ufvk(&MainNetwork, &seed, "m/32'/133'/0'").unwrap();
+ let seed_fingerprint = calculate_seed_fingerprint(&seed).unwrap();
+
+ let result = check_pczt(
+ &MainNetwork,
+ invalid_pczt,
+ &ufvk.to_string(),
+ &seed_fingerprint,
+ 0,
+ );
+ assert!(result.is_err());
+ assert!(matches!(result.unwrap_err(), ZcashError::InvalidPczt(_)));
+ }
+
+ #[test]
+ fn test_check_pczt_invalid_ufvk() {
+ let pczt_hex = hex::decode("50435a5401000000058ace9cb502d5a09cc70c0100f083ae0185010000000180ade2041976a91467f7aa14f177a7e0058c66c7242e086488bd3d1088ac000001237431544d4c4a376b324e344e6172716b3546643575556f38324e58534d624b5267436300000000fbc2f4300c01f0b7820d00e3347c8da4ee614674376cbc45359daa54f9b5493e010000000000000000000000000000000000000000000000000000000000000000024d2eeb083d7c168f64239c3186d53c72e2b1a3a5140f5250f0963689c08cd61c0999baea13f0be05dc6a2554bb2f8f093f4d20911202567a5ab9fd17bce5142b3f79838a71d14757fcff03ba16486a3efb26c9773ec9596821d1e5f32039fe220001d5d3506f152f62c45198446223abf29e06da700990a779fb60a460712fb666a0ff1fab61e2b2b3566b263d0180b6dc05014b2225d5521d6dbb55ae03d22567ce98b242ba5520bc4e2493ec36fb9211c6350194215c2aa089dfa317c61bab4b9747f4e45abca855e45e00710a3dc5caa40a570186f6f9e818f6674c2df92918a55d20f340944de5c67c1c4a9ee347c2c2d6d71d4753d765f2859a3157f7b05cc3bc7089e3f2c9d5abb3fcb1708e74c790985d3dd90cfe2ed03276dfda527c6e8c08d9a1fdeedcb6aef59d9e5bf0ae5d9477ed030001872727f23f40a96896b66d04de905791bae2bc7ee9dc1f4e4ec5ae493dc2fc1001afb475105f1f5b477c52aa3c32ccf131b0c556b80f55ac555460e6b5148bf85303a0808080088581808008808080800800002585b32c42aa5a12b2763953f09aafed13450eda0c416e32d0978260c4171c375413b91e25fa826399623b6716ae8bbb0b4a1099de22478944627af7e5969aa0c404ffab4d35664c1dafd2d2c0cecf4fb3c8b054179f84b2d35d207077b3d256b429acdee34963c573b55ae20fffce73e0e3e575c8fde9d115e7ffab50b3bee60d2436b72c17677e1d7db141fafa72c7f89002908a7a8de3320e5ad3d1ed0bb545235e136904c5c5e4adfa5a100420ceb2196e5e197e919aeaeefa7cb2a1d98e011539af52d618bfb3ba1dfc2d2c01e9bd67523bb6787eb5a0d28e30ad483c6303efd4796795082cc67ea94ba8548a33da1a5ec7c56174bd6b260f548e83a924b7cdd32980ca489b44e981aa1d81cefe2581eebf3a585fb80542aea4a27862f593203b560a412ba4e737c8f678f239f3d1d07c5a82367435f0a0921c46600eb4f6f7387b3cb5984af98b1337f5148ad6388b62dab7cdc48c66ff81685894c2d1d0fe41716b7cb457fb5bd6ff13e321d2f91c15d431f942d7869955dfeadfff61638266ba38d7ba4db7ffe5ee03550d345715cebd9b378181b5769c22e1b20328165da02eeb5d246c70c008ac0c7f7b1bba2cf8270f013eb99cbc5d534270180f34892fdf08d8c16c518d8b7f62d832d676c65fcae34c640ff30d5bd9d65afeab509117a98374b4b9b016228a65bdd803d6c601d2ad6a654c2fe4487d9c7b088d886c36a6afe63d33f8c474f096500acabbb63968e7408c620cc8139331cf7227e9bdbf4b7bae292e15d310e66186b730f28d0515ac5bb71fcc5de09995fe89d005cc2c7afd0fb8f01b315815d38366ebeb6de9ed565b5d1f2ce14b7795b9ad784851f357beacc454be41aaec506f0148461ba5907043ab8618114bbbede979d7f0e0e0af914750df648079e3625e4f309d13ff74d4ada783203bb3652137abd8327cdd06b9332591c9abdcc0cc16f7fec2e0afd849bef8927b3b0ceeca2b90af7611875b78cf525852ee83e10c8f4cb2c80045cbf33c0801a55eeb15c9dca6e53b3dde8a12daf820f1f76624ee48e3128aaa0ef6f6fb32a0303d89e88be288be1b92a301e893790179ec07711e275f48de2f5f8e0ee7b000091c9d96159746d46f353e67463d7052000000000118c5796d39cd2bc56b0a062c20ebd32feb0b57cc231c262d6703520f8de603211edcf51f6084e3288cbdb02957a02cd68fb84973a6a98260fb60f30951dedb2e1240275687c0bd82a2653a2c212bd3c0ea75cd294f5a4d31dcf507c15461402760282899f6b560858c0b6bd95c708f62d1e856480a52401d0d7d6a642fa1c2a10176072c6147735b785ea4ad9276378885704a44c6246f4630ef1df59438562e055bba6c1411a790727ab27421e6c418df8b65cb636d6786ce9e5b632659f5d32401caffe6271e2d77d8634e67a116926d7566b5eb2f2aadba6498d7a1e120f27f52379bb3f8781090ae47e30b0100011a78b2abbab21b29d79141fdff8a389c2eacde5be75c69ae4c4fabc175aec10a0142b202630def2df1f7cd23fcf362c68194829282c57b0c4d5f0ca023b51a571f01bd466676b53cfc27ba4a94bb4ab3ed19d8db336042e09e1e756b560b5ce7fc05d5dc3269236828f541662db5bfd4ab6e07c4dac2682906ee85eca2d12b6522013dd286fc499141cfebfb53175ea4321e08e8a504604bbc2e9d3e59706a1fa439000130febcd5d0c57c6e3780d6fe1f6c07f01a9d5d7a053ac5562f29304418d33a20000000f7fa16a612e422c34d61c44ae692b255c921239547172fcd26519928a3abb10d22548d840b466f1fed5ccb4c442d97b4b59d1a728455ee1598bae8e316f819bac404c9112693c57e0733d550ddc984d82ecc9047721e7e7bc6f283ba00852e49a4d3cda4dad343a366650b1d75b26025eadc5200113ebcc2a4a7db9ac2291083d76e7a8c04831764caf35e4c18bfc58e58699b4a651ca3686a95a6db7133611b5ce80a14225cdac643311869ea0c4a6d760379f285fa9c396c435361044da7e077f236d589a3eb962129988ea6ccde694cb72fa986748fc106981320f478a1c5402fe75a26dee31ec9fad4240aa19932fa8361c43798aa381c63b0c0b17657ccf37792a28456cfe6562e15d9e4aa26ed2660b6c8fc8a92cd352a6025dabcbed5eba82d88b9df3ba73270ff2f9c44fca8b0c1df8ed4cbfa2a4ebe7d0bcc6e5ce73e43b51e054860d7939ca13d77813b372070fd24cdd9c0e2fad7567471c0279bba19a76f0cdbd3107220821dd676c1df6524c15b87c1318eda418d65f8c66d2a77a65f6894199d44611e60c0291c330d1692bd521aef0e316e2b3f8c377b0d6873b3b645196ba74a79c6e0509869ac66276c3e2dfefd54a12365b5945406e7b673321ed36e89a14a194ae8b864e9ac4684655bae7fcd3123a226f282ac6ac82ca88d6a383d8be90f87f4cb85225f697932abfb4c05cda3b6dadb003621fee663f3fcb8f1c96320a3f148bc106ec231961a8f5142dd614317eef16b81492668a8b8795b85d7b0f737fa8d79e9dc3d78840d158a73dc6d1700ce3a8de2a9f93ff1bc8108703b94fd5bd230a19dd0fd821b832d3508b335e07bac28e95c3ab0eb637334bf166fa2a440ea35c0372bb5a745ee86c727a80f0d0d080fef6642ae7aae1407d6a25c3050c498a52ae300105bded1f19829b10df00e7ba301a9aef2c99ad7c5338b0e259ab97ea852630606b8d59709ca067d32698c8761e0f7d5b76ac07d4860b0fe2992010ba88827bb37cf4e3436488580e79101b366d454f29aa2bdf76725130baa08b38af3a71c251521809c84fe3d086943f39f01d760884b6342fac60c010001c54930d4f4f9946dfe91ac3e94cf5b513871c4a5c0c21137959482da796d2d280000000001c4666732084baff2e402ed7d3e457303c73b77dbd4aa5bc943ac7ca96f3779070398a2e304004aed48232c44dbd0b0b5404063ecc4679436f28c6251cbba91e29388fcd98d0e0001dc2be19f4118dbb7500df3a95e304733b247cea7f8c681f6aaafceb8fc1d7d28").unwrap();
+ let seed_fingerprint = [0u8; 32];
+
+ let result = check_pczt(
+ &MainNetwork,
+ &pczt_hex,
+ "invalid_ufvk",
+ &seed_fingerprint,
+ 0,
+ );
+ assert!(result.is_err());
+ assert!(matches!(
+ result.unwrap_err(),
+ ZcashError::InvalidDataError(_)
+ ));
+ }
+
+ #[test]
+ fn test_parse_pczt_invalid_data() {
+ let invalid_pczt = b"invalid_pczt_data";
+ let seed = hex::decode("d561f5aba9db8b100a9a84197322e522f952171a388ad74eaab1ab9db815be3335c3099a0a2bb0fee57e630db5ed7251412b6bd4b905cf518627411fee3f32dd").unwrap();
+ let ufvk = derive_ufvk(&MainNetwork, &seed, "m/32'/133'/0'").unwrap();
+ let seed_fingerprint = calculate_seed_fingerprint(&seed).unwrap();
+
+ let result = parse_pczt(
+ &MainNetwork,
+ invalid_pczt,
+ &ufvk.to_string(),
+ &seed_fingerprint,
+ );
+ assert!(result.is_err());
+ assert!(matches!(result.unwrap_err(), ZcashError::InvalidPczt(_)));
+ }
+
+ #[test]
+ fn test_sign_pczt_invalid_data() {
+ let invalid_pczt = b"invalid_pczt_data";
+ let seed = hex::decode("d561f5aba9db8b100a9a84197322e522f952171a388ad74eaab1ab9db815be3335c3099a0a2bb0fee57e630db5ed7251412b6bd4b905cf518627411fee3f32dd").unwrap();
+
+ let result = sign_pczt(invalid_pczt, &seed);
+ assert!(result.is_err());
+ assert!(matches!(result.unwrap_err(), ZcashError::InvalidPczt(_)));
+ }
}
diff --git a/rust/apps/zcash/src/pczt/parse.rs b/rust/apps/zcash/src/pczt/parse.rs
index 587099b..4794d3b 100644
--- a/rust/apps/zcash/src/pczt/parse.rs
+++ b/rust/apps/zcash/src/pczt/parse.rs
@@ -666,4 +666,53 @@ mod tests {
assert_eq!(result.get_total_transfer_value(), "0.001 ZEC");
assert_eq!(result.get_fee_value(), "0.0002 ZEC");
}
+
+ #[test]
+ fn test_decode_memo_with_hex_content() {
+ {
+ let mut memo = [0u8; 512];
+ memo[0] = 0xF6;
+ memo[1] = 0x01;
+ let result = decode_memo(memo);
+ assert!(result.is_some());
+ let hex_str = result.unwrap();
+ assert!(hex_str.starts_with("f6"));
+ }
+ {
+ let mut memo = [0u8; 512];
+ memo[0] = 0xF5;
+ let result = decode_memo(memo);
+ assert!(result.is_some());
+ }
+ }
+
+ #[test]
+ fn test_format_zec_value_with_different_amounts() {
+ let test_cases = vec![
+ (0, "0 ZEC"),
+ (1, "0.00000001 ZEC"),
+ (100_000_000, "1 ZEC"),
+ (150_000_000, "1.5 ZEC"),
+ (10_000, "0.0001 ZEC"),
+ (123_456_789, "1.23456789 ZEC"),
+ (1, "0.00000001 ZEC"),
+ (10, "0.0000001 ZEC"),
+ ];
+
+ for (input, expected) in test_cases {
+ assert_eq!(format_zec_value(input as f64), expected);
+ }
+ }
+
+ #[test]
+ fn test_format_zec_value_rounding() {
+ // Test trailing zero removal
+ let value = 100_000_000; // 1.00000000 ZEC
+ let result = format_zec_value(value as f64);
+ assert_eq!(result, "1 ZEC");
+
+ let value = 150_000_000; // 1.50000000 ZEC
+ let result = format_zec_value(value as f64);
+ assert_eq!(result, "1.5 ZEC");
+ }
}
diff --git a/rust/apps/zcash/src/pczt/structs.rs b/rust/apps/zcash/src/pczt/structs.rs
index 1f5e263..48823d4 100644
--- a/rust/apps/zcash/src/pczt/structs.rs
+++ b/rust/apps/zcash/src/pczt/structs.rs
@@ -54,3 +54,173 @@ impl ParsedOrchard {
self.to.push(to);
}
}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use alloc::{string::ToString, vec};
+ extern crate std;
+
+ #[test]
+ fn test_parsed_pczt_creation() {
+ let pczt = ParsedPczt::new(
+ None,
+ None,
+ "1.0 ZEC".to_string(),
+ "0.0001 ZEC".to_string(),
+ false,
+ );
+ assert!(pczt.get_transparent().is_none());
+ assert!(pczt.get_orchard().is_none());
+ assert_eq!(pczt.get_total_transfer_value(), "1.0 ZEC");
+ assert_eq!(pczt.get_fee_value(), "0.0001 ZEC");
+ assert!(!pczt.get_has_sapling());
+ }
+
+ #[test]
+ fn test_parsed_transparent_add_from_and_to() {
+ let mut transparent = ParsedTransparent::new(vec![], vec![]);
+ assert_eq!(transparent.get_from().len(), 0);
+ assert_eq!(transparent.get_to().len(), 0);
+
+ let from = ParsedFrom::new(
+ Some("addr1".to_string()),
+ "1.0 ZEC".to_string(),
+ 100000000,
+ true,
+ );
+ transparent.add_from(from);
+ assert_eq!(transparent.get_from().len(), 1);
+
+ let to = ParsedTo::new(
+ "addr2".to_string(),
+ "0.5 ZEC".to_string(),
+ 50000000,
+ false,
+ false,
+ None,
+ );
+ transparent.add_to(to);
+ assert_eq!(transparent.get_to().len(), 1);
+ }
+
+ #[test]
+ fn test_parsed_from_fields() {
+ let from = ParsedFrom::new(
+ Some("test_address".to_string()),
+ "2.5 ZEC".to_string(),
+ 250000000,
+ true,
+ );
+ assert!(matches!(from.get_address(), Some(addr) if addr == "test_address"));
+ assert_eq!(from.get_value(), "2.5 ZEC");
+ assert_eq!(from.get_amount(), 250000000);
+ assert!(from.get_is_mine());
+ }
+
+ #[test]
+ fn test_parsed_from_without_address() {
+ let from = ParsedFrom::new(None, "1.0 ZEC".to_string(), 100000000, false);
+ assert!(from.get_address().is_none());
+ assert!(!from.get_is_mine());
+ }
+
+ #[test]
+ fn test_parsed_to_fields() {
+ let to = ParsedTo::new(
+ "recipient_address".to_string(),
+ "3.0 ZEC".to_string(),
+ 300000000,
+ true,
+ false,
+ Some("Test memo".to_string()),
+ );
+ assert_eq!(to.get_address(), "recipient_address");
+ assert_eq!(to.get_value(), "3.0 ZEC");
+ assert_eq!(to.get_amount(), 300000000);
+ assert!(to.get_is_change());
+ assert!(!to.get_is_dummy());
+ assert!(matches!(to.get_memo(), Some(memo) if memo == "Test memo"));
+ }
+
+ #[test]
+ fn test_parsed_to_dummy() {
+ let to = ParsedTo::new(
+ "dummy".to_string(),
+ "0 ZEC".to_string(),
+ 0,
+ false,
+ true,
+ None,
+ );
+ assert!(to.get_is_dummy());
+ assert!(!to.get_is_change());
+ assert_eq!(to.get_amount(), 0);
+ }
+
+ #[test]
+ fn test_parsed_orchard_add_from_and_to() {
+ let mut orchard = ParsedOrchard::new(vec![], vec![]);
+ assert_eq!(orchard.get_from().len(), 0);
+ assert_eq!(orchard.get_to().len(), 0);
+
+ let from = ParsedFrom::new(None, "1.5 ZEC".to_string(), 150000000, true);
+ orchard.add_from(from);
+ assert_eq!(orchard.get_from().len(), 1);
+ assert!(orchard.get_from().first().unwrap().get_is_mine());
+
+ let to = ParsedTo::new(
+ "<internal-address>".to_string(),
+ "1.4 ZEC".to_string(),
+ 140000000,
+ true,
+ false,
+ None,
+ );
+ orchard.add_to(to);
+ assert_eq!(orchard.get_to().len(), 1);
+ assert!(orchard.get_to().first().unwrap().get_is_change());
+ }
+
+ #[test]
+ fn test_parsed_pczt_with_all_pools() {
+ let transparent = ParsedTransparent::new(
+ vec![ParsedFrom::new(
+ Some("t_addr".to_string()),
+ "1.0 ZEC".to_string(),
+ 100000000,
+ true,
+ )],
+ vec![ParsedTo::new(
+ "t_out".to_string(),
+ "0.5 ZEC".to_string(),
+ 50000000,
+ false,
+ false,
+ None,
+ )],
+ );
+ let orchard = ParsedOrchard::new(
+ vec![ParsedFrom::new(None, "0.5 ZEC".to_string(), 50000000, true)],
+ vec![ParsedTo::new(
+ "<internal>".to_string(),
+ "0.4 ZEC".to_string(),
+ 40000000,
+ true,
+ false,
+ None,
+ )],
+ );
+ let pczt = ParsedPczt::new(
+ Some(transparent),
+ Some(orchard),
+ "0.5 ZEC".to_string(),
+ "0.1 ZEC".to_string(),
+ false,
+ );
+ assert!(pczt.get_transparent().is_some());
+ assert!(pczt.get_orchard().is_some());
+ assert_eq!(pczt.get_total_transfer_value(), "0.5 ZEC");
+ assert_eq!(pczt.get_fee_value(), "0.1 ZEC");
+ }
+}
diff --git a/rust/rust_c/src/cardano/mod.rs b/rust/rust_c/src/cardano/mod.rs
index 7f09f52..0b70fec 100644
--- a/rust/rust_c/src/cardano/mod.rs
+++ b/rust/rust_c/src/cardano/mod.rs
@@ -1187,16 +1187,16 @@ mod tests {
let bip32_signing_key =
keystore::algorithms::ed25519::bip32_ed25519::derive_extended_privkey_by_icarus_master_key(
- &master_key.as_ref(),
+ master_key.as_ref(),
&"m/1853'/1815'/0'".to_string(),
)
.unwrap();
let xpub = bip32_signing_key.public();
- assert_eq!("", hex::encode(xpub.as_ref()));
+ assert_eq!("0ef99eea5e305a9a2a8eef5c626f150b29ba4e0e08bc7aa2fdd18a0884d80c99c6301a490ce2c00c273bdd4cda7138de4b8714796fd2adf2c09a425fe8d3acf6", hex::encode(xpub.as_ref()));
let result = app_cardano::transaction::sign_data(
&"m/1853'/1815'/0'/0'".to_string(),
- &message_hash,
+ message_hash,
master_key,
)
.unwrap();
diff --git a/src/crypto/account_public_info.c b/src/crypto/account_public_info.c
index 9e0a552..4615519 100644
--- a/src/crypto/account_public_info.c
+++ b/src/crypto/account_public_info.c
@@ -1021,7 +1021,6 @@ int32_t AccountPublicInfoSwitch(uint8_t accountIndex, const char *password, bool
ASSERT(accountIndex < 3);
FreePublicKeyRam();
//Load Multisig wallet Manager
-
addr = SPI_FLASH_ADDR_USER1_DATA + accountIndex * SPI_FLASH_ADDR_EACH_SIZE;
if (!regeneratePubKey) {
ret = AccountPublicInfoReadFromFlash(accountIndex, addr);
diff --git a/src/ui/gui_chain/gui_chain.c b/src/ui/gui_chain/gui_chain.c
index 887cd70..bae3756 100644
--- a/src/ui/gui_chain/gui_chain.c
+++ b/src/ui/gui_chain/gui_chain.c
@@ -193,7 +193,7 @@ UREncodeResult *SignInternal(SignFn sign_func, void *data)
UREncodeResult *encodeResult = NULL;
uint8_t seed[SEED_LEN] = {0};
int ret = 0;
-
+
do {
ret = GetAccountSeed(GetCurrentAccountIndex(), seed, SecretCacheGetPassword());
if (ret != 0) {
diff --git a/src/ui/gui_chain/multi/cypherpunk/gui_zcash.c b/src/ui/gui_chain/multi/cypherpunk/gui_zcash.c
index bf0268b..fac1bc5 100644
--- a/src/ui/gui_chain/multi/cypherpunk/gui_zcash.c
+++ b/src/ui/gui_chain/multi/cypherpunk/gui_zcash.c
@@ -5,6 +5,7 @@
#include "gui_chain.h"
#include "keystore.h"
#include "screen_manager.h"
+#include "gui_chain.h"
#define MAX_MEMO_LENGTH 1024
@@ -308,20 +309,8 @@ PtrT_TransactionCheckResult GuiGetZcashCheckResult(void)
UREncodeResult *GuiGetZcashSignQrCodeData(void)
{
- bool enable = IsPreviousLockScreenEnable();
- SetLockScreen(false);
- UREncodeResult *encodeResult;
void *data = g_isMulti ? g_urMultiResult->data : g_urResult->data;
- do {
- uint8_t seed[64];
- GetAccountSeed(GetCurrentAccountIndex(), seed, SecretCacheGetPassword());
- int len = GetMnemonicType() == MNEMONIC_TYPE_BIP39 ? sizeof(seed) : GetCurrentAccountEntropyLen();
- encodeResult = sign_zcash_tx(data, seed, len);
- ClearSecretCache();
- CHECK_CHAIN_BREAK(encodeResult);
- } while (0);
- SetLockScreen(enable);
- return encodeResult;
+ return SignInternal(sign_zcash_tx, data);
}
void FreeZcashMemory(void)
Why this scored 17/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.