diff --git a/Cargo.lock b/Cargo.lock index edd00190..2a922df1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,8 +23,16 @@ name = "block-padding" version = "0.3.3" dependencies = [ "generic-array", + "rand_chacha", + "rand_core", ] +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + [[package]] name = "cmov" version = "0.3.0" @@ -76,6 +84,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "hex" version = "0.4.3" @@ -123,6 +142,12 @@ checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" name = "opaque-debug" version = "0.3.0" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro2" version = "1.0.66" @@ -141,6 +166,25 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "ryu" version = "1.0.15" @@ -207,6 +251,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wycheproof2blb" version = "0.1.0" diff --git a/block-padding/Cargo.toml b/block-padding/Cargo.toml index 6a049717..4af7ef18 100644 --- a/block-padding/Cargo.toml +++ b/block-padding/Cargo.toml @@ -13,8 +13,13 @@ categories = ["cryptography", "no-std"] [dependencies] generic-array = "0.14" +rand_core = { version = "0.6", features = ["getrandom"], optional = true } + +[dev-dependencies] +rand_chacha = "0.3" [features] +iso-10126 = ["rand_core"] std = [] [package.metadata.docs.rs] diff --git a/block-padding/src/lib.rs b/block-padding/src/lib.rs index be950cc6..153b8ae3 100644 --- a/block-padding/src/lib.rs +++ b/block-padding/src/lib.rs @@ -18,6 +18,9 @@ use core::fmt; pub use generic_array; use generic_array::{ArrayLength, GenericArray}; +#[cfg(feature = "iso-10126")] +use rand_core::{RngCore, SeedableRng}; + /// Padding types #[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum PadType { @@ -174,26 +177,6 @@ impl RawPadding for ZeroPadding { #[derive(Clone, Copy, Debug)] pub struct Pkcs7; -impl Pkcs7 { - #[inline] - fn unpad(block: &[u8], strict: bool) -> Result<&[u8], UnpadError> { - // TODO: use bounds to check it at compile time - if block.len() > 255 { - panic!("block size is too big for PKCS#7"); - } - let bs = block.len(); - let n = block[bs - 1]; - if n == 0 || n as usize > bs { - return Err(UnpadError); - } - let s = bs - n as usize; - if strict && block[s..bs - 1].iter().any(|&v| v != n) { - return Err(UnpadError); - } - Ok(&block[..s]) - } -} - impl RawPadding for Pkcs7 { const TYPE: PadType = PadType::Reversible; @@ -214,7 +197,20 @@ impl RawPadding for Pkcs7 { #[inline] fn raw_unpad(block: &[u8]) -> Result<&[u8], UnpadError> { - Pkcs7::unpad(block, true) + // TODO: use bounds to check it at compile time + if block.len() > 255 { + panic!("block size is too big for PKCS#7"); + } + let bs = block.len(); + let n = block[bs - 1]; + if n == 0 || n as usize > bs { + return Err(UnpadError); + } + let s = bs - n as usize; + if block[s..bs - 1].iter().any(|&v| v != n) { + return Err(UnpadError); + } + Ok(&block[..s]) } } @@ -225,32 +221,55 @@ impl RawPadding for Pkcs7 { /// ``` /// use block_padding::{Iso10126, Padding}; /// use generic_array::{GenericArray, typenum::U8}; +/// use rand_chacha::ChaCha8Rng; /// /// let msg = b"test"; /// let pos = msg.len(); /// let mut block: GenericArray:: = [0xff; 8].into(); /// block[..pos].copy_from_slice(msg); -/// Iso10126::pad(&mut block, pos); -/// assert_eq!(&block[..], b"test\x04\x04\x04\x04"); -/// let res = Iso10126::unpad(&block).unwrap(); +/// Iso10126::::pad(&mut block, pos); +/// assert_eq!(&block[..4], b"test"); +/// assert_eq!(block[7], b'\x04'); +/// let res = Iso10126::::unpad(&block).unwrap(); /// assert_eq!(res, msg); /// ``` +#[cfg(feature = "iso-10126")] #[derive(Clone, Copy, Debug)] -pub struct Iso10126; +pub struct Iso10126 { + rand: core::marker::PhantomData, +} -impl RawPadding for Iso10126 { +#[cfg(feature = "iso-10126")] +impl RawPadding for Iso10126 { const TYPE: PadType = PadType::Reversible; #[inline] fn raw_pad(block: &mut [u8], pos: usize) { - // Instead of generating random bytes as specified by Iso10126 we - // simply use Pkcs7 padding. - Pkcs7::raw_pad(block, pos) + // TODO: use bounds to check it at compile time + if block.len() > 255 { + panic!("block size is too big for ISO 10126"); + } + if pos >= block.len() { + panic!("`pos` is bigger or equal to block size"); + } + let bs = block.len(); + let mut rand = R::from_entropy(); + rand.fill_bytes(&mut block[pos..bs - 1]); + block[bs - 1] = (bs - pos) as u8; } #[inline] fn raw_unpad(block: &[u8]) -> Result<&[u8], UnpadError> { - Pkcs7::unpad(block, false) + // TODO: use bounds to check it at compile time + if block.len() > 255 { + panic!("block size is too big for ISO 10126"); + } + let bs = block.len(); + let n = block[bs - 1] as usize; + if n == 0 || n > bs { + return Err(UnpadError); + } + Ok(&block[..bs - n]) } }