()
| 168 | |
| 169 | #[test] |
| 170 | fn rejects_tampered_mac() { |
| 171 | let secret = [0x11u8; 32]; |
| 172 | let expiry = SystemTime::now() |
| 173 | .duration_since(UNIX_EPOCH) |
| 174 | .unwrap() |
| 175 | .as_secs() |
| 176 | + 60; |
| 177 | let hex = issue_token(&secret, 1, expiry).unwrap(); |
| 178 | // Flip the last MAC byte. XOR with 0xFF so it always changes even |
| 179 | // if it was already 0x00 (a fixed "00" replacement would be a |
| 180 | // no-op ~1/256 of the time, since the MAC varies with the expiry). |
| 181 | let mut tampered = hex.clone(); |
| 182 | let len = tampered.len(); |
| 183 | let orig = u8::from_str_radix(&tampered[len - 2..len], 16).unwrap(); |
| 184 | tampered.replace_range(len - 2..len, &format!("{:02x}", orig ^ 0xFF)); |
| 185 | assert_eq!( |
| 186 | verify_token(&tampered, &secret).unwrap_err(), |
| 187 | TokenError::InvalidMac |
| 188 | ); |
| 189 | } |
| 190 | |
| 191 | #[test] |
| 192 | fn rejects_wrong_secret() { |
nothing calls this directly
no test coverage detected