@@ -18,7 +18,7 @@ use chain::keysinterface;
1818use ln:: features:: { ChannelFeatures , InitFeatures } ;
1919use ln:: msgs;
2020use ln:: msgs:: OptionalField ;
21- use util:: enforcing_trait_impls:: EnforcingChannelKeys ;
21+ use util:: enforcing_trait_impls:: { EnforcingChannelKeys , INITIAL_REVOKED_COMMITMENT_NUMBER } ;
2222use util:: events;
2323use util:: logger:: { Logger , Level , Record } ;
2424use util:: ser:: { Readable , ReadableArgs , Writer , Writeable } ;
@@ -35,7 +35,7 @@ use bitcoin::secp256k1::{SecretKey, PublicKey, Secp256k1, Signature};
3535use regex;
3636
3737use std:: time:: Duration ;
38- use std:: sync:: Mutex ;
38+ use std:: sync:: { Mutex , Arc } ;
3939use std:: sync:: atomic:: { AtomicBool , AtomicUsize , Ordering } ;
4040use std:: { cmp, mem} ;
4141use 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
407408impl 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,37 @@ 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+ let obscure_and_last = Readable :: read ( & mut reader) ?;
442+
443+ Ok ( EnforcingChannelKeys {
444+ inner,
445+ commitment_number_obscure_and_last : Arc :: new ( Mutex :: new ( obscure_and_last) ) ,
446+ revoked_commitment,
447+ } )
434448 }
435449}
436450
451+
437452impl TestKeysInterface {
438453 pub fn new ( seed : & [ u8 ; 32 ] , network : Network ) -> Self {
439454 let now = Duration :: from_secs ( genesis_block ( network) . header . time as u64 ) ;
440455 Self {
441456 backing : keysinterface:: KeysManager :: new ( seed, network, now. as_secs ( ) , now. subsec_nanos ( ) ) ,
442457 override_session_priv : Mutex :: new ( None ) ,
443458 override_channel_id_priv : Mutex :: new ( None ) ,
459+ revoked_commitments : Mutex :: new ( HashMap :: new ( ) ) ,
444460 }
445461 }
446462 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) )
463+ let keys = self . backing . derive_channel_keys ( channel_value_satoshis, user_id_1, user_id_2) ;
464+ let revoked_commitment = self . make_revoked_commitment_cell ( keys. commitment_seed ) ;
465+ EnforcingChannelKeys :: new_with_revoked ( keys, revoked_commitment)
448466 }
449467}
450468
@@ -486,3 +504,14 @@ impl chain::Filter for TestChainSource {
486504 self . watched_outputs . lock ( ) . unwrap ( ) . insert ( ( * outpoint, script_pubkey. clone ( ) ) ) ;
487505 }
488506}
507+
508+ impl TestKeysInterface {
509+ fn make_revoked_commitment_cell ( & self , commitment_seed : [ u8 ; 32 ] ) -> Arc < Mutex < u64 > > {
510+ let mut revoked_commitments = self . revoked_commitments . lock ( ) . unwrap ( ) ;
511+ if !revoked_commitments. contains_key ( & commitment_seed) {
512+ revoked_commitments. insert ( commitment_seed, Arc :: new ( Mutex :: new ( INITIAL_REVOKED_COMMITMENT_NUMBER ) ) ) ;
513+ }
514+ let cell = revoked_commitments. get ( & commitment_seed) . unwrap ( ) ;
515+ Arc :: clone ( cell)
516+ }
517+ }
0 commit comments