Skip to content

Commit 071cfad

Browse files
committed
Set the SigHashType of htlc signatures w/ anchors to SinglePlusAnyoneCanPay
1 parent 2a8a396 commit 071cfad

File tree

6 files changed

+26
-12
lines changed

6 files changed

+26
-12
lines changed

lightning/src/chain/channelmonitor.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -3579,7 +3579,12 @@ mod tests {
35793579
let sighash = hash_to_message!(&$sighash_parts.signature_hash($idx, &redeem_script, $amount, SigHashType::All)[..]);
35803580
let sig = secp_ctx.sign(&sighash, &privkey);
35813581
$sighash_parts.access_witness($idx).push(sig.serialize_der().to_vec());
3582-
$sighash_parts.access_witness($idx)[0].push(SigHashType::All as u8);
3582+
let sighashtype = if *$weight != WEIGHT_REVOKED_OUTPUT && $opt_anchors {
3583+
SigHashType::SinglePlusAnyoneCanPay
3584+
} else {
3585+
SigHashType::All
3586+
};
3587+
$sighash_parts.access_witness($idx)[0].push(sighashtype as u8);
35833588
sum_actual_sigs += $sighash_parts.access_witness($idx)[0].len();
35843589
if *$weight == WEIGHT_REVOKED_OUTPUT {
35853590
$sighash_parts.access_witness($idx).push(vec!(1));

lightning/src/chain/keysinterface.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,8 @@ impl BaseSign for InMemorySigner {
612612
for htlc in commitment_tx.htlcs() {
613613
let htlc_tx = chan_utils::build_htlc_transaction(&commitment_txid, commitment_tx.feerate_per_kw(), self.holder_selected_contest_delay(), htlc, self.opt_anchors(), &keys.broadcaster_delayed_payment_key, &keys.revocation_key);
614614
let htlc_redeemscript = chan_utils::get_htlc_redeemscript(&htlc, self.opt_anchors(), &keys);
615-
let htlc_sighash = hash_to_message!(&bip143::SigHashCache::new(&htlc_tx).signature_hash(0, &htlc_redeemscript, htlc.amount_msat / 1000, SigHashType::All)[..]);
615+
let htlc_sighashtype = if self.opt_anchors() { SigHashType::SinglePlusAnyoneCanPay } else { SigHashType::All };
616+
let htlc_sighash = hash_to_message!(&bip143::SigHashCache::new(&htlc_tx).signature_hash(0, &htlc_redeemscript, htlc.amount_msat / 1000, htlc_sighashtype)[..]);
616617
let holder_htlc_key = chan_utils::derive_private_key(&secp_ctx, &keys.per_commitment_point, &self.htlc_base_key).map_err(|_| ())?;
617618
htlc_sigs.push(secp_ctx.sign(&htlc_sighash, &holder_htlc_key));
618619
}
@@ -682,7 +683,8 @@ impl BaseSign for InMemorySigner {
682683
} else { return Err(()) }
683684
} else { return Err(()) };
684685
let mut sighash_parts = bip143::SigHashCache::new(htlc_tx);
685-
let sighash = hash_to_message!(&sighash_parts.signature_hash(input, &witness_script, amount, SigHashType::All)[..]);
686+
let sighashtype = if self.opt_anchors() { SigHashType::SinglePlusAnyoneCanPay } else { SigHashType::All };
687+
let sighash = hash_to_message!(&sighash_parts.signature_hash(input, &witness_script, amount, sighashtype)[..]);
686688
return Ok(secp_ctx.sign(&sighash, &htlc_key))
687689
}
688690
Err(())

lightning/src/chain/package.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -354,10 +354,10 @@ impl PackageSolvingData {
354354
PackageSolvingData::CounterpartyOfferedHTLCOutput(ref outp) => {
355355
if let Ok(chan_keys) = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint) {
356356
let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
357-
357+
let sighashtype = if onchain_handler.opt_anchors() { SigHashType::SinglePlusAnyoneCanPay } else { SigHashType::All };
358358
if let Ok(sig) = onchain_handler.signer.sign_counterparty_htlc_transaction(&bumped_tx, i, &outp.htlc.amount_msat / 1000, &outp.per_commitment_point, &outp.htlc, &onchain_handler.secp_ctx) {
359359
bumped_tx.input[i].witness.push(sig.serialize_der().to_vec());
360-
bumped_tx.input[i].witness[0].push(SigHashType::All as u8);
360+
bumped_tx.input[i].witness[0].push(sighashtype as u8);
361361
bumped_tx.input[i].witness.push(outp.preimage.0.to_vec());
362362
bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
363363
}
@@ -366,11 +366,12 @@ impl PackageSolvingData {
366366
PackageSolvingData::CounterpartyReceivedHTLCOutput(ref outp) => {
367367
if let Ok(chan_keys) = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint) {
368368
let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
369+
let sighashtype = if onchain_handler.opt_anchors() { SigHashType::SinglePlusAnyoneCanPay } else { SigHashType::All };
369370

370371
bumped_tx.lock_time = outp.htlc.cltv_expiry; // Right now we don't aggregate time-locked transaction, if we do we should set lock_time before to avoid breaking hash computation
371372
if let Ok(sig) = onchain_handler.signer.sign_counterparty_htlc_transaction(&bumped_tx, i, &outp.htlc.amount_msat / 1000, &outp.per_commitment_point, &outp.htlc, &onchain_handler.secp_ctx) {
372373
bumped_tx.input[i].witness.push(sig.serialize_der().to_vec());
373-
bumped_tx.input[i].witness[0].push(SigHashType::All as u8);
374+
bumped_tx.input[i].witness[0].push(sighashtype as u8);
374375
// Due to BIP146 (MINIMALIF) this must be a zero-length element to relay.
375376
bumped_tx.input[i].witness.push(vec![]);
376377
bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());

lightning/src/ln/chan_utils.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -1407,7 +1407,8 @@ impl<'a> TrustedCommitmentTransaction<'a> {
14071407

14081408
let htlc_redeemscript = get_htlc_redeemscript_with_explicit_keys(&this_htlc, self.opt_anchors(), &keys.broadcaster_htlc_key, &keys.countersignatory_htlc_key, &keys.revocation_key);
14091409

1410-
let sighash = hash_to_message!(&bip143::SigHashCache::new(&htlc_tx).signature_hash(0, &htlc_redeemscript, this_htlc.amount_msat / 1000, SigHashType::All)[..]);
1410+
let sighashtype = if self.opt_anchors() { SigHashType::SinglePlusAnyoneCanPay } else { SigHashType::All };
1411+
let sighash = hash_to_message!(&bip143::SigHashCache::new(&htlc_tx).signature_hash(0, &htlc_redeemscript, this_htlc.amount_msat / 1000, sighashtype)[..]);
14111412
ret.push(secp_ctx.sign(&sighash, &holder_htlc_key));
14121413
}
14131414
Ok(ret)
@@ -1429,13 +1430,15 @@ impl<'a> TrustedCommitmentTransaction<'a> {
14291430

14301431
let htlc_redeemscript = get_htlc_redeemscript_with_explicit_keys(&this_htlc, self.opt_anchors(), &keys.broadcaster_htlc_key, &keys.countersignatory_htlc_key, &keys.revocation_key);
14311432

1433+
let sighashtype = if self.opt_anchors() { SigHashType::SinglePlusAnyoneCanPay } else { SigHashType::All };
1434+
14321435
// First push the multisig dummy, note that due to BIP147 (NULLDUMMY) it must be a zero-length element.
14331436
htlc_tx.input[0].witness.push(Vec::new());
14341437

14351438
htlc_tx.input[0].witness.push(counterparty_signature.serialize_der().to_vec());
14361439
htlc_tx.input[0].witness.push(signature.serialize_der().to_vec());
1437-
htlc_tx.input[0].witness[1].push(SigHashType::All as u8);
1438-
htlc_tx.input[0].witness[2].push(SigHashType::All as u8);
1440+
htlc_tx.input[0].witness[1].push(sighashtype as u8);
1441+
htlc_tx.input[0].witness[2].push(sighashtype as u8);
14391442

14401443
if this_htlc.offered {
14411444
// Due to BIP146 (MINIMALIF) this must be a zero-length element to relay.

lightning/src/ln/channel.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -2625,7 +2625,8 @@ impl<Signer: Sign> Channel<Signer> {
26252625
&keys.broadcaster_delayed_payment_key, &keys.revocation_key);
26262626

26272627
let htlc_redeemscript = chan_utils::get_htlc_redeemscript(&htlc, self.opt_anchors(), &keys);
2628-
let htlc_sighash = hash_to_message!(&bip143::SigHashCache::new(&htlc_tx).signature_hash(0, &htlc_redeemscript, htlc.amount_msat / 1000, SigHashType::All)[..]);
2628+
let htlc_sighashtype = if self.opt_anchors() { SigHashType::SinglePlusAnyoneCanPay } else { SigHashType::All };
2629+
let htlc_sighash = hash_to_message!(&bip143::SigHashCache::new(&htlc_tx).signature_hash(0, &htlc_redeemscript, htlc.amount_msat / 1000, htlc_sighashtype)[..]);
26292630
log_trace!(logger, "Checking HTLC tx signature {} by key {} against tx {} (sighash {}) with redeemscript {} in channel {}.",
26302631
log_bytes!(msg.htlc_signatures[idx].serialize_compact()[..]), log_bytes!(keys.countersignatory_htlc_key.serialize()),
26312632
encode::serialize_hex(&htlc_tx), log_bytes!(htlc_sighash[..]), encode::serialize_hex(&htlc_redeemscript), log_bytes!(self.channel_id()));
@@ -6288,7 +6289,8 @@ mod tests {
62886289
chan.get_counterparty_selected_contest_delay().unwrap(),
62896290
&htlc, opt_anchors, &keys.broadcaster_delayed_payment_key, &keys.revocation_key);
62906291
let htlc_redeemscript = chan_utils::get_htlc_redeemscript(&htlc, opt_anchors, &keys);
6291-
let htlc_sighash = Message::from_slice(&bip143::SigHashCache::new(&htlc_tx).signature_hash(0, &htlc_redeemscript, htlc.amount_msat / 1000, SigHashType::All)[..]).unwrap();
6292+
let htlc_sighashtype = if opt_anchors { SigHashType::SinglePlusAnyoneCanPay } else { SigHashType::All };
6293+
let htlc_sighash = Message::from_slice(&bip143::SigHashCache::new(&htlc_tx).signature_hash(0, &htlc_redeemscript, htlc.amount_msat / 1000, htlc_sighashtype)[..]).unwrap();
62926294
secp_ctx.verify(&htlc_sighash, &remote_signature, &keys.countersignatory_htlc_key).unwrap();
62936295

62946296
let mut preimage: Option<PaymentPreimage> = None;

lightning/src/util/enforcing_trait_impls.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,8 @@ impl BaseSign for EnforcingSigner {
160160

161161
let htlc_redeemscript = chan_utils::get_htlc_redeemscript(&this_htlc, self.opt_anchors(), &keys);
162162

163-
let sighash = hash_to_message!(&bip143::SigHashCache::new(&htlc_tx).signature_hash(0, &htlc_redeemscript, this_htlc.amount_msat / 1000, SigHashType::All)[..]);
163+
let htlc_sighashtype = if self.opt_anchors() { SigHashType::SinglePlusAnyoneCanPay } else { SigHashType::All };
164+
let sighash = hash_to_message!(&bip143::SigHashCache::new(&htlc_tx).signature_hash(0, &htlc_redeemscript, this_htlc.amount_msat / 1000, htlc_sighashtype)[..]);
164165
secp_ctx.verify(&sighash, sig, &keys.countersignatory_htlc_key).unwrap();
165166
}
166167

0 commit comments

Comments
 (0)