summaryrefslogtreecommitdiff
path: root/toxcore
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2014-03-02 19:46:47 -0500
committerirungentoo <irungentoo@gmail.com>2014-03-02 19:46:47 -0500
commitc0c660c99ac953cffd0828ba9b7f625507825cdf (patch)
tree3b3a6e15283b9796c47cf07ac40e6a971aebd2bc /toxcore
parentde69dcef241d54dc75ce01cdeae60f445660608f (diff)
Small CPU optimizations to ping requests/reponses.
Same idea as last commit.
Diffstat (limited to 'toxcore')
-rw-r--r--toxcore/ping.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/toxcore/ping.c b/toxcore/ping.c
index f521542f..2bc1f07d 100644
--- a/toxcore/ping.c
+++ b/toxcore/ping.c
@@ -44,6 +44,7 @@ typedef struct {
44 IP_Port ip_port; 44 IP_Port ip_port;
45 uint64_t id; 45 uint64_t id;
46 uint64_t timestamp; 46 uint64_t timestamp;
47 uint8_t shared_key[crypto_box_BEFORENMBYTES];
47} pinged_t; 48} pinged_t;
48 49
49struct PING { 50struct PING {
@@ -86,7 +87,7 @@ static void remove_timeouts(PING *ping) // O(n)
86 ping->pos_pings = new_pos % PING_NUM_MAX; 87 ping->pos_pings = new_pos % PING_NUM_MAX;
87} 88}
88 89
89static uint64_t add_ping(PING *ping, IP_Port ipp) // O(n) 90static uint64_t add_ping(PING *ping, IP_Port ipp, uint8_t *shared_encryption_key) // O(n)
90{ 91{
91 size_t p; 92 size_t p;
92 93
@@ -104,6 +105,7 @@ static uint64_t add_ping(PING *ping, IP_Port ipp) // O(n)
104 ping->pings[p].ip_port = ipp; 105 ping->pings[p].ip_port = ipp;
105 ping->pings[p].timestamp = unix_time(); 106 ping->pings[p].timestamp = unix_time();
106 ping->pings[p].id = random_64b(); 107 ping->pings[p].id = random_64b();
108 memcpy(ping->pings[p].shared_key, shared_encryption_key, crypto_box_BEFORENMBYTES);
107 109
108 ping->num_pings++; 110 ping->num_pings++;
109 return ping->pings[p].id; 111 return ping->pings[p].id;
@@ -151,19 +153,22 @@ int send_ping_request(PING *ping, IP_Port ipp, uint8_t *client_id)
151 if (is_pinging(ping, ipp, 0) || id_equal(client_id, ping->dht->self_public_key)) 153 if (is_pinging(ping, ipp, 0) || id_equal(client_id, ping->dht->self_public_key))
152 return 1; 154 return 1;
153 155
156 uint8_t shared_key[crypto_box_BEFORENMBYTES];
157
158 // generate key to encrypt ping_id with recipient privkey
159 encrypt_precompute(client_id, ping->dht->self_secret_key, shared_key);
154 // Generate random ping_id. 160 // Generate random ping_id.
155 ping_id = add_ping(ping, ipp); 161 ping_id = add_ping(ping, ipp, shared_key);
156 162
157 pk[0] = NET_PACKET_PING_REQUEST; 163 pk[0] = NET_PACKET_PING_REQUEST;
158 id_copy(pk + 1, ping->dht->self_public_key); // Our pubkey 164 id_copy(pk + 1, ping->dht->self_public_key); // Our pubkey
159 new_nonce(pk + 1 + CLIENT_ID_SIZE); // Generate new nonce 165 new_nonce(pk + 1 + CLIENT_ID_SIZE); // Generate new nonce
160 166
161 // Encrypt ping_id using recipient privkey 167
162 rc = encrypt_data(client_id, 168 rc = encrypt_data_fast(shared_key,
163 ping->dht->self_secret_key, 169 pk + 1 + CLIENT_ID_SIZE,
164 pk + 1 + CLIENT_ID_SIZE, 170 (uint8_t *) &ping_id, sizeof(ping_id),
165 (uint8_t *) &ping_id, sizeof(ping_id), 171 pk + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES);
166 pk + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES);
167 172
168 if (rc != sizeof(ping_id) + crypto_box_MACBYTES) 173 if (rc != sizeof(ping_id) + crypto_box_MACBYTES)
169 return 1; 174 return 1;
@@ -244,21 +249,23 @@ static int handle_ping_response(void *_dht, IP_Port source, uint8_t *packet, uin
244 if (id_equal(packet + 1, ping->dht->self_public_key)) 249 if (id_equal(packet + 1, ping->dht->self_public_key))
245 return 1; 250 return 1;
246 251
252 int ping_index = is_pinging(ping, source, 0);
253
254 if (!ping_index)
255 return 1;
256
257 --ping_index;
247 // Decrypt ping_id 258 // Decrypt ping_id
248 rc = decrypt_data(packet + 1, 259 rc = decrypt_data_fast(ping->pings[ping_index].shared_key,
249 ping->dht->self_secret_key, 260 packet + 1 + CLIENT_ID_SIZE,
250 packet + 1 + CLIENT_ID_SIZE, 261 packet + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES,
251 packet + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES, 262 sizeof(ping_id) + crypto_box_MACBYTES,
252 sizeof(ping_id) + crypto_box_MACBYTES, 263 (uint8_t *) &ping_id);
253 (uint8_t *) &ping_id);
254 264
255 if (rc != sizeof(ping_id)) 265 if (rc != sizeof(ping_id))
256 return 1; 266 return 1;
257 267
258 /* Make sure ping_id is correct. */ 268 if (ping->pings[ping_index].id != ping_id)
259 int ping_index = is_pinging(ping, source, ping_id);
260
261 if (!ping_index)
262 return 1; 269 return 1;
263 270
264 addto_lists(dht, source, packet + 1); 271 addto_lists(dht, source, packet + 1);