@@ -27,7 +27,7 @@ use utils::ensure;
2727
2828use crate :: signer:: ledger_signer:: LedgerError ;
2929
30- use super :: { LSighashInputCommitment , LedgerSignature } ;
30+ use super :: LedgerSignature ;
3131
3232macro_rules! ensure_response_type {
3333 ( $resp: expr, $pattern: pat $( if $guard: expr) ?, $out: expr) => {
@@ -132,8 +132,8 @@ pub async fn sign_challenge<L: Exchange>(
132132 path : ledger_msg:: Bip32Path ,
133133 addr_type : ledger_msg:: AddrType ,
134134 message : & [ u8 ] ,
135- ) -> Result < ledger_msg:: SignatureResponse , LedgerError > {
136- let req = ledger_msg:: SignMessageReq {
135+ ) -> Result < ledger_msg:: Signature , LedgerError > {
136+ let req = ledger_msg:: SignMessageStartReq {
137137 coin,
138138 addr_type,
139139 path,
@@ -142,7 +142,7 @@ pub async fn sign_challenge<L: Exchange>(
142142 let resp = send_chunked (
143143 ledger,
144144 ledger_msg:: Ins :: SIGN_MSG ,
145- ledger_msg:: SignP1 :: Start . into ( ) ,
145+ ledger_msg:: SignMsgP1 :: Start . into ( ) ,
146146 & ledger_msg:: encode ( req) ,
147147 )
148148 . await ?;
@@ -152,7 +152,7 @@ pub async fn sign_challenge<L: Exchange>(
152152 let resp = send_chunked (
153153 ledger,
154154 ledger_msg:: Ins :: SIGN_MSG ,
155- ledger_msg:: SignP1 :: Next . into ( ) ,
155+ ledger_msg:: SignMsgP1 :: Next . into ( ) ,
156156 message,
157157 )
158158 . await ?;
@@ -176,7 +176,7 @@ pub async fn check_current_app<L: Exchange + Device + Send>(
176176}
177177
178178pub async fn ping < L : Exchange > ( ledger : & mut L ) -> Result < ( ) , LedgerError > {
179- let apdu = make_apdu ( ledger_msg:: Ins :: PING , ledger_msg:: PingP1 :: Start . into ( ) , & [ ] ) ?;
179+ let apdu = make_apdu ( ledger_msg:: Ins :: PING , ledger_msg:: PingP1 :: Dummy . into ( ) , & [ ] ) ?;
180180
181181 let mut msg_buf = Vec :: with_capacity ( apdu. bytes_count ( ) ) ;
182182 apdu. write_bytes ( & mut msg_buf) ;
@@ -196,12 +196,12 @@ pub async fn get_extended_public_key<L: Exchange>(
196196 let path = ledger_msg:: Bip32Path (
197197 derivation_path. as_slice ( ) . iter ( ) . map ( |c| c. into_encoded_index ( ) ) . collect ( ) ,
198198 ) ;
199- let req = ledger_msg:: PublicKeyReq { coin_type, path } ;
199+ let req = ledger_msg:: GetPubKeyReq { coin_type, path } ;
200200
201201 let resp = send_chunked (
202202 ledger,
203- ledger_msg:: Ins :: PUB_KEY ,
204- ledger_msg:: PubKeyP1 :: NoDisplayAddress . into ( ) ,
203+ ledger_msg:: Ins :: GET_PUB_KEY ,
204+ ledger_msg:: GetPubKeyP1 :: NoDisplayAddress . into ( ) ,
205205 & ledger_msg:: encode ( req) ,
206206 )
207207 . await ?;
@@ -221,34 +221,33 @@ pub async fn get_extended_public_key<L: Exchange>(
221221pub async fn sign_tx < L : Exchange > (
222222 ledger : & mut L ,
223223 chain_type : ledger_msg:: CoinType ,
224- inputs : Vec < ledger_msg:: TxInputReq > ,
225- input_commitments : Vec < LSighashInputCommitment > ,
226- outputs : Vec < ledger_msg:: TxOutputReq > ,
224+ inputs : Vec < ledger_msg:: TxInputData > ,
225+ input_commitments : Vec < ledger_msg :: SighashInputCommitment > ,
226+ outputs : Vec < ledger_msg:: TxOutputData > ,
227227) -> Result < BTreeMap < usize , Vec < LedgerSignature > > , LedgerError > {
228- let metadata = ledger_msg:: encode ( ledger_msg:: TxMetadataReq {
228+ let start_req = ledger_msg:: encode ( ledger_msg:: SignTxStartReq {
229229 coin : chain_type,
230- version : ledger_msg:: TxMetadataVersionReq :: V1 ( ledger_msg:: TxMetadataV1Req {
231- num_inputs : inputs. len ( ) as u32 ,
232- num_outputs : outputs. len ( ) as u32 ,
233- } ) ,
230+ version : ledger_msg:: TransactionVersion :: V1 ,
231+ num_inputs : inputs. len ( ) as u32 ,
232+ num_outputs : outputs. len ( ) as u32 ,
234233 } ) ;
235234
236235 let resp = send_chunked (
237236 ledger,
238237 ledger_msg:: Ins :: SIGN_TX ,
239- ledger_msg:: SignP1 :: Start . into ( ) ,
240- & metadata ,
238+ ledger_msg:: SignTxP1 :: Start . into ( ) ,
239+ & start_req ,
241240 )
242241 . await ?;
243242 let resp = decode_response ( & resp) ?;
244243 ensure_response_type ! ( resp, ledger_msg:: Response :: TxSetup , ( ) ) ;
245244
246- for inp in inputs {
245+ for input in inputs {
247246 let resp = send_chunked (
248247 ledger,
249248 ledger_msg:: Ins :: SIGN_TX ,
250- ledger_msg:: SignP1 :: Next . into ( ) ,
251- & ledger_msg:: encode ( ledger_msg:: SignTxReq :: Input ( Box :: new ( inp ) ) ) ,
249+ ledger_msg:: SignTxP1 :: Next . into ( ) ,
250+ & ledger_msg:: encode ( ledger_msg:: SignTxNextReq :: ProcessInput ( Box :: new ( input ) ) ) ,
252251 )
253252 . await ?;
254253 let resp = decode_response ( & resp) ?;
@@ -259,51 +258,49 @@ pub async fn sign_tx<L: Exchange>(
259258 let resp = send_chunked (
260259 ledger,
261260 ledger_msg:: Ins :: SIGN_TX ,
262- ledger_msg:: SignP1 :: Next . into ( ) ,
263- & ledger_msg:: encode ( ledger_msg:: SignTxReq :: InputCommitment ( Box :: new ( commitment) ) ) ,
261+ ledger_msg:: SignTxP1 :: Next . into ( ) ,
262+ & ledger_msg:: encode ( ledger_msg:: SignTxNextReq :: ProcessInputCommitment ( Box :: new (
263+ ledger_msg:: TxInputCommitmentData { commitment } ,
264+ ) ) ) ,
264265 )
265266 . await ?;
266267 let resp = decode_response ( & resp) ?;
267268 ensure_response_type ! ( resp, ledger_msg:: Response :: TxNext , ( ) ) ;
268269 }
269270
270- // Send tx outputs and retrieve the first signature from the response for the last output.
271- // TODO: this won't work if the tx has zero outputs.
272- let mut sig_resp = vec ! [ ] ;
273- let num_outputs = outputs. len ( ) ;
274- for ( idx, o) in outputs. into_iter ( ) . enumerate ( ) {
271+ for output in outputs {
275272 let resp = send_chunked (
276273 ledger,
277274 ledger_msg:: Ins :: SIGN_TX ,
278- ledger_msg:: SignP1 :: Next . into ( ) ,
279- & ledger_msg:: encode ( ledger_msg:: SignTxReq :: Output ( Box :: new ( o ) ) ) ,
275+ ledger_msg:: SignTxP1 :: Next . into ( ) ,
276+ & ledger_msg:: encode ( ledger_msg:: SignTxNextReq :: ProcessOutput ( Box :: new ( output ) ) ) ,
280277 )
281278 . await ?;
282279
283- if idx < num_outputs - 1 {
284- let resp = decode_response ( & resp) ?;
285- ensure_response_type ! ( resp, ledger_msg:: Response :: TxNext , ( ) ) ;
286- } else {
287- // the response from the last output will have the first signature returned
288- sig_resp = resp;
289- } ;
280+ let resp = decode_response ( & resp) ?;
281+ ensure_response_type ! ( resp, ledger_msg:: Response :: TxNext , ( ) ) ;
290282 }
291283
292- let mut signatures: BTreeMap < _ , Vec < _ > > = BTreeMap :: new ( ) ;
284+ let next_sig_raw_req = {
285+ let next_sig = ledger_msg:: encode ( ledger_msg:: SignTxNextReq :: ReturnNextSignature ) ;
286+ let apdu = make_apdu (
287+ ledger_msg:: Ins :: SIGN_TX ,
288+ ledger_msg:: SignTxP1 :: Next . into ( ) ,
289+ & next_sig,
290+ ) ?;
293291
294- let next_sig = ledger_msg:: encode ( ledger_msg:: SignTxReq :: NextSignature ) ;
295- let apdu = make_apdu (
296- ledger_msg:: Ins :: SIGN_TX ,
297- ledger_msg:: SignP1 :: Next . into ( ) ,
298- & next_sig,
299- ) ?;
292+ let mut msg_buf = Vec :: with_capacity ( apdu. bytes_count ( ) ) ;
293+ apdu. write_bytes ( & mut msg_buf) ;
294+ msg_buf
295+ } ;
300296
301- let mut msg_buf = Vec :: with_capacity ( apdu. bytes_count ( ) ) ;
302- apdu. write_bytes ( & mut msg_buf) ;
297+ let mut signatures: BTreeMap < _ , Vec < _ > > = BTreeMap :: new ( ) ;
303298
304299 loop {
300+ let sig_resp = exchange_message ( ledger, & next_sig_raw_req) . await ?;
301+
305302 let resp = decode_response ( & sig_resp) ?;
306- let resp = ensure_response_type ! ( resp, ledger_msg:: Response :: TxSignature ( resp) , resp) ;
303+ let resp = ensure_response_type ! ( resp, ledger_msg:: Response :: TxInputSignature ( resp) , resp) ;
307304
308305 signatures. entry ( resp. input_idx as usize ) . or_default ( ) . push ( LedgerSignature {
309306 signature : resp. signature ,
@@ -313,8 +310,6 @@ pub async fn sign_tx<L: Exchange>(
313310 if !resp. has_next {
314311 break ;
315312 }
316-
317- sig_resp = exchange_message ( ledger, & msg_buf) . await ?;
318313 }
319314
320315 Ok ( signatures)
0 commit comments