diff options
author | Justus Winter <justus@sequoia-pgp.org> | 2019-07-02 19:00:41 +0200 |
---|---|---|
committer | Justus Winter <justus@sequoia-pgp.org> | 2019-07-02 19:02:15 +0200 |
commit | d887f79b62c86cf7a29ecc206c5755ff56879713 (patch) | |
tree | 8aa6fa341722b0e4ee4f38d2f4fd7a7fc46abca8 /openpgp/src/crypto | |
parent | 92371c26e33119d2ea162d9a8bfdabe45f9400ec (diff) |
openpgp: New function crypto::random.
- Add and use a function that fills a buffer with a thread-local
random number generator.
Diffstat (limited to 'openpgp/src/crypto')
-rw-r--r-- | openpgp/src/crypto/aead.rs | 6 | ||||
-rw-r--r-- | openpgp/src/crypto/mod.rs | 9 | ||||
-rw-r--r-- | openpgp/src/crypto/s2k.rs | 3 | ||||
-rw-r--r-- | openpgp/src/crypto/symmetric.rs | 4 |
4 files changed, 12 insertions, 10 deletions
diff --git a/openpgp/src/crypto/aead.rs b/openpgp/src/crypto/aead.rs index b6ca09d3..2c16ffc0 100644 --- a/openpgp/src/crypto/aead.rs +++ b/openpgp/src/crypto/aead.rs @@ -754,8 +754,6 @@ mod tests { #[test] fn roundtrip() { use std::io::Cursor; - use nettle::{Random, Yarrow}; - let mut rng = Yarrow::default(); for sym_algo in [SymmetricAlgorithm::AES128, SymmetricAlgorithm::AES192, @@ -768,10 +766,10 @@ mod tests { let version = 1; let chunk_size = 64; let mut key = vec![0; sym_algo.key_size().unwrap()]; - rng.random(&mut key); + ::crypto::random(&mut key); let key: SessionKey = key.into(); let mut iv = vec![0; aead.iv_size().unwrap()]; - rng.random(&mut iv); + ::crypto::random(&mut iv); let mut ciphertext = Vec::new(); { diff --git a/openpgp/src/crypto/mod.rs b/openpgp/src/crypto/mod.rs index 5a6b06c0..6645ecdc 100644 --- a/openpgp/src/crypto/mod.rs +++ b/openpgp/src/crypto/mod.rs @@ -27,6 +27,13 @@ pub use self::asymmetric::{ KeyPair, }; +/// Fills the given buffer with random data. +pub fn random<B: AsMut<[u8]>>(mut buf: B) { + use std::cell::RefCell; + thread_local!(static RNG: RefCell<Yarrow> = Default::default()); + RNG.with(|rng| rng.borrow_mut().random(buf.as_mut())); +} + /// Holds a session key. /// /// The session key is cleared when dropped. @@ -37,7 +44,7 @@ impl SessionKey { /// Creates a new session key. pub fn new(size: usize) -> Self { let mut sk: mem::Protected = vec![0; size].into(); - Yarrow::default().random(&mut sk); + random(&mut sk); Self(sk) } diff --git a/openpgp/src/crypto/s2k.rs b/openpgp/src/crypto/s2k.rs index b3e099e2..b2b95f68 100644 --- a/openpgp/src/crypto/s2k.rs +++ b/openpgp/src/crypto/s2k.rs @@ -14,7 +14,6 @@ use crypto::SessionKey; use std::fmt; -use nettle::{Yarrow, Random}; use quickcheck::{Arbitrary, Gen}; use rand::Rng; @@ -57,7 +56,7 @@ pub enum S2K { impl Default for S2K { fn default() -> Self { let mut salt = [0u8; 8]; - Yarrow::default().random(&mut salt); + ::crypto::random(&mut salt); S2K::Iterated { // SHA2-256, being optimized for implementations on // architectures with a word size of 32 bit, has a more diff --git a/openpgp/src/crypto/symmetric.rs b/openpgp/src/crypto/symmetric.rs index d2a94b15..32183163 100644 --- a/openpgp/src/crypto/symmetric.rs +++ b/openpgp/src/crypto/symmetric.rs @@ -583,8 +583,6 @@ mod tests { #[test] fn roundtrip() { use std::io::Cursor; - use nettle::{Random, Yarrow}; - let mut rng = Yarrow::default(); for algo in [SymmetricAlgorithm::TripleDES, SymmetricAlgorithm::CAST5, @@ -597,7 +595,7 @@ mod tests { SymmetricAlgorithm::Camellia192, SymmetricAlgorithm::Camellia256].iter() { let mut key = vec![0; algo.key_size().unwrap()]; - rng.random(&mut key); + ::crypto::random(&mut key); let mut ciphertext = Vec::new(); { |