Remove sha2 dep; limit rand depends; fixes after PR#68 merge.

* ADD new "batch" feature for feature-gating ed25519 batch verification; off by
   default. The "batch" feature is the only thing which depends on all of the
   `rand` crate, since it requires the functionality of `rand::thread_rng()`.
   Without batch verification, the rest of ed25519-dalek only depends on
   `rand_os` and `rand_core`.
This commit is contained in:
Isis Lovecruft 2019-04-02 01:46:23 +00:00
parent 1bec256418
commit d31df0aaa8
No known key found for this signature in database
GPG key ID: AB41313533E8E812
5 changed files with 89 additions and 80 deletions

View file

@ -29,6 +29,10 @@ features = ["i128_support"]
default-features = false
optional = true
[dependencies.rand_os]
version = "0.1"
optional = true
[dependencies.serde]
version = "^1.0"
optional = true
@ -48,8 +52,7 @@ version = "0.2"
hex = "^0.3"
bincode = "^0.9"
criterion = "0.2"
rand_os = "0.1.0"
rand_chacha = "0.1.0"
rand_os = "0.1"
[[bench]]
name = "ed25519_benchmarks"
@ -57,9 +60,10 @@ harness = false
[features]
default = ["std", "u64_backend"]
std = ["curve25519-dalek/std", "rand", "sha2/std"]
alloc = ["curve25519-dalek/alloc"]
std = ["curve25519-dalek/std", "rand_os", "sha2/std"]
alloc = ["curve25519-dalek/alloc", "rand_os"]
nightly = ["curve25519-dalek/nightly", "clear_on_drop/nightly"]
batch = ["rand"]
asm = ["sha2/asm"]
yolocrypto = ["curve25519-dalek/yolocrypto"]
u64_backend = ["curve25519-dalek/u64_backend"]

View file

@ -28,11 +28,11 @@ pub use sha2::Sha512;
use curve25519_dalek::digest::generic_array::typenum::U64;
pub use curve25519_dalek::digest::Digest;
#[cfg(any(feature = "alloc", feature = "std"))]
#[cfg(all(feature = "batch", any(feature = "alloc", feature = "std")))]
use curve25519_dalek::constants;
#[cfg(any(feature = "alloc", feature = "std"))]
#[cfg(all(feature = "batch", any(feature = "alloc", feature = "std")))]
use curve25519_dalek::edwards::EdwardsPoint;
#[cfg(any(feature = "alloc", feature = "std"))]
#[cfg(all(feature = "batch", any(feature = "alloc", feature = "std")))]
use curve25519_dalek::scalar::Scalar;
pub use crate::constants::*;
@ -48,7 +48,7 @@ pub use crate::signature::*;
/// * `messages` is a slice of byte slices, one per signed message.
/// * `signatures` is a slice of `Signature`s.
/// * `public_keys` is a slice of `PublicKey`s.
/// * `csprng` is an implementation of `Rng + CryptoRng`, such as `rand::rngs::ThreadRng`.
/// * `csprng` is an implementation of `Rng + CryptoRng`.
///
/// # Panics
///
@ -65,17 +65,16 @@ pub use crate::signature::*;
///
/// ```
/// extern crate ed25519_dalek;
/// extern crate rand;
/// extern crate rand_os;
///
/// use ed25519_dalek::verify_batch;
/// use ed25519_dalek::Keypair;
/// use ed25519_dalek::PublicKey;
/// use ed25519_dalek::Signature;
/// use rand::thread_rng;
/// use rand::rngs::ThreadRng;
/// use rand_os::OsRng;
///
/// # fn main() {
/// let mut csprng: ThreadRng = thread_rng();
/// let mut csprng: OsRng = OsRng::new().unwrap();
/// let keypairs: Vec<Keypair> = (0..64).map(|_| Keypair::generate(&mut csprng)).collect();
/// let msg: &[u8] = b"They're good dogs Brant";
/// let messages: Vec<&[u8]> = (0..64).map(|_| msg).collect();
@ -86,7 +85,7 @@ pub use crate::signature::*;
/// assert!(result.is_ok());
/// # }
/// ```
#[cfg(any(feature = "alloc", feature = "std"))]
#[cfg(all(feature = "batch", any(feature = "alloc", feature = "std")))]
#[allow(non_snake_case)]
pub fn verify_batch(
messages: &[&[u8]],
@ -217,12 +216,14 @@ impl Keypair {
/// # Example
///
/// ```
/// extern crate rand_core;
/// extern crate rand_os;
/// extern crate ed25519_dalek;
///
/// # #[cfg(feature = "std")]
/// # fn main() {
///
/// use rand_core::{CryptoRng, RngCore};
/// use rand_os::OsRng;
/// use ed25519_dalek::Keypair;
/// use ed25519_dalek::Signature;
@ -238,7 +239,7 @@ impl Keypair {
///
/// # Input
///
/// A CSPRNG with a `fill_bytes()` method, e.g. `rand_chacha::ChaChaRng`.
/// A CSPRNG with a `fill_bytes()` method, e.g. `rand_os::OsRng`.
///
/// The caller must also supply a hash function which implements the
/// `Digest` and `Default` traits, and which returns 512 bits of output.
@ -282,17 +283,17 @@ impl Keypair {
///
/// ```
/// extern crate ed25519_dalek;
/// extern crate rand;
/// extern crate rand_os;
///
/// use ed25519_dalek::Digest;
/// use ed25519_dalek::Keypair;
/// use ed25519_dalek::Sha512;
/// use ed25519_dalek::Signature;
/// use rand::thread_rng;
/// use rand_os::OsRng;
///
/// # #[cfg(feature = "std")]
/// # fn main() {
/// let mut csprng = thread_rng();
/// let mut csprng = OsRng::new().unwrap();
/// let keypair: Keypair = Keypair::generate(&mut csprng);
/// let message: &[u8] = b"All I want is to pet all of the dogs.";
///
@ -329,17 +330,17 @@ impl Keypair {
///
/// ```
/// # extern crate ed25519_dalek;
/// # extern crate rand;
/// # extern crate rand_os;
/// #
/// # use ed25519_dalek::Digest;
/// # use ed25519_dalek::Keypair;
/// # use ed25519_dalek::Signature;
/// # use ed25519_dalek::Sha512;
/// # use rand::thread_rng;
/// # use rand_os::OsRng;
/// #
/// # #[cfg(feature = "std")]
/// # fn main() {
/// # let mut csprng = thread_rng();
/// # let mut csprng: OsRng = OsRng::new().unwrap();
/// # let keypair: Keypair = Keypair::generate(&mut csprng);
/// # let message: &[u8] = b"All I want is to pet all of the dogs.";
/// # let mut prehashed: Sha512 = Sha512::new();
@ -400,17 +401,17 @@ impl Keypair {
///
/// ```
/// extern crate ed25519_dalek;
/// extern crate rand;
/// extern crate rand_os;
///
/// use ed25519_dalek::Digest;
/// use ed25519_dalek::Keypair;
/// use ed25519_dalek::Signature;
/// use ed25519_dalek::Sha512;
/// use rand::thread_rng;
/// use rand_os::OsRng;
///
/// # #[cfg(feature = "std")]
/// # fn main() {
/// let mut csprng = thread_rng();
/// let mut csprng: OsRng = OsRng::new().unwrap();
/// let keypair: Keypair = Keypair::generate(&mut csprng);
/// let message: &[u8] = b"All I want is to pet all of the dogs.";
///

View file

@ -19,12 +19,13 @@
//! the operating system's builtin PRNG:
//!
//! ```
//! extern crate rand_core;
//! extern crate rand_os;
//! extern crate ed25519_dalek;
//!
//! # #[cfg(feature = "std")]
//! # fn main() {
//! use rand::Rng;
//! use rand_core::RngCore;
//! use rand_os::OsRng;
//! use ed25519_dalek::Keypair;
//! use ed25519_dalek::Signature;
@ -40,14 +41,15 @@
//! We can now use this `keypair` to sign a message:
//!
//! ```
//! # extern crate rand;
//! # extern crate rand_core;
//! # extern crate rand_os;
//! # extern crate ed25519_dalek;
//! # fn main() {
//! # use rand::Rng;
//! # use rand::thread_rng;
//! # use rand_core::RngCore;
//! # use rand_os::OsRng;
//! # use ed25519_dalek::Keypair;
//! # use ed25519_dalek::Signature;
//! # let mut csprng = thread_rng();
//! # let mut csprng = OsRng::new().unwrap();
//! # let keypair: Keypair = Keypair::generate(&mut csprng);
//! let message: &[u8] = b"This is a test of the tsunami alert system.";
//! let signature: Signature = keypair.sign(message);
@ -58,14 +60,15 @@
//! that `message`:
//!
//! ```
//! # extern crate rand;
//! # extern crate rand_core;
//! # extern crate rand_os;
//! # extern crate ed25519_dalek;
//! # fn main() {
//! # use rand::Rng;
//! # use rand::thread_rng;
//! # use rand_core::RngCore;
//! # use rand_os::OsRng;
//! # use ed25519_dalek::Keypair;
//! # use ed25519_dalek::Signature;
//! # let mut csprng = thread_rng();
//! # let mut csprng = OsRng::new().unwrap();
//! # let keypair: Keypair = Keypair::generate(&mut csprng);
//! # let message: &[u8] = b"This is a test of the tsunami alert system.";
//! # let signature: Signature = keypair.sign(message);
@ -77,15 +80,16 @@
//! verify this signature:
//!
//! ```
//! # extern crate rand;
//! # extern crate rand_core;
//! # extern crate rand_os;
//! # extern crate ed25519_dalek;
//! # fn main() {
//! # use rand::Rng;
//! # use rand::thread_rng;
//! # use rand_core::RngCore;
//! # use rand_os::OsRng;
//! # use ed25519_dalek::Keypair;
//! # use ed25519_dalek::Signature;
//! use ed25519_dalek::PublicKey;
//! # let mut csprng = thread_rng();
//! # let mut csprng = OsRng::new().unwrap();
//! # let keypair: Keypair = Keypair::generate(&mut csprng);
//! # let message: &[u8] = b"This is a test of the tsunami alert system.";
//! # let signature: Signature = keypair.sign(message);
@ -104,14 +108,15 @@
//! verify your signatures!)
//!
//! ```
//! # extern crate rand;
//! # extern crate rand_core;
//! # extern crate rand_os;
//! # extern crate ed25519_dalek;
//! # fn main() {
//! # use rand::Rng;
//! # use rand::thread_rng;
//! # use rand_core::RngCore;
//! # use rand_os::OsRng;
//! # use ed25519_dalek::{Keypair, Signature, PublicKey};
//! use ed25519_dalek::{PUBLIC_KEY_LENGTH, SECRET_KEY_LENGTH, KEYPAIR_LENGTH, SIGNATURE_LENGTH};
//! # let mut csprng = thread_rng();
//! # let mut csprng = OsRng::new().unwrap();
//! # let keypair: Keypair = Keypair::generate(&mut csprng);
//! # let message: &[u8] = b"This is a test of the tsunami alert system.";
//! # let signature: Signature = keypair.sign(message);
@ -127,14 +132,15 @@
//! And similarly, decoded from bytes with `::from_bytes()`:
//!
//! ```
//! # extern crate rand;
//! # extern crate rand_core;
//! # extern crate rand_os;
//! # extern crate ed25519_dalek;
//! # use rand::Rng;
//! # use rand::thread_rng;
//! # use rand_core::RngCore;
//! # use rand_os::OsRng;
//! # use ed25519_dalek::{Keypair, Signature, PublicKey, SecretKey, SignatureError};
//! # use ed25519_dalek::{PUBLIC_KEY_LENGTH, SECRET_KEY_LENGTH, KEYPAIR_LENGTH, SIGNATURE_LENGTH};
//! # fn do_test() -> Result<(SecretKey, PublicKey, Keypair, Signature), SignatureError> {
//! # let mut csprng = thread_rng();
//! # let mut csprng = OsRng::new().unwrap();
//! # let keypair_orig: Keypair = Keypair::generate(&mut csprng);
//! # let message: &[u8] = b"This is a test of the tsunami alert system.";
//! # let signature_orig: Signature = keypair_orig.sign(message);
@ -169,7 +175,8 @@
//! For example, using [bincode](https://github.com/TyOverby/bincode):
//!
//! ```
//! # extern crate rand;
//! # extern crate rand_core;
//! # extern crate rand_os;
//! # extern crate ed25519_dalek;
//! # #[cfg(feature = "serde")]
//! extern crate serde;
@ -178,11 +185,11 @@
//!
//! # #[cfg(feature = "serde")]
//! # fn main() {
//! # use rand::Rng;
//! # use rand::thread_rng;
//! # use rand_core::RngCore;
//! # use rand_os::OsRng;
//! # use ed25519_dalek::{Keypair, Signature, PublicKey};
//! use bincode::{serialize, Infinite};
//! # let mut csprng = thread_rng();
//! # let mut csprng = OsRng::new().unwrap();
//! # let keypair: Keypair = Keypair::generate(&mut csprng);
//! # let message: &[u8] = b"This is a test of the tsunami alert system.";
//! # let signature: Signature = keypair.sign(message);
@ -200,7 +207,8 @@
//! recipient may deserialise them and verify:
//!
//! ```
//! # extern crate rand;
//! # extern crate rand_core;
//! # extern crate rand_os;
//! # extern crate ed25519_dalek;
//! # #[cfg(feature = "serde")]
//! # extern crate serde;
@ -209,13 +217,13 @@
//! #
//! # #[cfg(feature = "serde")]
//! # fn main() {
//! # use rand::Rng;
//! # use rand::thread_rng;
//! # use rand_core::RngCore;
//! # use rand_os::OsRng;
//! # use ed25519_dalek::{Keypair, Signature, PublicKey};
//! # use bincode::{serialize, Infinite};
//! use bincode::{deserialize};
//!
//! # let mut csprng = thread_rng();
//! # let mut csprng = OsRng::new().unwrap();
//! # let keypair: Keypair = Keypair::generate(&mut csprng);
//! let message: &[u8] = b"This is a test of the tsunami alert system.";
//! # let signature: Signature = keypair.sign(message);
@ -250,10 +258,10 @@ extern crate std;
extern crate clear_on_drop;
extern crate curve25519_dalek;
extern crate failure;
#[cfg(any(feature = "std", test))]
#[cfg(all(feature = "batch", any(feature = "std", feature = "alloc", test)))]
extern crate rand;
#[cfg(test)]
extern crate rand_chacha;
#[cfg(any(feature = "std", test))]
extern crate rand_os;
extern crate rand_core;
#[cfg(feature = "serde")]
extern crate serde;

View file

@ -126,14 +126,12 @@ impl SecretKey {
///
/// ```
/// extern crate rand_os;
/// extern crate sha2;
/// extern crate ed25519_dalek;
///
/// # #[cfg(feature = "std")]
/// # fn main() {
/// #
/// use rand_os::OsRng;
/// use sha2::Sha512;
/// use ed25519_dalek::PublicKey;
/// use ed25519_dalek::SecretKey;
/// use ed25519_dalek::Signature;
@ -149,18 +147,17 @@ impl SecretKey {
/// Afterwards, you can generate the corresponding public:
///
/// ```
/// # extern crate rand;
/// # extern crate rand_os;
/// # extern crate ed25519_dalek;
/// #
/// # fn main() {
/// #
/// # use rand::Rng;
/// # use rand::thread_rng;
/// # use rand_os::OsRng;
/// # use ed25519_dalek::PublicKey;
/// # use ed25519_dalek::SecretKey;
/// # use ed25519_dalek::Signature;
/// #
/// # let mut csprng = thread_rng();
/// # let mut csprng = OsRng::new().unwrap();
/// # let secret_key: SecretKey = SecretKey::generate(&mut csprng);
///
/// let public_key: PublicKey = (&secret_key).into();
@ -172,7 +169,7 @@ impl SecretKey {
/// A CSPRNG with a `fill_bytes()` method, e.g. `rand::OsRng`
pub fn generate<T>(csprng: &mut T) -> SecretKey
where
T: CryptoRng + Rng,
T: CryptoRng + RngCore,
{
let mut sk: SecretKey = SecretKey([0u8; 32]);
@ -273,18 +270,18 @@ impl<'a> From<&'a SecretKey> for ExpandedSecretKey {
/// # Examples
///
/// ```
/// # extern crate rand;
/// # extern crate rand_core;
/// # extern crate rand_os;
/// # extern crate sha2;
/// # extern crate ed25519_dalek;
/// #
/// # fn main() {
/// #
/// use rand::Rng;
/// use rand::thread_rng;
/// use sha2::Sha512;
/// use rand_core::RngCore;
/// use rand_os::OsRng;
/// use ed25519_dalek::{SecretKey, ExpandedSecretKey};
///
/// let mut csprng = thread_rng();
/// let mut csprng = OsRng::new().unwrap();
/// let secret_key: SecretKey = SecretKey::generate(&mut csprng);
/// let expanded_secret_key: ExpandedSecretKey = ExpandedSecretKey::from(&secret_key);
/// # }
@ -329,7 +326,6 @@ impl ExpandedSecretKey {
/// # fn main() {
/// #
/// use rand_os::OsRng;
/// use sha2::Sha512;
/// use ed25519_dalek::{SecretKey, ExpandedSecretKey};
///
/// let mut csprng: OsRng = OsRng::new().unwrap();
@ -340,7 +336,7 @@ impl ExpandedSecretKey {
/// assert!(&expanded_secret_key_bytes[..] != &[0u8; 64][..]);
/// # }
/// #
/// # #[cfg(any(not(feature = "sha2"), not(feature = "std")))]
/// # #[cfg(not(feature = "std"))]
/// # fn main() { }
/// ```
#[inline]
@ -384,13 +380,13 @@ impl ExpandedSecretKey {
/// # Ok(expanded_secret_key_again)
/// # }
/// #
/// # #[cfg(all(feature = "sha2", feature = "std"))]
/// # #[cfg(feature = "std")]
/// # fn main() {
/// # let result = do_test();
/// # assert!(result.is_ok());
/// # }
/// #
/// # #[cfg(any(not(feature = "sha2"), not(feature = "std")))]
/// # #[cfg(not(feature = "std"))]
/// # fn main() { }
/// ```
#[inline]

View file

@ -13,15 +13,14 @@
extern crate bincode;
extern crate ed25519_dalek;
extern crate hex;
extern crate rand;
extern crate rand_os;
extern crate sha2;
use ed25519_dalek::*;
use hex::FromHex;
use rand::thread_rng;
use rand::rngs::ThreadRng;
use rand_os::OsRng;
use sha2::Sha512;
@ -117,7 +116,6 @@ mod integrations {
#[test]
fn sign_verify() { // TestSignVerify
let mut csprng: ThreadRng;
let keypair: Keypair;
let good_sig: Signature;
let bad_sig: Signature;
@ -125,7 +123,8 @@ mod integrations {
let good: &[u8] = "test message".as_bytes();
let bad: &[u8] = "wrong message".as_bytes();
csprng = thread_rng();
let mut csprng: OsRng = OsRng::new().unwrap();
keypair = Keypair::generate(&mut csprng);
good_sig = keypair.sign(&good);
bad_sig = keypair.sign(&bad);
@ -140,7 +139,6 @@ mod integrations {
#[test]
fn ed25519ph_sign_verify() {
let mut csprng: ThreadRng;
let keypair: Keypair;
let good_sig: Signature;
let bad_sig: Signature;
@ -148,6 +146,8 @@ mod integrations {
let good: &[u8] = b"test message";
let bad: &[u8] = b"wrong message";
let mut csprng: OsRng = OsRng::new().unwrap();
// ugh… there's no `impl Copy for Sha512`… i hope we can all agree these are the same hashes
let mut prehashed_good1: Sha512 = Sha512::default();
prehashed_good1.input(good);
@ -163,7 +163,6 @@ mod integrations {
let context: &[u8] = b"testing testing 1 2 3";
csprng = thread_rng();
keypair = Keypair::generate(&mut csprng);
good_sig = keypair.sign_prehashed(prehashed_good1, Some(context));
bad_sig = keypair.sign_prehashed(prehashed_bad1, Some(context));
@ -176,6 +175,7 @@ mod integrations {
"Verification of a signature on a different message passed!");
}
#[cfg(feature = "batch")]
#[test]
fn verify_batch_seven_signatures() {
let messages: [&[u8]; 7] = [
@ -186,7 +186,7 @@ mod integrations {
b"Fuck dumbin' it down, spit ice, skip jewellery: Molotov cocktails on me like accessories.",
b"Hey, I never cared about your bucks, so if I run up with a mask on, probably got a gas can too.",
b"And I'm not here to fill 'er up. Nope, we came to riot, here to incite, we don't want any of your stuff.", ];
let mut csprng: ThreadRng = thread_rng();
let mut csprng: OsRng = OsRng::new().unwrap();
let mut keypairs: Vec<Keypair> = Vec::new();
let mut signatures: Vec<Signature> = Vec::new();
@ -204,7 +204,7 @@ mod integrations {
#[test]
fn pubkey_from_secret_and_expanded_secret() {
let mut csprng = thread_rng();
let mut csprng = OsRng::new().unwrap();
let secret: SecretKey = SecretKey::generate(&mut csprng);
let expanded_secret: ExpandedSecretKey = (&secret).into();
let public_from_secret: PublicKey = (&secret).into(); // XXX eww