Skip to content

Commit 717c033

Browse files
committed
Verify channel type features for decoding.
1 parent 3690975 commit 717c033

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

lightning/src/chain/package.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ use core::cmp;
3838
#[cfg(anchors)]
3939
use core::convert::TryInto;
4040
use core::mem;
41-
use core::ops::Deref;
41+
use core::ops::{BitOr, Deref};
4242
use bitcoin::{PackedLockTime, Sequence, Witness};
4343
use crate::ln::features::ChannelTypeFeatures;
4444

@@ -75,6 +75,30 @@ pub(crate) fn weight_received_htlc(channel_type_features: &ChannelTypeFeatures)
7575
if channel_type_features.supports_anchors_zero_fee_htlc_tx() { WEIGHT_RECEIVED_HTLC_ANCHORS } else { WEIGHT_RECEIVED_HTLC }
7676
}
7777

78+
/// Verifies deserializable channel type features
79+
pub(crate) fn verify_channel_type_features(channel_type_features: &Option<ChannelTypeFeatures>, additional_permitted_features: Option<&ChannelTypeFeatures>) -> Result<(), DecodeError> {
80+
if let Some(features) = channel_type_features.as_ref() {
81+
if features.requires_unknown_bits() {
82+
return Err(DecodeError::UnknownRequiredFeature);
83+
}
84+
85+
let mut supported_feature_set = ChannelTypeFeatures::anchors_zero_htlc_fee_and_dependencies();
86+
supported_feature_set.set_scid_privacy_required();
87+
supported_feature_set.set_zero_conf_required();
88+
89+
// allow the passing of an additional necessary permitted flag
90+
if let Some(additional_permitted_features) = additional_permitted_features {
91+
supported_feature_set = supported_feature_set.bitor(additional_permitted_features.clone());
92+
}
93+
94+
if !features.is_subset(&supported_feature_set) {
95+
return Err(DecodeError::UnknownRequiredFeature);
96+
}
97+
}
98+
99+
Ok(())
100+
}
101+
78102
// number_of_witness_elements + sig_length + revocation_sig + true_length + op_true + witness_script_length + witness_script
79103
pub(crate) const WEIGHT_REVOKED_OUTPUT: u64 = 1 + 1 + 73 + 1 + 1 + 1 + 77;
80104

@@ -237,6 +261,8 @@ impl Readable for CounterpartyOfferedHTLCOutput {
237261
(11, channel_type_features, option),
238262
});
239263

264+
verify_channel_type_features(&channel_type_features, None)?;
265+
240266
Ok(Self {
241267
per_commitment_point: per_commitment_point.0.unwrap(),
242268
counterparty_delayed_payment_base_key: counterparty_delayed_payment_base_key.0.unwrap(),
@@ -306,6 +332,8 @@ impl Readable for CounterpartyReceivedHTLCOutput {
306332
(9, channel_type_features, option),
307333
});
308334

335+
verify_channel_type_features(&channel_type_features, None)?;
336+
309337
Ok(Self {
310338
per_commitment_point: per_commitment_point.0.unwrap(),
311339
counterparty_delayed_payment_base_key: counterparty_delayed_payment_base_key.0.unwrap(),
@@ -379,6 +407,8 @@ impl Readable for HolderHTLCOutput {
379407
(7, channel_type_features, option),
380408
});
381409

410+
verify_channel_type_features(&channel_type_features, None)?;
411+
382412
Ok(Self {
383413
amount_msat: amount_msat.0.unwrap(),
384414
cltv_expiry: cltv_expiry.0.unwrap(),
@@ -436,6 +466,8 @@ impl Readable for HolderFundingOutput {
436466
(3, funding_amount, option)
437467
});
438468

469+
verify_channel_type_features(&channel_type_features, None)?;
470+
439471
Ok(Self {
440472
funding_redeemscript: funding_redeemscript.0.unwrap(),
441473
channel_type_features: channel_type_features.unwrap_or(ChannelTypeFeatures::only_static_remote_key()),

lightning/src/ln/chan_utils.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -952,6 +952,10 @@ impl Readable for ChannelTransactionParameters {
952952
(11, channel_type_features, option),
953953
});
954954

955+
let mut additional_features = ChannelTypeFeatures::empty();
956+
additional_features.set_anchors_nonzero_fee_htlc_tx_required();
957+
chain::package::verify_channel_type_features(&channel_type_features, Some(&additional_features))?;
958+
955959
Ok(Self {
956960
holder_pubkeys: holder_pubkeys.0.unwrap(),
957961
holder_selected_contest_delay: holder_selected_contest_delay.0.unwrap(),
@@ -1375,6 +1379,10 @@ impl Readable for CommitmentTransaction {
13751379
(15, channel_type_features, option),
13761380
});
13771381

1382+
let mut additional_features = ChannelTypeFeatures::empty();
1383+
additional_features.set_anchors_nonzero_fee_htlc_tx_required();
1384+
chain::package::verify_channel_type_features(&channel_type_features, Some(&additional_features))?;
1385+
13781386
Ok(Self {
13791387
commitment_number: commitment_number.0.unwrap(),
13801388
to_broadcaster_value_sat: to_broadcaster_value_sat.0.unwrap(),

lightning/src/ln/features.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,6 @@ impl ChannelTypeFeatures {
582582
ret
583583
}
584584

585-
#[cfg(any(anchors, test))]
586585
/// Constructs a ChannelTypeFeatures with anchors support
587586
pub(crate) fn anchors_zero_htlc_fee_and_dependencies() -> Self {
588587
let mut ret = Self::empty();

0 commit comments

Comments
 (0)