@@ -38,7 +38,7 @@ use core::cmp;
3838#[ cfg( anchors) ]
3939use core:: convert:: TryInto ;
4040use core:: mem;
41- use core:: ops:: Deref ;
41+ use core:: ops:: { BitOr , Deref } ;
4242use bitcoin:: { PackedLockTime , Sequence , Witness } ;
4343use 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
79103pub ( 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 ( ) ) ,
0 commit comments