decrypt: one content-detected decryption stage; keep going past damage

Every input decrypts through one stage that detects its content, with
strict stale-CPI handling and partial units only at EOF. Damage no
longer ends a rip where usable content remains (E7031, UDF FID,
MPLS/CLPI truncation, whole-disc E7032). M2TS output declares tracks in
an HDMV PMT and paces PCR; network:// allows LAN and loopback and
is_blocked_ip is public; parity goldens pin today's outputs.
This commit is contained in:
Matthew Jackson
2026-09-30 20:11:59 -07:00
parent cf2171e11a
commit 81ecc8acce
70 changed files with 4697 additions and 821 deletions
+4 -4
View File
@@ -20,13 +20,13 @@ fn css_descramble_sector_roundtrip_via_public_api() {
};
let mut sector = vec![0xAAu8; 2048];
// Real scrambled DVD sectors are MPEG-2 PS packs, and the public API now
// requires the pack start code as well as the flag bits — byte 0x14 means
// something else entirely in an IFO or UDF sector.
// A real scrambled DVD-Video pack: pack header, then a PES whose MPEG-2 flags byte (0x14)
// carries the scramble bits. Byte 0x14 means something else in an IFO or UDF sector.
sector[0x00..0x04].copy_from_slice(&[0x00, 0x00, 0x01, 0xBA]);
sector[4] = 0x44; // '01': a 13818-1 pack
sector[0x0D] = 0xF8; // pack_stuffing_length 0
sector[0x14] = 0x30;
sector[0x0E..0x12].copy_from_slice(&[0x00, 0x00, 0x01, 0xE0]);
sector[0x14] = 0xB0;
sector[0x54..0x59].copy_from_slice(&[0xDE, 0xAD, 0xBE, 0xEF, 0x42]);
let original = sector.clone();
@@ -0,0 +1,25 @@
resolve-whole status = KeySetStatus { proven: 1, declared: Some(1), keyed: 1, clear: 0, lazy: 0, forensic: None, origin: Some("keydb"), best_effort: false, requests: 1 }
copy failed = E6000
copy blanked = 0
extract result = good=18432 unreadable=18432 complete=false halted=false files=[("BDMV/STREAM/00001.m2ts", 18432, 18432, true)]
extract out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:44fee6c3dc35a6f2a58b400893c22b7a
copy-raw failed = E6000
extract-raw result = good=18432 unreadable=18432 complete=false halted=false files=[("BDMV/STREAM/00001.m2ts", 18432, 18432, true)]
extract-raw out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:48e61cd82e2557534766b163f852bd66
resolve-title status = KeySetStatus { proven: 1, declared: Some(1), keyed: 1, clear: 0, lazy: 0, forensic: None, origin: Some("keydb"), best_effort: false, requests: 1 }
title-read = 0 bytes sha256:e3b0c44298fc1c149afbf4c8996fb924
title-read blanked = 0
title-read failed = E6000
iso-mkv outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
iso-mkv out o.mkv = 28578 bytes sha256:51db71260cb190c5bafb17544c8976ab
iso-m2ts outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
iso-m2ts out o.m2ts = 39360 bytes sha256:bf6571efb2ada7dc353acd6fb1dca21e
iso-null outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
iso-mkv-raw refused = E6008
iso-mkv-selection outcome = completed=true opened=true bytes=20016 errors=0 lost=0 streams=2 undelivered=[]
iso-mkv-selection out o.mkv = 21563 bytes sha256:cda2cf35944d0511ffd8de92d4a542fd
live-mkv refused = E6008
live-mkv out o.mkv = 493 bytes sha256:454f3eb165010aa1646faed1279583cf
live-mkv-raw refused = E6000
live-mkv-skip outcome = completed=true opened=true bytes=17910 errors=7 lost=6144 streams=3 undelivered=[]
live-mkv-skip out o.mkv = 19715 bytes sha256:732a5c67d1f32079e51a58cd87e8d82e
@@ -0,0 +1,28 @@
resolve-whole status = KeySetStatus { proven: 0, declared: Some(2), keyed: 0, clear: 2, lazy: 0, forensic: None, origin: None, best_effort: false, requests: 0 }
copy written = 8466432
copy image = 8466432 bytes sha256:98778a03e8af5deb127b504109f70589
copy blanked = 0
extract result = good=73728 unreadable=0 complete=true halted=false files=[("BDMV/STREAM/00001.m2ts", 36864, 0, true), ("BDMV/STREAM/00002.m2ts", 36864, 0, true)]
extract out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:368a55d7eca3e25f6af377a6f1aec041
extract out BDMV/STREAM/00002.m2ts = 36864 bytes sha256:368a55d7eca3e25f6af377a6f1aec041
copy-raw written = 8466432
copy-raw image = 8466432 bytes sha256:98778a03e8af5deb127b504109f70589
extract-raw result = good=73728 unreadable=0 complete=true halted=false files=[("BDMV/STREAM/00001.m2ts", 36864, 0, true), ("BDMV/STREAM/00002.m2ts", 36864, 0, true)]
extract-raw out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:368a55d7eca3e25f6af377a6f1aec041
extract-raw out BDMV/STREAM/00002.m2ts = 36864 bytes sha256:368a55d7eca3e25f6af377a6f1aec041
resolve-title status = KeySetStatus { proven: 0, declared: Some(2), keyed: 0, clear: 2, lazy: 0, forensic: None, origin: None, best_effort: false, requests: 0 }
title-read = 73728 bytes sha256:6b12cadf0d7bb63d7decc4a7663d3e52
title-read blanked = 0
iso-mkv outcome = completed=true opened=true bytes=52832 errors=0 lost=0 streams=3 undelivered=[]
iso-mkv out o.mkv = 56444 bytes sha256:5acfcd084d22d1df3913475317704196
iso-m2ts outcome = completed=true opened=true bytes=52832 errors=0 lost=0 streams=3 undelivered=[]
iso-m2ts out o.m2ts = 73920 bytes sha256:75f47cceb62e356629aec9b6bdb722c1
iso-null outcome = completed=true opened=true bytes=52832 errors=0 lost=0 streams=3 undelivered=[]
iso-mkv-raw outcome = completed=true opened=true bytes=52832 errors=0 lost=0 streams=3 undelivered=[]
iso-mkv-raw out o.mkv = 56444 bytes sha256:5acfcd084d22d1df3913475317704196
iso-mkv-selection outcome = completed=true opened=true bytes=40032 errors=0 lost=0 streams=2 undelivered=[]
iso-mkv-selection out o.mkv = 42528 bytes sha256:371978c9cf71c3d5c1a01fda23e9bcf9
live-mkv outcome = completed=true opened=true bytes=52832 errors=0 lost=0 streams=3 undelivered=[]
live-mkv out o.mkv = 56444 bytes sha256:5acfcd084d22d1df3913475317704196
live-mkv-raw outcome = completed=true opened=true bytes=52832 errors=0 lost=0 streams=3 undelivered=[]
live-mkv-raw out o.mkv = 56444 bytes sha256:5acfcd084d22d1df3913475317704196
@@ -0,0 +1,26 @@
resolve-whole status = KeySetStatus { proven: 2, declared: Some(2), keyed: 2, clear: 0, lazy: 0, forensic: None, origin: Some("keydb"), best_effort: false, requests: 1 }
copy written = 8466432
copy image = 8466432 bytes sha256:c6d26898508714516541998bf8f33456
copy blanked = 3
extract result = good=55296 unreadable=18432 complete=false halted=false files=[("BDMV/STREAM/00001.m2ts", 36864, 0, true), ("BDMV/STREAM/00002.m2ts", 18432, 18432, true)]
extract out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:368a55d7eca3e25f6af377a6f1aec041
extract out BDMV/STREAM/00002.m2ts = 36864 bytes sha256:1cee23a03e507c9e5103d108ada392ce
copy-raw written = 8466432
copy-raw image = 8466432 bytes sha256:d1ca43ed54cc80c47ce57969c335e303
extract-raw result = good=73728 unreadable=0 complete=true halted=false files=[("BDMV/STREAM/00001.m2ts", 36864, 0, true), ("BDMV/STREAM/00002.m2ts", 36864, 0, true)]
extract-raw out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:375559f987f4f85e585d39abe6eb12fa
extract-raw out BDMV/STREAM/00002.m2ts = 36864 bytes sha256:13f1bdfc43aac09ff1c4a0359cd3ccb6
resolve-title status = KeySetStatus { proven: 2, declared: Some(2), keyed: 2, clear: 0, lazy: 0, forensic: None, origin: Some("keydb"), best_effort: false, requests: 1 }
title-read = 73728 bytes sha256:5097bdccd3a8ecd9c3cda375a2153ba6
title-read blanked = 3
iso-mkv outcome = completed=true opened=true bytes=37424 errors=8 lost=18432 streams=3 undelivered=[]
iso-mkv out o.mkv = 39926 bytes sha256:339adfed83a9095dc0b4eea03ec907c8
iso-m2ts outcome = completed=true opened=true bytes=37424 errors=8 lost=18432 streams=3 undelivered=[]
iso-m2ts out o.m2ts = 52992 bytes sha256:eab70dc59a7d7bda01b3368baf5c8cc0
iso-null outcome = completed=true opened=true bytes=37424 errors=8 lost=18432 streams=3 undelivered=[]
iso-mkv-raw refused = E6008
iso-mkv-selection outcome = completed=true opened=true bytes=29232 errors=8 lost=18432 streams=2 undelivered=[]
iso-mkv-selection out o.mkv = 30979 bytes sha256:ce3203996e6720690f5de3d739a9ebc6
live-mkv outcome = completed=true opened=true bytes=37424 errors=8 lost=18432 streams=3 undelivered=[]
live-mkv out o.mkv = 39926 bytes sha256:339adfed83a9095dc0b4eea03ec907c8
live-mkv-raw refused = E6008
@@ -0,0 +1,27 @@
resolve-whole status = KeySetStatus { proven: 1, declared: Some(2), keyed: 1, clear: 0, lazy: 1, forensic: None, origin: Some("keydb"), best_effort: false, requests: 1 }
copy written = 8466432
copy image = 8466432 bytes sha256:f2dcc9c4d4d4139e9d6efdbdccb5718c
copy blanked = 6
extract result = good=36864 unreadable=36864 complete=false halted=false files=[("BDMV/STREAM/00001.m2ts", 36864, 0, true), ("BDMV/STREAM/00002.m2ts", 0, 36864, true)]
extract out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:368a55d7eca3e25f6af377a6f1aec041
extract out BDMV/STREAM/00002.m2ts = 36864 bytes sha256:1c0273095382988333e2f2b5ae487cea
copy-raw written = 8466432
copy-raw image = 8466432 bytes sha256:f0856c74bf5c9f7b6822186cafcaf1d6
extract-raw result = good=73728 unreadable=0 complete=true halted=false files=[("BDMV/STREAM/00001.m2ts", 36864, 0, true), ("BDMV/STREAM/00002.m2ts", 36864, 0, true)]
extract-raw out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:375559f987f4f85e585d39abe6eb12fa
extract-raw out BDMV/STREAM/00002.m2ts = 36864 bytes sha256:2d895155c02331f792c4fca0bfb881ea
resolve-title status = KeySetStatus { proven: 1, declared: Some(2), keyed: 1, clear: 0, lazy: 1, forensic: None, origin: Some("keydb"), best_effort: false, requests: 1 }
title-read = 36864 bytes sha256:368a55d7eca3e25f6af377a6f1aec041
title-read blanked = 0
title-read failed = E7022
iso-mkv refused = E7022
iso-mkv out o.mkv = 21863 bytes sha256:47337f351b04ebb679c0da200a04e94a
iso-m2ts refused = E7022
iso-m2ts out o.m2ts = 31488 bytes sha256:3a40b2a87a7e62135df01ead62597601
iso-null refused = E7022
iso-mkv-raw refused = E6008
iso-mkv-selection refused = E7022
iso-mkv-selection out o.mkv = 15124 bytes sha256:120947d4cc4150b1531e918c11865049
live-mkv refused = E7022
live-mkv out o.mkv = 21863 bytes sha256:47337f351b04ebb679c0da200a04e94a
live-mkv-raw refused = E6008
@@ -0,0 +1,26 @@
resolve-whole status = KeySetStatus { proven: 2, declared: Some(2), keyed: 2, clear: 0, lazy: 0, forensic: None, origin: Some("keydb"), best_effort: false, requests: 1 }
copy written = 8466432
copy image = 8466432 bytes sha256:98778a03e8af5deb127b504109f70589
copy blanked = 0
extract result = good=73728 unreadable=0 complete=true halted=false files=[("BDMV/STREAM/00001.m2ts", 36864, 0, true), ("BDMV/STREAM/00002.m2ts", 36864, 0, true)]
extract out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:368a55d7eca3e25f6af377a6f1aec041
extract out BDMV/STREAM/00002.m2ts = 36864 bytes sha256:368a55d7eca3e25f6af377a6f1aec041
copy-raw written = 8466432
copy-raw image = 8466432 bytes sha256:f0856c74bf5c9f7b6822186cafcaf1d6
extract-raw result = good=73728 unreadable=0 complete=true halted=false files=[("BDMV/STREAM/00001.m2ts", 36864, 0, true), ("BDMV/STREAM/00002.m2ts", 36864, 0, true)]
extract-raw out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:375559f987f4f85e585d39abe6eb12fa
extract-raw out BDMV/STREAM/00002.m2ts = 36864 bytes sha256:2d895155c02331f792c4fca0bfb881ea
resolve-title status = KeySetStatus { proven: 2, declared: Some(2), keyed: 2, clear: 0, lazy: 0, forensic: None, origin: Some("keydb"), best_effort: false, requests: 1 }
title-read = 73728 bytes sha256:6b12cadf0d7bb63d7decc4a7663d3e52
title-read blanked = 0
iso-mkv outcome = completed=true opened=true bytes=52832 errors=0 lost=0 streams=3 undelivered=[]
iso-mkv out o.mkv = 56444 bytes sha256:5acfcd084d22d1df3913475317704196
iso-m2ts outcome = completed=true opened=true bytes=52832 errors=0 lost=0 streams=3 undelivered=[]
iso-m2ts out o.m2ts = 73920 bytes sha256:75f47cceb62e356629aec9b6bdb722c1
iso-null outcome = completed=true opened=true bytes=52832 errors=0 lost=0 streams=3 undelivered=[]
iso-mkv-raw refused = E6008
iso-mkv-selection outcome = completed=true opened=true bytes=40032 errors=0 lost=0 streams=2 undelivered=[]
iso-mkv-selection out o.mkv = 42528 bytes sha256:371978c9cf71c3d5c1a01fda23e9bcf9
live-mkv outcome = completed=true opened=true bytes=52832 errors=0 lost=0 streams=3 undelivered=[]
live-mkv out o.mkv = 56444 bytes sha256:5acfcd084d22d1df3913475317704196
live-mkv-raw refused = E6008
@@ -0,0 +1,24 @@
resolve-whole status = KeySetStatus { proven: 1, declared: Some(1), keyed: 1, clear: 0, lazy: 0, forensic: None, origin: Some("keydb"), best_effort: false, requests: 1 }
copy written = 8429568
copy image = 8429568 bytes sha256:499099b58b2d57445e8d04cea9a7b4a1
copy blanked = 0
extract result = good=36864 unreadable=0 complete=true halted=false files=[("BDMV/STREAM/00001.m2ts", 36864, 0, true)]
extract out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:368a55d7eca3e25f6af377a6f1aec041
copy-raw written = 8429568
copy-raw image = 8429568 bytes sha256:4372cf8f58195b59c08ba93d47576bc9
extract-raw result = good=36864 unreadable=0 complete=true halted=false files=[("BDMV/STREAM/00001.m2ts", 36864, 0, true)]
extract-raw out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:375559f987f4f85e585d39abe6eb12fa
resolve-title status = KeySetStatus { proven: 1, declared: Some(1), keyed: 1, clear: 0, lazy: 0, forensic: None, origin: Some("keydb"), best_effort: false, requests: 1 }
title-read = 36864 bytes sha256:368a55d7eca3e25f6af377a6f1aec041
title-read blanked = 0
iso-mkv outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
iso-mkv out o.mkv = 28578 bytes sha256:51db71260cb190c5bafb17544c8976ab
iso-m2ts outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
iso-m2ts out o.m2ts = 39360 bytes sha256:bf6571efb2ada7dc353acd6fb1dca21e
iso-null outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
iso-mkv-raw refused = E6008
iso-mkv-selection outcome = completed=true opened=true bytes=20016 errors=0 lost=0 streams=2 undelivered=[]
iso-mkv-selection out o.mkv = 21563 bytes sha256:cda2cf35944d0511ffd8de92d4a542fd
live-mkv outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
live-mkv out o.mkv = 28578 bytes sha256:51db71260cb190c5bafb17544c8976ab
live-mkv-raw refused = E6008
@@ -0,0 +1,3 @@
extract result = good=860160 unreadable=0 complete=true halted=false files=[("VIDEO_TS/VTS_01_1.VOB", 430080, 0, true), ("VIDEO_TS/VTS_02_1.VOB", 430080, 0, true)]
extract out VIDEO_TS/VTS_01_1.VOB = 430080 bytes sha256:4f62f2019c87c5183c7015aeebdbf241
extract out VIDEO_TS/VTS_02_1.VOB = 430080 bytes sha256:4f62f2019c87c5183c7015aeebdbf241
@@ -0,0 +1,6 @@
phase0 status = KeySetStatus { proven: 2, declared: Some(2), keyed: 2, clear: 0, lazy: 0, forensic: Resolved, origin: Some("online"), best_effort: false, requests: 2 }
phase0 forensic-clip = 98304 bytes sha256:2f40ac12464652e99ffb371dc0ed2af6
phase0 copy = refused E7013
phase1 status = KeySetStatus { proven: 2, declared: Some(2), keyed: 2, clear: 0, lazy: 0, forensic: Resolved, origin: Some("online"), best_effort: false, requests: 3 }
phase1 forensic-clip = 98304 bytes sha256:5026938565e0cc00c6399f36f8fc1fa2
phase1 copy = refused E7013
@@ -0,0 +1,6 @@
resolve-whole status = KeySetStatus { proven: 1, declared: Some(1), keyed: 1, clear: 0, lazy: 0, forensic: None, origin: Some("keydb"), best_effort: true, requests: 1 }
copy written = 8460288
copy image = 8460288 bytes sha256:438eaf4106ce92a5550c5fa70574a2d2
extract result = good=61440 unreadable=6144 complete=false halted=false files=[("BDMV/index.bdmv", 0, 6144, true), ("HVDVD_TS/FEATURE.EVO", 61440, 0, true)]
extract out BDMV/index.bdmv = 6144 bytes sha256:fd9243e1ba57263ed469c3bdbd7ade6e
extract out HVDVD_TS/FEATURE.EVO = 61440 bytes sha256:9be03259626dabeb7c985b6930729f99
@@ -0,0 +1,24 @@
resolve-whole status = KeySetStatus { proven: 1, declared: Some(1), keyed: 1, clear: 0, lazy: 0, forensic: None, origin: Some("keydb"), best_effort: false, requests: 1 }
copy written = 8429568
copy image = 8429568 bytes sha256:499099b58b2d57445e8d04cea9a7b4a1
copy blanked = 0
extract result = good=36864 unreadable=0 complete=true halted=false files=[("BDMV/STREAM/00001.m2ts", 36864, 0, true)]
extract out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:368a55d7eca3e25f6af377a6f1aec041
copy-raw written = 8429568
copy-raw image = 8429568 bytes sha256:4372cf8f58195b59c08ba93d47576bc9
extract-raw result = good=36864 unreadable=0 complete=true halted=false files=[("BDMV/STREAM/00001.m2ts", 36864, 0, true)]
extract-raw out BDMV/STREAM/00001.m2ts = 36864 bytes sha256:375559f987f4f85e585d39abe6eb12fa
resolve-title status = KeySetStatus { proven: 1, declared: Some(1), keyed: 1, clear: 0, lazy: 0, forensic: None, origin: Some("keydb"), best_effort: false, requests: 1 }
title-read = 36864 bytes sha256:368a55d7eca3e25f6af377a6f1aec041
title-read blanked = 0
iso-mkv outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
iso-mkv out o.mkv = 28578 bytes sha256:51db71260cb190c5bafb17544c8976ab
iso-m2ts outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
iso-m2ts out o.m2ts = 39360 bytes sha256:bf6571efb2ada7dc353acd6fb1dca21e
iso-null outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
iso-mkv-raw refused = E6008
iso-mkv-selection outcome = completed=true opened=true bytes=20016 errors=0 lost=0 streams=2 undelivered=[]
iso-mkv-selection out o.mkv = 21563 bytes sha256:cda2cf35944d0511ffd8de92d4a542fd
live-mkv outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
live-mkv out o.mkv = 28578 bytes sha256:51db71260cb190c5bafb17544c8976ab
live-mkv-raw refused = E6008
@@ -0,0 +1,4 @@
strict refused = E6008
strict out o.mkv = 489 bytes sha256:8628b7bc94f1815e2948a4ce9f32c10f
skip outcome = completed=true opened=true bytes=17910 errors=7 lost=6144 streams=3 undelivered=[]
skip out o.mkv = 19705 bytes sha256:e8bf5f82342443c240a95385c881d3e2
@@ -0,0 +1,3 @@
keys = KeySetStatus { proven: 0, declared: Some(1), keyed: 0, clear: 0, lazy: 1, forensic: None, origin: None, best_effort: false, requests: 1 }
lazy outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
lazy out o.mkv = 28567 bytes sha256:bf1a6347d627e65f7580b67322dee4d5
@@ -0,0 +1,8 @@
scan = titles=1
keys = KeySetStatus { proven: 1, declared: Some(1), keyed: 1, clear: 0, lazy: 0, forensic: None, origin: Some("keydb"), best_effort: false, requests: 1 }
keyed outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
keyed out o.mkv = 28567 bytes sha256:bf1a6347d627e65f7580b67322dee4d5
keyless refused = E7022
keyed-again outcome = completed=true opened=true bytes=26416 errors=0 lost=0 streams=3 undelivered=[]
keyed-again out o.mkv = 28567 bytes sha256:bf1a6347d627e65f7580b67322dee4d5
raw refused = E6008
@@ -0,0 +1 @@
stop = Ok((false, 0, 0))
@@ -0,0 +1,3 @@
wire = 28510 bytes sha256:2b424f1d15a098c9389ff126ab11a83d
frames = 69
round-trip identical = true
@@ -0,0 +1,25 @@
mkv outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
mkv out o.mkv = 58232 bytes sha256:b25ee88e8f6935e99acf42fd476cc71d
mp4 refused = E9048
mp4 out o.mp4 = 0 bytes sha256:e3b0c44298fc1c149afbf4c8996fb924
mpg outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
mpg out o.mpg = 206852 bytes sha256:1fb67e840822afec9eab312490f39458
m2ts outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
m2ts out o.m2ts = 80256 bytes sha256:ab5d202fdf7ea5d2e5be98f01840be21
fvi outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
fvi out o.fvi = 6010 bytes sha256:b2c2689eb46dbb88df82ed4036805429
json outcome = completed=true opened=true bytes=0 errors=0 lost=0 streams=3 undelivered=[]
json out o.json = 1263 bytes sha256:040a1c5961ab0286333076150fbab37e
chapters outcome = completed=true opened=true bytes=0 errors=0 lost=0 streams=3 undelivered=[]
chapters out o.xml = 147 bytes sha256:1a73b20654e6b734d7388c10049455fb
demux outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
demux out o/title t00 MPEG2.m2v = 27880 bytes sha256:be8990c82ea9024deb38cdfb174bea80
demux out o/title t01 und AC3 DELAY 0ms.ac3 = 13312 bytes sha256:904e9e35a2990b1001d2d99baeb1a633
demux out o/title t02 und AC3 DELAY 0ms.ac3 = 13312 bytes sha256:48694b3013866911b7e0f20507ebb311
video outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
video out o/title t00 MPEG2.m2v = 27880 bytes sha256:be8990c82ea9024deb38cdfb174bea80
audio outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
audio out o/title t01 und AC3 DELAY 0ms.ac3 = 13312 bytes sha256:904e9e35a2990b1001d2d99baeb1a633
audio out o/title t02 und AC3 DELAY 0ms.ac3 = 13312 bytes sha256:48694b3013866911b7e0f20507ebb311
sub outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
null outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
@@ -0,0 +1,8 @@
mkv outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
mkv out o.mkv = 58232 bytes sha256:b25ee88e8f6935e99acf42fd476cc71d
m2ts outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
m2ts out o.m2ts = 80256 bytes sha256:ab5d202fdf7ea5d2e5be98f01840be21
demux outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
demux out o/title t00 MPEG2.m2v = 27880 bytes sha256:be8990c82ea9024deb38cdfb174bea80
demux out o/title t01 und AC3 DELAY 0ms.ac3 = 13312 bytes sha256:904e9e35a2990b1001d2d99baeb1a633
demux out o/title t02 und AC3 DELAY 0ms.ac3 = 13312 bytes sha256:48694b3013866911b7e0f20507ebb311
@@ -0,0 +1,10 @@
mkv outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
mkv out o.mkv = 58232 bytes sha256:b25ee88e8f6935e99acf42fd476cc71d
m2ts outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
m2ts out o.m2ts = 80256 bytes sha256:ab5d202fdf7ea5d2e5be98f01840be21
demux outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
demux out o/title t00 MPEG2.m2v = 27880 bytes sha256:be8990c82ea9024deb38cdfb174bea80
demux out o/title t01 und AC3 DELAY 0ms.ac3 = 13312 bytes sha256:904e9e35a2990b1001d2d99baeb1a633
demux out o/title t02 und AC3 DELAY 0ms.ac3 = 13312 bytes sha256:48694b3013866911b7e0f20507ebb311
json outcome = completed=true opened=true bytes=0 errors=0 lost=0 streams=3 undelivered=[]
json out o.json = 1263 bytes sha256:040a1c5961ab0286333076150fbab37e
@@ -0,0 +1,18 @@
mkv outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
mkv out o.mkv = 58232 bytes sha256:b25ee88e8f6935e99acf42fd476cc71d
mkv-src streams = v:Mpeg2:0x1011,a:Ac3:0x1100,a:Ac3:0x1101
mkv-src frames = 144
mkv-src frame-digest = 56952 bytes sha256:31b7c2bd3b6567b7ae3e221c83700597
mkv-src errors = 0 lost=0
mkv outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
mkv out o.mkv = 58240 bytes sha256:45714c430679de5252267609a053a2f5
mpg-src streams = v:Mpeg2:0xe0,a:Ac3:0xbd80,a:Ac3:0xbd81
mpg-src frames = 144
mpg-src frame-digest = 56952 bytes sha256:f0fec739fcfd4189d7be047dde0e4fb5
mpg-src errors = 0 lost=0
mkv outcome = completed=true opened=true bytes=54504 errors=0 lost=0 streams=3 undelivered=[]
mkv out o.mkv = 58232 bytes sha256:c51c6c8c17bd803887d5024a37952ba2
m2ts-src streams = v:Mpeg2:0x1011,a:Ac3:0x1100,a:Ac3:0x1101
m2ts-src frames = 144
m2ts-src frame-digest = 56952 bytes sha256:885d82d30957a6d1bb04f301c4b3e1f4
m2ts-src errors = 0 lost=0
@@ -0,0 +1,21 @@
clear frames = 144
clear frame-digest = 56808 bytes sha256:bf3c1d39e961e73e299c1724d9b02f13
clear blanked = 0
clear-keyed frames = 144
clear-keyed frame-digest = 56808 bytes sha256:bf3c1d39e961e73e299c1724d9b02f13
clear-keyed blanked = 0
stale-cpi frames = 144
stale-cpi frame-digest = 56808 bytes sha256:bf3c1d39e961e73e299c1724d9b02f13
stale-cpi blanked = 0
aacs-held-key frames = 144
aacs-held-key frame-digest = 56808 bytes sha256:bf3c1d39e961e73e299c1724d9b02f13
aacs-held-key blanked = 0
aacs-no-keys refused = E7022
aacs-wrong-key refused = E7022
aacs-raw refused = E6009
aacs-truncated frames = 133
aacs-truncated frame-digest = 53612 bytes sha256:efce90984f5d5261013c0993a90240df
aacs-truncated blanked = 1
aacs-damaged-unit frames = 123
aacs-damaged-unit frame-digest = 49408 bytes sha256:cda35d2f16131e47155e99bf0ab12863
aacs-damaged-unit blanked = 9
@@ -0,0 +1,14 @@
clear frames = 304
clear frame-digest = 114510 bytes sha256:2719568af5ba03412eca1096bdd5913a
clear blanked = 0
scrambled frames = 304
scrambled frame-digest = 114510 bytes sha256:2719568af5ba03412eca1096bdd5913a
scrambled blanked = 0
scrambled-raw frames = 251
scrambled-raw frame-digest = 107966 bytes sha256:69b84843c0860a5459b23ca497e28366
scrambled-raw blanked = 0
scrambled-as-mkv refused = E7023
mkv outcome = completed=true opened=true bytes=109646 errors=0 lost=0 streams=3 undelivered=[]
mkv out o.mkv = 116792 bytes sha256:a78c043cac5f3aea36f7b6471d335077
m2ts outcome = completed=true opened=true bytes=109646 errors=0 lost=0 streams=3 undelivered=[]
m2ts out o.m2ts = 163008 bytes sha256:05f5cf7a47850c8a1f8e7cbd15dc7596
+1 -1
View File
@@ -390,7 +390,7 @@ fn no_thread_sleep_on_op_paths() {
),
(
"src/mux/network.rs",
"accept_from_with_halt",
"accept_staged",
"halt-checked accept poll; open item: convert to Halt::wait",
),
];
+5 -4
View File
@@ -28,13 +28,14 @@ fn css_decrypt_of_an_uncrackable_sector_still_descrambles() {
// is not a rip failure — `attack_crib` is a heuristic, so this mismatch just
// means the cached key stands (CSS recoverability varies per sector, unlike AACS).
let mut sector = vec![0xFFu8; 2048];
// Scrambled DVD sectors are MPEG-2 PS packs. The descramble policy requires
// the pack start code as well as the flag bits, because byte 0x14 means
// something else entirely in an IFO, UDF or ISO 9660 sector.
// Scrambled DVD sectors are DVD-Video packs: the scramble bits are judged in the first
// PES header's MPEG-2 flags byte (0x14), because byte 0x14 means something else
// entirely in an IFO, UDF or ISO 9660 sector.
sector[0x00..0x04].copy_from_slice(&[0x00, 0x00, 0x01, 0xBA]);
sector[4] = 0x44; // '01': a 13818-1 pack
sector[0x0D] = 0xF8; // pack_stuffing_length 0
sector[0x14] |= 0x30; // CSS scramble flag, bits 4-5
sector[0x0E..0x12].copy_from_slice(&[0x00, 0x00, 0x01, 0xE0]);
sector[0x14] = 0xB0; // MPEG-2 flags, CSS scramble bits 4-5
let title_key: [u8; 5] = [0x42, 0x13, 0x37, 0xBE, 0xEF];
let mut keys = DecryptKeys::Css { title_key };
+1 -1
View File
@@ -79,4 +79,4 @@ src/mux/codec/lpcm.rs dvd_header MS-30
src/mux/mpg/scan.rs parse_map MS-8
src/mux/mpg/scan.rs parse_map MS-9
src/mux/mpg/scan.rs scan MS-23
src/css/mod.rs ps_scrambled_at MS-31
src/css/mod.rs scrambled_at MS-31