diff --git a/src/ledger/builder.rs b/src/ledger/builder.rs index 0237068..8b8006f 100644 --- a/src/ledger/builder.rs +++ b/src/ledger/builder.rs @@ -138,6 +138,7 @@ pub async fn build_broadcast_tx( h.write_u32::(tx_plan.expiry_height)?; let header_digest = h.finalize(); + ledger_set_header_digest(header_digest.as_bytes()).await?; for sp in tx_plan.spends.iter() { match sp.source { @@ -173,7 +174,7 @@ pub async fn build_broadcast_tx( .await?; } } - transparent_builder.set_merkle_proof(header_digest.as_bytes()).await?; + transparent_builder.set_merkle_proof().await?; ledger_set_stage(3).await?; for output in tx_plan.outputs.iter() { diff --git a/src/ledger/builder/orchard_bundle.rs b/src/ledger/builder/orchard_bundle.rs index 86eb0ff..90b8e33 100644 --- a/src/ledger/builder/orchard_bundle.rs +++ b/src/ledger/builder/orchard_bundle.rs @@ -272,7 +272,7 @@ impl OrchardBuilder { pub async fn sign(&mut self) -> Result<()> { - self.sig_hash = ledger_get_sighash().await?; + self.sig_hash = ledger_get_shielded_sighash().await?; for (a, (ref s, _)) in self.actions.iter().zip(self.padded_inouts.iter()) { let signature = diff --git a/src/ledger/builder/sapling_bundle.rs b/src/ledger/builder/sapling_bundle.rs index 6e47cc5..8111fac 100644 --- a/src/ledger/builder/sapling_bundle.rs +++ b/src/ledger/builder/sapling_bundle.rs @@ -291,7 +291,7 @@ impl<'a> SaplingBuilder<'a> { let value: i64 = self.value_balance.try_into().unwrap(); let value = Amount::from_i64(value).unwrap(); - let sighash = ledger_get_sighash().await?; + let sighash = ledger_get_shielded_sighash().await?; log::info!("TXID {}", hex::encode(&sighash)); let binding_sig = self .sapling_context diff --git a/src/ledger/builder/transparent_bundle.rs b/src/ledger/builder/transparent_bundle.rs index 5c98817..dadc747 100644 --- a/src/ledger/builder/transparent_bundle.rs +++ b/src/ledger/builder/transparent_bundle.rs @@ -99,7 +99,7 @@ impl TransparentBuilder { Ok(()) } - pub async fn set_merkle_proof(&self, header_hash: &[u8]) -> Result<()> { + pub async fn set_merkle_proof(&self) -> Result<()> { let prevouts_digest = self.prevouts_hasher.finalize(); log::info!("PREVOUTS {}", hex::encode(prevouts_digest)); let pubscripts_digest = self.trscripts_hasher.finalize(); @@ -108,7 +108,6 @@ impl TransparentBuilder { log::info!("SEQUENCES {}", hex::encode(sequences_digest)); ledger_set_transparent_merkle_proof( - header_hash, prevouts_digest.as_bytes(), pubscripts_digest.as_bytes(), sequences_digest.as_bytes(), diff --git a/src/ledger/transport.rs b/src/ledger/transport.rs index c98ad91..ecbecfb 100644 --- a/src/ledger/transport.rs +++ b/src/ledger/transport.rs @@ -43,6 +43,7 @@ async fn apdu(data: &[u8]) -> Result> { const TEST_SERVER_IP: Option<&'static str> = option_env!("LEDGER_IP"); +#[allow(dead_code)] async fn apdu_http(data: &[u8]) -> Result> { let client = Client::new(); let response = client @@ -69,9 +70,16 @@ pub async fn ledger_init() -> Result<()> { Ok(()) } -pub async fn ledger_get_dfvk() -> Result { +pub async fn ledger_get_pubkey() -> Result> { let mut bb: Vec = vec![]; bb.write_all(&hex!("E006000000"))?; + let pk = apdu(&bb).await?; + Ok(pk) +} + +pub async fn ledger_get_dfvk() -> Result { + let mut bb: Vec = vec![]; + bb.write_all(&hex!("E007000000"))?; let dfvk_vec = apdu(&bb).await?; let mut dfvk = [0; 128]; dfvk.copy_from_slice(&dfvk_vec); @@ -81,13 +89,6 @@ pub async fn ledger_get_dfvk() -> Result { Ok(dfvk) } -pub async fn ledger_get_pubkey() -> Result> { - let mut bb: Vec = vec![]; - bb.write_all(&hex!("E007000000"))?; - let pk = apdu(&bb).await?; - Ok(pk) -} - pub async fn ledger_get_o_fvk() -> Result> { let mut bb: Vec = vec![]; bb.write_all(&hex!("E008000000"))?; @@ -111,53 +112,9 @@ pub async fn ledger_set_stage(stage: u8) -> Result<()> { Ok(()) } -pub async fn ledger_set_transparent_merkle_proof( - header_digest: &[u8], - prevouts_digest: &[u8], - pubscripts_digest: &[u8], - sequences_digest: &[u8], -) -> Result<()> { - let mut bb: Vec = vec![]; - bb.write_all(&hex!("E012000080"))?; - bb.write_all(header_digest)?; - bb.write_all(prevouts_digest)?; - bb.write_all(pubscripts_digest)?; - bb.write_all(sequences_digest)?; - apdu(&bb).await?; - Ok(()) -} - -pub async fn ledger_set_sapling_merkle_proof( - spends_digest: &[u8], - memos_digest: &[u8], - outputs_nc_digest: &[u8], -) -> Result<()> { - let mut bb: Vec = vec![]; - bb.write_all(&hex!("E013000060"))?; - bb.write_all(spends_digest)?; - bb.write_all(memos_digest)?; - bb.write_all(outputs_nc_digest)?; - apdu(&bb).await?; - Ok(()) -} - -pub async fn ledger_set_orchard_merkle_proof( - anchor: &[u8], - memos_digest: &[u8], - outputs_nc_digest: &[u8], -) -> Result<()> { - let mut bb: Vec = vec![]; - bb.write_all(&hex!("E014000060"))?; - bb.write_all(anchor)?; - bb.write_all(memos_digest)?; - bb.write_all(outputs_nc_digest)?; - apdu(&bb).await?; - Ok(()) -} - pub async fn ledger_add_t_input(amount: u64) -> Result<()> { let mut bb: Vec = vec![]; - bb.write_all(&hex!("E015000008"))?; + bb.write_all(&hex!("E012000008"))?; bb.write_u64::(amount)?; apdu(&bb).await?; Ok(()) @@ -165,7 +122,7 @@ pub async fn ledger_add_t_input(amount: u64) -> Result<()> { pub async fn ledger_add_t_output(amount: u64, address: &[u8]) -> Result<()> { let mut bb: Vec = vec![]; - bb.write_all(&hex!("E01601001D"))?; + bb.write_all(&hex!("E01301001D"))?; bb.write_u64::(amount)?; bb.write_all(address)?; apdu(&bb).await?; @@ -179,7 +136,7 @@ pub async fn ledger_add_s_output( enc_compact: &[u8], ) -> Result<()> { let mut bb: Vec = vec![]; - bb.write_all(&hex!("E017010087"))?; + bb.write_all(&hex!("E014010087"))?; bb.write_all(address)?; bb.write_u64::(amount)?; bb.write_all(epk)?; @@ -196,7 +153,7 @@ pub async fn ledger_add_o_action( enc_compact: &[u8], ) -> Result<()> { let mut bb: Vec = vec![]; - bb.write_all(&hex!("E0180100A7"))?; + bb.write_all(&hex!("E0150100A7"))?; bb.write_all(nf)?; bb.write_all(address)?; bb.write_u64::(amount)?; @@ -208,7 +165,7 @@ pub async fn ledger_add_o_action( pub async fn ledger_set_net_sapling(net: i64) -> Result<()> { let mut bb: Vec = vec![]; - bb.write_all(&hex!("E019000008"))?; + bb.write_all(&hex!("E016000008"))?; bb.write_i64::(net)?; apdu(&bb).await?; Ok(()) @@ -216,29 +173,74 @@ pub async fn ledger_set_net_sapling(net: i64) -> Result<()> { pub async fn ledger_set_net_orchard(net: i64) -> Result<()> { let mut bb: Vec = vec![]; - bb.write_all(&hex!("E01A000008"))?; + bb.write_all(&hex!("E017000008"))?; bb.write_i64::(net)?; apdu(&bb).await?; Ok(()) } +pub async fn ledger_set_header_digest( + header_digest: &[u8], +) -> Result<()> { + let mut bb: Vec = vec![]; + bb.write_all(&hex!("E018000020"))?; + bb.write_all(header_digest)?; + apdu(&bb).await?; + Ok(()) +} + +pub async fn ledger_set_transparent_merkle_proof( + prevouts_digest: &[u8], + pubscripts_digest: &[u8], + sequences_digest: &[u8], +) -> Result<()> { + let mut bb: Vec = vec![]; + bb.write_all(&hex!("E019000060"))?; + bb.write_all(prevouts_digest)?; + bb.write_all(pubscripts_digest)?; + bb.write_all(sequences_digest)?; + apdu(&bb).await?; + Ok(()) +} + +pub async fn ledger_set_sapling_merkle_proof( + spends_digest: &[u8], + memos_digest: &[u8], + outputs_nc_digest: &[u8], +) -> Result<()> { + let mut bb: Vec = vec![]; + bb.write_all(&hex!("E01A000060"))?; + bb.write_all(spends_digest)?; + bb.write_all(memos_digest)?; + bb.write_all(outputs_nc_digest)?; + apdu(&bb).await?; + Ok(()) +} + +pub async fn ledger_set_orchard_merkle_proof( + anchor: &[u8], + memos_digest: &[u8], + outputs_nc_digest: &[u8], +) -> Result<()> { + let mut bb: Vec = vec![]; + bb.write_all(&hex!("E01B000060"))?; + bb.write_all(anchor)?; + bb.write_all(memos_digest)?; + bb.write_all(outputs_nc_digest)?; + apdu(&bb).await?; + Ok(()) +} + pub async fn ledger_confirm_fee() -> Result<()> { let mut bb: Vec = vec![]; - bb.write_all(&hex!("E01B010000"))?; + bb.write_all(&hex!("E01C010000"))?; apdu(&bb).await?; Ok(()) } -pub async fn ledger_get_sighash() -> Result> { - let mut bb: Vec = vec![]; - bb.write_all(&hex!("E020000000"))?; - let sighash = apdu(&bb).await?; - Ok(sighash) -} - pub async fn ledger_get_proofgen_key() -> Result { let mut bb: Vec = vec![]; - bb.write_all(&hex!("E021000000"))?; + bb.write_all(&hex!("E020000000"))?; let proofgen_key = apdu(&bb).await?; let proofgen_key = ProofGenerationKey { ak: SubgroupPoint::from_bytes(proofgen_key[0..32].try_into().unwrap()).unwrap(), @@ -249,7 +251,7 @@ pub async fn ledger_get_proofgen_key() -> Result { pub async fn ledger_sign_transparent(txin_digest: &[u8]) -> Result> { let mut bb: Vec = vec![]; - bb.write_all(&hex!("E022000020"))?; + bb.write_all(&hex!("E021000020"))?; bb.write_all(txin_digest)?; let signature = apdu(&bb).await?; Ok(signature) @@ -257,12 +259,19 @@ pub async fn ledger_sign_transparent(txin_digest: &[u8]) -> Result> { pub async fn ledger_sign_sapling() -> Result> { let mut bb: Vec = vec![]; - bb.write_all(&hex!("E023000000"))?; + bb.write_all(&hex!("E022000000"))?; let signature = apdu(&bb).await?; Ok(signature) } pub async fn ledger_sign_orchard() -> Result> { + let mut bb: Vec = vec![]; + bb.write_all(&hex!("E023000000"))?; + let signature = apdu(&bb).await?; + Ok(signature) +} + +pub async fn ledger_get_shielded_sighash() -> Result> { let mut bb: Vec = vec![]; bb.write_all(&hex!("E024000000"))?; let signature = apdu(&bb).await?;