is_unit_encrypted read the TP_extra copy-control bits (byte 0), which are a copy-permission flag, not an encryption flag. On discs whose sampled units are clear navigation packets (PAT/PMT) those bits can be set while the unit is not scrambled, so a correct Unit Key was used to 'decrypt' already-plaintext data, produced garbage, and the key was wrongly treated as failing. Read the actual flag instead: the TS transport_scrambling_control bits (top two of TS-header byte 3 = byte 7 of the aligned unit, inside the clear seed). AACS encrypts whole aligned units, so this one packet's TSC reflects the unit. decrypt_unit now clears the TSC bits of every packet on the way out so the result is valid unscrambled TS. Tests updated to the TSC flag.
61 lines
1.9 KiB
TOML
61 lines
1.9 KiB
TOML
[package]
|
|
name = "libfreemkv"
|
|
version = "0.26.11"
|
|
edition = "2024"
|
|
rust-version = "1.86"
|
|
license = "AGPL-3.0-only"
|
|
description = "Open source raw disc access library for optical drives"
|
|
repository = "https://github.com/freemkv/libfreemkv"
|
|
keywords = ["bluray", "uhd", "optical", "scsi", "disc"]
|
|
categories = ["hardware-support", "multimedia"]
|
|
|
|
[dependencies]
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
sha1 = "0.10"
|
|
sha2 = "0.10"
|
|
aes = "0.8"
|
|
cbc = "0.1"
|
|
flate2 = "1"
|
|
num-bigint = "0.4"
|
|
num-traits = "0.2"
|
|
num-integer = "0.1"
|
|
rand = "0.8"
|
|
cmac = "0.7"
|
|
zip = { version = "2", default-features = false, features = ["deflate"] }
|
|
base64 = "0.22.1"
|
|
# Trace-level instrumentation for Disc::copy + SgIoTransport::execute. Permitted
|
|
# under project docs ("Acceptable strings: debug/trace logging"). Consumers (autorip)
|
|
# wire a tracing subscriber and pipe events into the JSONL debug log.
|
|
tracing = "0.1"
|
|
# Bounded MPSC channel with kernel-wakeup send_timeout. Used by `io::pipeline`
|
|
# so the halt-aware send/finish loops can BLOCK on consumer drain instead of
|
|
# polling — the 50 ms poll cadence of the previous mpsc-based impl capped mux
|
|
# throughput at ~1 MB/s (0.21.7).
|
|
crossbeam-channel = "0.5"
|
|
# Persistent work-stealing thread pool for parallel AACS unit
|
|
# decryption. Per-call std::thread::scope spawned fresh OS threads
|
|
# and that overhead dominated for typical batch sizes (60 units).
|
|
# rayon's global pool initialises once on first use.
|
|
rayon = "1"
|
|
# SIMD-accelerated bytestring search. Drives the HEVC/H.264 start-code
|
|
# scan in `mux::codec::h264::find_start_code` — naive byte-by-byte
|
|
# walk is ~500 MB/s single-thread on x86_64; memchr's vectorised
|
|
# `memmem::find` for the 3-byte `00 00 01` needle hits ~5 GB/s on
|
|
# AVX2-capable hosts.
|
|
memchr = "2"
|
|
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
libc = "0.2"
|
|
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
libc = "0.2"
|
|
|
|
[dev-dependencies]
|
|
tempfile = "3"
|
|
|
|
[[bench]]
|
|
name = "sgio_read"
|
|
harness = false
|
|
|