Drop six unused crates, and align the rest with the workspace
Two problems, both invisible until the whole graph is looked at together. DEAD: num-bigint, sha2, num-traits, num-integer, cmac and cbc are declared here and referenced nowhere -- not in src, tests or benches. They were being compiled, audited and offered version bumps forever for no reason. Removing beats bumping. cbc nearly survived the sweep: a substring search for "cbc" matches 44 occurrences of ycbcr_to_rgb in the DVD subtitle decoder, so it looked used. Only a word-boundary search exposed it. SKEW: this crate was the outlier on every shared dependency -- aes 0.8, rand 0.8, base64 0.22.1 and zip 2 against 0.9 / 0.10 / 0.23 / 8 elsewhere. Cargo cannot unify across a major version, so it compiled BOTH: 32 duplicated crates in the freemkv binary's graph, including two complete AES implementations (aes 0.8 + 0.9, cipher 0.4 + 0.5), two digest stacks and two getrandom. Two crypto stacks in one product is worth removing on its own. The aes bump is an API rename -- BlockCipher-prefixed traits, Array for GenericArray -- and the obvious translation uses Array::from_slice, which the new version deprecates and clippy's -D warnings would reject. These use the From<[T; N]> conversion the crate points at instead. 3441 tests pass in debug and release. The AACS crypto here is covered by known-answer tests, so a byte-order or sizing mistake in that rename could not have passed.
This commit is contained in:
+4
-10
@@ -22,20 +22,14 @@ codegen-units = 1
|
|||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
sha1 = "0.10"
|
sha1 = "0.10"
|
||||||
sha2 = "0.10"
|
aes = "0.9"
|
||||||
aes = "0.8"
|
|
||||||
cbc = "0.1"
|
|
||||||
# Interim path dep for local cross-repo dev; the release script re-pins this to
|
# Interim path dep for local cross-repo dev; the release script re-pins this to
|
||||||
# `{ git = ".../freemkv-unlock", tag = "vX.Y.Z" }` before tagging libfreemkv (so
|
# `{ git = ".../freemkv-unlock", tag = "vX.Y.Z" }` before tagging libfreemkv (so
|
||||||
# the released tag resolves freemkv-unlock from git, not a sibling path).
|
# the released tag resolves freemkv-unlock from git, not a sibling path).
|
||||||
freemkv-unlock = { path = "../freemkv-unlock" }
|
freemkv-unlock = { path = "../freemkv-unlock" }
|
||||||
num-bigint = "0.4"
|
rand = "0.10"
|
||||||
num-traits = "0.2"
|
zip = { version = "8", default-features = false, features = ["deflate"] }
|
||||||
num-integer = "0.1"
|
base64 = "0.23"
|
||||||
rand = "0.8"
|
|
||||||
cmac = "0.7"
|
|
||||||
zip = { version = "2", default-features = false, features = ["deflate"] }
|
|
||||||
base64 = "0.22.1"
|
|
||||||
# Read-only XML DOM parser (pure Rust, forbid(unsafe_code), entity-expansion
|
# Read-only XML DOM parser (pure Rust, forbid(unsafe_code), entity-expansion
|
||||||
# bounded). Parses the HD-DVD Advanced-Content playlist `ADV_OBJ/VPLST000.XPL`
|
# bounded). Parses the HD-DVD Advanced-Content playlist `ADV_OBJ/VPLST000.XPL`
|
||||||
# — untrusted disc bytes — into authoritative titles/clips/chapters. A real
|
# — untrusted disc bytes — into authoritative titles/clips/chapters. A real
|
||||||
|
|||||||
+10
-6
@@ -4,7 +4,7 @@
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
use aes::Aes128;
|
use aes::Aes128;
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
use aes::cipher::{KeyInit, generic_array::GenericArray};
|
use aes::cipher::{Array, KeyInit};
|
||||||
|
|
||||||
use super::crypto::{aes_cbc_decrypt, aes_cbc_encrypt, aes_ecb_encrypt};
|
use super::crypto::{aes_cbc_decrypt, aes_cbc_encrypt, aes_ecb_encrypt};
|
||||||
// Only this module's test fixtures build CBC ciphertext by hand now — the
|
// Only this module's test fixtures build CBC ciphertext by hand now — the
|
||||||
@@ -418,7 +418,7 @@ pub(crate) fn decrypt_bus(unit: &mut [u8], read_data_key: &[u8; 16]) {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use super::super::crypto::aes_ecb_decrypt;
|
use super::super::crypto::aes_ecb_decrypt;
|
||||||
use super::*;
|
use super::*;
|
||||||
use aes::cipher::BlockEncrypt; // test fixtures build ciphertext directly
|
use aes::cipher::BlockCipherEncrypt; // test fixtures build ciphertext directly
|
||||||
|
|
||||||
/// [`encrypt_unit`] is the exact inverse of [`decrypt_unit`]: whatever an
|
/// [`encrypt_unit`] is the exact inverse of [`decrypt_unit`]: whatever an
|
||||||
/// authoring caller encrypts, the read path must recover byte-for-byte.
|
/// authoring caller encrypts, the read path must recover byte-for-byte.
|
||||||
@@ -725,7 +725,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CBC encrypt bytes 16..6143
|
// CBC encrypt bytes 16..6143
|
||||||
let cipher = Aes128::new(GenericArray::from_slice(&encrypt_key));
|
let cipher = Aes128::new(&encrypt_key.into());
|
||||||
let mut prev = AACS_IV;
|
let mut prev = AACS_IV;
|
||||||
let num_blocks = (ALIGNED_UNIT_LEN - 16) / 16;
|
let num_blocks = (ALIGNED_UNIT_LEN - 16) / 16;
|
||||||
for i in 0..num_blocks {
|
for i in 0..num_blocks {
|
||||||
@@ -733,7 +733,9 @@ mod tests {
|
|||||||
for j in 0..16 {
|
for j in 0..16 {
|
||||||
plain[off + j] ^= prev[j];
|
plain[off + j] ^= prev[j];
|
||||||
}
|
}
|
||||||
let mut block = GenericArray::clone_from_slice(&plain[off..off + 16]);
|
let mut chunk = [0u8; 16];
|
||||||
|
chunk.copy_from_slice(&plain[off..off + 16]);
|
||||||
|
let mut block: Array<u8, _> = chunk.into();
|
||||||
cipher.encrypt_block(&mut block);
|
cipher.encrypt_block(&mut block);
|
||||||
plain[off..off + 16].copy_from_slice(&block);
|
plain[off..off + 16].copy_from_slice(&block);
|
||||||
prev.copy_from_slice(&plain[off..off + 16]);
|
prev.copy_from_slice(&plain[off..off + 16]);
|
||||||
@@ -1496,7 +1498,7 @@ mod tests {
|
|||||||
let plain = unit.clone();
|
let plain = unit.clone();
|
||||||
|
|
||||||
// Forward: CBC-encrypt unit[s+16 .. s+2048] per sector under AACS IV.
|
// Forward: CBC-encrypt unit[s+16 .. s+2048] per sector under AACS IV.
|
||||||
let cipher = Aes128::new(GenericArray::from_slice(&rdk));
|
let cipher = Aes128::new(&rdk.into());
|
||||||
for s in (0..ALIGNED_UNIT_LEN).step_by(SECTOR_BYTES) {
|
for s in (0..ALIGNED_UNIT_LEN).step_by(SECTOR_BYTES) {
|
||||||
let mut prev = AACS_IV;
|
let mut prev = AACS_IV;
|
||||||
let body = s + 16;
|
let body = s + 16;
|
||||||
@@ -1507,7 +1509,9 @@ mod tests {
|
|||||||
for j in 0..16 {
|
for j in 0..16 {
|
||||||
unit[off + j] ^= prev[j];
|
unit[off + j] ^= prev[j];
|
||||||
}
|
}
|
||||||
let mut blk = GenericArray::clone_from_slice(&unit[off..off + 16]);
|
let mut chunk = [0u8; 16];
|
||||||
|
chunk.copy_from_slice(&unit[off..off + 16]);
|
||||||
|
let mut blk: Array<u8, _> = chunk.into();
|
||||||
cipher.encrypt_block(&mut blk);
|
cipher.encrypt_block(&mut blk);
|
||||||
unit[off..off + 16].copy_from_slice(&blk);
|
unit[off..off + 16].copy_from_slice(&blk);
|
||||||
prev.copy_from_slice(&unit[off..off + 16]);
|
prev.copy_from_slice(&unit[off..off + 16]);
|
||||||
|
|||||||
+10
-8
@@ -8,7 +8,7 @@
|
|||||||
//! content / keys / variant modules.
|
//! content / keys / variant modules.
|
||||||
|
|
||||||
use aes::Aes128;
|
use aes::Aes128;
|
||||||
use aes::cipher::{BlockDecrypt, BlockEncrypt, KeyInit, generic_array::GenericArray};
|
use aes::cipher::{Array, BlockCipherDecrypt, BlockCipherEncrypt, KeyInit};
|
||||||
|
|
||||||
/// Fixed IV used by AACS for all AES-CBC operations. [C] §2.1.2 (default CBC IV, `iv0`).
|
/// Fixed IV used by AACS for all AES-CBC operations. [C] §2.1.2 (default CBC IV, `iv0`).
|
||||||
pub(crate) const AACS_IV: [u8; 16] = [
|
pub(crate) const AACS_IV: [u8; 16] = [
|
||||||
@@ -39,13 +39,13 @@ pub(crate) fn new_cipher_for(key: &[u8; 16]) -> Aes128 {
|
|||||||
fn new_cipher(key: &[u8; 16]) -> Aes128 {
|
fn new_cipher(key: &[u8; 16]) -> Aes128 {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
KEY_EXPANSIONS.with(|c| c.set(c.get() + 1));
|
KEY_EXPANSIONS.with(|c| c.set(c.get() + 1));
|
||||||
Aes128::new(GenericArray::from_slice(key))
|
Aes128::new(&(*key).into())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// AES-128-ECB encrypt a single 16-byte block. [C] §2.1.1 (`AES-128E`).
|
/// AES-128-ECB encrypt a single 16-byte block. [C] §2.1.1 (`AES-128E`).
|
||||||
pub(crate) fn aes_ecb_encrypt(key: &[u8; 16], data: &[u8; 16]) -> [u8; 16] {
|
pub(crate) fn aes_ecb_encrypt(key: &[u8; 16], data: &[u8; 16]) -> [u8; 16] {
|
||||||
let cipher = Aes128::new(GenericArray::from_slice(key));
|
let cipher = Aes128::new(&(*key).into());
|
||||||
let mut block = GenericArray::clone_from_slice(data);
|
let mut block: Array<u8, _> = (*data).into();
|
||||||
cipher.encrypt_block(&mut block);
|
cipher.encrypt_block(&mut block);
|
||||||
let mut out = [0u8; 16];
|
let mut out = [0u8; 16];
|
||||||
out.copy_from_slice(&block);
|
out.copy_from_slice(&block);
|
||||||
@@ -54,8 +54,8 @@ pub(crate) fn aes_ecb_encrypt(key: &[u8; 16], data: &[u8; 16]) -> [u8; 16] {
|
|||||||
|
|
||||||
/// AES-128-ECB decrypt a single 16-byte block. [C] §2.1.1 (`AES-128D`).
|
/// AES-128-ECB decrypt a single 16-byte block. [C] §2.1.1 (`AES-128D`).
|
||||||
pub(crate) fn aes_ecb_decrypt(key: &[u8; 16], data: &[u8; 16]) -> [u8; 16] {
|
pub(crate) fn aes_ecb_decrypt(key: &[u8; 16], data: &[u8; 16]) -> [u8; 16] {
|
||||||
let cipher = Aes128::new(GenericArray::from_slice(key));
|
let cipher = Aes128::new(&(*key).into());
|
||||||
let mut block = GenericArray::clone_from_slice(data);
|
let mut block: Array<u8, _> = (*data).into();
|
||||||
cipher.decrypt_block(&mut block);
|
cipher.decrypt_block(&mut block);
|
||||||
let mut out = [0u8; 16];
|
let mut out = [0u8; 16];
|
||||||
out.copy_from_slice(&block);
|
out.copy_from_slice(&block);
|
||||||
@@ -88,7 +88,7 @@ pub(crate) fn aes_cbc_encrypt(key: &[u8; 16], data: &mut [u8]) {
|
|||||||
for j in 0..16 {
|
for j in 0..16 {
|
||||||
block[j] = data[offset + j] ^ prev[j];
|
block[j] = data[offset + j] ^ prev[j];
|
||||||
}
|
}
|
||||||
let mut ga = GenericArray::clone_from_slice(&block);
|
let mut ga: Array<u8, _> = block.into();
|
||||||
cipher.encrypt_block(&mut ga);
|
cipher.encrypt_block(&mut ga);
|
||||||
data[offset..offset + 16].copy_from_slice(&ga);
|
data[offset..offset + 16].copy_from_slice(&ga);
|
||||||
prev.copy_from_slice(&ga);
|
prev.copy_from_slice(&ga);
|
||||||
@@ -140,7 +140,9 @@ pub(crate) fn cbc_decrypt_blocks(cipher: &Aes128, data: &mut [u8]) {
|
|||||||
p.copy_from_slice(&data[(i - 1) * 16..i * 16]);
|
p.copy_from_slice(&data[(i - 1) * 16..i * 16]);
|
||||||
p
|
p
|
||||||
};
|
};
|
||||||
let mut block = GenericArray::clone_from_slice(&data[offset..offset + 16]);
|
let mut chunk = [0u8; 16];
|
||||||
|
chunk.copy_from_slice(&data[offset..offset + 16]);
|
||||||
|
let mut block: Array<u8, _> = chunk.into();
|
||||||
cipher.decrypt_block(&mut block);
|
cipher.decrypt_block(&mut block);
|
||||||
for j in 0..16 {
|
for j in 0..16 {
|
||||||
data[offset + j] = block[j] ^ prev[j];
|
data[offset + j] = block[j] ^ prev[j];
|
||||||
|
|||||||
+5
-5
@@ -5416,7 +5416,7 @@ mod tests {
|
|||||||
use crate::aacs::content::ALIGNED_UNIT_LEN;
|
use crate::aacs::content::ALIGNED_UNIT_LEN;
|
||||||
use crate::aacs::crypto::AACS_IV;
|
use crate::aacs::crypto::AACS_IV;
|
||||||
use aes::Aes128;
|
use aes::Aes128;
|
||||||
use aes::cipher::{BlockEncrypt, KeyInit, generic_array::GenericArray};
|
use aes::cipher::{Array, BlockCipherEncrypt, KeyInit};
|
||||||
let mut unit = clear[..ALIGNED_UNIT_LEN].to_vec();
|
let mut unit = clear[..ALIGNED_UNIT_LEN].to_vec();
|
||||||
// Flag the unit encrypted (CPI bits on byte 0) before key derivation so
|
// Flag the unit encrypted (CPI bits on byte 0) before key derivation so
|
||||||
// the recovered plaintext header matches and `decrypt_unit`'s CPI gate
|
// the recovered plaintext header matches and `decrypt_unit`'s CPI gate
|
||||||
@@ -5424,14 +5424,14 @@ mod tests {
|
|||||||
unit[0] |= 0xC0;
|
unit[0] |= 0xC0;
|
||||||
let mut header = [0u8; 16];
|
let mut header = [0u8; 16];
|
||||||
header.copy_from_slice(&unit[..16]);
|
header.copy_from_slice(&unit[..16]);
|
||||||
let cipher = Aes128::new(GenericArray::from_slice(uk));
|
let cipher = Aes128::new(&(*uk).into());
|
||||||
let mut blk = GenericArray::clone_from_slice(&header);
|
let mut blk: Array<u8, _> = header.into();
|
||||||
cipher.encrypt_block(&mut blk);
|
cipher.encrypt_block(&mut blk);
|
||||||
let mut dk = [0u8; 16];
|
let mut dk = [0u8; 16];
|
||||||
for i in 0..16 {
|
for i in 0..16 {
|
||||||
dk[i] = blk[i] ^ header[i];
|
dk[i] = blk[i] ^ header[i];
|
||||||
}
|
}
|
||||||
let bc = Aes128::new(GenericArray::from_slice(&dk));
|
let bc = Aes128::new(&dk.into());
|
||||||
let mut prev = AACS_IV;
|
let mut prev = AACS_IV;
|
||||||
let mut i = 16;
|
let mut i = 16;
|
||||||
while i + 16 <= ALIGNED_UNIT_LEN {
|
while i + 16 <= ALIGNED_UNIT_LEN {
|
||||||
@@ -5439,7 +5439,7 @@ mod tests {
|
|||||||
for j in 0..16 {
|
for j in 0..16 {
|
||||||
b[j] = unit[i + j] ^ prev[j];
|
b[j] = unit[i + j] ^ prev[j];
|
||||||
}
|
}
|
||||||
let mut g = GenericArray::clone_from_slice(&b);
|
let mut g: Array<u8, _> = b.into();
|
||||||
bc.encrypt_block(&mut g);
|
bc.encrypt_block(&mut g);
|
||||||
for j in 0..16 {
|
for j in 0..16 {
|
||||||
unit[i + j] = g[j];
|
unit[i + j] = g[j];
|
||||||
|
|||||||
+18
-14
@@ -85,7 +85,7 @@ fn css_is_scrambled_detection() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn aacs_decrypt_unit_roundtrip() {
|
fn aacs_decrypt_unit_roundtrip() {
|
||||||
use aes::Aes128;
|
use aes::Aes128;
|
||||||
use aes::cipher::{BlockEncrypt, KeyInit, generic_array::GenericArray};
|
use aes::cipher::{Array, BlockCipherEncrypt, KeyInit};
|
||||||
|
|
||||||
let unit_key = [0xAAu8; 16];
|
let unit_key = [0xAAu8; 16];
|
||||||
let aacs_iv: [u8; 16] = [
|
let aacs_iv: [u8; 16] = [
|
||||||
@@ -113,8 +113,8 @@ fn aacs_decrypt_unit_roundtrip() {
|
|||||||
let header: [u8; 16] = plain[..16].try_into().unwrap();
|
let header: [u8; 16] = plain[..16].try_into().unwrap();
|
||||||
|
|
||||||
// Step 1: AES-ECB encrypt header with unit key
|
// Step 1: AES-ECB encrypt header with unit key
|
||||||
let cipher_header = Aes128::new(GenericArray::from_slice(&unit_key));
|
let cipher_header = Aes128::new(&unit_key.into());
|
||||||
let mut block = GenericArray::clone_from_slice(&header);
|
let mut block: Array<u8, _> = header.into();
|
||||||
cipher_header.encrypt_block(&mut block);
|
cipher_header.encrypt_block(&mut block);
|
||||||
let mut derived = [0u8; 16];
|
let mut derived = [0u8; 16];
|
||||||
derived.copy_from_slice(&block);
|
derived.copy_from_slice(&block);
|
||||||
@@ -126,7 +126,7 @@ fn aacs_decrypt_unit_roundtrip() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Step 3: AES-CBC encrypt bytes 16..6144
|
// Step 3: AES-CBC encrypt bytes 16..6144
|
||||||
let cipher = Aes128::new(GenericArray::from_slice(&encrypt_key));
|
let cipher = Aes128::new(&encrypt_key.into());
|
||||||
let mut prev = aacs_iv;
|
let mut prev = aacs_iv;
|
||||||
let num_blocks = (aacs::content::ALIGNED_UNIT_LEN - 16) / 16;
|
let num_blocks = (aacs::content::ALIGNED_UNIT_LEN - 16) / 16;
|
||||||
for i in 0..num_blocks {
|
for i in 0..num_blocks {
|
||||||
@@ -134,7 +134,9 @@ fn aacs_decrypt_unit_roundtrip() {
|
|||||||
for j in 0..16 {
|
for j in 0..16 {
|
||||||
plain[off + j] ^= prev[j];
|
plain[off + j] ^= prev[j];
|
||||||
}
|
}
|
||||||
let mut blk = GenericArray::clone_from_slice(&plain[off..off + 16]);
|
let mut c_blk = [0u8; 16];
|
||||||
|
c_blk.copy_from_slice(&plain[off..off + 16]);
|
||||||
|
let mut blk: Array<u8, _> = c_blk.into();
|
||||||
cipher.encrypt_block(&mut blk);
|
cipher.encrypt_block(&mut blk);
|
||||||
plain[off..off + 16].copy_from_slice(&blk);
|
plain[off..off + 16].copy_from_slice(&blk);
|
||||||
prev.copy_from_slice(&plain[off..off + 16]);
|
prev.copy_from_slice(&plain[off..off + 16]);
|
||||||
@@ -215,7 +217,7 @@ fn aacs_disc_hash_deterministic() {
|
|||||||
#[test]
|
#[test]
|
||||||
fn aacs_decrypt_unit_key_roundtrip() {
|
fn aacs_decrypt_unit_key_roundtrip() {
|
||||||
use aes::Aes128;
|
use aes::Aes128;
|
||||||
use aes::cipher::{BlockEncrypt, KeyInit, generic_array::GenericArray};
|
use aes::cipher::{Array, BlockCipherEncrypt, KeyInit};
|
||||||
|
|
||||||
let vuk = [
|
let vuk = [
|
||||||
0x11u8, 0x14, 0x36, 0x0B, 0x10, 0xEE, 0x6E, 0xAC, 0x78, 0xAA, 0x4A, 0xC0, 0xB7, 0x52, 0xEA,
|
0x11u8, 0x14, 0x36, 0x0B, 0x10, 0xEE, 0x6E, 0xAC, 0x78, 0xAA, 0x4A, 0xC0, 0xB7, 0x52, 0xEA,
|
||||||
@@ -227,8 +229,8 @@ fn aacs_decrypt_unit_key_roundtrip() {
|
|||||||
];
|
];
|
||||||
|
|
||||||
// Encrypt: AES-ECB encrypt the unit key with VUK
|
// Encrypt: AES-ECB encrypt the unit key with VUK
|
||||||
let cipher = Aes128::new(GenericArray::from_slice(&vuk));
|
let cipher = Aes128::new(&vuk.into());
|
||||||
let mut block = GenericArray::clone_from_slice(&original_unit_key);
|
let mut block: Array<u8, _> = original_unit_key.into();
|
||||||
cipher.encrypt_block(&mut block);
|
cipher.encrypt_block(&mut block);
|
||||||
let mut encrypted_uk = [0u8; 16];
|
let mut encrypted_uk = [0u8; 16];
|
||||||
encrypted_uk.copy_from_slice(&block);
|
encrypted_uk.copy_from_slice(&block);
|
||||||
@@ -340,9 +342,9 @@ fn aacs_clear_unit_reports_not_encrypted() {
|
|||||||
/// Independent AES-128-ECB encrypt (uses `aes` crate directly, NOT our library).
|
/// Independent AES-128-ECB encrypt (uses `aes` crate directly, NOT our library).
|
||||||
fn ref_aes_ecb_encrypt(key: &[u8; 16], data: &[u8; 16]) -> [u8; 16] {
|
fn ref_aes_ecb_encrypt(key: &[u8; 16], data: &[u8; 16]) -> [u8; 16] {
|
||||||
use aes::Aes128;
|
use aes::Aes128;
|
||||||
use aes::cipher::{BlockEncrypt, KeyInit, generic_array::GenericArray};
|
use aes::cipher::{Array, BlockCipherEncrypt, KeyInit};
|
||||||
let cipher = Aes128::new(GenericArray::from_slice(key));
|
let cipher = Aes128::new(&(*key).into());
|
||||||
let mut block = GenericArray::clone_from_slice(data);
|
let mut block: Array<u8, _> = (*data).into();
|
||||||
cipher.encrypt_block(&mut block);
|
cipher.encrypt_block(&mut block);
|
||||||
let mut out = [0u8; 16];
|
let mut out = [0u8; 16];
|
||||||
out.copy_from_slice(&block);
|
out.copy_from_slice(&block);
|
||||||
@@ -352,8 +354,8 @@ fn ref_aes_ecb_encrypt(key: &[u8; 16], data: &[u8; 16]) -> [u8; 16] {
|
|||||||
/// Independent AES-128-CBC encrypt (uses `aes` crate directly, NOT our library).
|
/// Independent AES-128-CBC encrypt (uses `aes` crate directly, NOT our library).
|
||||||
fn ref_aes_cbc_encrypt(key: &[u8; 16], iv: &[u8; 16], data: &mut [u8]) {
|
fn ref_aes_cbc_encrypt(key: &[u8; 16], iv: &[u8; 16], data: &mut [u8]) {
|
||||||
use aes::Aes128;
|
use aes::Aes128;
|
||||||
use aes::cipher::{BlockEncrypt, KeyInit, generic_array::GenericArray};
|
use aes::cipher::{Array, BlockCipherEncrypt, KeyInit};
|
||||||
let cipher = Aes128::new(GenericArray::from_slice(key));
|
let cipher = Aes128::new(&(*key).into());
|
||||||
let mut prev = *iv;
|
let mut prev = *iv;
|
||||||
let num_blocks = data.len() / 16;
|
let num_blocks = data.len() / 16;
|
||||||
for i in 0..num_blocks {
|
for i in 0..num_blocks {
|
||||||
@@ -361,7 +363,9 @@ fn ref_aes_cbc_encrypt(key: &[u8; 16], iv: &[u8; 16], data: &mut [u8]) {
|
|||||||
for j in 0..16 {
|
for j in 0..16 {
|
||||||
data[off + j] ^= prev[j];
|
data[off + j] ^= prev[j];
|
||||||
}
|
}
|
||||||
let mut block = GenericArray::clone_from_slice(&data[off..off + 16]);
|
let mut c_block = [0u8; 16];
|
||||||
|
c_block.copy_from_slice(&data[off..off + 16]);
|
||||||
|
let mut block: Array<u8, _> = c_block.into();
|
||||||
cipher.encrypt_block(&mut block);
|
cipher.encrypt_block(&mut block);
|
||||||
data[off..off + 16].copy_from_slice(&block);
|
data[off..off + 16].copy_from_slice(&block);
|
||||||
prev.copy_from_slice(&data[off..off + 16]);
|
prev.copy_from_slice(&data[off..off + 16]);
|
||||||
|
|||||||
Reference in New Issue
Block a user