use libfreemkv::{aacs, decrypt::DecryptKeys};
#[test]
fn decrypt_sectors_with_aacs_keys_works() {
let mut unit = vec![0xFFu8; aacs::ALIGNED_UNIT_LEN];
unit[0] |= 0xC0;
for (i, byte) in unit
.iter_mut()
.enumerate()
.take(aacs::ALIGNED_UNIT_LEN)
.skip(1)
{
*byte = ((i * 3 + 7) & 0xFF) as u8;
}
let unit_key: [u8; 16] = [0xAAu8; 16];
aacs::decrypt_unit(&mut unit, &unit_key);
let keys = DecryptKeys::Aacs {
unit_keys: vec![(0u32, unit_key)],
read_data_key: None,
};
let result = libfreemkv::decrypt::decrypt_sectors(&mut unit, &keys, 0);
assert!(
result.is_ok(),
"decrypt_sectors with AACS keys should not error"
);
}
#[test]
fn decrypt_sectors_with_none_keys_is_noop() {
let mut sector = vec![0x42u8; 2048];
let keys = DecryptKeys::None;
let result = libfreemkv::decrypt::decrypt_sectors(&mut sector, &keys, 0);
assert!(result.is_ok());
assert_eq!(
§or[..],
&[0x42u8; 2048][..],
"DecryptKeys::None should not modify buffer"
);
}
#[test]
fn decrypt_sectors_with_css_keys_works() {
let mut sector = vec![0xFFu8; 2048];
sector[0x14] |= 0x30;
let title_key: [u8; 5] = [0x42, 0x13, 0x37, 0xBE, 0xEF]; let keys = DecryptKeys::Css { title_key };
libfreemkv::decrypt::decrypt_sectors(&mut sector, &keys, 0).unwrap();
assert_eq!(sector[0x14] & 0x30, 0x00, "CSS flag should be cleared");
}
#[test]
fn aacs_encryption_flag_detection() {
let mut unit = vec![0u8; aacs::ALIGNED_UNIT_LEN];
assert!(!aacs::is_unit_encrypted(&unit));
unit[0] |= 0x40;
assert!(aacs::is_unit_encrypted(&unit));
unit[0] = 0x80;
assert!(aacs::is_unit_encrypted(&unit));
unit[0] = 0xC0;
assert!(aacs::is_unit_encrypted(&unit));
}
#[test]
fn decrypt_keys_is_encrypted_variants() {
let none = DecryptKeys::None;
assert!(!none.is_encrypted());
let aacs = DecryptKeys::Aacs {
unit_keys: vec![],
read_data_key: None,
};
assert!(aacs.is_encrypted());
let css = DecryptKeys::Css {
title_key: [0u8; 5],
};
assert!(css.is_encrypted());
}