Skip to content

Commit 96c9d11

Browse files
authored
Merge pull request #447 from tox-rs/type_abuse
refactor(onion): use plain array when type of stored value isn't known
2 parents d4e9c3b + ded84c5 commit 96c9d11

File tree

5 files changed

+39
-53
lines changed

5 files changed

+39
-53
lines changed

tox_core/src/dht/server/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,7 +1241,7 @@ impl Server {
12411241
payload: &OnionAnnounceRequestPayload,
12421242
packet: &OnionAnnounceRequest,
12431243
addr: SocketAddr
1244-
) -> (AnnounceStatus, sha256::Digest) {
1244+
) -> (AnnounceStatus, [u8; 32]) {
12451245
let mut onion_announce = self.onion_announce.write().await;
12461246
onion_announce.handle_onion_announce_request(
12471247
&payload,
@@ -2573,7 +2573,7 @@ mod tests {
25732573

25742574
let sendback_data = 42;
25752575
let payload = OnionAnnounceRequestPayload {
2576-
ping_id: initial_ping_id(),
2576+
ping_id: INITIAL_PING_ID,
25772577
search_pk: gen_keypair().0,
25782578
data_pk: gen_keypair().0,
25792579
sendback_data
@@ -2639,7 +2639,7 @@ mod tests {
26392639
// get ping id
26402640

26412641
let payload = OnionAnnounceRequestPayload {
2642-
ping_id: initial_ping_id(),
2642+
ping_id: INITIAL_PING_ID,
26432643
search_pk: gen_keypair().0,
26442644
data_pk: gen_keypair().0,
26452645
sendback_data: 42
@@ -2661,7 +2661,7 @@ mod tests {
26612661
let response = unpack!(packet, Packet::OnionResponse3);
26622662
let response = unpack!(response.payload, InnerOnionResponse::OnionAnnounceResponse);
26632663
let payload = response.get_payload(&precomp).unwrap();
2664-
let ping_id = payload.ping_id_or_pk;
2664+
let ping_id = sha256::Digest(payload.ping_id_or_pk);
26652665

26662666
// announce node
26672667

@@ -3666,7 +3666,7 @@ mod tests {
36663666

36673667
let payload = OnionAnnounceResponsePayload {
36683668
announce_status: AnnounceStatus::Found,
3669-
ping_id_or_pk: sha256::hash(&[1, 2, 3]),
3669+
ping_id_or_pk: [42; 32],
36703670
nodes: vec![
36713671
PackedNode::new(SocketAddr::V4("5.6.7.8:12345".parse().unwrap()), &gen_keypair().0)
36723672
]

tox_core/src/onion/client/mod.rs

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use tox_packet::ip_port::*;
2727
use crate::onion::client::errors::*;
2828
use crate::onion::client::onion_path::*;
2929
use crate::onion::client::paths_pool::*;
30-
use crate::onion::onion_announce::initial_ping_id;
30+
use crate::onion::onion_announce::INITIAL_PING_ID;
3131
use tox_packet::onion::*;
3232
use tox_packet::packed_node::*;
3333
use crate::relay::client::Connections as TcpConnections;
@@ -270,7 +270,7 @@ impl<'a> AnnouncePacketData<'a> {
270270
/// pind_id is 0 and an announce request otherwise.
271271
fn request(&self, node_pk: &PublicKey, ping_id: Option<sha256::Digest>, request_id: u64) -> InnerOnionAnnounceRequest {
272272
let payload = OnionAnnounceRequestPayload {
273-
ping_id: ping_id.unwrap_or_else(initial_ping_id),
273+
ping_id: ping_id.unwrap_or(INITIAL_PING_ID),
274274
search_pk: self.search_pk,
275275
data_pk: self.data_pk.unwrap_or(PublicKey([0; 32])),
276276
sendback_data: request_id,
@@ -467,9 +467,9 @@ impl OnionClient {
467467
}
468468

469469
let (ping_id, data_pk) = if payload.announce_status == AnnounceStatus::Found {
470-
(None, Some(digest_as_pk(payload.ping_id_or_pk)))
470+
(None, Some(PublicKey(payload.ping_id_or_pk)))
471471
} else {
472-
(Some(payload.ping_id_or_pk), None)
472+
(Some(sha256::Digest(payload.ping_id_or_pk)), None)
473473
};
474474

475475
let now = clock_now();
@@ -1211,7 +1211,7 @@ mod tests {
12111211

12121212
drop(state);
12131213

1214-
let ping_id = sha256::hash(&[1, 2, 3]);
1214+
let ping_id = [42; 32];
12151215
let (node_pk, node_sk) = gen_keypair();
12161216
let node = PackedNode::new(SocketAddr::V4("5.6.7.8:12345".parse().unwrap()), &node_pk);
12171217
let payload = OnionAnnounceResponsePayload {
@@ -1228,7 +1228,7 @@ mod tests {
12281228
// The sender should be added to close nodes
12291229
let onion_node = state.announce_list.get_node(&real_pk, &sender_pk).unwrap();
12301230
assert_eq!(onion_node.path_id, path.id());
1231-
assert_eq!(onion_node.ping_id, Some(ping_id));
1231+
assert_eq!(onion_node.ping_id, Some(sha256::Digest(ping_id)));
12321232
assert_eq!(onion_node.data_pk, None);
12331233
assert_eq!(onion_node.announce_status, AnnounceStatus::Announced);
12341234

@@ -1240,7 +1240,7 @@ mod tests {
12401240
let payload = unpack_onion_packet(packet, addr_to_send, &key_by_addr);
12411241
let packet = unpack!(payload.inner, InnerOnionRequest::InnerOnionAnnounceRequest);
12421242
let payload = packet.get_payload(&precompute(&real_pk, &node_sk)).unwrap();
1243-
assert_eq!(payload.ping_id, initial_ping_id());
1243+
assert_eq!(payload.ping_id, INITIAL_PING_ID);
12441244
assert_eq!(payload.search_pk, real_pk);
12451245
assert_eq!(payload.data_pk, onion_client.data_pk);
12461246
}
@@ -1284,12 +1284,11 @@ mod tests {
12841284

12851285
drop(state);
12861286

1287-
let ping_id = sha256::hash(&[1, 2, 3]);
12881287
let (node_pk, _node_sk) = gen_keypair();
12891288
let node = PackedNode::new(SocketAddr::V4("5.6.7.8:12345".parse().unwrap()), &node_pk);
12901289
let payload = OnionAnnounceResponsePayload {
12911290
announce_status: AnnounceStatus::Announced,
1292-
ping_id_or_pk: ping_id,
1291+
ping_id_or_pk: [42; 32],
12931292
nodes: vec![node]
12941293
};
12951294
let packet = OnionAnnounceResponse::new(&precompute(&friend_temporary_pk, &sender_sk), request_id, &payload);
@@ -1345,7 +1344,7 @@ mod tests {
13451344

13461345
let payload = OnionAnnounceResponsePayload {
13471346
announce_status: AnnounceStatus::Announced,
1348-
ping_id_or_pk: sha256::hash(&[1, 2, 3]),
1347+
ping_id_or_pk: [42; 32],
13491348
nodes: vec![node]
13501349
};
13511350
let packet = OnionAnnounceResponse::new(&precompute(&real_pk, &sender_sk), request_id, &payload);
@@ -1410,7 +1409,7 @@ mod tests {
14101409
let node = PackedNode::new(SocketAddr::V4("5.6.7.8:12345".parse().unwrap()), &node_pk);
14111410
let payload = OnionAnnounceResponsePayload {
14121411
announce_status: AnnounceStatus::Found,
1413-
ping_id_or_pk: pk_as_digest(friend_data_pk),
1412+
ping_id_or_pk: friend_data_pk.0,
14141413
nodes: vec![node]
14151414
};
14161415
let packet = OnionAnnounceResponse::new(&precompute(&friend_temporary_pk, &sender_sk), request_id, &payload);
@@ -1434,7 +1433,7 @@ mod tests {
14341433
let payload = unpack_onion_packet(packet, addr_to_send, &key_by_addr);
14351434
let packet = unpack!(payload.inner, InnerOnionRequest::InnerOnionAnnounceRequest);
14361435
let payload = packet.get_payload(&precompute(&friend_temporary_pk, &node_sk)).unwrap();
1437-
assert_eq!(payload.ping_id, initial_ping_id());
1436+
assert_eq!(payload.ping_id, INITIAL_PING_ID);
14381437
assert_eq!(payload.search_pk, friend_pk);
14391438
assert_eq!(payload.data_pk, PublicKey([0; 32]));
14401439
}
@@ -1478,7 +1477,7 @@ mod tests {
14781477
let node = PackedNode::new(SocketAddr::V4("5.6.7.8:12345".parse().unwrap()), &node_pk);
14791478
let payload = OnionAnnounceResponsePayload {
14801479
announce_status: AnnounceStatus::Found,
1481-
ping_id_or_pk: pk_as_digest(friend_data_pk),
1480+
ping_id_or_pk: friend_data_pk.0,
14821481
nodes: vec![node]
14831482
};
14841483
let packet = OnionAnnounceResponse::new(&precompute(&real_pk, &sender_sk), request_id, &payload);
@@ -1520,7 +1519,7 @@ mod tests {
15201519
let (friend_data_pk, _friend_data_sk) = gen_keypair();
15211520
let payload = OnionAnnounceResponsePayload {
15221521
announce_status: AnnounceStatus::Found,
1523-
ping_id_or_pk: pk_as_digest(friend_data_pk),
1522+
ping_id_or_pk: friend_data_pk.0,
15241523
nodes: vec![]
15251524
};
15261525
let packet = OnionAnnounceResponse::new(&precompute(&friend_temporary_pk, &sender_sk), request_id, &payload);
@@ -1625,7 +1624,7 @@ mod tests {
16251624
let node = PackedNode::new(SocketAddr::V4("5.6.7.8:12345".parse().unwrap()), &node_pk);
16261625
let payload = OnionAnnounceResponsePayload {
16271626
announce_status: AnnounceStatus::Found,
1628-
ping_id_or_pk: pk_as_digest(friend_data_pk),
1627+
ping_id_or_pk: friend_data_pk.0,
16291628
nodes: vec![node]
16301629
};
16311630
let packet = OnionAnnounceResponse::new(&precompute(&friend_temporary_pk, &sender_sk), request_id, &payload);
@@ -1890,7 +1889,7 @@ mod tests {
18901889
let payload = unpack_onion_packet(packet, addr_to_send, &key_by_addr);
18911890
let packet = unpack!(payload.inner, InnerOnionRequest::InnerOnionAnnounceRequest);
18921891
let payload = packet.get_payload(&precompute(&real_pk, &key_by_addr[&payload.ip_port.to_saddr()])).unwrap();
1893-
assert_eq!(payload.ping_id, initial_ping_id());
1892+
assert_eq!(payload.ping_id, INITIAL_PING_ID);
18941893
assert_eq!(payload.search_pk, real_pk);
18951894
assert_eq!(payload.data_pk, data_pk);
18961895
}
@@ -2017,7 +2016,7 @@ mod tests {
20172016
let payload = unpack_onion_packet(packet, addr_to_send, &key_by_addr);
20182017
let packet = unpack!(payload.inner, InnerOnionRequest::InnerOnionAnnounceRequest);
20192018
let payload = packet.get_payload(&precompute(&friend_temporary_pk, &key_by_addr[&payload.ip_port.to_saddr()])).unwrap();
2020-
assert_eq!(payload.ping_id, initial_ping_id());
2019+
assert_eq!(payload.ping_id, INITIAL_PING_ID);
20212020
assert_eq!(payload.search_pk, friend_pk);
20222021
assert_eq!(payload.data_pk, PublicKey([0; 32]));
20232022
}
@@ -2097,7 +2096,7 @@ mod tests {
20972096
let payload = unpack_onion_packet(packet, addr_to_send, &key_by_addr);
20982097
let packet = unpack!(payload.inner, InnerOnionRequest::InnerOnionAnnounceRequest);
20992098
let payload = packet.get_payload(&precompute(&friend_temporary_pk, &nodes_key_by_addr[&payload.ip_port.to_saddr()])).unwrap();
2100-
assert_eq!(payload.ping_id, initial_ping_id());
2099+
assert_eq!(payload.ping_id, INITIAL_PING_ID);
21012100
assert_eq!(payload.search_pk, friend_pk);
21022101
assert_eq!(payload.data_pk, PublicKey([0; 32]));
21032102
}

tox_core/src/onion/onion_announce.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,7 @@ pub const PING_ID_TIMEOUT: Duration = Duration::from_secs(300);
2828
pub const ONION_ANNOUNCE_TIMEOUT: Duration = Duration::from_secs(300);
2929

3030
/// Create onion ping id filled with zeros.
31-
pub fn initial_ping_id() -> sha256::Digest {
32-
// can not fail since slice has enough length
33-
sha256::Digest::from_slice(&[0; sha256::DIGESTBYTES]).unwrap()
34-
}
31+
pub const INITIAL_PING_ID: sha256::Digest = sha256::Digest([0; sha256::DIGESTBYTES]);
3532

3633
/** Entry that corresponds to announced onion node.
3734
@@ -262,7 +259,7 @@ impl OnionAnnounce {
262259
request_pk: PublicKey,
263260
onion_return: OnionReturn,
264261
addr: SocketAddr
265-
) -> (AnnounceStatus, sha256::Digest) {
262+
) -> (AnnounceStatus, [u8; 32]) {
266263
let time = SystemTime::now();
267264
let ping_id_1 = self.ping_id(
268265
time,
@@ -289,18 +286,18 @@ impl OnionAnnounce {
289286
if entry.data_pk != payload.data_pk {
290287
// failed to find ourselves with same long term pk but different data pk
291288
// weird case, should we remove it?
292-
(AnnounceStatus::Failed, ping_id_2)
289+
(AnnounceStatus::Failed, ping_id_2.0)
293290
} else {
294291
// successfully announced ourselves
295-
(AnnounceStatus::Announced, ping_id_2)
292+
(AnnounceStatus::Announced, ping_id_2.0)
296293
}
297294
} else {
298295
// requested node is found by its long term pk
299-
(AnnounceStatus::Found, pk_as_digest(entry.data_pk))
296+
(AnnounceStatus::Found, entry.data_pk.0)
300297
}
301298
} else {
302299
// requested node not found or failed to announce
303-
(AnnounceStatus::Failed, ping_id_2)
300+
(AnnounceStatus::Failed, ping_id_2.0)
304301
}
305302
}
306303

@@ -656,7 +653,7 @@ mod tests {
656653

657654
// create request packet
658655
let payload = OnionAnnounceRequestPayload {
659-
ping_id: initial_ping_id(),
656+
ping_id: INITIAL_PING_ID,
660657
search_pk,
661658
data_pk,
662659
sendback_data: 42
@@ -695,7 +692,7 @@ mod tests {
695692

696693
// create request packet
697694
let payload = OnionAnnounceRequestPayload {
698-
ping_id: initial_ping_id(),
695+
ping_id: INITIAL_PING_ID,
699696
search_pk,
700697
data_pk,
701698
sendback_data: 42
@@ -715,7 +712,7 @@ mod tests {
715712
);
716713

717714
assert_eq!(announce_status, AnnounceStatus::Found);
718-
assert_eq!(digest_as_pk(ping_id_or_pk), entry_data_pk);
715+
assert_eq!(ping_id_or_pk, entry_data_pk.0);
719716
}
720717

721718
#[test]
@@ -776,7 +773,7 @@ mod tests {
776773
// create request packet
777774
let sendback_data = 42;
778775
let payload = OnionAnnounceRequestPayload {
779-
ping_id: initial_ping_id(),
776+
ping_id: INITIAL_PING_ID,
780777
search_pk: packet_pk,
781778
data_pk,
782779
sendback_data

tox_crypto/src/lib.rs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -139,18 +139,6 @@ pub fn increment_nonce_number(nonce: &mut Nonce, num: u64) {
139139
bytes.reverse(); // treat nonce as BE number again
140140
}
141141

142-
/// Convert `PublicKey` to sha256 `Digest` type.
143-
pub fn pk_as_digest(pk: PublicKey) -> sha256::Digest {
144-
// can not fail since PublicKey has the same length as sha256 Digest
145-
sha256::Digest::from_slice(pk.as_ref()).unwrap()
146-
}
147-
148-
/// Convert sha256 `Digest` to `PublicKey` type.
149-
pub fn digest_as_pk(d: sha256::Digest) -> PublicKey {
150-
// can not fail since sha256 Digest has the same length as PublicKey
151-
PublicKey::from_slice(d.as_ref()).unwrap()
152-
}
153-
154142
#[cfg(test)]
155143
pub mod tests {
156144
use super::*;

tox_packet/src/onion/onion_announce_response.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ use tox_binary_io::*;
77
use tox_crypto::*;
88
use crate::dht::*;
99

10+
use std::convert::TryInto;
1011
use nom::{
1112
many0,
13+
map_opt,
1214
number::complete::le_u64,
1315
combinator::{rest, rest_len},
1416
};
@@ -130,15 +132,15 @@ pub struct OnionAnnounceResponsePayload {
130132
/// as `is_stored` variable
131133
pub announce_status: AnnounceStatus,
132134
/// Onion ping id or PublicKey that should be used to send data packets
133-
pub ping_id_or_pk: sha256::Digest,
135+
pub ping_id_or_pk: [u8; 32],
134136
/// Up to 4 closest to the requested PublicKey DHT nodes
135137
pub nodes: Vec<PackedNode>
136138
}
137139

138140
impl FromBytes for OnionAnnounceResponsePayload {
139141
named!(from_bytes<OnionAnnounceResponsePayload>, do_parse!(
140142
announce_status: call!(AnnounceStatus::from_bytes) >>
141-
ping_id_or_pk: call!(sha256::Digest::from_bytes) >>
143+
ping_id_or_pk: map_opt!(take!(32), |bytes: &[u8]| bytes.try_into().ok()) >>
142144
nodes: many0!(PackedNode::from_bytes) >>
143145
_len: verify!(value!(nodes.len()), |len| *len <= 4_usize) >>
144146
eof!() >>
@@ -184,7 +186,7 @@ mod tests {
184186
onion_announce_response_payload_encode_decode,
185187
OnionAnnounceResponsePayload {
186188
announce_status: AnnounceStatus::Found,
187-
ping_id_or_pk: sha256::hash(&[1, 2, 3]),
189+
ping_id_or_pk: [42; 32],
188190
nodes: vec![
189191
PackedNode::new(SocketAddr::V4("5.6.7.8:12345".parse().unwrap()), &gen_keypair().0)
190192
]
@@ -199,7 +201,7 @@ mod tests {
199201
let shared_secret = encrypt_precompute(&bob_pk, &alice_sk);
200202
let payload = OnionAnnounceResponsePayload {
201203
announce_status: AnnounceStatus::Found,
202-
ping_id_or_pk: sha256::hash(&[1, 2, 3]),
204+
ping_id_or_pk: [42; 32],
203205
nodes: vec![
204206
PackedNode::new(SocketAddr::V4("5.6.7.8:12345".parse().unwrap()), &gen_keypair().0)
205207
]
@@ -221,7 +223,7 @@ mod tests {
221223
let shared_secret = encrypt_precompute(&bob_pk, &alice_sk);
222224
let payload = OnionAnnounceResponsePayload {
223225
announce_status: AnnounceStatus::Found,
224-
ping_id_or_pk: sha256::hash(&[1, 2, 3]),
226+
ping_id_or_pk: [42; 32],
225227
nodes: vec![
226228
PackedNode::new(SocketAddr::V4("5.6.7.8:12345".parse().unwrap()), &gen_keypair().0)
227229
]

0 commit comments

Comments
 (0)