@@ -47,21 +47,6 @@ static bool _is_unlocked_bip39 = false;
47
47
// Must be defined if _is_unlocked is true. ONLY ACCESS THIS WITH _copy_bip39_seed().
48
48
static uint8_t _retained_bip39_seed [64 ] = {0 };
49
49
50
- #ifdef TESTING
51
- void keystore_mock_unlocked (const uint8_t * seed , size_t seed_len , const uint8_t * bip39_seed )
52
- {
53
- _is_unlocked_device = seed != NULL ;
54
- if (seed != NULL ) {
55
- _seed_length = seed_len ;
56
- memcpy (_retained_seed , seed , seed_len );
57
- }
58
- _is_unlocked_bip39 = bip39_seed != NULL ;
59
- if (bip39_seed != NULL ) {
60
- memcpy (_retained_bip39_seed , bip39_seed , sizeof (_retained_bip39_seed ));
61
- }
62
- }
63
- #endif
64
-
65
50
/**
66
51
* We allow seeds of 16, 24 or 32 bytes.
67
52
*/
@@ -319,6 +304,25 @@ static void _free_string(char** str)
319
304
wally_free_string (* str );
320
305
}
321
306
307
+ static void _retain_seed (const uint8_t * seed , size_t seed_len )
308
+ {
309
+ memcpy (_retained_seed , seed , seed_len );
310
+ _seed_length = seed_len ;
311
+ }
312
+
313
+ USE_RESULT static bool _retain_bip39_seed (const uint8_t * bip39_seed )
314
+ {
315
+ memcpy (_retained_bip39_seed , bip39_seed , sizeof (_retained_bip39_seed ));
316
+ return true;
317
+ }
318
+
319
+ static void _delete_retained_seeds (void )
320
+ {
321
+ _seed_length = 0 ;
322
+ util_zero (_retained_seed , sizeof (_retained_seed ));
323
+ util_zero (_retained_bip39_seed , sizeof (_retained_bip39_seed ));
324
+ }
325
+
322
326
keystore_error_t keystore_unlock (
323
327
const char * password ,
324
328
uint8_t * remaining_attempts_out ,
@@ -354,8 +358,7 @@ keystore_error_t keystore_unlock(
354
358
Abort ("Seed has suddenly changed. This should never happen." );
355
359
}
356
360
} else {
357
- memcpy (_retained_seed , seed , seed_len );
358
- _seed_length = seed_len ;
361
+ _retain_seed (seed , seed_len );
359
362
_is_unlocked_device = true;
360
363
}
361
364
bitbox02_smarteeprom_reset_unlock_attempts ();
@@ -396,7 +399,9 @@ bool keystore_unlock_bip39(const char* mnemonic_passphrase)
396
399
mnemonic , mnemonic_passphrase , bip39_seed , sizeof (bip39_seed ), NULL ) != WALLY_OK ) {
397
400
return false;
398
401
}
399
- memcpy (_retained_bip39_seed , bip39_seed , sizeof (bip39_seed ));
402
+ if (!_retain_bip39_seed (bip39_seed )) {
403
+ return false;
404
+ }
400
405
_is_unlocked_bip39 = true;
401
406
return true;
402
407
}
@@ -405,9 +410,7 @@ void keystore_lock(void)
405
410
{
406
411
_is_unlocked_device = false;
407
412
_is_unlocked_bip39 = false;
408
- _seed_length = 0 ;
409
- util_zero (_retained_seed , sizeof (_retained_seed ));
410
- util_zero (_retained_bip39_seed , sizeof (_retained_bip39_seed ));
413
+ _delete_retained_seeds ();
411
414
}
412
415
413
416
bool keystore_is_locked (void )
@@ -789,3 +792,17 @@ bool keystore_secp256k1_schnorr_bip86_sign(
789
792
}
790
793
return secp256k1_schnorrsig_verify (ctx , sig64_out , msg32 , 32 , & pubkey ) == 1 ;
791
794
}
795
+
796
+ #ifdef TESTING
797
+ void keystore_mock_unlocked (const uint8_t * seed , size_t seed_len , const uint8_t * bip39_seed )
798
+ {
799
+ _is_unlocked_device = seed != NULL ;
800
+ if (seed != NULL ) {
801
+ _retain_seed (seed , seed_len );
802
+ }
803
+ _is_unlocked_bip39 = bip39_seed != NULL ;
804
+ if (bip39_seed != NULL ) {
805
+ memcpy (_retained_bip39_seed , bip39_seed , sizeof (_retained_bip39_seed ));
806
+ }
807
+ }
808
+ #endif
0 commit comments