Skip to content

Commit 5936542

Browse files
committed
WIP: try to enforce signing vs revocation
1 parent 0c98489 commit 5936542

File tree

1 file changed

+33
-7
lines changed

1 file changed

+33
-7
lines changed

lightning/src/util/enforcing_trait_impls.rs

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,26 @@ impl EnforcingChannelKeys {
5353

5454
impl ChannelKeys for EnforcingChannelKeys {
5555
fn get_per_commitment_point<T: secp256k1::Signing + secp256k1::Verification>(&self, idx: u64, secp_ctx: &Secp256k1<T>) -> PublicKey {
56-
self.inner.get_per_commitment_point(idx, secp_ctx)
56+
let res = self.inner.get_per_commitment_point(idx, secp_ctx);
57+
println!("XXX get_per {} {} = point {}", self.inner.commitment_seed[0], idx, res);
58+
res
5759
}
5860

5961
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)
62+
println!("XXX revoke {} {}", self.inner.commitment_seed[0], idx);
63+
let res = {
64+
let mut revoked = self.revoked_commitment.lock().unwrap();
65+
if idx != *revoked && idx != *revoked - 1 {
66+
panic!("can only revoke the current or next unrevoked commitment - trying {}, revoked {}", idx, *revoked)
67+
}
68+
*revoked = idx;
69+
self.inner.get_revoke_commitment_secret(idx)
70+
};
71+
{
72+
let revoked = self.revoked_commitment.lock().unwrap();
73+
assert_eq!(idx, *revoked);
6374
}
64-
*revoked = idx;
65-
self.inner.get_revoke_commitment_secret(idx)
75+
res
6676
}
6777
fn pubkeys(&self) -> &ChannelPublicKeys { self.inner.pubkeys() }
6878
fn key_derivation_params(&self) -> (u64, u64) { self.inner.key_derivation_params() }
@@ -86,6 +96,19 @@ impl ChannelKeys for EnforcingChannelKeys {
8696
}
8797

8898
fn sign_local_commitment<T: secp256k1::Signing + secp256k1::Verification>(&self, local_commitment_tx: &LocalCommitmentTransaction, secp_ctx: &Secp256k1<T>) -> Result<Signature, ()> {
99+
let revoked = self.revoked_commitment.lock().unwrap();
100+
let keys = &local_commitment_tx.local_keys;
101+
if keys.per_commitment_point != self.inner.get_per_commitment_point(*revoked - 1, secp_ctx) {
102+
if keys.per_commitment_point != self.inner.get_per_commitment_point(*revoked - 2, secp_ctx) {
103+
if keys.per_commitment_point == self.inner.get_per_commitment_point(*revoked, secp_ctx) {
104+
panic!("attempted to sign the latest revoked local commitment {}", self.inner.commitment_seed[0]);
105+
} else {
106+
panic!("can only sign the next two unrevoked commitment numbers, {} revoked={} point={}",
107+
self.inner.commitment_seed[0], *revoked, keys.per_commitment_point);
108+
}
109+
}
110+
}
111+
89112
Ok(self.inner.sign_local_commitment(local_commitment_tx, secp_ctx).unwrap())
90113
}
91114

@@ -137,6 +160,8 @@ impl Writeable for EnforcingChannelKeys {
137160
self.inner.write(writer)?;
138161
let revoked = *self.revoked_commitment.lock().unwrap();
139162
revoked.write(writer)?;
163+
println!("XXX write {} {}", self.inner.commitment_seed[0], revoked);
164+
140165
let (obscure, last) = *self.commitment_number_obscure_and_last.lock().unwrap();
141166
obscure.write(writer)?;
142167
last.write(writer)?;
@@ -146,9 +171,10 @@ impl Writeable for EnforcingChannelKeys {
146171

147172
impl Readable for EnforcingChannelKeys {
148173
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
149-
let inner = Readable::read(reader)?;
174+
let inner: InMemoryChannelKeys = Readable::read(reader)?;
150175
let revoked = Readable::read(reader)?;
151176
let obscure_and_last = Readable::read(reader)?;
177+
println!("XXX read {} {}", inner.commitment_seed[0], revoked);
152178
Ok(EnforcingChannelKeys {
153179
inner: inner,
154180
revoked_commitment: Arc::new(Mutex::new(revoked)),

0 commit comments

Comments
 (0)