Skip to content

Commit 65aa464

Browse files
committed
Merge branch 'rust-memory-tests'
2 parents 6721459 + a5e2327 commit 65aa464

File tree

1 file changed

+166
-0
lines changed

1 file changed

+166
-0
lines changed

src/rust/bitbox02/src/memory.rs

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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\nbar", // 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

Comments
 (0)