HMAC signature comparison is not timing-safe and is vulnerable to timing attacks.
SharedKey::sign() returns a Vec<u8> which has a non-constant-time equality implementation.
Hmac::finalize() returns a constant-time wrapper (<code>CtOutput</code>) which was discarded. Alternatively, Hmac has a constant-time verify() method.
The problem reported here is due to the following lines in SharedKey::sign() of the previous code:
let mut mac = HmacSha256::new_from_slice(key).unwrap();
mac.update(data);
Ok(mac.finalize().into_bytes().to_vec())
and the merged update changes the third line to directly verify with verify_slice.
Anyone who uses HS256 signature verification is vulnerably to Timing Attack that allows the attacker to forge a signature.
{
"github_reviewed": true,
"nvd_published_at": "2025-09-12T14:15:41Z",
"severity": "MODERATE",
"cwe_ids": [
"CWE-208"
],
"github_reviewed_at": "2025-09-12T21:11:13Z"
}