| @@ -4,7 +4,7 @@ use crate::remote_wallet::{ | |||||||
| use dialoguer::{theme::ColorfulTheme, Select}; | use dialoguer::{theme::ColorfulTheme, Select}; | ||||||
| use log::*; | use log::*; | ||||||
| use semver::Version as FirmwareVersion; | use semver::Version as FirmwareVersion; | ||||||
| use solana_sdk::{pubkey::Pubkey, signature::Signature, transaction::Transaction}; | use solana_sdk::{pubkey::Pubkey, signature::Signature}; | ||||||
| use std::{cmp::min, fmt, sync::Arc}; | use std::{cmp::min, fmt, sync::Arc}; | ||||||
|  |  | ||||||
| const APDU_TAG: u8 = 0x05; | const APDU_TAG: u8 = 0x05; | ||||||
| @@ -38,8 +38,8 @@ const HID_PREFIX_ZERO: usize = 0; | |||||||
| mod commands { | mod commands { | ||||||
|     #[allow(dead_code)] |     #[allow(dead_code)] | ||||||
|     pub const GET_APP_CONFIGURATION: u8 = 0x06; |     pub const GET_APP_CONFIGURATION: u8 = 0x06; | ||||||
|     pub const GET_SOL_PUBKEY: u8 = 0x02; |     pub const GET_PUBKEY: u8 = 0x02; | ||||||
|     pub const SIGN_SOL_TRANSACTION: u8 = 0x03; |     pub const SIGN_MESSAGE: u8 = 0x03; | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Ledger Wallet device | /// Ledger Wallet device | ||||||
| @@ -233,19 +233,6 @@ impl LedgerWallet { | |||||||
|             ver[3].into(), |             ver[3].into(), | ||||||
|         )) |         )) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn sign_raw_data( |  | ||||||
|         &self, |  | ||||||
|         derivation_path: &DerivationPath, |  | ||||||
|         data: &[u8], |  | ||||||
|     ) -> Result<Vec<u8>, RemoteWalletError> { |  | ||||||
|         let mut payload = extend_and_serialize(&derivation_path); |  | ||||||
|         for byte in (data.len() as u16).to_be_bytes().iter() { |  | ||||||
|             payload.push(*byte); |  | ||||||
|         } |  | ||||||
|         payload.extend_from_slice(data); |  | ||||||
|         self.send_apdu(0x03, 1, 0, &payload) |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  |  | ||||||
| impl RemoteWallet for LedgerWallet { | impl RemoteWallet for LedgerWallet { | ||||||
| @@ -282,7 +269,7 @@ impl RemoteWallet for LedgerWallet { | |||||||
|         let derivation_path = extend_and_serialize(derivation_path); |         let derivation_path = extend_and_serialize(derivation_path); | ||||||
|  |  | ||||||
|         let key = self.send_apdu( |         let key = self.send_apdu( | ||||||
|             commands::GET_SOL_PUBKEY, |             commands::GET_PUBKEY, | ||||||
|             0, // In the naive implementation, default request is for no device confirmation |             0, // In the naive implementation, default request is for no device confirmation | ||||||
|             0, |             0, | ||||||
|             &derivation_path, |             &derivation_path, | ||||||
| @@ -293,13 +280,12 @@ impl RemoteWallet for LedgerWallet { | |||||||
|         Ok(Pubkey::new(&key)) |         Ok(Pubkey::new(&key)) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn sign_transaction( |     fn sign_message( | ||||||
|         &self, |         &self, | ||||||
|         derivation_path: &DerivationPath, |         derivation_path: &DerivationPath, | ||||||
|         transaction: Transaction, |         data: &[u8], | ||||||
|     ) -> Result<Signature, RemoteWalletError> { |     ) -> Result<Signature, RemoteWalletError> { | ||||||
|         let mut payload = extend_and_serialize(derivation_path); |         let mut payload = extend_and_serialize(derivation_path); | ||||||
|         let mut data = transaction.message_data(); |  | ||||||
|         if data.len() > u16::max_value() as usize { |         if data.len() > u16::max_value() as usize { | ||||||
|             return Err(RemoteWalletError::InvalidInput( |             return Err(RemoteWalletError::InvalidInput( | ||||||
|                 "Message to sign is too long".to_string(), |                 "Message to sign is too long".to_string(), | ||||||
| @@ -308,11 +294,11 @@ impl RemoteWallet for LedgerWallet { | |||||||
|         for byte in (data.len() as u16).to_be_bytes().iter() { |         for byte in (data.len() as u16).to_be_bytes().iter() { | ||||||
|             payload.push(*byte); |             payload.push(*byte); | ||||||
|         } |         } | ||||||
|         payload.append(&mut data); |         payload.extend_from_slice(data); | ||||||
|         trace!("Serialized payload length {:?}", payload.len()); |         trace!("Serialized payload length {:?}", payload.len()); | ||||||
|  |  | ||||||
|         let result = self.send_apdu( |         let result = self.send_apdu( | ||||||
|             commands::SIGN_SOL_TRANSACTION, |             commands::SIGN_MESSAGE, | ||||||
|             1, // In the naive implementation, default request is for requred device confirmation |             1, // In the naive implementation, default request is for requred device confirmation | ||||||
|             0, |             0, | ||||||
|             &payload, |             &payload, | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| use crate::ledger::{is_valid_ledger, LedgerWallet}; | use crate::ledger::{is_valid_ledger, LedgerWallet}; | ||||||
| use log::*; | use log::*; | ||||||
| use parking_lot::{Mutex, RwLock}; | use parking_lot::{Mutex, RwLock}; | ||||||
| use solana_sdk::{pubkey::Pubkey, signature::Signature, transaction::Transaction}; | use solana_sdk::{pubkey::Pubkey, signature::Signature}; | ||||||
| use std::{ | use std::{ | ||||||
|     fmt, |     fmt, | ||||||
|     str::FromStr, |     str::FromStr, | ||||||
| @@ -156,10 +156,10 @@ pub trait RemoteWallet { | |||||||
|     fn get_pubkey(&self, derivation_path: &DerivationPath) -> Result<Pubkey, RemoteWalletError>; |     fn get_pubkey(&self, derivation_path: &DerivationPath) -> Result<Pubkey, RemoteWalletError>; | ||||||
|  |  | ||||||
|     /// Sign transaction data with wallet managing pubkey at derivation path m/44'/501'/<account>'/<change>'. |     /// Sign transaction data with wallet managing pubkey at derivation path m/44'/501'/<account>'/<change>'. | ||||||
|     fn sign_transaction( |     fn sign_message( | ||||||
|         &self, |         &self, | ||||||
|         derivation_path: &DerivationPath, |         derivation_path: &DerivationPath, | ||||||
|         transaction: Transaction, |         data: &[u8], | ||||||
|     ) -> Result<Signature, RemoteWalletError>; |     ) -> Result<Signature, RemoteWalletError>; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -208,6 +208,10 @@ impl Message { | |||||||
|         ) |         ) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     pub fn serialize(&self) -> Vec<u8> { | ||||||
|  |         bincode::serialize(self).unwrap() | ||||||
|  |     } | ||||||
|  |  | ||||||
|     pub fn program_ids(&self) -> Vec<&Pubkey> { |     pub fn program_ids(&self) -> Vec<&Pubkey> { | ||||||
|         self.instructions |         self.instructions | ||||||
|             .iter() |             .iter() | ||||||
|   | |||||||
| @@ -9,7 +9,6 @@ use crate::{ | |||||||
|     signature::{KeypairUtil, Signature}, |     signature::{KeypairUtil, Signature}, | ||||||
|     system_instruction, |     system_instruction, | ||||||
| }; | }; | ||||||
| use bincode::serialize; |  | ||||||
| use std::result; | use std::result; | ||||||
| use thiserror::Error; | use thiserror::Error; | ||||||
|  |  | ||||||
| @@ -211,7 +210,7 @@ impl Transaction { | |||||||
|  |  | ||||||
|     /// Return the serialized message data to sign. |     /// Return the serialized message data to sign. | ||||||
|     pub fn message_data(&self) -> Vec<u8> { |     pub fn message_data(&self) -> Vec<u8> { | ||||||
|         serialize(&self.message()).unwrap() |         self.message().serialize() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// Check keys and keypair lengths, then sign this transaction. |     /// Check keys and keypair lengths, then sign this transaction. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user