From 313607f06ac439cb1f5d277f021a6b9931921af2 Mon Sep 17 00:00:00 2001 From: Isis Lovecruft Date: Thu, 30 Nov 2017 22:04:47 +0000 Subject: [PATCH 1/3] Remove decaf fuzzer and change scalar fuzzer. * REMOVE fuzz/fuzz_targets/decaf.rs * RENAME fuzz/fuzz_targets/scalar_constructor_accepts_256bit_values.rs to fuzz/fuzz_targets/scalar_constructors_and_reduction.rs * CHANGE scalar_constructors_and_reduction fuzz target to test reduction after using the 255-bit constructor versus constructor mod order. * FIXES #91: https://github.com/isislovecruft/curve25519-dalek/issues/91 --- fuzz/Cargo.toml | 4 ---- fuzz/fuzz_targets/decaf.rs | 21 ------------------- ...s => scalar_constructors_and_reduction.rs} | 14 +++++-------- 3 files changed, 5 insertions(+), 34 deletions(-) delete mode 100644 fuzz/fuzz_targets/decaf.rs rename fuzz/fuzz_targets/{scalar_constructor_accepts_256bit_values.rs => scalar_constructors_and_reduction.rs} (63%) diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index ceb067b..0dccf7b 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -23,10 +23,6 @@ git = "https://github.com/rust-fuzz/libfuzzer-sys.git" [workspace] members = ["."] -[[bin]] -name = "decaf" -path = "fuzz_targets/decaf.rs" - [[bin]] name = "scalar_constructor_accepts_256bit_values" path = "fuzz_targets/scalar_constructor_accepts_256bit_values.rs" diff --git a/fuzz/fuzz_targets/decaf.rs b/fuzz/fuzz_targets/decaf.rs deleted file mode 100644 index 5199183..0000000 --- a/fuzz/fuzz_targets/decaf.rs +++ /dev/null @@ -1,21 +0,0 @@ -#![no_main] -#[macro_use] extern crate libfuzzer_sys; -extern crate curve25519_dalek; - -use curve25519_dalek::curve::ValidityCheck; -use curve25519_dalek::decaf::DecafPoint; -use curve25519_dalek::field::FieldElement; - -fuzz_target!(|data: &[u8]| { - if data.len() != 32 { - return; - } - let mut field_bytes = [0u8; 32]; - for (by, data) in field_bytes.iter_mut().zip(data.iter()) { - *by = *data; - } - let fe = FieldElement::from_bytes(&field_bytes); - let p = DecafPoint::elligator_decaf_flavour(&fe); - assert!(p.0.is_valid()); - p.compress(); -}); diff --git a/fuzz/fuzz_targets/scalar_constructor_accepts_256bit_values.rs b/fuzz/fuzz_targets/scalar_constructors_and_reduction.rs similarity index 63% rename from fuzz/fuzz_targets/scalar_constructor_accepts_256bit_values.rs rename to fuzz/fuzz_targets/scalar_constructors_and_reduction.rs index 38bba88..fc3eba9 100644 --- a/fuzz/fuzz_targets/scalar_constructor_accepts_256bit_values.rs +++ b/fuzz/fuzz_targets/scalar_constructors_and_reduction.rs @@ -4,10 +4,10 @@ extern crate curve25519_dalek; use curve25519_dalek::scalar::Scalar; -/// Check that the Scalar constructor accepts 256-bit input values and +/// Check that the Scalar constructor accepts 255-bit input values and /// behaves correctly on them. /// -/// Specifically, we take 256-bit values `a` and `b` from the fuzzer +/// Specifically, we take 255-bit values `a` and `b` from the fuzzer /// input data and check that `(a mod l) * (b mod l) == (a * b) mod l`. fuzz_target!(|data: &[u8]| { if data.len() != 64 { @@ -21,15 +21,11 @@ fuzz_target!(|data: &[u8]| { b_bytes.copy_from_slice(&data[32..64]); // Compute c = a*b (mod l) - let c1 = &Scalar(a_bytes) * &Scalar(b_bytes); + let c1 = (&Scalar::from_bits(a_bytes) * &Scalar::from_bits(b_bytes)).reduce(); // Compute c = (a mod l) * (b mod l) - let mut tmp = [0u8; 64]; - tmp[0..32].copy_from_slice(&a_bytes[..]); - let a_mod_l = Scalar::reduce(&tmp); - tmp[0..32].copy_from_slice(&b_bytes[..]); - let b_mod_l = Scalar::reduce(&tmp); - + let a_mod_l = Scalar::from_bytes_mod_order(a_bytes); + let b_mod_l = Scalar::from_bytes_mod_order(b_bytes); let c2 = &a_mod_l * &b_mod_l; assert_eq!(c1, c2); From c4c9775cb2337ade4ff93951406044baf7208b42 Mon Sep 17 00:00:00 2001 From: Isis Lovecruft Date: Mon, 4 Dec 2017 01:19:55 +0000 Subject: [PATCH 2/3] Remove scalar_constructors_and_reduction fuzzer. It doesn't really test anything usefully discoverable since the searchspace is too large. --- .../scalar_constructors_and_reduction.rs | 32 ------------------- 1 file changed, 32 deletions(-) delete mode 100644 fuzz/fuzz_targets/scalar_constructors_and_reduction.rs diff --git a/fuzz/fuzz_targets/scalar_constructors_and_reduction.rs b/fuzz/fuzz_targets/scalar_constructors_and_reduction.rs deleted file mode 100644 index fc3eba9..0000000 --- a/fuzz/fuzz_targets/scalar_constructors_and_reduction.rs +++ /dev/null @@ -1,32 +0,0 @@ -#![no_main] -#[macro_use] extern crate libfuzzer_sys; -extern crate curve25519_dalek; - -use curve25519_dalek::scalar::Scalar; - -/// Check that the Scalar constructor accepts 255-bit input values and -/// behaves correctly on them. -/// -/// Specifically, we take 255-bit values `a` and `b` from the fuzzer -/// input data and check that `(a mod l) * (b mod l) == (a * b) mod l`. -fuzz_target!(|data: &[u8]| { - if data.len() != 64 { - return; - } - let mut a_bytes = [0u8; 32]; - let mut b_bytes = [0u8; 32]; - - // Set a, b to be random 256-bit integers - a_bytes.copy_from_slice(&data[ 0..32]); - b_bytes.copy_from_slice(&data[32..64]); - - // Compute c = a*b (mod l) - let c1 = (&Scalar::from_bits(a_bytes) * &Scalar::from_bits(b_bytes)).reduce(); - - // Compute c = (a mod l) * (b mod l) - let a_mod_l = Scalar::from_bytes_mod_order(a_bytes); - let b_mod_l = Scalar::from_bytes_mod_order(b_bytes); - let c2 = &a_mod_l * &b_mod_l; - - assert_eq!(c1, c2); -}); From d3cf2526372055cb4c384d42b2f09e44c7201292 Mon Sep 17 00:00:00 2001 From: Isis Lovecruft Date: Mon, 4 Dec 2017 01:21:46 +0000 Subject: [PATCH 3/3] Remove unused fuzz/ directory for now. --- fuzz/.gitignore | 4 ---- fuzz/Cargo.toml | 28 ---------------------------- 2 files changed, 32 deletions(-) delete mode 100644 fuzz/.gitignore delete mode 100644 fuzz/Cargo.toml diff --git a/fuzz/.gitignore b/fuzz/.gitignore deleted file mode 100644 index 572e03b..0000000 --- a/fuzz/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ - -target -corpus -artifacts diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml deleted file mode 100644 index 0dccf7b..0000000 --- a/fuzz/Cargo.toml +++ /dev/null @@ -1,28 +0,0 @@ - -[package] -name = "curve25519-dalek-fuzz" -version = "0.0.1" -authors = ["Automatically generated"] -publish = false - -[package.metadata] -cargo-fuzz = true - -[dependencies.curve25519-dalek] -path = ".." - -[features] -yolocrypto = ["curve25519-dalek/yolocrypto"] -nightly = ["curve25519-dalek/nightly"] -radix_51 = ["curve25519-dalek/radix_51"] - -[dependencies.libfuzzer-sys] -git = "https://github.com/rust-fuzz/libfuzzer-sys.git" - -# Prevent this from interfering with workspaces -[workspace] -members = ["."] - -[[bin]] -name = "scalar_constructor_accepts_256bit_values" -path = "fuzz_targets/scalar_constructor_accepts_256bit_values.rs"