Skip to content

Commit d4e9c3b

Browse files
authored
Merge pull request #446 from tox-rs/rand
refactor(rand): use rand crate instead of sodiumoxide
2 parents 7e3ebf6 + ffbfd93 commit d4e9c3b

36 files changed

+284
-384
lines changed

tox_core/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ failure = "0.1"
3131
lru = "0.6"
3232
bitflags = "1.0"
3333
itertools = "0.10"
34+
rand = "0.8"
3435

3536
[dependencies.tokio]
3637
version = "1.0"

tox_core/src/dht/dht_friend.rs

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

55
use std::time::Instant;
66
use std::net::SocketAddr;
7+
use rand::Rng;
78

89
use crate::time::*;
910
use crate::dht::kbucket::*;
@@ -40,14 +41,14 @@ pub struct DhtFriend {
4041

4142
impl DhtFriend {
4243
/// Create new `DhtFriend`.
43-
pub fn new(pk: PublicKey) -> Self {
44+
pub fn new<R: Rng>(rng: &mut R, pk: PublicKey) -> Self {
4445
DhtFriend {
4546
pk,
4647
close_nodes: Kbucket::new(FRIEND_CLOSE_NODES_COUNT),
4748
last_nodes_req_time: clock_now(),
4849
random_requests_count: 0,
4950
nodes_to_bootstrap: Kbucket::new(FRIEND_BOOTSTRAP_NODES_COUNT),
50-
hole_punch: HolePunching::new(),
51+
hole_punch: HolePunching::new(rng),
5152
}
5253
}
5354

@@ -98,12 +99,13 @@ mod tests {
9899
use super::*;
99100

100101
use std::time::Duration;
102+
use rand::thread_rng;
101103

102104
#[test]
103105
fn addr_is_unknown() {
104106
crypto_init().unwrap();
105107
let pk = gen_keypair().0;
106-
let mut friend = DhtFriend::new(pk);
108+
let mut friend = DhtFriend::new(&mut thread_rng(), pk);
107109

108110
assert!(friend.try_add_to_close(PackedNode::new("192.168.1.1:12345".parse().unwrap(), &gen_keypair().0)));
109111
assert!(friend.try_add_to_close(PackedNode::new("192.168.1.2:12345".parse().unwrap(), &gen_keypair().0)));
@@ -115,7 +117,7 @@ mod tests {
115117
fn addr_is_known() {
116118
crypto_init().unwrap();
117119
let pk = gen_keypair().0;
118-
let mut friend = DhtFriend::new(pk);
120+
let mut friend = DhtFriend::new(&mut thread_rng(), pk);
119121

120122
assert!(friend.try_add_to_close(PackedNode::new("192.168.1.1:12345".parse().unwrap(), &gen_keypair().0)));
121123
assert!(friend.try_add_to_close(PackedNode::new("192.168.1.2:12345".parse().unwrap(), &gen_keypair().0)));
@@ -129,7 +131,7 @@ mod tests {
129131
fn get_returned_addrs() {
130132
crypto_init().unwrap();
131133
let pk = gen_keypair().0;
132-
let mut friend = DhtFriend::new(pk);
134+
let mut friend = DhtFriend::new(&mut thread_rng(), pk);
133135

134136
let nodes = [
135137
PackedNode::new("192.168.1.1:12345".parse().unwrap(), &gen_keypair().0),
@@ -162,7 +164,7 @@ mod tests {
162164
async fn get_returned_addrs_timed_out() {
163165
crypto_init().unwrap();
164166
let pk = gen_keypair().0;
165-
let mut friend = DhtFriend::new(pk);
167+
let mut friend = DhtFriend::new(&mut thread_rng(), pk);
166168

167169
let nodes = [
168170
PackedNode::new("192.168.1.1:12345".parse().unwrap(), &gen_keypair().0),
@@ -191,7 +193,7 @@ mod tests {
191193
fn can_and_try_add_to_close() {
192194
crypto_init().unwrap();
193195
let pk = PublicKey([0; PUBLICKEYBYTES]);
194-
let mut friend = DhtFriend::new(pk);
196+
let mut friend = DhtFriend::new(&mut thread_rng(), pk);
195197

196198
for i in 0 .. 8 {
197199
let addr = SocketAddr::new("1.2.3.4".parse().unwrap(), 12345 + u16::from(i));

tox_core/src/dht/dht_node.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ impl From<PackedNode> for DhtNode {
195195
}
196196
}
197197

198-
impl HasPK for DhtNode {
198+
impl HasPk for DhtNode {
199199
fn pk(&self) -> PublicKey {
200200
self.pk
201201
}

tox_core/src/dht/kbucket.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,24 +66,24 @@ impl Distance for PublicKey {
6666
}
6767

6868
/// Anything that has `PublicKey`.
69-
pub trait HasPK {
69+
pub trait HasPk {
7070
/// `PublicKey`.
7171
fn pk(&self) -> PublicKey;
7272
}
7373

74-
impl HasPK for PackedNode {
74+
impl HasPk for PackedNode {
7575
fn pk(&self) -> PublicKey {
7676
self.pk
7777
}
7878
}
7979

8080
/// Node that can be stored in a `Kbucket`.
81-
pub trait KbucketNode : Sized + HasPK {
81+
pub trait KbucketNode : Sized + HasPk {
8282
/// The type of nodes that can be added to a `Kbucket`.
83-
type NewNode: HasPK;
83+
type NewNode: HasPk;
8484
/// The type of nodes that can be checked if they can be added to a
8585
/// `Kbucket`.
86-
type CheckNode: HasPK;
86+
type CheckNode: HasPk;
8787

8888
/// Check if the node can be updated with a new one.
8989
fn is_outdated(&self, other: &Self::CheckNode) -> bool;
@@ -143,9 +143,9 @@ pub struct Kbucket<Node> {
143143
pub nodes: Vec<Node>,
144144
}
145145

146-
impl<Node> Into<Vec<Node>> for Kbucket<Node> {
147-
fn into(self) -> Vec<Node> {
148-
self.nodes
146+
impl<Node> From<Kbucket<Node>> for Vec<Node> {
147+
fn from(kbucket: Kbucket<Node>) -> Self {
148+
kbucket.nodes
149149
}
150150
}
151151

@@ -154,8 +154,8 @@ pub const KBUCKET_DEFAULT_SIZE: u8 = 8;
154154

155155
impl<NewNode, CheckNode, Node> Kbucket<Node>
156156
where
157-
NewNode: HasPK,
158-
CheckNode: HasPK,
157+
NewNode: HasPk,
158+
CheckNode: HasPk,
159159
Node: KbucketNode<NewNode = NewNode, CheckNode = CheckNode> + From<NewNode>
160160
{
161161
/** Create a new `Kbucket` to store nodes close to the `PublicKey`.

tox_core/src/dht/request_queue.rs

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

78
use crate::utils::gen_ping_id;
89
use crate::time::*;
@@ -28,9 +29,9 @@ impl<T> RequestQueue<T> {
2829
}
2930

3031
/// Generate unique non zero request ID.
31-
fn generate_ping_id(&self) -> u64 {
32+
fn generate_ping_id<R: Rng>(&self, rng: &mut R) -> u64 {
3233
loop {
33-
let ping_id = gen_ping_id();
34+
let ping_id = gen_ping_id(rng);
3435
if !self.ping_map.contains_key(&ping_id) {
3536
return ping_id;
3637
}
@@ -39,8 +40,8 @@ impl<T> RequestQueue<T> {
3940

4041
/// Generate and store unique non zero request ID. Later this request ID can
4142
/// be verified with `check_ping_id` function.
42-
pub fn new_ping_id(&mut self, data: T) -> u64 {
43-
let ping_id = self.generate_ping_id();
43+
pub fn new_ping_id<R: Rng>(&mut self, rng: &mut R, data: T) -> u64 {
44+
let ping_id = self.generate_ping_id(rng);
4445
self.ping_map.insert(ping_id, (clock_now(), data));
4546
ping_id
4647
}
@@ -87,26 +88,22 @@ impl<T> RequestQueue<T> {
8788
mod tests {
8889
use super::*;
8990

90-
use tox_crypto::*;
91+
use rand::thread_rng;
9192

9293
#[test]
9394
fn insert_new_ping_id() {
94-
crypto_init().unwrap();
95-
9695
let mut queue = RequestQueue::new(Duration::from_secs(42));
9796

98-
let ping_id = queue.new_ping_id(7);
97+
let ping_id = queue.new_ping_id(&mut thread_rng(), 7);
9998

10099
assert_eq!(queue.ping_map[&ping_id].1, 7);
101100
}
102101

103102
#[test]
104103
fn check_ping_id() {
105-
crypto_init().unwrap();
106-
107104
let mut queue = RequestQueue::new(Duration::from_secs(42));
108105

109-
let ping_id = queue.new_ping_id(7);
106+
let ping_id = queue.new_ping_id(&mut thread_rng(), 7);
110107
assert_eq!(queue.check_ping_id(ping_id, |&data| data == 6), None);
111108
assert_eq!(queue.check_ping_id(ping_id, |&data| data == 7), Some(7));
112109
assert_eq!(queue.check_ping_id(ping_id, |&data| data == 7), None);
@@ -121,21 +118,17 @@ mod tests {
121118

122119
#[test]
123120
fn check_ping_id_nonexistent() {
124-
crypto_init().unwrap();
125-
126121
let mut queue = RequestQueue::new(Duration::from_secs(42));
127122

128-
let ping_id = queue.new_ping_id(());
123+
let ping_id = queue.new_ping_id(&mut thread_rng(), ());
129124
assert_eq!(queue.check_ping_id(ping_id.overflowing_add(1).0, |_| true), None);
130125
assert_eq!(queue.check_ping_id(ping_id.overflowing_sub(1).0, |_| true), None);
131126
}
132127

133128
#[tokio::test]
134129
async fn check_ping_id_timed_out() {
135-
crypto_init().unwrap();
136-
137130
let mut queue = RequestQueue::new(Duration::from_secs(42));
138-
let ping_id = queue.new_ping_id(());
131+
let ping_id = queue.new_ping_id(&mut thread_rng(), ());
139132

140133
tokio::time::pause();
141134

@@ -148,18 +141,16 @@ mod tests {
148141

149142
#[tokio::test]
150143
async fn clear_timed_out() {
151-
crypto_init().unwrap();
152-
153144
let mut queue = RequestQueue::new(Duration::from_secs(42));
154-
let ping_id_1 = queue.new_ping_id(());
145+
let ping_id_1 = queue.new_ping_id(&mut thread_rng(), ());
155146

156147
tokio::time::pause();
157148

158149
let now = clock_now();
159150
let time = queue.ping_map[&ping_id_1].0;
160151

161152
tokio::time::advance((time + Duration::from_secs(21)) - now).await;
162-
let ping_id_2 = queue.new_ping_id(());
153+
let ping_id_2 = queue.new_ping_id(&mut thread_rng(), ());
163154

164155
tokio::time::advance(Duration::from_secs(43 - 21)).await;
165156
queue.clear_timed_out();
@@ -171,13 +162,12 @@ mod tests {
171162

172163
#[test]
173164
fn get_values() {
174-
crypto_init().unwrap();
175-
176165
let mut queue = RequestQueue::new(Duration::from_secs(42));
166+
let mut rng = &mut thread_rng();
177167

178-
let _ping_id_1 = queue.new_ping_id(1);
179-
let _ping_id_2 = queue.new_ping_id(2);
180-
let _ping_id_3 = queue.new_ping_id(3);
168+
let _ping_id_1 = queue.new_ping_id(&mut rng, 1);
169+
let _ping_id_2 = queue.new_ping_id(&mut rng, 2);
170+
let _ping_id_3 = queue.new_ping_id(&mut rng, 3);
181171

182172
let values = queue.get_values().map(|(_, &data)| data).collect::<Vec<_>>();
183173

tox_core/src/dht/server/hole_punching.rs

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +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;
1011

1112
use crate::dht::dht_friend::*;
1213
use crate::dht::server::*;
@@ -55,15 +56,9 @@ pub struct HolePunching {
5556
pub ping_id: u64,
5657
}
5758

58-
impl Default for HolePunching {
59-
fn default() -> Self {
60-
HolePunching::new()
61-
}
62-
}
63-
6459
impl HolePunching {
6560
/// Create new `HolePunching` object.
66-
pub fn new() -> Self {
61+
pub fn new<R: Rng>(rng: &mut R) -> Self {
6762
HolePunching {
6863
is_punching_done: true,
6964
num_punch_tries: 0,
@@ -72,7 +67,7 @@ impl HolePunching {
7267
last_punching_time: None,
7368
first_punching_index: 0,
7469
last_punching_index: 0,
75-
ping_id: gen_ping_id(),
70+
ping_id: gen_ping_id(rng),
7671
}
7772
}
7873

@@ -216,21 +211,11 @@ impl HolePunching {
216211
#[cfg(test)]
217212
mod tests {
218213
use super::*;
214+
use rand::thread_rng;
219215

220216
#[test]
221217
fn hole_punch_new() {
222-
let hole_punch = HolePunching::new();
223-
assert!(hole_punch.is_punching_done);
224-
assert_eq!(hole_punch.num_punch_tries, 0);
225-
assert!(hole_punch.last_send_ping_time.is_none());
226-
assert!(hole_punch.last_punching_time.is_none());
227-
assert_eq!(hole_punch.first_punching_index, 0);
228-
assert_eq!(hole_punch.last_punching_index, 0);
229-
}
230-
231-
#[test]
232-
fn hole_punch_default() {
233-
let hole_punch = HolePunching::default();
218+
let hole_punch = HolePunching::new(&mut thread_rng());
234219
assert!(hole_punch.is_punching_done);
235220
assert_eq!(hole_punch.num_punch_tries, 0);
236221
assert!(hole_punch.last_send_ping_time.is_none());
@@ -243,7 +228,7 @@ mod tests {
243228
fn hole_punch_get_common_ip_with_null_addrs() {
244229
let addrs = vec![];
245230

246-
let mut hole_punch = HolePunching::new();
231+
let mut hole_punch = HolePunching::new(&mut thread_rng());
247232
hole_punch.is_punching_done = false;
248233

249234
assert!(hole_punch.next_punch_addrs(&addrs).is_empty());
@@ -257,7 +242,7 @@ mod tests {
257242
"127.0.0.2:33333".parse().unwrap(),
258243
];
259244

260-
let mut hole_punch = HolePunching::new();
245+
let mut hole_punch = HolePunching::new(&mut thread_rng());
261246
hole_punch.is_punching_done = false;
262247

263248
assert!(hole_punch.next_punch_addrs(&addrs).is_empty());
@@ -277,7 +262,7 @@ mod tests {
277262
"127.0.0.2:55559".parse().unwrap(),
278263
];
279264

280-
let mut hole_punch = HolePunching::new();
265+
let mut hole_punch = HolePunching::new(&mut thread_rng());
281266
hole_punch.is_punching_done = false;
282267

283268
assert!(!hole_punch.next_punch_addrs(&addrs).is_empty());
@@ -297,7 +282,7 @@ mod tests {
297282
"127.0.0.2:55559".parse().unwrap(),
298283
];
299284

300-
let mut hole_punch = HolePunching::new();
285+
let mut hole_punch = HolePunching::new(&mut thread_rng());
301286
hole_punch.is_punching_done = false;
302287
hole_punch.num_punch_tries = MAX_NORMAL_PUNCHING_TRIES + 1;
303288

0 commit comments

Comments
 (0)