use digest::dev::{feed_rand_16mib, fixed_reset_test};
use hex_literal::hex;
use sha1_checked::{Digest, Sha1};
digest::new_test!(sha1_checked_main, "sha1", Sha1, fixed_reset_test);
#[test]
fn sha1_rand() {
let mut h = Sha1::new();
feed_rand_16mib(&mut h);
assert_eq!(
&h.finalize()[..],
hex!("7e565a25a8b123e9881addbcedcd927b23377a78"),
);
}
#[test]
fn sha1_collision_rand() {
let mut h = Sha1::new();
feed_rand_16mib(&mut h);
assert_eq!(
&h.finalize()[..],
hex!("7e565a25a8b123e9881addbcedcd927b23377a78"),
);
}
#[cfg(feature = "std")]
#[test]
fn shambles_1() {
collision_test(
"./data/sha-mbles-1.bin",
hex!("8ac60ba76f1999a1ab70223f225aefdc78d4ddc0"),
hex!("4f3d9be4a472c4dae83c6314aa6c36a064c1fd14"),
None,
false,
false,
);
}
#[cfg(feature = "std")]
#[test]
fn shambles_2() {
collision_test(
"./data/sha-mbles-2.bin",
hex!("8ac60ba76f1999a1ab70223f225aefdc78d4ddc0"),
hex!("9ed5d77a4f48be1dbf3e9e15650733eb850897f2"),
None,
false,
false,
);
}
#[cfg(feature = "std")]
#[test]
fn shattered_1() {
collision_test(
"./data/shattered-1.pdf",
hex!("38762cf7f55934b34d179ae6a4c80cadccbb7f0a"),
hex!("16e96b70000dd1e7c85b8368ee197754400e58ec"),
Some(hex!("d3a1d09969c3b57113fd17b23e01dd3de74a99bb")),
false,
true,
);
}
#[cfg(feature = "std")]
#[test]
fn shattered_2() {
collision_test(
"./data/shattered-2.pdf",
hex!("38762cf7f55934b34d179ae6a4c80cadccbb7f0a"),
hex!("e1761773e6a35916d99f891b77663e6405313587"),
Some(hex!("92246b0b718f4c704d37bb025717cbc66babf102")),
false,
true,
);
}
#[cfg(feature = "std")]
#[test]
fn reducedsha_coll() {
collision_test(
"./data/sha1_reducedsha_coll.bin",
hex!("a56374e1cf4c3746499bc7c0acb39498ad2ee185"),
hex!("dd39885a2a5d8f59030b451e00cb45da9f9d3828"),
Some(hex!("dd39885a2a5d8f59030b451e00cb45da9f9d3828")),
true,
false,
);
}
#[cfg(feature = "std")]
fn collision_test(
input_path: &str,
hash: [u8; 20],
mitigated_hash: [u8; 20],
reduced_rounds_mitigated: Option<[u8; 20]>,
reduced_rounds: bool,
allow_skip: bool,
) {
let p = std::env::current_dir()
.unwrap()
.join("tests")
.join(input_path);
if !p.exists() && allow_skip {
eprintln!("SKIPPING TEST, data not available");
return;
}
let input = std::fs::read(p).unwrap();
let has_collision = true;
let mut ctx = Sha1::builder().detect_collision(false).build();
ctx.update(&input);
let d = ctx.try_finalize();
assert!(!d.has_collision());
assert_eq!(&d.hash()[..], hash,);
let mut ctx = Sha1::builder()
.safe_hash(false)
.reduced_round_collision(reduced_rounds)
.build();
ctx.update(&input);
let d = ctx.try_finalize();
assert_eq!(d.has_collision(), has_collision);
assert_eq!(&d.hash()[..], hash);
let mut ctx = Sha1::builder()
.safe_hash(false)
.use_ubc(false)
.reduced_round_collision(reduced_rounds)
.build();
ctx.update(&input);
let d = ctx.try_finalize();
assert_eq!(d.has_collision(), has_collision);
assert_eq!(&d.hash()[..], hash);
let mut ctx = Sha1::builder()
.reduced_round_collision(reduced_rounds)
.build();
ctx.update(&input);
let d = ctx.try_finalize();
assert_eq!(d.has_collision(), has_collision);
assert_eq!(&d.hash()[..], mitigated_hash);
if let Some(rr) = reduced_rounds_mitigated {
let mut ctx = Sha1::builder().reduced_round_collision(true).build();
ctx.update(&input);
let d = ctx.try_finalize();
assert_eq!(d.has_collision(), has_collision);
assert_eq!(&d.hash()[..], rr);
}
}