@@ -111,14 +111,18 @@ fn unlock_bip39_finalize(bip39_seed: &[u8; 64]) -> Result<(), Error> {
111
111
}
112
112
}
113
113
114
- fn derive_bip39_seed (
114
+ async fn derive_bip39_seed (
115
115
secp : & Secp256k1 < All > ,
116
116
seed : & [ u8 ] ,
117
117
mnemonic_passphrase : & str ,
118
+ yield_now : impl AsyncFn ( usize ) ,
118
119
) -> ( zeroize:: Zeroizing < [ u8 ; 64 ] > , [ u8 ; 4 ] ) {
119
120
let mnemonic = bip39:: Mnemonic :: from_entropy_in ( bip39:: Language :: English , seed) . unwrap ( ) ;
120
- let bip39_seed: zeroize:: Zeroizing < [ u8 ; 64 ] > =
121
- zeroize:: Zeroizing :: new ( mnemonic. to_seed_normalized ( mnemonic_passphrase) ) ;
121
+ let bip39_seed: zeroize:: Zeroizing < [ u8 ; 64 ] > = zeroize:: Zeroizing :: new (
122
+ mnemonic
123
+ . to_seed_normalized_async ( mnemonic_passphrase, yield_now)
124
+ . await ,
125
+ ) ;
122
126
let root_fingerprint: [ u8 ; 4 ] =
123
127
bitcoin:: bip32:: Xpriv :: new_master ( bitcoin:: NetworkKind :: Main , bip39_seed. as_ref ( ) )
124
128
. unwrap ( )
@@ -132,14 +136,16 @@ fn derive_bip39_seed(
132
136
/// of `keystore_copy_seed()`).
133
137
/// `mnemonic_passphrase` is the bip39 passphrase used in the derivation. Use the empty string if no
134
138
/// passphrase is needed or provided.
135
- pub fn unlock_bip39 (
139
+ pub async fn unlock_bip39 (
136
140
secp : & Secp256k1 < All > ,
137
141
seed : & [ u8 ] ,
138
142
mnemonic_passphrase : & str ,
143
+ yield_now : impl AsyncFn ( usize ) ,
139
144
) -> Result < ( ) , Error > {
140
145
unlock_bip39_check ( seed) ?;
141
146
142
- let ( bip39_seed, root_fingerprint) = derive_bip39_seed ( secp, seed, mnemonic_passphrase) ;
147
+ let ( bip39_seed, root_fingerprint) =
148
+ derive_bip39_seed ( secp, seed, mnemonic_passphrase, yield_now) . await ;
143
149
144
150
unlock_bip39_finalize ( bip39_seed. as_slice ( ) . try_into ( ) . unwrap ( ) ) ?;
145
151
@@ -279,6 +285,7 @@ mod tests {
279
285
use bitcoin:: secp256k1;
280
286
281
287
use crate :: testing:: { mock_memory, mock_unlocked_using_mnemonic} ;
288
+ use util:: bb02_async:: block_on;
282
289
283
290
#[ test]
284
291
fn test_secp256k1_sign ( ) {
@@ -442,7 +449,15 @@ mod tests {
442
449
. unwrap ( ) ;
443
450
assert ! ( encrypt_and_store_seed( & seed, "password" ) . is_ok( ) ) ;
444
451
assert ! ( is_locked( ) ) ; // still locked, it is only unlocked after unlock_bip39.
445
- assert ! ( unlock_bip39( & secp256k1:: Secp256k1 :: new( ) , & seed, "foo" ) . is_ok( ) ) ;
452
+ assert ! (
453
+ block_on( unlock_bip39(
454
+ & secp256k1:: Secp256k1 :: new( ) ,
455
+ & seed,
456
+ "foo" ,
457
+ async |_idx| { }
458
+ ) )
459
+ . is_ok( )
460
+ ) ;
446
461
assert ! ( !is_locked( ) ) ;
447
462
lock ( ) ;
448
463
assert ! ( is_locked( ) ) ;
@@ -569,7 +584,12 @@ mod tests {
569
584
let secp = secp256k1:: Secp256k1 :: new ( ) ;
570
585
for test in tests {
571
586
let seed = hex:: decode ( test. seed ) . unwrap ( ) ;
572
- let ( bip39_seed, root_fingerprint) = derive_bip39_seed ( & secp, & seed, test. passphrase ) ;
587
+ let ( bip39_seed, root_fingerprint) = block_on ( derive_bip39_seed (
588
+ & secp,
589
+ & seed,
590
+ test. passphrase ,
591
+ async |_idx| { } ,
592
+ ) ) ;
573
593
assert_eq ! ( hex:: encode( bip39_seed) . as_str( ) , test. expected_bip39_seed) ;
574
594
assert_eq ! (
575
595
hex:: encode( root_fingerprint) . as_str( ) ,
@@ -597,9 +617,17 @@ mod tests {
597
617
assert ! ( encrypt_and_store_seed( & seed, "password" ) . is_ok( ) ) ;
598
618
assert ! ( root_fingerprint( ) . is_err( ) ) ;
599
619
// Incorrect seed passed
600
- assert ! ( unlock_bip39( & secp, b"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" , "foo" ) . is_err( ) ) ;
620
+ assert ! (
621
+ block_on( unlock_bip39(
622
+ & secp,
623
+ b"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ,
624
+ "foo" ,
625
+ async |_idx| { }
626
+ ) )
627
+ . is_err( )
628
+ ) ;
601
629
// Correct seed passed.
602
- assert ! ( unlock_bip39( & secp, & seed, "foo" ) . is_ok( ) ) ;
630
+ assert ! ( block_on ( unlock_bip39( & secp, & seed, "foo" , async |_idx| { } ) ) . is_ok( ) ) ;
603
631
assert_eq ! ( root_fingerprint( ) , Ok ( vec![ 0xf1 , 0xbc , 0x3c , 0x46 ] ) , ) ;
604
632
605
633
let expected_bip39_seed = hex:: decode ( "2b3c63de86f0f2b13cc6a36c1ba2314fbc1b40c77ab9cb64e96ba4d5c62fc204748ca6626a9f035e7d431bce8c9210ec0bdffc2e7db873dee56c8ac2153eee9a" ) . unwrap ( ) ;
0 commit comments