diff --git a/Cargo.lock b/Cargo.lock index 4b34fb3..237c498 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,33 +19,13 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher 0.2.5", -] - -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher 0.2.5", - "opaque-debug", -] - -[[package]] -name = "aesni" -version = "0.10.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" +checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" dependencies = [ - "cipher 0.2.5", - "opaque-debug", + "cfg-if", + "cipher", + "cpufeatures", ] [[package]] @@ -121,22 +101,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block-modes" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb03d1bed155d89dce0f845b7899b18a9a163e148fd004e1c28421a783e2d8e" -dependencies = [ - "block-padding", - "cipher 0.3.0", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - [[package]] name = "blz-nx" version = "1.0.1" @@ -215,20 +179,12 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array", -] - -[[package]] -name = "cipher" -version = "0.3.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" dependencies = [ - "generic-array", + "crypto-common", + "inout", ] [[package]] @@ -270,12 +226,13 @@ dependencies = [ [[package]] name = "cmac" -version = "0.5.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73d4de4f7724e5fe70addfb2bd37c2abd2f95084a429d7773b0b9645499b4272" +checksum = "606383658416244b8dc4b36f864ec1f86cb922b95c41a908fd07aeb01cad06fa" dependencies = [ - "crypto-mac", + "cipher", "dbl", + "digest", ] [[package]] @@ -303,24 +260,13 @@ dependencies = [ "typenum", ] -[[package]] -name = "crypto-mac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a" -dependencies = [ - "cipher 0.2.5", - "generic-array", - "subtle", -] - [[package]] name = "ctr" -version = "0.6.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ - "cipher 0.2.5", + "cipher", ] [[package]] @@ -353,6 +299,7 @@ checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] @@ -498,6 +445,15 @@ dependencies = [ "libc", ] +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "io-lifetimes" version = "1.0.3" @@ -544,15 +500,16 @@ version = "0.2.10" dependencies = [ "aes", "bit_field", - "block-modes", "blz-nx", "byteorder 1.4.3", "cargo-toml2", "cargo_metadata", + "cipher", "clap 4.0.32", "cmac", "ctr", "derive_more", + "digest", "dirs-next", "elf", "goblin", @@ -643,12 +600,6 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - [[package]] name = "ordered-multimap" version = "0.4.3" diff --git a/Cargo.toml b/Cargo.toml index fef3d93..515a63b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Thog "] license = "MIT/Apache-2.0" homepage = "https://github.com/MegatonHammer/linkle/" repository = "https://github.com/MegatonHammer/linkle/" -edition = "2018" +edition = "2021" description = "Nintendo file format manipulation library and tools." [[bin]] @@ -42,10 +42,11 @@ bit_field = "0.10" cargo-toml2 = { version = "1.3.2", optional = true } # This group of crates had some breaking changes, so we can't update them -block-modes = "0.8.1" -ctr = "0.6" -aes = "0.6" -cmac = "0.5" +cipher = "0.4.3" +digest = "0.10.6" +ctr = "0.9.2" +aes = "0.8.2" +cmac = "0.7.1" [features] binaries = ["structopt", "cargo_metadata", "semver", "scroll", "goblin", "clap", "cargo-toml2"] diff --git a/src/error.rs b/src/error.rs index 997d871..2284c44 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,4 +1,3 @@ -use block_modes::BlockModeError; use snafu::Snafu; use snafu::{Backtrace, GenerateImplicitData}; use std::io; @@ -24,11 +23,6 @@ pub enum Error { error: io::Error, backtrace: Backtrace, }, - #[snafu(display("Decryption failed"))] - BlockMode { - error: BlockModeError, - backtrace: Backtrace, - }, #[snafu(display("Error parsing the INI file: {}", error))] Ini { error: ini::Error, @@ -38,7 +32,7 @@ pub enum Error { Crypto { error: String, backtrace: Backtrace }, #[snafu(display("Invalid keyblob {}: {}.", id, error))] MacError { - error: cmac::crypto_mac::MacError, + error: digest::MacError, id: usize, backtrace: Backtrace, }, @@ -117,15 +111,6 @@ impl From for Error { } } -impl From for Error { - fn from(error: BlockModeError) -> Error { - Error::BlockMode { - error, - backtrace: Backtrace::generate(), - } - } -} - impl From for Error { fn from(error: serde_json::error::Error) -> Error { Error::Deserialization { error } @@ -143,8 +128,8 @@ impl From for Error { } } -impl From<(usize, cmac::crypto_mac::MacError)> for Error { - fn from((id, error): (usize, cmac::crypto_mac::MacError)) -> Error { +impl From<(usize, digest::MacError)> for Error { + fn from((id, error): (usize, digest::MacError)) -> Error { Error::MacError { error, id, diff --git a/src/pki.rs b/src/pki.rs index f755ca2..a3878f8 100644 --- a/src/pki.rs +++ b/src/pki.rs @@ -1,11 +1,10 @@ use crate::error::Error; -use aes::cipher::generic_array::GenericArray; -use aes::cipher::{BlockCipher, SyncStreamCipher}; use aes::Aes128; -use aes::NewBlockCipher; -use cmac::{Cmac, Mac, NewMac}; -use ctr::cipher::stream::NewStreamCipher; -use ctr::Ctr128; +use cipher::{ + generic_array::GenericArray, BlockDecrypt, BlockEncrypt, KeyInit, KeyIvInit, StreamCipher, +}; +use cmac::{Cmac, Mac}; +use ctr::Ctr128BE; use ini::{self, Properties}; use snafu::{Backtrace, GenerateImplicitData}; use std::fmt; @@ -56,13 +55,13 @@ impl Keyblob { let mut encrypted_keyblob = [0; 0xB0]; encrypted_keyblob[0x20..].copy_from_slice(&self.0); - let mut crypter = Ctr128::::new( + let mut crypter = as KeyIvInit>::new( GenericArray::from_slice(&key.0), GenericArray::from_slice(&encrypted_keyblob[0x10..0x20]), ); crypter.apply_keystream(&mut encrypted_keyblob[0x20..]); - let mut cmac = Cmac::::new_varkey(&mac_key.0[..]).unwrap(); + let mut cmac = as KeyInit>::new_from_slice(&mac_key.0[..]).unwrap(); cmac.update(&encrypted_keyblob[0x10..]); encrypted_keyblob[..0x10].copy_from_slice(cmac.finalize().into_bytes().as_slice()); Ok(EncryptedKeyblob(encrypted_keyblob)) @@ -79,12 +78,12 @@ impl EncryptedKeyblob { let mut keyblob = [0; 0x90]; keyblob.copy_from_slice(&self.0[0x20..]); - let mut cmac = Cmac::::new_varkey(&mac_key.0[..]).unwrap(); + let mut cmac = as KeyInit>::new_from_slice(&mac_key.0[..]).unwrap(); cmac.update(&self.0[0x10..]); - cmac.verify(&self.0[..0x10]) + cmac.verify(GenericArray::from_slice(&self.0[..0x10])) .map_err(|err| (keyblob_id, err))?; - let mut crypter = Ctr128::::new( + let mut crypter = Ctr128BE::::new( GenericArray::from_slice(&key.0), GenericArray::from_slice(&self.0[0x10..0x20]), );