@@ -76,6 +76,51 @@ pub struct TestChannelSigner {
76
76
pub available : Arc < Mutex < bool > > ,
77
77
}
78
78
79
+ /// Channel signer operations that can be individually enabled and disabled. If a particular value
80
+ /// is set in the `TestChannelSigner::unavailable` bitmask, then that operation will return an
81
+ /// error.
82
+ pub mod ops {
83
+ pub const GET_PER_COMMITMENT_POINT : u32 = 1 << 0 ;
84
+ pub const RELEASE_COMMITMENT_SECRET : u32 = 1 << 1 ;
85
+ pub const VALIDATE_HOLDER_COMMITMENT : u32 = 1 << 2 ;
86
+ pub const SIGN_COUNTERPARTY_COMMITMENT : u32 = 1 << 3 ;
87
+ pub const VALIDATE_COUNTERPARTY_REVOCATION : u32 = 1 << 4 ;
88
+ pub const SIGN_HOLDER_COMMITMENT_AND_HTLCS : u32 = 1 << 5 ;
89
+ pub const SIGN_JUSTICE_REVOKED_OUTPUT : u32 = 1 << 6 ;
90
+ pub const SIGN_JUSTICE_REVOKED_HTLC : u32 = 1 << 7 ;
91
+ pub const SIGN_HOLDER_HTLC_TRANSACTION : u32 = 1 << 8 ;
92
+ pub const SIGN_COUNTERPARTY_HTLC_TRANSACTION : u32 = 1 << 9 ;
93
+ pub const SIGN_CLOSING_TRANSACTION : u32 = 1 << 10 ;
94
+ pub const SIGN_HOLDER_ANCHOR_INPUT : u32 = 1 << 11 ;
95
+ pub const SIGN_CHANNEL_ANNOUNCMENT_WITH_FUNDING_KEY : u32 = 1 << 12 ;
96
+
97
+ #[ cfg( test) ]
98
+ pub fn string_from ( mask : u32 ) -> String {
99
+ if mask == 0 {
100
+ return "nothing" . to_owned ( ) ;
101
+ }
102
+ if mask == !( 0 as u32 ) {
103
+ return "everything" . to_owned ( ) ;
104
+ }
105
+
106
+ vec ! [
107
+ if ( mask & GET_PER_COMMITMENT_POINT ) != 0 { Some ( "get_per_commitment_point" ) } else { None } ,
108
+ if ( mask & RELEASE_COMMITMENT_SECRET ) != 0 { Some ( "release_commitment_secret" ) } else { None } ,
109
+ if ( mask & VALIDATE_HOLDER_COMMITMENT ) != 0 { Some ( "validate_holder_commitment" ) } else { None } ,
110
+ if ( mask & SIGN_COUNTERPARTY_COMMITMENT ) != 0 { Some ( "sign_counterparty_commitment" ) } else { None } ,
111
+ if ( mask & VALIDATE_COUNTERPARTY_REVOCATION ) != 0 { Some ( "validate_counterparty_revocation" ) } else { None } ,
112
+ if ( mask & SIGN_HOLDER_COMMITMENT_AND_HTLCS ) != 0 { Some ( "sign_holder_commitment_and_htlcs" ) } else { None } ,
113
+ if ( mask & SIGN_JUSTICE_REVOKED_OUTPUT ) != 0 { Some ( "sign_justice_revoked_output" ) } else { None } ,
114
+ if ( mask & SIGN_JUSTICE_REVOKED_HTLC ) != 0 { Some ( "sign_justice_revoked_htlc" ) } else { None } ,
115
+ if ( mask & SIGN_HOLDER_HTLC_TRANSACTION ) != 0 { Some ( "sign_holder_htlc_transaction" ) } else { None } ,
116
+ if ( mask & SIGN_COUNTERPARTY_HTLC_TRANSACTION ) != 0 { Some ( "sign_counterparty_htlc_transaction" ) } else { None } ,
117
+ if ( mask & SIGN_CLOSING_TRANSACTION ) != 0 { Some ( "sign_closing_transaction" ) } else { None } ,
118
+ if ( mask & SIGN_HOLDER_ANCHOR_INPUT ) != 0 { Some ( "sign_holder_anchor_input" ) } else { None } ,
119
+ if ( mask & SIGN_CHANNEL_ANNOUNCMENT_WITH_FUNDING_KEY ) != 0 { Some ( "sign_channel_announcment_with_funding_key" ) } else { None } ,
120
+ ] . iter ( ) . flatten ( ) . map ( |s| s. to_string ( ) ) . collect :: < Vec < _ > > ( ) . join ( ", " )
121
+ }
122
+ }
123
+
79
124
impl PartialEq for TestChannelSigner {
80
125
fn eq ( & self , o : & Self ) -> bool {
81
126
Arc :: ptr_eq ( & self . state , & o. state )
@@ -123,6 +168,20 @@ impl TestChannelSigner {
123
168
pub fn set_available ( & self , available : bool ) {
124
169
* self . available . lock ( ) . unwrap ( ) = available;
125
170
}
171
+
172
+ #[ cfg( test) ]
173
+ pub fn set_ops_available ( & self , mask : u32 , available : bool ) {
174
+ let mut state = self . get_enforcement_state ( ) ;
175
+ if available {
176
+ state. unavailable_signer_ops &= !mask; // clear the bits that are now available
177
+ } else {
178
+ state. unavailable_signer_ops |= mask; // set the bits that are now unavailable
179
+ }
180
+ }
181
+
182
+ fn is_signer_available ( & self , ops_mask : u32 ) -> bool {
183
+ self . state . lock ( ) . unwrap ( ) . is_signer_available ( ops_mask)
184
+ }
126
185
}
127
186
128
187
impl ChannelSigner for TestChannelSigner {
@@ -379,6 +438,10 @@ pub struct EnforcementState {
379
438
pub last_holder_revoked_commitment : u64 ,
380
439
/// The last validated holder commitment number, backwards counting
381
440
pub last_holder_commitment : u64 ,
441
+ /// A flag array that indicates which signing operations are currently *not* available in the
442
+ /// channel. When a method's bit is set, then the signer will act as if the signature is
443
+ /// unavailable and return an error result.
444
+ pub unavailable_signer_ops : u32 ,
382
445
}
383
446
384
447
impl EnforcementState {
@@ -389,6 +452,11 @@ impl EnforcementState {
389
452
last_counterparty_revoked_commitment : INITIAL_REVOKED_COMMITMENT_NUMBER ,
390
453
last_holder_revoked_commitment : INITIAL_REVOKED_COMMITMENT_NUMBER ,
391
454
last_holder_commitment : INITIAL_REVOKED_COMMITMENT_NUMBER ,
455
+ unavailable_signer_ops : 0 ,
392
456
}
393
457
}
458
+
459
+ pub fn is_signer_available ( & self , ops_mask : u32 ) -> bool {
460
+ ( self . unavailable_signer_ops & ops_mask) == 0
461
+ }
394
462
}
0 commit comments