@@ -23,10 +23,10 @@ use bitcoin::key::Secp256k1;
2323use bitcoin:: Network ;
2424use lightning:: impl_writeable_tlv_based_enum;
2525use lightning:: io:: { self , Error , ErrorKind } ;
26+ use lightning:: sign:: { EntropySource as LdkEntropySource , RandomBytes } ;
2627use lightning:: util:: persist:: { KVStore , KVStoreSync } ;
2728use lightning:: util:: ser:: { Readable , Writeable } ;
2829use prost:: Message ;
29- use rand:: RngCore ;
3030use vss_client:: client:: VssClient ;
3131use vss_client:: error:: VssError ;
3232use vss_client:: headers:: { FixedHeaders , LnurlAuthToJwtProvider , VssHeaderProvider } ;
@@ -114,6 +114,10 @@ impl VssStore {
114114 derive_data_encryption_and_obfuscation_keys ( & vss_seed) ;
115115 let key_obfuscator = KeyObfuscator :: new ( obfuscation_master_key) ;
116116
117+ let mut entropy_seed = [ 0u8 ; 32 ] ;
118+ getrandom:: fill ( & mut entropy_seed) . expect ( "Failed to generate random bytes" ) ;
119+ let entropy_source = RandomBytes :: new ( entropy_seed) ;
120+
117121 let sync_retry_policy = retry_policy ( ) ;
118122 let blocking_client = VssClient :: new_with_headers (
119123 base_url. clone ( ) ,
@@ -129,6 +133,7 @@ impl VssStore {
129133 & store_id,
130134 data_encryption_key,
131135 & key_obfuscator,
136+ & entropy_source,
132137 )
133138 . await
134139 } )
@@ -145,6 +150,7 @@ impl VssStore {
145150 store_id,
146151 data_encryption_key,
147152 key_obfuscator,
153+ entropy_source,
148154 ) ) ;
149155
150156 Ok ( Self { inner, next_version, internal_runtime : Some ( internal_runtime) } )
@@ -385,6 +391,7 @@ struct VssStoreInner {
385391 store_id : String ,
386392 data_encryption_key : [ u8 ; 32 ] ,
387393 key_obfuscator : KeyObfuscator ,
394+ entropy_source : RandomBytes ,
388395 // Per-key locks that ensures that we don't have concurrent writes to the same namespace/key.
389396 // The lock also encapsulates the latest written version per key.
390397 locks : Mutex < HashMap < String , Arc < tokio:: sync:: Mutex < u64 > > > > ,
@@ -394,7 +401,7 @@ impl VssStoreInner {
394401 pub ( crate ) fn new (
395402 schema_version : VssSchemaVersion , blocking_client : VssClient < CustomRetryPolicy > ,
396403 async_client : VssClient < CustomRetryPolicy > , store_id : String ,
397- data_encryption_key : [ u8 ; 32 ] , key_obfuscator : KeyObfuscator ,
404+ data_encryption_key : [ u8 ; 32 ] , key_obfuscator : KeyObfuscator , entropy_source : RandomBytes ,
398405 ) -> Self {
399406 let locks = Mutex :: new ( HashMap :: new ( ) ) ;
400407 Self {
@@ -404,6 +411,7 @@ impl VssStoreInner {
404411 store_id,
405412 data_encryption_key,
406413 key_obfuscator,
414+ entropy_source,
407415 locks,
408416 }
409417 }
@@ -524,7 +532,7 @@ impl VssStoreInner {
524532 Error :: new ( ErrorKind :: Other , msg)
525533 } ) ?;
526534
527- let storable_builder = StorableBuilder :: new ( RandEntropySource ) ;
535+ let storable_builder = StorableBuilder :: new ( VssEntropySource ( & self . entropy_source ) ) ;
528536 let aad =
529537 if self . schema_version == VssSchemaVersion :: V1 { store_key. as_bytes ( ) } else { & [ ] } ;
530538 let decrypted = storable_builder. deconstruct ( storable, & self . data_encryption_key , aad) ?. 0 ;
@@ -545,7 +553,7 @@ impl VssStoreInner {
545553
546554 let store_key = self . build_obfuscated_key ( & primary_namespace, & secondary_namespace, & key) ;
547555 let vss_version = -1 ;
548- let storable_builder = StorableBuilder :: new ( RandEntropySource ) ;
556+ let storable_builder = StorableBuilder :: new ( VssEntropySource ( & self . entropy_source ) ) ;
549557 let aad =
550558 if self . schema_version == VssSchemaVersion :: V1 { store_key. as_bytes ( ) } else { & [ ] } ;
551559 let storable =
@@ -703,7 +711,7 @@ fn retry_policy() -> CustomRetryPolicy {
703711
704712async fn determine_and_write_schema_version (
705713 client : & VssClient < CustomRetryPolicy > , store_id : & String , data_encryption_key : [ u8 ; 32 ] ,
706- key_obfuscator : & KeyObfuscator ,
714+ key_obfuscator : & KeyObfuscator , entropy_source : & RandomBytes ,
707715) -> io:: Result < VssSchemaVersion > {
708716 // Build the obfuscated `vss_schema_version` key.
709717 let obfuscated_prefix = key_obfuscator. obfuscate ( & format ! { "{}#{}" , "" , "" } ) ;
@@ -734,7 +742,7 @@ async fn determine_and_write_schema_version(
734742 Error :: new ( ErrorKind :: Other , msg)
735743 } ) ?;
736744
737- let storable_builder = StorableBuilder :: new ( RandEntropySource ) ;
745+ let storable_builder = StorableBuilder :: new ( VssEntropySource ( entropy_source ) ) ;
738746 // Schema version was added starting with V1, so if set at all, we use the key as `aad`
739747 let aad = store_key. as_bytes ( ) ;
740748 let decrypted = storable_builder
@@ -778,7 +786,7 @@ async fn determine_and_write_schema_version(
778786 let schema_version = VssSchemaVersion :: V1 ;
779787 let encoded_version = schema_version. encode ( ) ;
780788
781- let storable_builder = StorableBuilder :: new ( RandEntropySource ) ;
789+ let storable_builder = StorableBuilder :: new ( VssEntropySource ( entropy_source ) ) ;
782790 let vss_version = -1 ;
783791 let aad = store_key. as_bytes ( ) ;
784792 let storable =
@@ -805,12 +813,18 @@ async fn determine_and_write_schema_version(
805813 }
806814}
807815
808- /// A source for generating entropy/randomness using [`rand`] .
809- pub ( crate ) struct RandEntropySource ;
816+ /// A thin wrapper bridging LDK's [`RandomBytes`] to the vss-client [`EntropySource`] trait .
817+ struct VssEntropySource < ' a > ( & ' a RandomBytes ) ;
810818
811- impl EntropySource for RandEntropySource {
819+ impl EntropySource for VssEntropySource < ' _ > {
812820 fn fill_bytes ( & self , buffer : & mut [ u8 ] ) {
813- rand:: rng ( ) . fill_bytes ( buffer) ;
821+ let mut offset = 0 ;
822+ while offset < buffer. len ( ) {
823+ let random = self . 0 . get_secure_random_bytes ( ) ;
824+ let to_copy = ( buffer. len ( ) - offset) . min ( 32 ) ;
825+ buffer[ offset..offset + to_copy] . copy_from_slice ( & random[ ..to_copy] ) ;
826+ offset += to_copy;
827+ }
814828 }
815829}
816830
0 commit comments