Ledger messaging cleanup (#8506)
This commit is contained in:
parent
61a20febb9
commit
0b66ae5c53
|
@ -12,6 +12,7 @@ const HARDENED_BIT: u32 = 1 << 31;
|
||||||
const APDU_TAG: u8 = 0x05;
|
const APDU_TAG: u8 = 0x05;
|
||||||
const APDU_CLA: u8 = 0xe0;
|
const APDU_CLA: u8 = 0xe0;
|
||||||
const APDU_PAYLOAD_HEADER_LEN: usize = 8;
|
const APDU_PAYLOAD_HEADER_LEN: usize = 8;
|
||||||
|
const P1_NON_CONFIRM: u8 = 0x00;
|
||||||
const P1_CONFIRM: u8 = 0x01;
|
const P1_CONFIRM: u8 = 0x01;
|
||||||
const P2_EXTEND: u8 = 0x01;
|
const P2_EXTEND: u8 = 0x01;
|
||||||
const P2_MORE: u8 = 0x02;
|
const P2_MORE: u8 = 0x02;
|
||||||
|
@ -197,15 +198,15 @@ impl LedgerWallet {
|
||||||
0x6982 => Err(RemoteWalletError::Protocol(
|
0x6982 => Err(RemoteWalletError::Protocol(
|
||||||
"Security status not satisfied (Canceled by user)",
|
"Security status not satisfied (Canceled by user)",
|
||||||
)),
|
)),
|
||||||
|
0x6985 => Err(RemoteWalletError::UserCancel),
|
||||||
0x6a80 => Err(RemoteWalletError::Protocol("Invalid data")),
|
0x6a80 => Err(RemoteWalletError::Protocol("Invalid data")),
|
||||||
0x6a82 => Err(RemoteWalletError::Protocol("File not found")),
|
0x6a82 => Err(RemoteWalletError::Protocol("File not found")),
|
||||||
0x6a85 => Err(RemoteWalletError::UserCancel),
|
|
||||||
0x6b00 => Err(RemoteWalletError::Protocol("Incorrect parameters")),
|
0x6b00 => Err(RemoteWalletError::Protocol("Incorrect parameters")),
|
||||||
0x6d00 => Err(RemoteWalletError::Protocol(
|
0x6d00 => Err(RemoteWalletError::Protocol(
|
||||||
"Not implemented. Make sure the Ledger Solana Wallet app is running.",
|
"Not implemented. Make sure the Ledger Solana Wallet app is running.",
|
||||||
)),
|
)),
|
||||||
0x6faa => Err(RemoteWalletError::Protocol(
|
0x6faa => Err(RemoteWalletError::Protocol(
|
||||||
"Your Ledger needs to be unplugged",
|
"Your Ledger device needs to be unplugged",
|
||||||
)),
|
)),
|
||||||
0x6f00..=0x6fff => Err(RemoteWalletError::Protocol("Internal error")),
|
0x6f00..=0x6fff => Err(RemoteWalletError::Protocol("Internal error")),
|
||||||
0x9000 => Ok(()),
|
0x9000 => Ok(()),
|
||||||
|
@ -224,6 +225,9 @@ impl LedgerWallet {
|
||||||
data: &[u8],
|
data: &[u8],
|
||||||
) -> Result<Vec<u8>, RemoteWalletError> {
|
) -> Result<Vec<u8>, RemoteWalletError> {
|
||||||
self.write(command, p1, p2, data)?;
|
self.write(command, p1, p2, data)?;
|
||||||
|
if p1 == P1_CONFIRM {
|
||||||
|
println!("Waiting for remote wallet to approve...");
|
||||||
|
}
|
||||||
self.read()
|
self.read()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,7 +283,11 @@ impl RemoteWallet for LedgerWallet {
|
||||||
|
|
||||||
let key = self.send_apdu(
|
let key = self.send_apdu(
|
||||||
commands::GET_PUBKEY,
|
commands::GET_PUBKEY,
|
||||||
if confirm_key { 1 } else { 0 },
|
if confirm_key {
|
||||||
|
P1_CONFIRM
|
||||||
|
} else {
|
||||||
|
P1_NON_CONFIRM
|
||||||
|
},
|
||||||
0,
|
0,
|
||||||
&derivation_path,
|
&derivation_path,
|
||||||
)?;
|
)?;
|
||||||
|
|
|
@ -47,7 +47,7 @@ pub enum RemoteWalletError {
|
||||||
#[error("pubkey not found for given address")]
|
#[error("pubkey not found for given address")]
|
||||||
PubkeyNotFound,
|
PubkeyNotFound,
|
||||||
|
|
||||||
#[error("operation has been cancelled")]
|
#[error("remote wallet operation rejected by the user")]
|
||||||
UserCancel,
|
UserCancel,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +62,9 @@ impl From<RemoteWalletError> for SignerError {
|
||||||
RemoteWalletError::InvalidInput(input) => SignerError::InvalidInput(input),
|
RemoteWalletError::InvalidInput(input) => SignerError::InvalidInput(input),
|
||||||
RemoteWalletError::NoDeviceFound => SignerError::NoDeviceFound,
|
RemoteWalletError::NoDeviceFound => SignerError::NoDeviceFound,
|
||||||
RemoteWalletError::Protocol(e) => SignerError::Protocol(e.to_string()),
|
RemoteWalletError::Protocol(e) => SignerError::Protocol(e.to_string()),
|
||||||
RemoteWalletError::UserCancel => SignerError::UserCancel,
|
RemoteWalletError::UserCancel => {
|
||||||
|
SignerError::UserCancel("remote wallet operation rejected by the user".to_string())
|
||||||
|
}
|
||||||
_ => SignerError::CustomError(err.to_string()),
|
_ => SignerError::CustomError(err.to_string()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -219,8 +219,8 @@ pub enum SignerError {
|
||||||
#[error("device protocol error: {0}")]
|
#[error("device protocol error: {0}")]
|
||||||
Protocol(String),
|
Protocol(String),
|
||||||
|
|
||||||
#[error("operation has been cancelled")]
|
#[error("{0}")]
|
||||||
UserCancel,
|
UserCancel(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Default)]
|
#[derive(Clone, Debug, Default)]
|
||||||
|
|
Loading…
Reference in New Issue