mux: conceal only genuinely-undecryptable units (padding-aware)
The P3 concealment loop in DecryptingSectorSource::read_sectors keyed on aacs_unit_needs_decrypt, whose sync check is the majority-vote ts_sync_destroyed (<=16 of 32 syncs). A successfully padding-aware- decrypted content-fragment TAIL unit (e.g. 11 content packets + 21 zero padding) has only 11 syncs, so the majority vote called it "still encrypted" — and when such a good unit shared a read buffer with a genuinely-undecryptable one (dropped>0), the loop overwrote the GOOD decrypted tail with NULL-TS, silently discarding correct video and over-counting concealed units vs the tallied dropped bytes. Add aacs_unit_still_ciphertext (padding-aware): encrypted AND at least one non-zero (non-padding) 192-byte packet missing its 0x47 sync — the same discriminator decrypt_unit uses to accept a fragment tail. The conceal loop now uses it, so only genuinely-unrestored ciphertext is concealed. Full and fully-ciphertext units are unchanged. Regression test: a decrypted short-padding-tail co-resident with a failed unit is left byte-for-byte intact while the failed unit is concealed.
This commit is contained in:
+4
-3
@@ -44,9 +44,10 @@ pub use trace::{KeyNode, KeyOutcome, KeyStep, ResolutionTrace, UnlockOutcome, Un
|
||||
// AES primitives (aes_ecb_encrypt, aes_ecb_decrypt, aes_cbc_decrypt) are pub(crate) in decrypt.rs.
|
||||
pub use decrypt::{
|
||||
ALIGNED_UNIT_LEN, ALIGNED_UNIT_SECTORS, UnitKeyResult, aacs_unit_encrypted,
|
||||
aacs_unit_needs_decrypt, decrypt_bus, decrypt_unit, decrypt_unit_checked, decrypt_unit_full,
|
||||
decrypt_unit_try_keys, fill_null_ts_unit, is_unit_aligned, ts_packet_total, ts_sync_count,
|
||||
ts_sync_destroyed, unit_is_clean_ps, unit_is_clean_ts, unit_key_validates,
|
||||
aacs_unit_needs_decrypt, aacs_unit_still_ciphertext, decrypt_bus, decrypt_unit,
|
||||
decrypt_unit_checked, decrypt_unit_full, decrypt_unit_try_keys, fill_null_ts_unit,
|
||||
is_unit_aligned, ts_packet_total, ts_sync_count, ts_sync_destroyed, unit_is_clean_ps,
|
||||
unit_is_clean_ts, unit_key_validates,
|
||||
};
|
||||
// `probe` is a reproduction-harness helper (see keys.rs), not part of the
|
||||
// documented 1.0 surface; keep it reachable but off the rendered docs so we
|
||||
|
||||
Reference in New Issue
Block a user