Ledger messaging cleanup (#8506)

This commit is contained in:
Tyera Eulberg 2020-02-27 12:23:13 -07:00 committed by GitHub
parent 61a20febb9
commit 0b66ae5c53
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 7 deletions

View File

@ -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,
)?; )?;

View File

@ -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()),
} }
} }

View File

@ -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)]