use constant-time password verification

The password verification in RootKeys compared hashed passwords
byte-by-byte with an early return on mismatch. This leaks how many
leading bytes match through timing, weakening the protection that
bcrypt provides.

Replace the loop with subtle::ConstantTimeEq::ct_eq, which is
already used elsewhere in this crate (backups.rs, FPGA key check).

Signed-off-by: Finn Glas <finn@finnmglas.com>
This commit is contained in:
Finn Glas 2026-05-27 23:15:48 +02:00
parent 0b3b481322
commit 2eeacada70

View file

@ -882,28 +882,12 @@ impl<'a> RootKeys {
unsafe {
match pw_type {
PasswordType::Boot => {
if (*pcache_ptr).hashed_boot_pw_valid == 1 {
for (&src, &dst) in digest.iter().zip((*pcache_ptr).hashed_boot_pw.iter()) {
if dst != src {
return false;
}
}
true
} else {
false
}
(*pcache_ptr).hashed_boot_pw_valid == 1
&& bool::from(digest.ct_eq(&(*pcache_ptr).hashed_boot_pw))
}
PasswordType::Update => {
if (*pcache_ptr).hashed_update_pw_valid == 1 {
for (&src, &dst) in digest.iter().zip((*pcache_ptr).hashed_update_pw.iter()) {
if dst != src {
return false;
}
}
true
} else {
false
}
(*pcache_ptr).hashed_update_pw_valid == 1
&& bool::from(digest.ct_eq(&(*pcache_ptr).hashed_update_pw))
}
}
}