Skip to content

Commit db7de02

Browse files
authored
Merge pull request #452 from tox-rs/randombytes
refactor(rand): remove randombytes_into usages
2 parents 0ab46c1 + f31f6aa commit db7de02

File tree

24 files changed

+136
-144
lines changed

24 files changed

+136
-144
lines changed

examples/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ futures = { version = "0.3", default-features = false, features = ["std", "async
1515
env_logger = "0.8"
1616
hex = "0.4"
1717
failure = "0.1"
18+
rand = "0.8"
1819

1920
[dev-dependencies.tokio]
2021
version = "1.0"

examples/echo.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use futures::{*, future::TryFutureExt};
1010
use futures::channel::mpsc;
1111
use hex::FromHex;
1212
use failure::{err_msg, Error};
13+
use rand::thread_rng;
1314

1415
use std::net::SocketAddr;
1516

@@ -49,11 +50,13 @@ const TCP_RELAYS: [(&str, &str); 5] = [
4950
async fn main() -> Result<(), Error> {
5051
env_logger::init();
5152

53+
let mut rng = thread_rng();
54+
5255
let (dht_pk, dht_sk) = gen_keypair();
5356

5457
// create random tox id and print it
5558
let (real_pk, real_sk) = gen_keypair();
56-
let id = ToxId::new(real_pk);
59+
let id = ToxId::new(&mut rng, real_pk);
5760
println!("your tox id is: {:X}",id);
5861

5962
// Create a channel for server to communicate with network

tox_core/src/dht/dht_friend.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Module for friend.
44

55
use std::time::Instant;
66
use std::net::SocketAddr;
7-
use rand::Rng;
7+
use rand::{CryptoRng, Rng};
88

99
use crate::time::*;
1010
use crate::dht::kbucket::*;
@@ -41,7 +41,7 @@ pub struct DhtFriend {
4141

4242
impl DhtFriend {
4343
/// Create new `DhtFriend`.
44-
pub fn new<R: Rng>(rng: &mut R, pk: PublicKey) -> Self {
44+
pub fn new<R: Rng + CryptoRng>(rng: &mut R, pk: PublicKey) -> Self {
4545
DhtFriend {
4646
pk,
4747
close_nodes: Kbucket::new(FRIEND_CLOSE_NODES_COUNT),

tox_core/src/dht/request_queue.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use std::collections::HashMap;
44
use std::collections::hash_map::Entry;
55
use std::time::{Duration, Instant};
6-
use rand::Rng;
6+
use rand::{CryptoRng, Rng};
77

88
use crate::utils::gen_ping_id;
99
use crate::time::*;
@@ -29,7 +29,7 @@ impl<T> RequestQueue<T> {
2929
}
3030

3131
/// Generate unique non zero request ID.
32-
fn generate_ping_id<R: Rng>(&self, rng: &mut R) -> u64 {
32+
fn generate_ping_id<R: Rng + CryptoRng>(&self, rng: &mut R) -> u64 {
3333
loop {
3434
let ping_id = gen_ping_id(rng);
3535
if !self.ping_map.contains_key(&ping_id) {
@@ -40,7 +40,7 @@ impl<T> RequestQueue<T> {
4040

4141
/// Generate and store unique non zero request ID. Later this request ID can
4242
/// be verified with `check_ping_id` function.
43-
pub fn new_ping_id<R: Rng>(&mut self, rng: &mut R, data: T) -> u64 {
43+
pub fn new_ping_id<R: Rng + CryptoRng>(&mut self, rng: &mut R, data: T) -> u64 {
4444
let ping_id = self.generate_ping_id(rng);
4545
self.ping_map.insert(ping_id, (clock_now(), data));
4646
ping_id

tox_core/src/dht/server/hole_punching.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ https://zetok.github.io/tox-spec/#hole-punching
77
use std::net::{IpAddr, SocketAddr};
88
use std::time::{Duration, Instant};
99
use std::collections::HashMap;
10-
use rand::Rng;
10+
use rand::{CryptoRng, Rng};
1111

1212
use crate::dht::dht_friend::*;
1313
use crate::dht::server::*;
@@ -58,7 +58,7 @@ pub struct HolePunching {
5858

5959
impl HolePunching {
6060
/// Create new `HolePunching` object.
61-
pub fn new<R: Rng>(rng: &mut R) -> Self {
61+
pub fn new<R: Rng + CryptoRng>(rng: &mut R) -> Self {
6262
HolePunching {
6363
is_punching_done: true,
6464
num_punch_tries: 0,

tox_core/src/dht/server/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ impl Server {
201201
request_queue: Arc::new(RwLock::new(RequestQueue::new(PING_TIMEOUT))),
202202
close_nodes: Arc::new(RwLock::new(ForcedKtree::new(&pk))),
203203
onion_symmetric_key: Arc::new(RwLock::new(onion_symmetric_key)),
204-
onion_announce: Arc::new(RwLock::new(OnionAnnounce::new(pk))),
204+
onion_announce: Arc::new(RwLock::new(OnionAnnounce::new(&mut rng, pk))),
205205
fake_friends_keys,
206206
friends: Arc::new(RwLock::new(friends)),
207207
nodes_to_bootstrap: Arc::new(RwLock::new(Kbucket::new(MAX_TO_BOOTSTRAP))),

tox_core/src/net_crypto/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1137,6 +1137,7 @@ mod tests {
11371137
// https://github.com/rust-lang/rust/issues/61520
11381138
use super::{*, Packet};
11391139
use futures::{Future, StreamExt};
1140+
use rand::CryptoRng;
11401141

11411142
impl NetCrypto {
11421143
pub async fn has_friend(&self, pk: &PublicKey) -> bool {
@@ -1177,7 +1178,7 @@ mod tests {
11771178
self.connections.write().await.insert(peer_real_pk, Arc::new(RwLock::new(connection)));
11781179
}
11791180

1180-
pub fn get_cookie<R: Rng>(&self, rng: &mut R, real_pk: PublicKey, dht_pk: PublicKey) -> EncryptedCookie {
1181+
pub fn get_cookie<R: Rng + CryptoRng>(&self, rng: &mut R, real_pk: PublicKey, dht_pk: PublicKey) -> EncryptedCookie {
11811182
let cookie = Cookie::new(real_pk, dht_pk);
11821183
EncryptedCookie::new(rng, &self.symmetric_key, &cookie)
11831184
}

tox_core/src/onion/onion_announce.rs

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use std::net::{IpAddr, SocketAddr};
66
use std::time::{Duration, Instant, SystemTime};
77
use sha2::{Digest, Sha256};
88
use sha2::digest::generic_array::typenum::marker_traits::Unsigned;
9+
use rand::{CryptoRng, Rng};
910

1011
use tox_binary_io::*;
1112
use tox_crypto::*;
@@ -164,11 +165,9 @@ pub struct OnionAnnounce {
164165

165166
impl OnionAnnounce {
166167
/// Create new `OnionAnnounce` instance.
167-
pub fn new(dht_pk: PublicKey) -> OnionAnnounce {
168-
let mut secret_bytes = [0; SECRET_BYTES_SIZE];
169-
randombytes_into(&mut secret_bytes);
168+
pub fn new<R: Rng + CryptoRng>(rng: &mut R, dht_pk: PublicKey) -> OnionAnnounce {
170169
OnionAnnounce {
171-
secret_bytes,
170+
secret_bytes: rng.gen(),
172171
entries: Vec::with_capacity(ONION_ANNOUNCE_MAX_ENTRIES),
173172
dht_pk
174173
}
@@ -338,6 +337,8 @@ impl OnionAnnounce {
338337

339338
#[cfg(test)]
340339
mod tests {
340+
use rand::thread_rng;
341+
341342
use super::*;
342343

343344
const ONION_RETURN_3_PAYLOAD_SIZE: usize = ONION_RETURN_3_SIZE - xsalsa20poly1305::NONCE_SIZE;
@@ -381,7 +382,7 @@ mod tests {
381382
#[test]
382383
fn ping_id_respects_timeout_gap() {
383384
crypto_init().unwrap();
384-
let onion_announce = OnionAnnounce::new(gen_keypair().0);
385+
let onion_announce = OnionAnnounce::new(&mut thread_rng(), gen_keypair().0);
385386

386387
let time = SystemTime::now();
387388
let time_1 = time - Duration::from_secs(unix_time(time) % PING_ID_TIMEOUT.as_secs());
@@ -399,7 +400,7 @@ mod tests {
399400
#[test]
400401
fn ping_id_depends_on_all_args() {
401402
crypto_init().unwrap();
402-
let onion_announce = OnionAnnounce::new(gen_keypair().0);
403+
let onion_announce = OnionAnnounce::new(&mut thread_rng(), gen_keypair().0);
403404

404405
let time_1 = SystemTime::now();
405406
let time_2 = time_1 + PING_ID_TIMEOUT;
@@ -446,7 +447,7 @@ mod tests {
446447
async fn expired_entry_not_in_entries() {
447448
crypto_init().unwrap();
448449
let dht_pk = gen_keypair().0;
449-
let mut onion_announce = OnionAnnounce::new(dht_pk);
450+
let mut onion_announce = OnionAnnounce::new(&mut thread_rng(), dht_pk);
450451

451452
let entry = create_random_entry("1.2.3.4:12345".parse().unwrap());
452453
let entry_pk = entry.pk;
@@ -469,7 +470,7 @@ mod tests {
469470
fn add_to_entries_when_limit_is_not_reached() {
470471
crypto_init().unwrap();
471472
let dht_pk = gen_keypair().0;
472-
let mut onion_announce = OnionAnnounce::new(dht_pk);
473+
let mut onion_announce = OnionAnnounce::new(&mut thread_rng(), dht_pk);
473474

474475
let mut pks = Vec::new();
475476

@@ -492,7 +493,7 @@ mod tests {
492493
async fn add_to_entries_should_update_existent_entry() {
493494
crypto_init().unwrap();
494495
let dht_pk = gen_keypair().0;
495-
let mut onion_announce = OnionAnnounce::new(dht_pk);
496+
let mut onion_announce = OnionAnnounce::new(&mut thread_rng(), dht_pk);
496497

497498
let mut pks = Vec::new();
498499

@@ -533,7 +534,7 @@ mod tests {
533534
async fn add_to_entries_should_replace_timed_out_entries() {
534535
crypto_init().unwrap();
535536
let dht_pk = gen_keypair().0;
536-
let mut onion_announce = OnionAnnounce::new(dht_pk);
537+
let mut onion_announce = OnionAnnounce::new(&mut thread_rng(), dht_pk);
537538

538539
let mut pks = Vec::new();
539540

@@ -576,7 +577,7 @@ mod tests {
576577
fn add_to_entries_should_replace_the_farthest_entry() {
577578
crypto_init().unwrap();
578579
let dht_pk = PublicKey::from_slice(&[0; 32]).unwrap();
579-
let mut onion_announce = OnionAnnounce::new(dht_pk);
580+
let mut onion_announce = OnionAnnounce::new(&mut thread_rng(), dht_pk);
580581

581582
// add one entry with farthest pk
582583
let mut entry = create_random_entry("1.2.3.4:12345".parse().unwrap());
@@ -612,7 +613,7 @@ mod tests {
612613
fn add_to_entries_should_should_not_add_the_farthest_entry() {
613614
crypto_init().unwrap();
614615
let dht_pk = PublicKey::from_slice(&[0; 32]).unwrap();
615-
let mut onion_announce = OnionAnnounce::new(dht_pk);
616+
let mut onion_announce = OnionAnnounce::new(&mut thread_rng(), dht_pk);
616617

617618
let mut pks = Vec::new();
618619

@@ -650,7 +651,7 @@ mod tests {
650651
let data_pk = gen_keypair().0;
651652
let packet_pk = gen_keypair().0;
652653

653-
let mut onion_announce = OnionAnnounce::new(dht_pk);
654+
let mut onion_announce = OnionAnnounce::new(&mut thread_rng(), dht_pk);
654655

655656
// insert random entry
656657
let entry = create_random_entry("1.2.3.4:12345".parse().unwrap());
@@ -687,7 +688,7 @@ mod tests {
687688
let data_pk = gen_keypair().0;
688689
let packet_pk = gen_keypair().0;
689690

690-
let mut onion_announce = OnionAnnounce::new(dht_pk);
691+
let mut onion_announce = OnionAnnounce::new(&mut thread_rng(), dht_pk);
691692

692693
// insert random entry
693694
let entry = create_random_entry("1.2.3.4:12345".parse().unwrap());
@@ -728,7 +729,7 @@ mod tests {
728729
let data_pk = gen_keypair().0;
729730
let packet_pk = gen_keypair().0;
730731

731-
let mut onion_announce = OnionAnnounce::new(dht_pk);
732+
let mut onion_announce = OnionAnnounce::new(&mut thread_rng(), dht_pk);
732733

733734
// insert random entry
734735
let entry = create_random_entry("1.2.3.4:12345".parse().unwrap());
@@ -768,7 +769,7 @@ mod tests {
768769
let data_pk = gen_keypair().0;
769770
let packet_pk = gen_keypair().0;
770771

771-
let mut onion_announce = OnionAnnounce::new(dht_pk);
772+
let mut onion_announce = OnionAnnounce::new(&mut thread_rng(), dht_pk);
772773

773774
// insert ourselves
774775
let mut entry = create_random_entry("1.2.3.4:12345".parse().unwrap());
@@ -807,7 +808,7 @@ mod tests {
807808
crypto_init().unwrap();
808809
let (dht_pk, _dht_sk) = gen_keypair();
809810

810-
let mut onion_announce = OnionAnnounce::new(dht_pk);
811+
let mut onion_announce = OnionAnnounce::new(&mut thread_rng(), dht_pk);
811812

812813
// insert random entry
813814
let entry = create_random_entry("1.2.3.4:12345".parse().unwrap());
@@ -852,7 +853,7 @@ mod tests {
852853
crypto_init().unwrap();
853854
let (dht_pk, _dht_sk) = gen_keypair();
854855

855-
let onion_announce = OnionAnnounce::new(dht_pk);
856+
let onion_announce = OnionAnnounce::new(&mut thread_rng(), dht_pk);
856857

857858
let onion_return = OnionReturn {
858859
nonce: [42; xsalsa20poly1305::NONCE_SIZE],

tox_core/src/state_format/old.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use nom::{
77
combinator::rest,
88
bytes::complete::take,
99
};
10+
use rand::{Rng, distributions::{Distribution, Standard}};
1011

1112
use tox_binary_io::*;
1213
use tox_crypto::*;
@@ -36,13 +37,11 @@ pub struct NospamKeys {
3637
/// Number of bytes of serialized [`NospamKeys`](./struct.NospamKeys.html).
3738
pub const NOSPAMKEYSBYTES: usize = NOSPAMBYTES + PUBLICKEYBYTES + SECRETKEYBYTES;
3839

39-
impl NospamKeys {
40-
/// Generates random `NospamKeys`.
41-
pub fn random() -> Self {
42-
let nospam = NoSpam::random();
40+
impl Distribution<NospamKeys> for Standard {
41+
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> NospamKeys {
4342
let (pk, sk) = gen_keypair();
4443
NospamKeys {
45-
nospam,
44+
nospam: rng.gen(),
4645
pk,
4746
sk
4847
}
@@ -615,12 +614,13 @@ impl ToBytes for State {
615614
mod tests {
616615
use super::*;
617616

617+
use rand::thread_rng;
618618
use tox_packet::ip_port::*;
619619

620620
encode_decode_test!(
621621
tox_crypto::crypto_init().unwrap(),
622622
no_spam_keys_encode_decode,
623-
NospamKeys::random()
623+
thread_rng().gen::<NospamKeys>()
624624
);
625625

626626
encode_decode_test!(
@@ -755,7 +755,7 @@ mod tests {
755755
state_encode_decode,
756756
State {
757757
sections: vec![
758-
Section::NospamKeys(NospamKeys::random()),
758+
Section::NospamKeys(thread_rng().gen()),
759759
Section::DhtState(DhtState(vec![
760760
PackedNode {
761761
pk: gen_keypair().0,

tox_core/src/utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
/*! Common utility functions
22
*/
33

4-
use rand::Rng;
4+
use rand::{CryptoRng, Rng};
55

66
/// Generate non-zero ping_id
7-
pub fn gen_ping_id<R: Rng>(rng: &mut R) -> u64 {
7+
pub fn gen_ping_id<R: Rng + CryptoRng>(rng: &mut R) -> u64 {
88
let mut ping_id = 0;
99
while ping_id == 0 {
1010
ping_id = rng.gen();

0 commit comments

Comments
 (0)