curve25519-dalek-source/fuzz/fuzz_targets/scalar_constructors_and_reduction.rs
Isis Lovecruft 313607f06a
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
2017-11-30 22:34:32 +00:00

32 lines
983 B
Rust

#![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);
});