diff --git a/src/disc/mod.rs b/src/disc/mod.rs index c186cc99..6dacd18f 100644 --- a/src/disc/mod.rs +++ b/src/disc/mod.rs @@ -1778,12 +1778,12 @@ impl DiscId { } } -// Whether a live scan parses the file at `path` (absolute, any case), so the metadata -// prefetch bulk-loads it. On a BD tree only what the scan reads: the nav and clip files, -// BD-J objects, jar archives and the config files the labels read beside them, META XML, -// and the AACS files the capture reads first. Not /BDMV/BACKUP, BD-J image assets, -// /AACS/DUPLICATE or the other AACS files: a fallback read of one still works, unprefetched. -// Any other tree (DVD, HD DVD) keeps every file. +/// Whether a live scan parses the file at `path` (absolute, any case), so the metadata +/// prefetch bulk-loads it. On a BD tree only what the scan reads: the nav and clip files, +/// BD-J objects, jar archives and the config files the labels read beside them, META XML, +/// and the AACS files the capture reads first. Not /BDMV/BACKUP, BD-J image assets, +/// /AACS/DUPLICATE or the other AACS files: a fallback read of one still works, unprefetched. +/// Any other tree (DVD, HD DVD) keeps every file. pub(crate) fn scan_parses(bd: bool, path: &str) -> bool { if !bd { return true; @@ -2339,10 +2339,10 @@ impl Disc { Ok(crate::aacs::mkb::resolve_aacs_version(cert_major, mkb, index).major()) } - // Reads the AACS MKB's real record stream — NOT its ~128 MiB zero padding. Reads a bounded - // prefix (4 MiB holds a real MKB, ~4 MB on a UHD) and walks the record headers: a stream - // the prefix cuts is re-read with room for the record it cuts, never returned short. Also - // avoids the read_file MAX_FILE_BYTES cap. + /// Reads the AACS MKB's real record stream — NOT its ~128 MiB zero padding. Reads a bounded + /// prefix (4 MiB holds a real MKB, ~4 MB on a UHD) and walks the record headers: a stream + /// the prefix cuts is re-read with room for the record it cuts, never returned short. Also + /// avoids the read_file MAX_FILE_BYTES cap. fn read_mkb_content(reader: &mut dyn SectorSource, udf_fs: &udf::UdfFs) -> Result> { const START_BYTES: usize = 4 * 1024 * 1024; const MAX_BYTES: usize = 64 * 1024 * 1024; diff --git a/src/disc/mod_tests.rs b/src/disc/mod_tests.rs index 2fdd8315..2eaa19f0 100644 --- a/src/disc/mod_tests.rs +++ b/src/disc/mod_tests.rs @@ -5867,10 +5867,10 @@ fn read_capacity_rejects_a_short_transfer_instead_of_reporting_one_sector() { )); } -// The scan's metadata prefetch on a BD tree loads only what the scan parses: nav, clip, -// BD-J object, jar, META XML, the label config files beside the jars and the primary AACS -// files. Backups, duplicates, image assets and unread AACS files stay on the disc (a -// fallback read of one still works, unprefetched). Other trees keep every file. +/// The scan's metadata prefetch on a BD tree loads only what the scan parses: nav, clip, +/// BD-J object, jar, META XML, the label config files beside the jars and the primary AACS +/// files. Backups, duplicates, image assets and unread AACS files stay on the disc (a +/// fallback read of one still works, unprefetched). Other trees keep every file. #[test] fn scan_prefetches_only_the_files_a_bd_scan_parses() { for p in [ diff --git a/src/keys/resolve.rs b/src/keys/resolve.rs index 98903c5e..1220f9a9 100644 --- a/src/keys/resolve.rs +++ b/src/keys/resolve.rs @@ -551,12 +551,12 @@ fn scope_layout(ev: &KeyEvidence) -> (Option<&super::fmts::Layout>, Vec<(u32, u3 (layout, clip) } -// KS-14 [BD] §3.9.3: one declared CPS unit is one Unit Key for every stream file, so the disc -// is trusted as declared: the main title's samples ask the sources once, and the key that -// opens them keys every piece in scope. No per-piece probing (32 reads a piece: minutes of -// seeks on a many-clip disc). FMTS segment units are never samples; the segments are keyed -// by their forensic set. `None` (no ciphertext found, or no key opens it) falls back to the -// probed path, which decides clear content and refusals. +/// KS-14 [BD] §3.9.3: one declared CPS unit is one Unit Key for every stream file, so the disc +/// is trusted as declared: the main title's samples ask the sources once, and the key that +/// opens them keys every piece in scope. No per-piece probing (32 reads a piece: minutes of +/// seeks on a many-clip disc). FMTS segment units are never samples; the segments are keyed +/// by their forensic set. `None` (no ciphertext found, or no key opens it) falls back to the +/// probed path, which decides clear content and refusals. fn resolve_one_unit( ev: &KeyEvidence, sampler: &mut Sampler, @@ -643,12 +643,12 @@ fn resolve_one_unit( Ok(Some(inner)) } -// Several declared CPS units: each stream file sits in exactly one (KS-10), so one encrypted -// unit per piece (the first its probe grid finds, FMTS segment units skipped) names its key. -// The main title's samples ask first; pieces no held key opens then ask with their own units, -// at most `n_decl` requests. Every piece read clear and so do the forensic segments in scope: -// content in the clear, no source asked. `None` (a piece unreadable, or one no key opens) -// falls back to the probed path. +/// Several declared CPS units: each stream file sits in exactly one (KS-10), so one encrypted +/// unit per piece (the first its probe grid finds, FMTS segment units skipped) names its key. +/// The main title's samples ask first; pieces no held key opens then ask with their own units, +/// at most `n_decl` requests. Every piece read clear and so do the forensic segments in scope: +/// content in the clear, no source asked. `None` (a piece unreadable, or one no key opens) +/// falls back to the probed path. fn resolve_per_unit( ev: &KeyEvidence, sampler: &mut Sampler, @@ -715,9 +715,8 @@ fn resolve_per_unit( } } } - // Then, largest piece first, each still-unopened unit asks the sample-dependent sources - // with enough of its own ciphertext (topped up from pieces of the same title, KS-10), at - // most `n_decl` requests. One answer may open many pieces. A source that answers with no + // Largest piece first, each unopened unit asks with its own ciphertext (topped up from + // its title's pieces, KS-10), at most `n_decl` requests. A source that answers with no // key has none for this disc: it is not asked again. let mut budget = n_decl; let mut thin: Vec = Vec::new();