pub mod crack;
pub mod lfsr;
pub(crate) mod tables;
use crate::disc::Extent;
use crate::sector::SectorReader;
#[derive(Debug, Clone)]
pub struct CssState {
pub title_key: [u8; 5],
}
pub fn crack_key(reader: &mut dyn SectorReader, extents: &[Extent]) -> Option<CssState> {
if extents.is_empty() {
return None;
}
let ext = &extents[0];
let mut sectors = Vec::new();
let count = ext.sector_count.min(10);
for i in 0..count {
let mut buf = vec![0u8; 2048];
if reader.read_sectors(ext.start_lba + i, 1, &mut buf).is_ok() {
sectors.push(buf);
}
}
let key = crack::crack_from_sectors(§ors)?;
Some(CssState { title_key: key })
}
pub fn descramble_sector(state: &CssState, sector: &mut [u8]) {
lfsr::descramble_sector(&state.title_key, sector);
}
pub fn is_scrambled(sector: &[u8]) -> bool {
sector.len() >= 2048 && (sector[0x14] >> 4) & 0x03 != 0
}