Ledger API adjustments
This commit is contained in:
parent
839102cb14
commit
061d869d3e
|
@ -138,6 +138,7 @@ pub async fn build_broadcast_tx(
|
|||
|
||||
h.write_u32::<LE>(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() {
|
||||
|
|
|
@ -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 =
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -43,6 +43,7 @@ async fn apdu(data: &[u8]) -> Result<Vec<u8>> {
|
|||
|
||||
const TEST_SERVER_IP: Option<&'static str> = option_env!("LEDGER_IP");
|
||||
|
||||
#[allow(dead_code)]
|
||||
async fn apdu_http(data: &[u8]) -> Result<Vec<u8>> {
|
||||
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<DiversifiableFullViewingKey> {
|
||||
pub async fn ledger_get_pubkey() -> Result<Vec<u8>> {
|
||||
let mut bb: Vec<u8> = vec![];
|
||||
bb.write_all(&hex!("E006000000"))?;
|
||||
let pk = apdu(&bb).await?;
|
||||
Ok(pk)
|
||||
}
|
||||
|
||||
pub async fn ledger_get_dfvk() -> Result<DiversifiableFullViewingKey> {
|
||||
let mut bb: Vec<u8> = 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<DiversifiableFullViewingKey> {
|
|||
Ok(dfvk)
|
||||
}
|
||||
|
||||
pub async fn ledger_get_pubkey() -> Result<Vec<u8>> {
|
||||
let mut bb: Vec<u8> = vec![];
|
||||
bb.write_all(&hex!("E007000000"))?;
|
||||
let pk = apdu(&bb).await?;
|
||||
Ok(pk)
|
||||
}
|
||||
|
||||
pub async fn ledger_get_o_fvk() -> Result<Vec<u8>> {
|
||||
let mut bb: Vec<u8> = 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<u8> = 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<u8> = 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<u8> = 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<u8> = vec![];
|
||||
bb.write_all(&hex!("E015000008"))?;
|
||||
bb.write_all(&hex!("E012000008"))?;
|
||||
bb.write_u64::<LE>(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<u8> = vec![];
|
||||
bb.write_all(&hex!("E01601001D"))?;
|
||||
bb.write_all(&hex!("E01301001D"))?;
|
||||
bb.write_u64::<LE>(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<u8> = vec![];
|
||||
bb.write_all(&hex!("E017010087"))?;
|
||||
bb.write_all(&hex!("E014010087"))?;
|
||||
bb.write_all(address)?;
|
||||
bb.write_u64::<LE>(amount)?;
|
||||
bb.write_all(epk)?;
|
||||
|
@ -196,7 +153,7 @@ pub async fn ledger_add_o_action(
|
|||
enc_compact: &[u8],
|
||||
) -> Result<()> {
|
||||
let mut bb: Vec<u8> = vec![];
|
||||
bb.write_all(&hex!("E0180100A7"))?;
|
||||
bb.write_all(&hex!("E0150100A7"))?;
|
||||
bb.write_all(nf)?;
|
||||
bb.write_all(address)?;
|
||||
bb.write_u64::<LE>(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<u8> = vec![];
|
||||
bb.write_all(&hex!("E019000008"))?;
|
||||
bb.write_all(&hex!("E016000008"))?;
|
||||
bb.write_i64::<LE>(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<u8> = vec![];
|
||||
bb.write_all(&hex!("E01A000008"))?;
|
||||
bb.write_all(&hex!("E017000008"))?;
|
||||
bb.write_i64::<LE>(net)?;
|
||||
apdu(&bb).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn ledger_set_header_digest(
|
||||
header_digest: &[u8],
|
||||
) -> Result<()> {
|
||||
let mut bb: Vec<u8> = 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<u8> = 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<u8> = 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<u8> = 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<u8> = vec![];
|
||||
bb.write_all(&hex!("E01B010000"))?;
|
||||
bb.write_all(&hex!("E01C010000"))?;
|
||||
apdu(&bb).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn ledger_get_sighash() -> Result<Vec<u8>> {
|
||||
let mut bb: Vec<u8> = vec![];
|
||||
bb.write_all(&hex!("E020000000"))?;
|
||||
let sighash = apdu(&bb).await?;
|
||||
Ok(sighash)
|
||||
}
|
||||
|
||||
pub async fn ledger_get_proofgen_key() -> Result<ProofGenerationKey> {
|
||||
let mut bb: Vec<u8> = 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<ProofGenerationKey> {
|
|||
|
||||
pub async fn ledger_sign_transparent(txin_digest: &[u8]) -> Result<Vec<u8>> {
|
||||
let mut bb: Vec<u8> = 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<Vec<u8>> {
|
|||
|
||||
pub async fn ledger_sign_sapling() -> Result<Vec<u8>> {
|
||||
let mut bb: Vec<u8> = 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<Vec<u8>> {
|
||||
let mut bb: Vec<u8> = vec![];
|
||||
bb.write_all(&hex!("E023000000"))?;
|
||||
let signature = apdu(&bb).await?;
|
||||
Ok(signature)
|
||||
}
|
||||
|
||||
pub async fn ledger_get_shielded_sighash() -> Result<Vec<u8>> {
|
||||
let mut bb: Vec<u8> = vec![];
|
||||
bb.write_all(&hex!("E024000000"))?;
|
||||
let signature = apdu(&bb).await?;
|
||||
|
|
Loading…
Reference in New Issue