@@ -406,6 +406,172 @@ mod tests {
406406 set_salt_root ( original. as_slice ( ) . try_into ( ) . unwrap ( ) ) . unwrap ( ) ;
407407 }
408408
409+ #[ test]
410+ fn test_get_set_device_name ( ) {
411+ mock_memory ( ) ;
412+
413+ let original = get_device_name ( ) ;
414+ assert_eq ! ( original, "My BitBox" ) ;
415+
416+ let new_name = "Test device name" ;
417+
418+ set_device_name ( new_name) . unwrap ( ) ;
419+ assert_eq ! ( get_device_name( ) , new_name) ;
420+
421+ // A name with the maximum allowed length is accepted.
422+ let max_len_name = "DeviceName_ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxy" ;
423+ assert_eq ! ( max_len_name. len( ) , DEVICE_NAME_MAX_LEN ) ;
424+ set_device_name ( max_len_name) . unwrap ( ) ;
425+ assert_eq ! ( get_device_name( ) , max_len_name) ;
426+
427+ // Longer names are truncated to the maximum length.
428+ let long_name = format ! ( "{max_len_name}foobar" ) ;
429+ set_device_name ( & long_name) . unwrap ( ) ;
430+ let stored = get_device_name ( ) ;
431+ assert_eq ! ( stored, max_len_name) ;
432+
433+ // Invalid names are rejected and must not change the stored value.
434+ let invalid_names = [
435+ "" , // empty
436+ " name" , // leading space
437+ "name " , // trailing space
438+ "foo\n bar" , // control character
439+ "Ä" , // non-ASCII
440+ "漢字" , // non-ASCII
441+ ] ;
442+
443+ for invalid in invalid_names {
444+ assert ! ( set_device_name( invalid) . is_err( ) ) ;
445+ assert_eq ! ( get_device_name( ) , stored) ;
446+ }
447+ }
448+
449+ #[ test]
450+ fn test_is_set_initialized ( ) {
451+ mock_memory ( ) ;
452+
453+ assert ! ( !is_initialized( ) ) ;
454+ assert ! ( !is_seeded( ) ) ;
455+ assert ! ( set_initialized( ) . is_err( ) ) ;
456+
457+ let seed_data: Vec < u8 > = ( 0 ..96 ) . map ( |i| i as u8 ) . collect ( ) ;
458+ set_encrypted_seed_and_hmac ( & seed_data) . unwrap ( ) ;
459+ assert ! ( is_seeded( ) ) ;
460+ assert ! ( !is_initialized( ) ) ;
461+
462+ set_initialized ( ) . unwrap ( ) ;
463+ assert ! ( is_initialized( ) ) ;
464+ }
465+
466+ #[ test]
467+ fn test_mnemonic_passphrase_enabled_roundtrip ( ) {
468+ mock_memory ( ) ;
469+
470+ assert ! ( !is_mnemonic_passphrase_enabled( ) ) ;
471+
472+ set_mnemonic_passphrase_enabled ( true ) . unwrap ( ) ;
473+ assert ! ( is_mnemonic_passphrase_enabled( ) ) ;
474+
475+ set_mnemonic_passphrase_enabled ( false ) . unwrap ( ) ;
476+ assert ! ( !is_mnemonic_passphrase_enabled( ) ) ;
477+ }
478+
479+ #[ test]
480+ fn test_seed_birthdate_roundtrip ( ) {
481+ mock_memory ( ) ;
482+
483+ assert_eq ! ( get_seed_birthdate( ) , 0 ) ;
484+
485+ let timestamp: u32 = 0xABCDEF11 ;
486+ set_seed_birthdate ( timestamp) . unwrap ( ) ;
487+ assert_eq ! ( get_seed_birthdate( ) , timestamp) ;
488+ }
489+
490+ #[ test]
491+ fn test_ble_metadata_roundtrip ( ) {
492+ mock_memory ( ) ;
493+
494+ let new_metadata = BleMetadata {
495+ allowed_firmware_hash : [ 0x11u8 ; 32 ] ,
496+ active_index : 1 ,
497+ firmware_sizes : [ 1024u16 , 2048u16 ] ,
498+ firmware_checksums : [ 0xAAu8 , 0xBBu8 ] ,
499+ } ;
500+
501+ set_ble_metadata ( & new_metadata) . unwrap ( ) ;
502+ let readback = get_ble_metadata ( ) ;
503+
504+ assert_eq ! (
505+ readback. allowed_firmware_hash,
506+ new_metadata. allowed_firmware_hash
507+ ) ;
508+ assert_eq ! ( readback. active_index, new_metadata. active_index) ;
509+ assert_eq ! ( readback. firmware_sizes, new_metadata. firmware_sizes) ;
510+ assert_eq ! ( readback. firmware_checksums, new_metadata. firmware_checksums) ;
511+ }
512+
513+ #[ test]
514+ fn test_ble_enable_and_enabled ( ) {
515+ mock_memory ( ) ;
516+
517+ // Default after factory setup is BLE enabled.
518+ assert ! ( ble_enabled( ) ) ;
519+
520+ ble_enable ( false ) . unwrap ( ) ;
521+ assert ! ( !ble_enabled( ) ) ;
522+
523+ ble_enable ( true ) . unwrap ( ) ;
524+ assert ! ( ble_enabled( ) ) ;
525+ }
526+
527+ #[ test]
528+ fn test_noise_static_key_and_remote_pubkeys ( ) {
529+ mock_memory ( ) ;
530+
531+ let static_key = get_noise_static_private_key ( ) . unwrap ( ) ;
532+ assert ! ( static_key. iter( ) . any( |& b| b != 0xff ) ) ;
533+
534+ let pubkeys: [ [ u8 ; 32 ] ; 6 ] = [
535+ [ 0x11u8 ; 32 ] ,
536+ [ 0x22u8 ; 32 ] ,
537+ [ 0x33u8 ; 32 ] ,
538+ [ 0x44u8 ; 32 ] ,
539+ [ 0x55u8 ; 32 ] ,
540+ [ 0x66u8 ; 32 ] ,
541+ ] ;
542+
543+ // Initially, none of the pubkeys are stored.
544+ for key in pubkeys. iter ( ) {
545+ assert ! ( !check_noise_remote_static_pubkey( key) ) ;
546+ }
547+
548+ // Add the first five pubkeys. All added ones must be found, the rest not.
549+ for i in 0 ..5 {
550+ add_noise_remote_static_pubkey ( & pubkeys[ i] ) . unwrap ( ) ;
551+ for key in pubkeys. iter ( ) . take ( i + 1 ) {
552+ assert ! ( check_noise_remote_static_pubkey( key) ) ;
553+ }
554+ for key in pubkeys. iter ( ) . skip ( i + 1 ) {
555+ assert ! ( !check_noise_remote_static_pubkey( key) ) ;
556+ }
557+ }
558+
559+ // Adding a sixth pubkey should evict the oldest one and keep the
560+ // latest five.
561+ add_noise_remote_static_pubkey ( & pubkeys[ 5 ] ) . unwrap ( ) ;
562+ assert ! ( !check_noise_remote_static_pubkey( & pubkeys[ 0 ] ) ) ;
563+ for key in pubkeys. iter ( ) . skip ( 1 ) {
564+ assert ! ( check_noise_remote_static_pubkey( key) ) ;
565+ }
566+
567+ // Adding an already stored pubkey is a no-op.
568+ add_noise_remote_static_pubkey ( & pubkeys[ 5 ] ) . unwrap ( ) ;
569+ assert ! ( !check_noise_remote_static_pubkey( & pubkeys[ 0 ] ) ) ;
570+ for key in pubkeys. iter ( ) . skip ( 1 ) {
571+ assert ! ( check_noise_remote_static_pubkey( key) ) ;
572+ }
573+ }
574+
409575 static RAND_FIXTURES : [ [ u8 ; 32 ] ; 7 ] = [
410576 // salt root
411577 hex ! ( "bdb9ca4975e59e1b61d9141c5e79688cba7b3989b52b782de2e7e49b07ec8fae" ) ,
0 commit comments