From d0517a0e5862c6463ca77aff0debf84d1076cc64 Mon Sep 17 00:00:00 2001 From: Tony Arcieri Date: Sun, 9 Nov 2025 17:21:21 -0700 Subject: [PATCH] frodo-kem: remove `safe-oqs` Closes: #109 #165 It would be good to be able to retain these equivalence tests, but they're pretty onerous for anyone trying to develop any KEM. --- Cargo.lock | 219 +----------------------- frodo-kem/Cargo.toml | 7 - frodo-kem/benches/safe_oqs.rs | 314 ---------------------------------- frodo-kem/src/hazmat.rs | 190 -------------------- frodo-kem/src/lib.rs | 43 ----- 5 files changed, 2 insertions(+), 771 deletions(-) delete mode 100644 frodo-kem/benches/safe_oqs.rs diff --git a/Cargo.lock b/Cargo.lock index de8f397..2df3ac4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -70,29 +70,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "itertools 0.10.5", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn", - "which", -] - [[package]] name = "bitflags" version = "2.8.0" @@ -108,15 +85,6 @@ dependencies = [ "hybrid-array", ] -[[package]] -name = "build-deps" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f14468960818ce4f3e3553c32d524446687884f8e7af5d3e252331d8a87e43" -dependencies = [ - "glob", -] - [[package]] name = "bumpalo" version = "3.16.0" @@ -144,15 +112,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - [[package]] name = "cfg-if" version = "1.0.0" @@ -209,17 +168,6 @@ dependencies = [ "inout", ] -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - [[package]] name = "clap" version = "4.5.26" @@ -245,15 +193,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" -[[package]] -name = "cmake" -version = "0.1.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" -dependencies = [ - "cc", -] - [[package]] name = "cobs" version = "0.2.3" @@ -286,7 +225,7 @@ dependencies = [ "ciborium", "clap", "criterion-plot", - "itertools 0.13.0", + "itertools", "num-traits", "oorandom", "plotters", @@ -305,7 +244,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b1bcc0dc7dfae599d84ad0b1a55f80cde8af3725da8313b528da95ef783e338" dependencies = [ "cast", - "itertools 0.13.0", + "itertools", ] [[package]] @@ -368,22 +307,6 @@ dependencies = [ "rand_core", ] -[[package]] -name = "cstr_core" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd98742e4fdca832d40cab219dc2e3048de17d873248f83f17df47c1bea70956" -dependencies = [ - "cty", - "memchr", -] - -[[package]] -name = "cty" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" - [[package]] name = "curve25519-dalek" version = "5.0.0-pre.1" @@ -494,16 +417,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" -[[package]] -name = "errno" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" -dependencies = [ - "libc", - "windows-sys", -] - [[package]] name = "ff" version = "0.14.0-pre.0" @@ -534,7 +447,6 @@ dependencies = [ "rand", "rand_core", "rstest", - "safe-oqs", "serde", "serde_bare", "serde_cbor", @@ -697,15 +609,6 @@ dependencies = [ "digest", ] -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys", -] - [[package]] name = "hybrid-array" version = "0.4.5" @@ -736,15 +639,6 @@ dependencies = [ "hybrid-array", ] -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -800,40 +694,12 @@ dependencies = [ "zeroize", ] -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" -[[package]] -name = "libloading" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" -dependencies = [ - "cfg-if", - "windows-targets", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - [[package]] name = "lock_api" version = "0.4.12" @@ -856,12 +722,6 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "ml-kem" version = "0.3.0-pre.2" @@ -883,16 +743,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "num-bigint" version = "0.4.6" @@ -1068,16 +918,6 @@ dependencies = [ "serde", ] -[[package]] -name = "prettyplease" -version = "0.2.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb" -dependencies = [ - "proc-macro2", - "syn", -] - [[package]] name = "primefield" version = "0.14.0-rc.0" @@ -1227,12 +1067,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc_version" version = "0.4.1" @@ -1242,19 +1076,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - [[package]] name = "rustversion" version = "1.0.19" @@ -1267,30 +1088,6 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" -[[package]] -name = "safe-oqs" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65c25c81204cfb1cbc48e0cb17ee4fd79d93657facb728a840b03b2e259f55d9" -dependencies = [ - "cstr_core", - "libc", - "safe-oqs-sys", -] - -[[package]] -name = "safe-oqs-sys" -version = "0.10.0+liboqs-0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f8e4a7878d93a016f7c43521e789be3015ccac906fd3e4eaa4fd0bde7ae57b0" -dependencies = [ - "bindgen", - "build-deps", - "cmake", - "libc", - "pkg-config", -] - [[package]] name = "same-file" version = "1.0.6" @@ -1693,18 +1490,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - [[package]] name = "winapi-util" version = "0.1.9" diff --git a/frodo-kem/Cargo.toml b/frodo-kem/Cargo.toml index 6873f08..6f59f8f 100644 --- a/frodo-kem/Cargo.toml +++ b/frodo-kem/Cargo.toml @@ -86,7 +86,6 @@ hybrid-array = "0.4" rand = "0.10.0-rc.1" chacha20 = "0.10.0-rc.3" rstest = "0.26" -safe-oqs = { version = "0.10", default-features = false, features = ["frodokem"] } postcard = { version = "1.0", features = ["use-std"] } serde_bare = "0.5" serde_cbor = "0.11" @@ -103,12 +102,6 @@ features = [ ] rustdoc-args = ["--cfg", "docsrs"] -[[bench]] -name = "safe-oqs" -harness = false -path = "benches/safe_oqs.rs" -required-features = ["efrodo"] - [[bench]] name = "frodo" harness = false diff --git a/frodo-kem/benches/safe_oqs.rs b/frodo-kem/benches/safe_oqs.rs deleted file mode 100644 index ffc7d84..0000000 --- a/frodo-kem/benches/safe_oqs.rs +++ /dev/null @@ -1,314 +0,0 @@ -//! Benchmarking FrodoKEM against liboqs -use criterion::{ - BenchmarkGroup, Criterion, criterion_group, criterion_main, measurement::Measurement, -}; -use frodo_kem::*; -use rand_core::SeedableRng; - -fn bench_keygen(group: &mut BenchmarkGroup<'_, M>) { - let mut rng = chacha20::ChaCha8Rng::seed_from_u64(42); - group.bench_function("KeyGen 640Aes", |b| { - b.iter(|| { - let (_pk, _sk) = Algorithm::EphemeralFrodoKem640Aes.generate_keypair(&mut rng); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem640Aes).unwrap(); - group.bench_function("liboqs 640aes", |b| { - b.iter(|| { - let (_pk, _sk) = kem.keypair().unwrap(); - }); - }); - - group.bench_function("KeyGen 976Aes", |b| { - b.iter(|| { - let (_pk, _sk) = Algorithm::EphemeralFrodoKem976Aes.generate_keypair(&mut rng); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem976Aes).unwrap(); - group.bench_function("liboqs 976aes", |b| { - b.iter(|| { - let (_pk, _sk) = kem.keypair().unwrap(); - }); - }); - - group.bench_function("KeyGen 1344Aes", |b| { - b.iter(|| { - let (_pk, _sk) = Algorithm::EphemeralFrodoKem1344Aes.generate_keypair(&mut rng); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem1344Aes).unwrap(); - group.bench_function("liboqs 1344aes", |b| { - b.iter(|| { - let (_pk, _sk) = kem.keypair().unwrap(); - }); - }); - - group.bench_function("KeyGen 640Shake", |b| { - b.iter(|| { - let (_pk, _sk) = Algorithm::EphemeralFrodoKem640Shake.generate_keypair(&mut rng); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem640Shake).unwrap(); - group.bench_function("liboqs 640Shake", |b| { - b.iter(|| { - let (_pk, _sk) = kem.keypair().unwrap(); - }); - }); - - group.bench_function("KeyGen 976Shake", |b| { - b.iter(|| { - let (_pk, _sk) = Algorithm::EphemeralFrodoKem976Shake.generate_keypair(&mut rng); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem976Shake).unwrap(); - group.bench_function("liboqs 976Shake", |b| { - b.iter(|| { - let (_pk, _sk) = kem.keypair().unwrap(); - }); - }); - - group.bench_function("KeyGen 1344Shake", |b| { - b.iter(|| { - let (_pk, _sk) = Algorithm::EphemeralFrodoKem1344Shake.generate_keypair(&mut rng); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem1344Shake).unwrap(); - group.bench_function("liboqs 1344Shake", |b| { - b.iter(|| { - let (_pk, _sk) = kem.keypair().unwrap(); - }); - }); -} - -fn bench_encapsulate(group: &mut BenchmarkGroup<'_, M>) { - let mut rng = chacha20::ChaCha8Rng::seed_from_u64(42); - let (pk, _sk) = Algorithm::EphemeralFrodoKem640Aes.generate_keypair(&mut rng); - group.bench_function("Encapsulate 640Aes", |b| { - b.iter(|| { - let (_ct, _ss) = Algorithm::EphemeralFrodoKem640Aes - .encapsulate_with_rng(&pk, &mut rng) - .unwrap(); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem640Aes).unwrap(); - let (pk, _sk) = kem.keypair().unwrap(); - group.bench_function("liboqs encapsulate 640aes", |b| { - b.iter(|| { - let (_ct, _ss) = kem.encapsulate(&pk).unwrap(); - }); - }); - - let (pk, _sk) = Algorithm::EphemeralFrodoKem976Aes.generate_keypair(&mut rng); - group.bench_function("Encapsulate 976Aes", |b| { - b.iter(|| { - let (_ct, _ss) = Algorithm::EphemeralFrodoKem976Aes - .encapsulate_with_rng(&pk, &mut rng) - .unwrap(); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem976Aes).unwrap(); - let (pk, _sk) = kem.keypair().unwrap(); - group.bench_function("liboqs encapsulate 976aes", |b| { - b.iter(|| { - let (_ct, _ss) = kem.encapsulate(&pk).unwrap(); - }); - }); - - let (pk, _sk) = Algorithm::EphemeralFrodoKem1344Aes.generate_keypair(&mut rng); - group.bench_function("Encapsulate 1344Aes", |b| { - b.iter(|| { - let (_ct, _ss) = Algorithm::EphemeralFrodoKem1344Aes - .encapsulate_with_rng(&pk, &mut rng) - .unwrap(); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem1344Aes).unwrap(); - let (pk, _sk) = kem.keypair().unwrap(); - group.bench_function("liboqs encapsulate 1344aes", |b| { - b.iter(|| { - let (_ct, _ss) = kem.encapsulate(&pk).unwrap(); - }); - }); - - let (pk, _sk) = Algorithm::EphemeralFrodoKem640Shake.generate_keypair(&mut rng); - group.bench_function("Encapsulate 640Shake", |b| { - b.iter(|| { - let (_ct, _ss) = Algorithm::EphemeralFrodoKem640Shake - .encapsulate_with_rng(&pk, &mut rng) - .unwrap(); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem640Shake).unwrap(); - let (pk, _sk) = kem.keypair().unwrap(); - group.bench_function("liboqs encapsulate 640Shake", |b| { - b.iter(|| { - let (_ct, _ss) = kem.encapsulate(&pk).unwrap(); - }); - }); - - let (pk, _sk) = Algorithm::EphemeralFrodoKem976Shake.generate_keypair(&mut rng); - group.bench_function("Encapsulate 976Shake", |b| { - b.iter(|| { - let (_ct, _ss) = Algorithm::EphemeralFrodoKem976Shake - .encapsulate_with_rng(&pk, &mut rng) - .unwrap(); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem976Shake).unwrap(); - let (pk, _sk) = kem.keypair().unwrap(); - group.bench_function("liboqs encapsulate 976Shake", |b| { - b.iter(|| { - let (_ct, _ss) = kem.encapsulate(&pk).unwrap(); - }); - }); - - let (pk, _sk) = Algorithm::EphemeralFrodoKem1344Shake.generate_keypair(&mut rng); - group.bench_function("Encapsulate 1344Shake", |b| { - b.iter(|| { - let (_ct, _ss) = Algorithm::EphemeralFrodoKem1344Shake - .encapsulate_with_rng(&pk, &mut rng) - .unwrap(); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem1344Shake).unwrap(); - let (pk, _sk) = kem.keypair().unwrap(); - group.bench_function("liboqs encapsulate 1344Shake", |b| { - b.iter(|| { - let (_ct, _ss) = kem.encapsulate(&pk).unwrap(); - }); - }); -} - -fn bench_decapsulate(group: &mut BenchmarkGroup<'_, M>) { - let mut rng = chacha20::ChaCha8Rng::seed_from_u64(42); - let (pk, sk) = Algorithm::EphemeralFrodoKem640Aes.generate_keypair(&mut rng); - let (ct, _ss) = Algorithm::EphemeralFrodoKem640Aes - .encapsulate_with_rng(&pk, &mut rng) - .unwrap(); - group.bench_function("Decapsulate 640Aes", |b| { - b.iter(|| { - let (_ss, _mu) = Algorithm::EphemeralFrodoKem640Aes - .decapsulate(&sk, &ct) - .unwrap(); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem640Aes).unwrap(); - let (pk, sk) = kem.keypair().unwrap(); - let (ct, _ss) = kem.encapsulate(&pk).unwrap(); - group.bench_function("liboqs decapsulate 640aes", |b| { - b.iter(|| { - let _ss = kem.decapsulate(&sk, &ct).unwrap(); - }); - }); - - let (pk, sk) = Algorithm::EphemeralFrodoKem976Aes.generate_keypair(&mut rng); - let (ct, _ss) = Algorithm::EphemeralFrodoKem976Aes - .encapsulate_with_rng(&pk, &mut rng) - .unwrap(); - group.bench_function("Decapsulate 976Aes", |b| { - b.iter(|| { - let (_ss, _mu) = Algorithm::EphemeralFrodoKem976Aes - .decapsulate(&sk, &ct) - .unwrap(); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem976Aes).unwrap(); - let (pk, sk) = kem.keypair().unwrap(); - let (ct, _ss) = kem.encapsulate(&pk).unwrap(); - group.bench_function("liboqs decapsulate 976aes", |b| { - b.iter(|| { - let _ss = kem.decapsulate(&sk, &ct).unwrap(); - }); - }); - - let (pk, sk) = Algorithm::EphemeralFrodoKem1344Aes.generate_keypair(&mut rng); - let (ct, _ss) = Algorithm::EphemeralFrodoKem1344Aes - .encapsulate_with_rng(&pk, &mut rng) - .unwrap(); - group.bench_function("Decapsulate 1344Aes", |b| { - b.iter(|| { - let (_ss, _mu) = Algorithm::EphemeralFrodoKem1344Aes - .decapsulate(&sk, &ct) - .unwrap(); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem1344Aes).unwrap(); - let (pk, sk) = kem.keypair().unwrap(); - let (ct, _ss) = kem.encapsulate(&pk).unwrap(); - group.bench_function("liboqs decapsulate 1344aes", |b| { - b.iter(|| { - let _ss = kem.decapsulate(&sk, &ct).unwrap(); - }); - }); - - let (pk, sk) = Algorithm::EphemeralFrodoKem640Shake.generate_keypair(&mut rng); - let (ct, _ss) = Algorithm::EphemeralFrodoKem640Shake - .encapsulate_with_rng(&pk, &mut rng) - .unwrap(); - group.bench_function("Decapsulate 640Shake", |b| { - b.iter(|| { - let (_ss, _mu) = Algorithm::EphemeralFrodoKem640Shake - .decapsulate(&sk, &ct) - .unwrap(); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem640Shake).unwrap(); - let (pk, sk) = kem.keypair().unwrap(); - let (ct, _ss) = kem.encapsulate(&pk).unwrap(); - group.bench_function("liboqs decapsulate 640Shake", |b| { - b.iter(|| { - let _ss = kem.decapsulate(&sk, &ct).unwrap(); - }); - }); - - let (pk, sk) = Algorithm::EphemeralFrodoKem976Shake.generate_keypair(&mut rng); - let (ct, _ss) = Algorithm::EphemeralFrodoKem976Shake - .encapsulate_with_rng(&pk, &mut rng) - .unwrap(); - group.bench_function("Decapsulate 976Shake", |b| { - b.iter(|| { - let (_ss, _mu) = Algorithm::EphemeralFrodoKem976Shake - .decapsulate(&sk, &ct) - .unwrap(); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem976Shake).unwrap(); - let (pk, sk) = kem.keypair().unwrap(); - let (ct, _ss) = kem.encapsulate(&pk).unwrap(); - group.bench_function("liboqs decapsulate 976Shake", |b| { - b.iter(|| { - let _ss = kem.decapsulate(&sk, &ct).unwrap(); - }); - }); - - let (pk, sk) = Algorithm::EphemeralFrodoKem1344Shake.generate_keypair(&mut rng); - let (ct, _ss) = Algorithm::EphemeralFrodoKem1344Shake - .encapsulate_with_rng(&pk, &mut rng) - .unwrap(); - group.bench_function("Decapsulate 1344Shake", |b| { - b.iter(|| { - let (_ss, _mu) = Algorithm::EphemeralFrodoKem1344Shake - .decapsulate(&sk, &ct) - .unwrap(); - }); - }); - let kem = safe_oqs::kem::Kem::new(safe_oqs::kem::Algorithm::FrodoKem1344Shake).unwrap(); - let (pk, sk) = kem.keypair().unwrap(); - let (ct, _ss) = kem.encapsulate(&pk).unwrap(); - group.bench_function("liboqs decapsulate 1344Shake", |b| { - b.iter(|| { - let _ss = kem.decapsulate(&sk, &ct).unwrap(); - }); - }); -} - -fn bench_against_liboqs(c: &mut Criterion) { - let mut group = c.benchmark_group("eFrodoKEM"); - bench_keygen(&mut group); - bench_encapsulate(&mut group); - bench_decapsulate(&mut group); - group.finish(); -} - -criterion_group!(benches, bench_against_liboqs); -criterion_main!(benches); diff --git a/frodo-kem/src/hazmat.rs b/frodo-kem/src/hazmat.rs index 675f6f7..aee023b 100644 --- a/frodo-kem/src/hazmat.rs +++ b/frodo-kem/src/hazmat.rs @@ -110,8 +110,6 @@ pub type EphemeralFrodoKem1344Shake = EphemeralFrodoKem< #[cfg(test)] mod tests { use super::*; - use rand_core::SeedableRng; - use rstest::*; #[test] fn parameter_calculations() { @@ -149,192 +147,4 @@ mod tests { assert_eq!(EphemeralFrodoKem640Shake::SECRET_KEY_LENGTH, 19888); assert_eq!(EphemeralFrodoKem640Shake::CIPHERTEXT_LENGTH, 9720); } - - #[rstest] - #[case::aes640( - EphemeralFrodoKem640Aes::default(), - safe_oqs::kem::Algorithm::FrodoKem640Aes - )] - #[case::shake640( - EphemeralFrodoKem640Shake::default(), - safe_oqs::kem::Algorithm::FrodoKem640Shake - )] - #[case::aes976( - EphemeralFrodoKem976Aes::default(), - safe_oqs::kem::Algorithm::FrodoKem976Aes - )] - #[case::shake976( - EphemeralFrodoKem976Shake::default(), - safe_oqs::kem::Algorithm::FrodoKem976Shake - )] - #[case::aes1344( - EphemeralFrodoKem1344Aes::default(), - safe_oqs::kem::Algorithm::FrodoKem1344Aes - )] - #[case::shake1344( - EphemeralFrodoKem1344Shake::default(), - safe_oqs::kem::Algorithm::FrodoKem1344Shake - )] - fn liboqs_compatibility(#[case] kem: F, #[case] alg: safe_oqs::kem::Algorithm) { - let safe_kem = safe_oqs::kem::Kem::new(alg).unwrap(); - let (their_pk, their_sk) = safe_kem.keypair().unwrap(); - let my_pk = EncryptionKey::::from_slice(their_pk.as_ref()).unwrap(); - let my_sk = DecryptionKey::::from_slice(their_sk.as_ref()).unwrap(); - - let mut rng = chacha20::ChaCha8Rng::from_seed([1u8; 32]); - - let (my_ct, my_ess) = kem.encapsulate_with_rng(&my_pk, &mut rng); - let (my_ss, _) = kem.decapsulate(&my_sk, &my_ct); - assert_eq!(my_ess.as_ref(), my_ss.as_ref()); - - let their_ct = safe_kem.ciphertext_from_bytes(my_ct.as_ref()).unwrap(); - let their_ss = safe_kem.decapsulate(&their_sk, their_ct).unwrap(); - assert_eq!(my_ess.as_ref(), their_ss.as_ref()); - - let (their_ct, their_ess) = safe_kem.encapsulate(&their_pk).unwrap(); - - let my_ct = Ciphertext::::from_slice(their_ct.as_ref()).unwrap(); - let (my_ss, _) = kem.decapsulate(&my_sk, &my_ct); - assert_eq!(their_ess.as_ref(), my_ss.as_ref()); - } - - #[rstest] - #[case::aes640( - EphemeralFrodoKem640Aes::default(), - safe_oqs::kem::Algorithm::FrodoKem640Aes - )] - #[case::shake640( - EphemeralFrodoKem640Shake::default(), - safe_oqs::kem::Algorithm::FrodoKem640Shake - )] - #[case::aes976( - EphemeralFrodoKem976Aes::default(), - safe_oqs::kem::Algorithm::FrodoKem976Aes - )] - #[case::shake976( - EphemeralFrodoKem976Shake::default(), - safe_oqs::kem::Algorithm::FrodoKem976Shake - )] - #[case::aes1344( - EphemeralFrodoKem1344Aes::default(), - safe_oqs::kem::Algorithm::FrodoKem1344Aes - )] - #[case::shake1344( - EphemeralFrodoKem1344Shake::default(), - safe_oqs::kem::Algorithm::FrodoKem1344Shake - )] - fn generate_keypair_compatibility( - #[case] kem: F, - #[case] alg: safe_oqs::kem::Algorithm, - ) { - let mut rng = chacha20::ChaCha8Rng::from_seed([1u8; 32]); - let (our_pk, our_sk) = kem.generate_keypair(&mut rng); - let kem = safe_oqs::kem::Kem::new(alg).unwrap(); - let opt_pk = kem.public_key_from_bytes(&our_pk.0); - assert!(opt_pk.is_some()); - let opt_sk = kem.secret_key_from_bytes(&our_sk.0); - assert!(opt_sk.is_some()); - - let their_pk = opt_pk.unwrap(); - let their_sk = opt_sk.unwrap(); - - let (ciphertext, pk_ss) = kem.encapsulate(their_pk).unwrap(); - let sk_ss = kem.decapsulate(their_sk, &ciphertext).unwrap(); - assert_eq!(pk_ss.as_ref(), sk_ss.as_ref()); - } - - #[rstest] - #[case::aes640( - EphemeralFrodoKem640Aes::default(), - safe_oqs::kem::Algorithm::FrodoKem640Aes - )] - #[case::shake640( - EphemeralFrodoKem640Shake::default(), - safe_oqs::kem::Algorithm::FrodoKem640Shake - )] - #[case::aes976( - EphemeralFrodoKem976Aes::default(), - safe_oqs::kem::Algorithm::FrodoKem976Aes - )] - #[case::shake976( - EphemeralFrodoKem976Shake::default(), - safe_oqs::kem::Algorithm::FrodoKem976Shake - )] - #[case::aes1344( - EphemeralFrodoKem1344Aes::default(), - safe_oqs::kem::Algorithm::FrodoKem1344Aes - )] - #[case::shake1344( - EphemeralFrodoKem1344Shake::default(), - safe_oqs::kem::Algorithm::FrodoKem1344Shake - )] - fn encapsulate_compatibility(#[case] kem: F, #[case] alg: safe_oqs::kem::Algorithm) { - let mut rng = chacha20::ChaCha8Rng::from_seed([1u8; 32]); - let (our_pk, our_sk) = kem.generate_keypair(&mut rng); - let safe_kem = safe_oqs::kem::Kem::new(alg).unwrap(); - - let opt_sk = safe_kem.secret_key_from_bytes(&our_sk.0); - assert!(opt_sk.is_some()); - - let their_sk = opt_sk.unwrap(); - - let (our_ciphertext, our_ss) = kem.encapsulate_with_rng(&our_pk, &mut rng); - - let opt_ct = safe_kem.ciphertext_from_bytes(&our_ciphertext.0); - assert!(opt_ct.is_some()); - let ct = opt_ct.unwrap(); - let res_ss = safe_kem.decapsulate(their_sk, ct); - assert!(res_ss.is_ok()); - let their = res_ss.unwrap(); - assert_eq!(our_ss.as_ref(), their.as_ref()); - } - - #[rstest] - #[case::aes640( - EphemeralFrodoKem640Aes::default(), - safe_oqs::kem::Algorithm::FrodoKem640Aes - )] - #[case::shake640( - EphemeralFrodoKem640Shake::default(), - safe_oqs::kem::Algorithm::FrodoKem640Shake - )] - #[case::aes976( - EphemeralFrodoKem976Aes::default(), - safe_oqs::kem::Algorithm::FrodoKem976Aes - )] - #[case::shake976( - EphemeralFrodoKem976Shake::default(), - safe_oqs::kem::Algorithm::FrodoKem976Shake - )] - #[case::aes1344( - EphemeralFrodoKem1344Aes::default(), - safe_oqs::kem::Algorithm::FrodoKem1344Aes - )] - #[case::shake1344( - EphemeralFrodoKem1344Shake::default(), - safe_oqs::kem::Algorithm::FrodoKem1344Shake - )] - fn decapsulate_compatibility(#[case] kem: F, #[case] alg: safe_oqs::kem::Algorithm) { - let mut rng = chacha20::ChaCha8Rng::from_seed([1u8; 32]); - let (our_pk, our_sk) = kem.generate_keypair(&mut rng); - let safe_kem = safe_oqs::kem::Kem::new(alg).unwrap(); - - let opt_pk = safe_kem.public_key_from_bytes(&our_pk.0); - assert!(opt_pk.is_some()); - let their_pk = opt_pk.unwrap(); - let opt_sk = safe_kem.secret_key_from_bytes(&our_sk.0); - assert!(opt_sk.is_some()); - - let (our_ciphertext, our_ss) = kem.encapsulate_with_rng(&our_pk, &mut rng); - - let (opt_ss, _) = kem.decapsulate(&our_sk, &our_ciphertext); - assert_eq!(opt_ss.as_ref(), our_ss.as_ref()); - - let (their_ct, their_ss) = safe_kem.encapsulate(their_pk).unwrap(); - let res_my_ciphertext = Ciphertext::from_slice(their_ct.as_ref()); - assert!(res_my_ciphertext.is_ok()); - let my_ciphertext = res_my_ciphertext.unwrap(); - let (my_ss, _) = kem.decapsulate(&our_sk, &my_ciphertext); - assert_eq!(my_ss.as_ref(), their_ss.as_ref()); - } } diff --git a/frodo-kem/src/lib.rs b/frodo-kem/src/lib.rs index 662570f..9ef4148 100644 --- a/frodo-kem/src/lib.rs +++ b/frodo-kem/src/lib.rs @@ -1634,49 +1634,6 @@ mod tests { use super::*; use rand_core::{RngCore, SeedableRng}; use rstest::*; - use safe_oqs::kem; - - #[rstest] - #[case::aes640(Algorithm::EphemeralFrodoKem640Aes, kem::Algorithm::FrodoKem640Aes)] - #[case::aes976(Algorithm::EphemeralFrodoKem976Aes, kem::Algorithm::FrodoKem976Aes)] - #[case::aes1344(Algorithm::EphemeralFrodoKem1344Aes, kem::Algorithm::FrodoKem1344Aes)] - #[case::shake640(Algorithm::EphemeralFrodoKem640Shake, kem::Algorithm::FrodoKem640Shake)] - #[case::shake976(Algorithm::EphemeralFrodoKem976Shake, kem::Algorithm::FrodoKem976Shake)] - #[case::shake1344( - Algorithm::EphemeralFrodoKem1344Shake, - kem::Algorithm::FrodoKem1344Shake - )] - fn ephemeral_works(#[case] alg: Algorithm, #[case] safe_alg: kem::Algorithm) { - let mut rng = chacha20::ChaCha8Rng::from_seed([1u8; 32]); - let (our_pk, our_sk) = alg.generate_keypair(&mut rng); - let kem = kem::Kem::new(safe_alg).unwrap(); - - let opt_pk = kem.public_key_from_bytes(&our_pk.value); - assert!(opt_pk.is_some()); - let opt_sk = kem.secret_key_from_bytes(&our_sk.value); - assert!(opt_sk.is_some()); - - let their_pk = opt_pk.unwrap(); - let their_sk = opt_sk.unwrap(); - - let mut mu = vec![0u8; alg.params().message_length]; - rng.fill_bytes(&mut mu); - let (our_ct, our_ess) = alg.encapsulate(&our_pk, &mu, []).unwrap(); - let (our_dss, mu_prime) = alg.decapsulate(&our_sk, &our_ct).unwrap(); - assert_eq!(our_ess.value, our_dss.value); - assert_eq!(mu, mu_prime); - - let their_ct = kem.ciphertext_from_bytes(&our_ct.value).unwrap(); - let their_ss = kem.decapsulate(their_sk, their_ct).unwrap(); - assert_eq!(our_dss.value, their_ss.as_ref()); - - let (their_ct, their_ess) = kem.encapsulate(their_pk).unwrap(); - - let our_ct = alg.ciphertext_from_bytes(their_ct.as_ref()).unwrap(); - - let (their_dss, _) = alg.decapsulate(&our_sk, &our_ct).unwrap(); - assert_eq!(their_ess.as_ref(), their_dss.value); - } #[rstest] #[case::aes640(Algorithm::FrodoKem640Aes)]