Matthew Jackson de3f11f47d Redact HostCert Debug, surface dropped bus-key, add exact-CDB tests
- lib.rs: replace HostCert's derived Debug with a hand-written impl that
  redacts private_key/private_key_v2 (mirrors AacsAuth/Unlocked); keep Clone
  derived. Add a HostCert case to the Debug leak-guard tests.
- aacs/mod.rs: warn when the cert handshake drops a read_data_key (bus key)
  because the drive refused the fetch (read_data_key None + err Some) so the
  otherwise-invisible UHD bus-key failure is diagnosable. Public Unlocked
  type and return contract unchanged.
- mt1959: add byte-for-byte CDB assertions for variant_a's WRITE_BUFFER and
  0x45 verify read, and variant_b's Step-2 metadata read and Step-3
  write-extra CDBs.
- renesas: add a test where the A read fails, the knock runs, and the B read
  succeeds, asserting the knock CDB is issued between A and B.
- vid.rs: add a test for the Err-with-sense branch classifying as Ok(None)
  VID-miss, not Err(Transport).
- docs/freemkv-abi.md: correct the stale claim that a VID miss fails the
  unlock; full_unlock now returns Ok(Unlocked{vid:None}) on a VID miss.
2026-09-05 11:12:17 -07:00
2026-09-02 12:27:57 -07:00
2026-09-02 12:27:57 -07:00
2026-09-02 12:27:57 -07:00
2026-09-02 12:27:57 -07:00
2026-09-02 12:27:57 -07:00
2026-09-02 12:27:57 -07:00
2026-07-10 12:31:19 -07:00
2026-09-02 12:27:57 -07:00
2026-09-02 12:27:57 -07:00

License: MIT CI codecov

freemkv-unlock

The unlock layer for the freemkv toolchain.

An unlocker removes a drive-level bus-encryption barrier so the drive serves readable (de-bus'd / de-scrambled) sectors. Content-key decryption is a separate concern — the consumer's job.

This crate defines the Unlocker contract and a generic SCSI transport contract, and holds the self-contained unlocker modules. The consumer (libfreemkv) depends on this crate and dispatches through all_unlockers(); it never names an individual unlocker, and clients of libfreemkv are oblivious to unlockers entirely (as they are to the SCSI layer).

use freemkv_unlock::UnlockError;

// Drive-prep: try each unlocker's feature unlock until one claims the drive.
// `NotApplicable` means "not this unlocker's drive" — move on; a transport
// error means a dead bus — abort. `unlock_bus` follows the same contract for
// removing per-disc bus encryption.
for u in freemkv_unlock::all_unlockers() {
    match u.unlock_features(&mut scsi, &ctx) {
        Ok(unlocked) => return Ok(unlocked),
        Err(UnlockError::NotApplicable) => continue,
        Err(e) => return Err(e),
    }
}

To remove an unlocker, delete its module directory and its one line in all_unlockers() — nothing else changes.

License

freemkv-unlock's own source is MIT — see LICENSE.

src/ld/profiles.json bundles volatile, RAM-only LibreDrive microcode authored and owned by the MakeMKV team (GuinpinSoft inc.) — Copyright (c) MakeMKV team, all rights reserved. That microcode is third-party proprietary material, not covered by the MIT license; no ownership is claimed. See NOTICE. With thanks to the MakeMKV team for LibreDrive.

S
Description
No description provided
Readme MIT
1.3 MiB
Languages
Rust 100%