use super::hhat;
pub fn stc_extract(stego_bits: &[u8], hhat: &[Vec<u32>], w: usize) -> Vec<u8> {
if w == 0 {
return Vec::new();
}
let n = stego_bits.len();
let m = n.div_ceil(w);
let mut message = Vec::with_capacity(m);
let mut state = 0u32;
for i in 0..m {
let start = i * w;
let end = (start + w).min(n);
for j in start..end {
if stego_bits[j] & 1 != 0 {
let col_idx = j - start; state ^= hhat::column_packed(hhat, col_idx);
}
}
message.push((state & 1) as u8);
state >>= 1;
}
message
}
#[cfg(test)]
mod tests {
use super::*;
use super::super::hhat::generate_hhat;
#[test]
fn known_syndrome() {
let h = 3;
let w = 4;
let hhat = generate_hhat(h, w, &[99u8; 32]);
let stego = vec![0u8; 12]; let msg = stc_extract(&stego, &hhat, w);
assert_eq!(msg, vec![0, 0, 0]);
}
}