Skip to content

Commit ba0dc14

Browse files
committed
keep track of revocations in KeysInterface
1 parent 7c7cec7 commit ba0dc14

File tree

3 files changed

+84
-28
lines changed

3 files changed

+84
-28
lines changed

lightning/src/ln/onchaintx.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -962,7 +962,7 @@ impl<ChanSigner: ChannelKeys> OnchainTxHandler<ChanSigner> {
962962
pub(crate) fn get_fully_signed_copy_holder_tx(&mut self, funding_redeemscript: &Script) -> Option<Transaction> {
963963
if let Some(ref mut holder_commitment) = self.holder_commitment {
964964
let holder_commitment = holder_commitment.clone();
965-
match self.key_storage.sign_holder_commitment(&holder_commitment, &self.secp_ctx) {
965+
match self.key_storage.unsafe_sign_holder_commitment(&holder_commitment, &self.secp_ctx) {
966966
Ok(sig) => Some(holder_commitment.add_holder_sig(funding_redeemscript, sig)),
967967
Err(_) => return None,
968968
}

lightning/src/util/enforcing_trait_impls.rs

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,32 @@ use util::ser::{Writeable, Writer, Readable};
2424
use std::io::Error;
2525
use ln::msgs::DecodeError;
2626

27-
const INITIAL_COMMITMENT_NUMBER: u64 = (1 << 48) - 1;
27+
/// Initial value for revoked commitment downward counter
28+
pub const INITIAL_REVOKED_COMMITMENT_NUMBER: u64 = 1 << 48;
2829

2930
/// Enforces some rules on ChannelKeys calls. Eventually we will probably want to expose a variant
3031
/// of this which would essentially be what you'd want to run on a hardware wallet.
3132
#[derive(Clone)]
3233
pub struct EnforcingChannelKeys {
3334
pub inner: InMemoryChannelKeys,
34-
revoked_commitment: Arc<Mutex<u64>>,
35-
commitment_number_obscure_and_last: Arc<Mutex<(Option<u64>, u64)>>,
35+
pub(crate) revoked_commitment: Arc<Mutex<u64>>,
36+
pub(crate) commitment_number_obscure_and_last: Arc<Mutex<(Option<u64>, u64)>>,
3637
}
3738

3839
impl EnforcingChannelKeys {
3940
pub fn new(inner: InMemoryChannelKeys) -> Self {
4041
Self {
4142
inner,
4243
commitment_number_obscure_and_last: Arc::new(Mutex::new((None, 0))),
43-
revoked_commitment: Arc::new(Mutex::new(INITIAL_COMMITMENT_NUMBER + 1)),
44+
revoked_commitment: Arc::new(Mutex::new(INITIAL_REVOKED_COMMITMENT_NUMBER))
45+
}
46+
}
47+
48+
pub fn new_with_revoked(inner: InMemoryChannelKeys, revoked_commitment: Arc<Mutex<u64>>) -> Self {
49+
Self {
50+
inner,
51+
commitment_number_obscure_and_last: Arc::new(Mutex::new((None, 0))),
52+
revoked_commitment
4453
}
4554
}
4655
}
@@ -69,20 +78,17 @@ impl ChannelKeys for EnforcingChannelKeys {
6978

7079
fn release_commitment_secret(&self, idx: u64) -> [u8; 32] {
7180
println!("XXX revoke {} {}", self.inner.commitment_seed[0], idx);
72-
let res = {
81+
{
7382
let mut revoked = self.revoked_commitment.lock().unwrap();
7483
if idx != *revoked && idx != *revoked - 1 {
7584
panic!("can only revoke the current or next unrevoked commitment - trying {}, revoked {}", idx, *revoked)
7685
}
7786
*revoked = idx;
78-
self.inner.release_commitment_secret(idx)
79-
};
80-
{
81-
let revoked = self.revoked_commitment.lock().unwrap();
82-
assert_eq!(idx, *revoked);
8387
}
84-
res
88+
println!("XXX revoke after {} {}", self.inner.commitment_seed[0], *self.revoked_commitment.lock().unwrap());
89+
self.inner.release_commitment_secret(idx)
8590
}
91+
8692
fn pubkeys(&self) -> &ChannelPublicKeys { self.inner.pubkeys() }
8793
fn key_derivation_params(&self) -> (u64, u64) { self.inner.key_derivation_params() }
8894

@@ -112,10 +118,12 @@ impl ChannelKeys for EnforcingChannelKeys {
112118
if keys.per_commitment_point != self.inner.get_per_commitment_point(*revoked - 1, secp_ctx) {
113119
if keys.per_commitment_point != self.inner.get_per_commitment_point(*revoked - 2, secp_ctx) {
114120
if keys.per_commitment_point == self.inner.get_per_commitment_point(*revoked, secp_ctx) {
115-
panic!("attempted to sign the latest revoked local commitment {}", self.inner.commitment_seed[0]);
121+
println!("attempted to sign the latest revoked local commitment {}", self.inner.commitment_seed[0]);
122+
return Err(())
116123
} else {
117-
panic!("can only sign the next two unrevoked commitment numbers, {} revoked={} point={}",
124+
println!("can only sign the next two unrevoked commitment numbers, {} revoked={} point={}",
118125
self.inner.commitment_seed[0], *revoked, keys.per_commitment_point);
126+
return Err(())
119127
}
120128
}
121129
}
@@ -166,12 +174,14 @@ impl ChannelKeys for EnforcingChannelKeys {
166174
}
167175
}
168176

177+
169178
impl Writeable for EnforcingChannelKeys {
170179
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), Error> {
171180
self.inner.write(writer)?;
172-
let revoked = *self.revoked_commitment.lock().unwrap();
173-
revoked.write(writer)?;
174-
println!("XXX write {} {}", self.inner.commitment_seed[0], revoked);
181+
{
182+
let result = self.revoked_commitment.lock().unwrap();
183+
println!("XXX write {} {}", self.inner.commitment_seed[0], result);
184+
}
175185

176186
let (obscure, last) = *self.commitment_number_obscure_and_last.lock().unwrap();
177187
obscure.write(writer)?;
@@ -183,13 +193,11 @@ impl Writeable for EnforcingChannelKeys {
183193
impl Readable for EnforcingChannelKeys {
184194
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
185195
let inner: InMemoryChannelKeys = Readable::read(reader)?;
186-
let revoked = Readable::read(reader)?;
187196
let obscure_and_last = Readable::read(reader)?;
188-
println!("XXX read {} {}", inner.commitment_seed[0], revoked);
189197
Ok(EnforcingChannelKeys {
190-
inner: inner,
191-
revoked_commitment: Arc::new(Mutex::new(revoked)),
192-
commitment_number_obscure_and_last: Arc::new(Mutex::new(obscure_and_last))
198+
inner,
199+
commitment_number_obscure_and_last: Arc::new(Mutex::new(obscure_and_last)),
200+
revoked_commitment: Arc::new(Mutex::new(INITIAL_REVOKED_COMMITMENT_NUMBER)),
193201
})
194202
}
195203
}

lightning/src/util/test_utils.rs

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use chain::keysinterface;
1818
use ln::features::{ChannelFeatures, InitFeatures};
1919
use ln::msgs;
2020
use ln::msgs::OptionalField;
21-
use util::enforcing_trait_impls::EnforcingChannelKeys;
21+
use util::enforcing_trait_impls::{EnforcingChannelKeys, INITIAL_REVOKED_COMMITMENT_NUMBER};
2222
use util::events;
2323
use util::logger::{Logger, Level, Record};
2424
use util::ser::{Readable, ReadableArgs, Writer, Writeable};
@@ -35,7 +35,7 @@ use bitcoin::secp256k1::{SecretKey, PublicKey, Secp256k1, Signature};
3535
use regex;
3636

3737
use std::time::Duration;
38-
use std::sync::Mutex;
38+
use std::sync::{Mutex, Arc};
3939
use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};
4040
use std::{cmp, mem};
4141
use std::collections::{HashMap, HashSet};
@@ -402,6 +402,7 @@ pub struct TestKeysInterface {
402402
backing: keysinterface::KeysManager,
403403
pub override_session_priv: Mutex<Option<[u8; 32]>>,
404404
pub override_channel_id_priv: Mutex<Option<[u8; 32]>>,
405+
revoked_commitments: Mutex<HashMap<[u8;32], Arc<Mutex<u64>>>>,
405406
}
406407

407408
impl keysinterface::KeysInterface for TestKeysInterface {
@@ -411,7 +412,9 @@ impl keysinterface::KeysInterface for TestKeysInterface {
411412
fn get_destination_script(&self) -> Script { self.backing.get_destination_script() }
412413
fn get_shutdown_pubkey(&self) -> PublicKey { self.backing.get_shutdown_pubkey() }
413414
fn get_channel_keys(&self, inbound: bool, channel_value_satoshis: u64) -> EnforcingChannelKeys {
414-
EnforcingChannelKeys::new(self.backing.get_channel_keys(inbound, channel_value_satoshis))
415+
let keys = self.backing.get_channel_keys(inbound, channel_value_satoshis);
416+
let revoked_commitment = self.make_revoked_commitment_cell(keys.commitment_seed);
417+
EnforcingChannelKeys::new_with_revoked(keys, revoked_commitment)
415418
}
416419

417420
fn get_secure_random_bytes(&self) -> [u8; 32] {
@@ -429,22 +432,41 @@ impl keysinterface::KeysInterface for TestKeysInterface {
429432
self.backing.get_secure_random_bytes()
430433
}
431434

432-
fn read_chan_signer(&self, reader: &[u8]) -> Result<Self::ChanKeySigner, msgs::DecodeError> {
433-
EnforcingChannelKeys::read(&mut std::io::Cursor::new(reader))
435+
fn read_chan_signer(&self, buffer: &[u8]) -> Result<Self::ChanKeySigner, msgs::DecodeError> {
436+
let mut reader = std::io::Cursor::new(buffer);
437+
438+
let inner: InMemoryChannelKeys = Readable::read(&mut reader)?;
439+
let revoked_commitment = self.make_revoked_commitment_cell(inner.commitment_seed);
440+
441+
{
442+
let result = revoked_commitment.lock().unwrap();
443+
println!("XXX read {} {}", inner.commitment_seed[0], result);
444+
}
445+
let obscure_and_last = Readable::read(&mut reader)?;
446+
447+
Ok(EnforcingChannelKeys {
448+
inner,
449+
commitment_number_obscure_and_last: Arc::new(Mutex::new(obscure_and_last)),
450+
revoked_commitment,
451+
})
434452
}
435453
}
436454

455+
437456
impl TestKeysInterface {
438457
pub fn new(seed: &[u8; 32], network: Network) -> Self {
439458
let now = Duration::from_secs(genesis_block(network).header.time as u64);
440459
Self {
441460
backing: keysinterface::KeysManager::new(seed, network, now.as_secs(), now.subsec_nanos()),
442461
override_session_priv: Mutex::new(None),
443462
override_channel_id_priv: Mutex::new(None),
463+
revoked_commitments: Mutex::new(HashMap::new()),
444464
}
445465
}
446466
pub fn derive_channel_keys(&self, channel_value_satoshis: u64, user_id_1: u64, user_id_2: u64) -> EnforcingChannelKeys {
447-
EnforcingChannelKeys::new(self.backing.derive_channel_keys(channel_value_satoshis, user_id_1, user_id_2))
467+
let keys = self.backing.derive_channel_keys(channel_value_satoshis, user_id_1, user_id_2);
468+
let revoked_commitment = self.make_revoked_commitment_cell(keys.commitment_seed);
469+
EnforcingChannelKeys::new_with_revoked(keys, revoked_commitment)
448470
}
449471
}
450472

@@ -486,3 +508,29 @@ impl chain::Filter for TestChainSource {
486508
self.watched_outputs.lock().unwrap().insert((*outpoint, script_pubkey.clone()));
487509
}
488510
}
511+
512+
impl TestKeysInterface {
513+
fn make_revoked_commitment_cell(&self, commitment_seed: [u8; 32]) -> Arc<Mutex<u64>> {
514+
let mut revoked_commitments = self.revoked_commitments.lock().unwrap();
515+
if !revoked_commitments.contains_key(&commitment_seed) {
516+
revoked_commitments.insert(commitment_seed, Arc::new(Mutex::new(INITIAL_REVOKED_COMMITMENT_NUMBER)));
517+
}
518+
println!("XXX create {}", commitment_seed[0]);
519+
let cell = revoked_commitments.get(&commitment_seed).unwrap();
520+
Arc::clone(cell)
521+
}
522+
}
523+
524+
#[test]
525+
fn test_mutex() {
526+
let x = Arc::new(Mutex::new(123));
527+
let y = Arc::clone(&x);
528+
{
529+
let mut rx = x.lock().unwrap();
530+
*rx = 124;
531+
}
532+
{
533+
let ry = y.lock().unwrap();
534+
println!("{}", *ry);
535+
}
536+
}

0 commit comments

Comments
 (0)