diff --git a/Cargo.lock b/Cargo.lock index 96e14ff..ab03524 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -39,6 +39,7 @@ dependencies = [ "blake2", "cpufeatures", "password-hash", + "rayon", "zeroize", ] @@ -211,6 +212,31 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" + [[package]] name = "crypto-common" version = "0.2.2" @@ -283,6 +309,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "either" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be" + [[package]] name = "errno" version = "0.3.14" @@ -697,6 +729,26 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "ring" version = "0.17.14" diff --git a/Cargo.toml b/Cargo.toml index 0fe0956..8266ff5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ repository = "https://github.com/andydixon/vault" publish = false [dependencies] -argon2 = { version = "0.6", default-features = false, features = ["alloc", "zeroize"] } +argon2 = { version = "0.6", default-features = false, features = ["alloc", "zeroize", "parallel"] } chacha20poly1305 = { version = "0.11", default-features = false, features = ["alloc", "zeroize"] } hkdf = "0.13" hmac = { version = "0.13", features = ["zeroize"] } @@ -44,3 +44,7 @@ strip = true [[bench]] name = "micro" harness = false + +[[bench]] +name = "aead_probe" +harness = false diff --git a/benches/aead_probe.rs b/benches/aead_probe.rs new file mode 100644 index 0000000..8835958 --- /dev/null +++ b/benches/aead_probe.rs @@ -0,0 +1,25 @@ +use chacha20poly1305::aead::{AeadInOut, KeyInit}; +use chacha20poly1305::{ChaCha20Poly1305, Key, Nonce}; +use std::time::Instant; +fn main() { + let c = ChaCha20Poly1305::new(&Key::from([1u8; 32])); + let mut buf = vec![0u8; 64 * 1024]; + let n = 1024; // 64 MiB + let t = Instant::now(); + for i in 0..n { + let mut nb = [0u8; 12]; + nb[3..11].copy_from_slice(&(i as u64).to_be_bytes()); + std::hint::black_box(c.encrypt_inout_detached(&Nonce::from(nb), &[], buf.as_mut_slice().into()).unwrap()); + } + let s = t.elapsed().as_secs_f64(); + println!("raw seal: {:.0} MB/s", (n * 65536) as f64 / s / 1e6); + let key = [1u8; 32]; + let data = vec![0u8; 64 << 20]; + let t = Instant::now(); + let mut out = Vec::with_capacity(data.len() + (1 << 20)); + vault::crypto::stream::seal_all(&key, &data, &mut out); + println!("seal_all: {:.0} MB/s", data.len() as f64 / t.elapsed().as_secs_f64() / 1e6); + let t = Instant::now(); + let n = vault::crypto::stream::open_all(&key, &mut out).unwrap(); + println!("open_all: {:.0} MB/s ({n})", data.len() as f64 / t.elapsed().as_secs_f64() / 1e6); +}