@@ -279,12 +279,28 @@ pub trait BaseSign {
279
279
#[ cfg( any( test, feature = "unsafe_revoked_tx_signing" ) ) ]
280
280
fn unsafe_sign_holder_commitment_and_htlcs ( & self , commitment_tx : & HolderCommitmentTransaction , secp_ctx : & Secp256k1 < secp256k1:: All > ) -> Result < ( Signature , Vec < Signature > ) , ( ) > ;
281
281
282
- /// Create a signature for the given input in a transaction spending an HTLC or commitment
283
- /// transaction output when our counterparty broadcasts an old state.
282
+ /// Create a signature for the given input in a transaction spending an HTLC transaction output
283
+ /// or a commitment transaction `to_local` output when our counterparty broadcasts an old state.
284
284
///
285
- /// A justice transaction may claim multiples outputs at the same time if timelocks are
285
+ /// A justice transaction may claim multiple outputs at the same time if timelocks are
286
286
/// similar, but only a signature for the input at index `input` should be signed for here.
287
- /// It may be called multiples time for same output(s) if a fee-bump is needed with regards
287
+ /// It may be called multiple times for same output(s) if a fee-bump is needed with regards
288
+ /// to an upcoming timelock expiration.
289
+ ///
290
+ /// Amount is value of the output spent by this input, committed to in the BIP 143 signature.
291
+ ///
292
+ /// per_commitment_key is revocation secret which was provided by our counterparty when they
293
+ /// revoked the state which they eventually broadcast. It's not a _holder_ secret key and does
294
+ /// not allow the spending of any funds by itself (you need our holder revocation_secret to do
295
+ /// so).
296
+ fn sign_justice_revoked_output ( & self , justice_tx : & Transaction , input : usize , amount : u64 , per_commitment_key : & SecretKey , secp_ctx : & Secp256k1 < secp256k1:: All > ) -> Result < Signature , ( ) > ;
297
+
298
+ /// Create a signature for the given input in a transaction spending a commitment transaction
299
+ /// HTLC output when our counterparty broadcasts an old state.
300
+ ///
301
+ /// A justice transaction may claim multiple outputs at the same time if timelocks are
302
+ /// similar, but only a signature for the input at index `input` should be signed for here.
303
+ /// It may be called multiple times for same output(s) if a fee-bump is needed with regards
288
304
/// to an upcoming timelock expiration.
289
305
///
290
306
/// Amount is value of the output spent by this input, committed to in the BIP 143 signature.
@@ -294,10 +310,9 @@ pub trait BaseSign {
294
310
/// not allow the spending of any funds by itself (you need our holder revocation_secret to do
295
311
/// so).
296
312
///
297
- /// htlc holds HTLC elements (hash, timelock) if the output being spent is a HTLC output, thus
298
- /// changing the format of the witness script (which is committed to in the BIP 143
299
- /// signatures).
300
- fn sign_justice_transaction ( & self , justice_tx : & Transaction , input : usize , amount : u64 , per_commitment_key : & SecretKey , htlc : & Option < HTLCOutputInCommitment > , secp_ctx : & Secp256k1 < secp256k1:: All > ) -> Result < Signature , ( ) > ;
313
+ /// htlc holds HTLC elements (hash, timelock), thus changing the format of the witness script
314
+ /// (which is committed to in the BIP 143 signatures).
315
+ fn sign_justice_revoked_htlc ( & self , justice_tx : & Transaction , input : usize , amount : u64 , per_commitment_key : & SecretKey , htlc : & HTLCOutputInCommitment , secp_ctx : & Secp256k1 < secp256k1:: All > ) -> Result < Signature , ( ) > ;
301
316
302
317
/// Create a signature for a claiming transaction for a HTLC output on a counterparty's commitment
303
318
/// transaction, either offered or received.
@@ -593,10 +608,7 @@ impl BaseSign for InMemorySigner {
593
608
let htlc_tx = chan_utils:: build_htlc_transaction ( & commitment_txid, commitment_tx. feerate_per_kw ( ) , self . holder_selected_contest_delay ( ) , htlc, & keys. broadcaster_delayed_payment_key , & keys. revocation_key ) ;
594
609
let htlc_redeemscript = chan_utils:: get_htlc_redeemscript ( & htlc, & keys) ;
595
610
let htlc_sighash = hash_to_message ! ( & bip143:: SigHashCache :: new( & htlc_tx) . signature_hash( 0 , & htlc_redeemscript, htlc. amount_msat / 1000 , SigHashType :: All ) [ ..] ) ;
596
- let holder_htlc_key = match chan_utils:: derive_private_key ( & secp_ctx, & keys. per_commitment_point , & self . htlc_base_key ) {
597
- Ok ( s) => s,
598
- Err ( _) => return Err ( ( ) ) ,
599
- } ;
611
+ let holder_htlc_key = chan_utils:: derive_private_key ( & secp_ctx, & keys. per_commitment_point , & self . htlc_base_key ) . map_err ( |_| ( ) ) ?;
600
612
htlc_sigs. push ( secp_ctx. sign ( & htlc_sighash, & holder_htlc_key) ) ;
601
613
}
602
614
@@ -624,32 +636,27 @@ impl BaseSign for InMemorySigner {
624
636
Ok ( ( sig, htlc_sigs) )
625
637
}
626
638
627
- fn sign_justice_transaction ( & self , justice_tx : & Transaction , input : usize , amount : u64 , per_commitment_key : & SecretKey , htlc : & Option < HTLCOutputInCommitment > , secp_ctx : & Secp256k1 < secp256k1:: All > ) -> Result < Signature , ( ) > {
628
- let revocation_key = match chan_utils:: derive_private_revocation_key ( & secp_ctx, & per_commitment_key, & self . revocation_base_key ) {
629
- Ok ( revocation_key) => revocation_key,
630
- Err ( _) => return Err ( ( ) )
631
- } ;
639
+ fn sign_justice_revoked_output ( & self , justice_tx : & Transaction , input : usize , amount : u64 , per_commitment_key : & SecretKey , secp_ctx : & Secp256k1 < secp256k1:: All > ) -> Result < Signature , ( ) > {
640
+ let revocation_key = chan_utils:: derive_private_revocation_key ( & secp_ctx, & per_commitment_key, & self . revocation_base_key ) . map_err ( |_| ( ) ) ?;
632
641
let per_commitment_point = PublicKey :: from_secret_key ( secp_ctx, & per_commitment_key) ;
633
- let revocation_pubkey = match chan_utils:: derive_public_revocation_key ( & secp_ctx, & per_commitment_point, & self . pubkeys ( ) . revocation_basepoint ) {
634
- Ok ( revocation_pubkey) => revocation_pubkey,
635
- Err ( _) => return Err ( ( ) )
642
+ let revocation_pubkey = chan_utils:: derive_public_revocation_key ( & secp_ctx, & per_commitment_point, & self . pubkeys ( ) . revocation_basepoint ) . map_err ( |_| ( ) ) ?;
643
+ let witness_script = {
644
+ let counterparty_delayedpubkey = chan_utils:: derive_public_key ( & secp_ctx, & per_commitment_point, & self . counterparty_pubkeys ( ) . delayed_payment_basepoint ) . map_err ( |_| ( ) ) ?;
645
+ chan_utils:: get_revokeable_redeemscript ( & revocation_pubkey, self . holder_selected_contest_delay ( ) , & counterparty_delayedpubkey)
636
646
} ;
637
- let witness_script = if let & Some ( ref htlc) = htlc {
638
- let counterparty_htlcpubkey = match chan_utils:: derive_public_key ( & secp_ctx, & per_commitment_point, & self . counterparty_pubkeys ( ) . htlc_basepoint ) {
639
- Ok ( counterparty_htlcpubkey) => counterparty_htlcpubkey,
640
- Err ( _) => return Err ( ( ) )
641
- } ;
642
- let holder_htlcpubkey = match chan_utils:: derive_public_key ( & secp_ctx, & per_commitment_point, & self . pubkeys ( ) . htlc_basepoint ) {
643
- Ok ( holder_htlcpubkey) => holder_htlcpubkey,
644
- Err ( _) => return Err ( ( ) )
645
- } ;
647
+ let mut sighash_parts = bip143:: SigHashCache :: new ( justice_tx) ;
648
+ let sighash = hash_to_message ! ( & sighash_parts. signature_hash( input, & witness_script, amount, SigHashType :: All ) [ ..] ) ;
649
+ return Ok ( secp_ctx. sign ( & sighash, & revocation_key) )
650
+ }
651
+
652
+ fn sign_justice_revoked_htlc ( & self , justice_tx : & Transaction , input : usize , amount : u64 , per_commitment_key : & SecretKey , htlc : & HTLCOutputInCommitment , secp_ctx : & Secp256k1 < secp256k1:: All > ) -> Result < Signature , ( ) > {
653
+ let revocation_key = chan_utils:: derive_private_revocation_key ( & secp_ctx, & per_commitment_key, & self . revocation_base_key ) . map_err ( |_| ( ) ) ?;
654
+ let per_commitment_point = PublicKey :: from_secret_key ( secp_ctx, & per_commitment_key) ;
655
+ let revocation_pubkey = chan_utils:: derive_public_revocation_key ( & secp_ctx, & per_commitment_point, & self . pubkeys ( ) . revocation_basepoint ) . map_err ( |_| ( ) ) ?;
656
+ let witness_script = {
657
+ let counterparty_htlcpubkey = chan_utils:: derive_public_key ( & secp_ctx, & per_commitment_point, & self . counterparty_pubkeys ( ) . htlc_basepoint ) . map_err ( |_| ( ) ) ?;
658
+ let holder_htlcpubkey = chan_utils:: derive_public_key ( & secp_ctx, & per_commitment_point, & self . pubkeys ( ) . htlc_basepoint ) . map_err ( |_| ( ) ) ?;
646
659
chan_utils:: get_htlc_redeemscript_with_explicit_keys ( & htlc, & counterparty_htlcpubkey, & holder_htlcpubkey, & revocation_pubkey)
647
- } else {
648
- let counterparty_delayedpubkey = match chan_utils:: derive_public_key ( & secp_ctx, & per_commitment_point, & self . counterparty_pubkeys ( ) . delayed_payment_basepoint ) {
649
- Ok ( counterparty_delayedpubkey) => counterparty_delayedpubkey,
650
- Err ( _) => return Err ( ( ) )
651
- } ;
652
- chan_utils:: get_revokeable_redeemscript ( & revocation_pubkey, self . holder_selected_contest_delay ( ) , & counterparty_delayedpubkey)
653
660
} ;
654
661
let mut sighash_parts = bip143:: SigHashCache :: new ( justice_tx) ;
655
662
let sighash = hash_to_message ! ( & sighash_parts. signature_hash( input, & witness_script, amount, SigHashType :: All ) [ ..] ) ;
0 commit comments