@@ -79,6 +79,8 @@ pub trait KeysInterface: Send + Sync {
79
79
/// Get a new set of ChannelKeys for per-channel secrets. These MUST be unique even if you
80
80
/// restarted with some stale data!
81
81
fn get_channel_keys ( & self , inbound : bool ) -> ChannelKeys ;
82
+ /// Get a secret for construting an onion packet
83
+ fn get_session_key ( & self ) -> SecretKey ;
82
84
}
83
85
84
86
/// Set of lightning keys needed to operate a channel as described in BOLT 3
@@ -158,6 +160,8 @@ pub struct KeysManager {
158
160
shutdown_pubkey : PublicKey ,
159
161
channel_master_key : ExtendedPrivKey ,
160
162
channel_child_index : AtomicUsize ,
163
+ session_master_key : ExtendedPrivKey ,
164
+ session_child_index : AtomicUsize ,
161
165
162
166
logger : Arc < Logger > ,
163
167
}
@@ -184,13 +188,16 @@ impl KeysManager {
184
188
Err ( _) => panic ! ( "Your RNG is busted" ) ,
185
189
} ;
186
190
let channel_master_key = master_key. ckd_priv ( & secp_ctx, ChildNumber :: from_hardened_idx ( 3 ) ) . expect ( "Your RNG is busted" ) ;
191
+ let session_master_key = master_key. ckd_priv ( & secp_ctx, ChildNumber :: from_hardened_idx ( 4 ) ) . expect ( "Your RNG is busted" ) ;
187
192
KeysManager {
188
193
secp_ctx,
189
194
node_secret,
190
195
destination_script,
191
196
shutdown_pubkey,
192
197
channel_master_key,
193
198
channel_child_index : AtomicUsize :: new ( 0 ) ,
199
+ session_master_key,
200
+ session_child_index : AtomicUsize :: new ( 0 ) ,
194
201
195
202
logger,
196
203
}
@@ -235,4 +242,9 @@ impl KeysInterface for KeysManager {
235
242
sha. result ( & mut seed) ;
236
243
ChannelKeys :: new_from_seed ( & seed)
237
244
}
245
+
246
+ fn get_session_key ( & self ) -> SecretKey {
247
+ let child_ix = self . session_child_index . fetch_add ( 1 , Ordering :: AcqRel ) ;
248
+ self . session_master_key . ckd_priv ( & self . secp_ctx , ChildNumber :: from_hardened_idx ( child_ix as u32 ) ) . expect ( "Your RNG is busted" ) . secret_key
249
+ }
238
250
}
0 commit comments