@@ -15,11 +15,14 @@ use util::ser::{Writeable, Writer, Readable};
15
15
use std:: io:: Error ;
16
16
use ln:: msgs:: DecodeError ;
17
17
18
+ const INITIAL_COMMITMENT_NUMBER : u64 = ( 1 << 48 ) - 1 ;
19
+
18
20
/// Enforces some rules on ChannelKeys calls. Eventually we will probably want to expose a variant
19
21
/// of this which would essentially be what you'd want to run on a hardware wallet.
20
22
#[ derive( Clone ) ]
21
23
pub struct EnforcingChannelKeys {
22
24
pub inner : InMemoryChannelKeys ,
25
+ revoked_commitment : Arc < Mutex < u64 > > ,
23
26
commitment_number_obscure_and_last : Arc < Mutex < ( Option < u64 > , u64 ) > > ,
24
27
}
25
28
@@ -28,6 +31,7 @@ impl EnforcingChannelKeys {
28
31
Self {
29
32
inner,
30
33
commitment_number_obscure_and_last : Arc :: new ( Mutex :: new ( ( None , 0 ) ) ) ,
34
+ revoked_commitment : Arc :: new ( Mutex :: new ( INITIAL_COMMITMENT_NUMBER + 1 ) ) ,
31
35
}
32
36
}
33
37
}
@@ -52,7 +56,14 @@ impl ChannelKeys for EnforcingChannelKeys {
52
56
self . inner . get_per_commitment_point ( idx, secp_ctx)
53
57
}
54
58
55
- fn get_revoke_commitment_secret ( & self , idx : u64 ) -> [ u8 ; 32 ] { self . inner . get_revoke_commitment_secret ( idx) }
59
+ fn get_revoke_commitment_secret ( & self , idx : u64 ) -> [ u8 ; 32 ] {
60
+ let mut revoked = self . revoked_commitment . lock ( ) . unwrap ( ) ;
61
+ if idx != * revoked && idx != * revoked - 1 {
62
+ panic ! ( "can only revoke the current or next unrevoked commitment - trying {}, revoked {}" , idx, * revoked)
63
+ }
64
+ * revoked = idx;
65
+ self . inner . get_revoke_commitment_secret ( idx)
66
+ }
56
67
fn pubkeys ( & self ) -> & ChannelPublicKeys { self . inner . pubkeys ( ) }
57
68
fn key_derivation_params ( & self ) -> ( u64 , u64 ) { self . inner . key_derivation_params ( ) }
58
69
@@ -124,6 +135,8 @@ impl ChannelKeys for EnforcingChannelKeys {
124
135
impl Writeable for EnforcingChannelKeys {
125
136
fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , Error > {
126
137
self . inner . write ( writer) ?;
138
+ let revoked = * self . revoked_commitment . lock ( ) . unwrap ( ) ;
139
+ revoked. write ( writer) ?;
127
140
let ( obscure, last) = * self . commitment_number_obscure_and_last . lock ( ) . unwrap ( ) ;
128
141
obscure. write ( writer) ?;
129
142
last. write ( writer) ?;
@@ -134,9 +147,11 @@ impl Writeable for EnforcingChannelKeys {
134
147
impl Readable for EnforcingChannelKeys {
135
148
fn read < R : :: std:: io:: Read > ( reader : & mut R ) -> Result < Self , DecodeError > {
136
149
let inner = Readable :: read ( reader) ?;
150
+ let revoked = Readable :: read ( reader) ?;
137
151
let obscure_and_last = Readable :: read ( reader) ?;
138
152
Ok ( EnforcingChannelKeys {
139
153
inner : inner,
154
+ revoked_commitment : Arc :: new ( Mutex :: new ( revoked) ) ,
140
155
commitment_number_obscure_and_last : Arc :: new ( Mutex :: new ( obscure_and_last) )
141
156
} )
142
157
}
0 commit comments