//! Versioned read-only superblock parser guest probe. use super::*; use os_vfs_superblock::{Error, Superblock, checksum, decode, encode_v1}; fn reseal(bytes: &mut [u8; os_vfs_superblock::SUPERBLOCK_BYTES]) { let digest = checksum(bytes); bytes[60..64].copy_from_slice(&digest.to_le_bytes()); } pub fn run(allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let frames_before = allocator.remaining_pages(); let valid = encode_v1(2048, 7).map_err(|_| "k1605-encode")?; if decode(&valid, 4096) != Ok(Superblock {version: 1, total_blocks: 2048, root_inode: 1, generation: 7}) { return Err("k1605-v1"); } write_line("TURKOS/OS/K1605-SB: V1=2048 GEN=7"); let mut newer = valid; newer[4..6].copy_from_slice(&2u16.to_le_bytes()); reseal(&mut newer); if decode(&newer, 4096) != Err(Error::UnsupportedVersion) { return Err("k1605-version"); } write_line("TURKOS/OS/K1605-SB: VERSION2=REJECTED"); let mut features = valid; features[6..8].copy_from_slice(&1u16.to_le_bytes()); reseal(&mut features); if decode(&features, 4096) != Err(Error::UnsupportedFeatures) { return Err("k1605-features"); } write_line("TURKOS/OS/K1605-SB: FEATURES=REJECTED"); if decode(&valid, 2047) != Err(Error::BadGeometry) { return Err("k1605-geometry"); } write_line("TURKOS/OS/K1605-SB: GEOMETRY=REJECTED"); let mut corrupt = valid; corrupt[60] ^= 1; let mut reserved = valid; reserved[40] = 1; reseal(&mut reserved); if decode(&corrupt, 4096) != Err(Error::BadChecksum) || decode(&reserved, 4096) != Err(Error::BadReserved) || allocator.remaining_pages() != frames_before { return Err("k1605-corrupt"); } write_line("TURKOS/OS/K1605-SB: CORRUPTION=REJECTED FRAMES=UNCHANGED"); Ok(()) }