diff options
author | irungentoo <irungentoo@gmail.com> | 2014-03-02 19:46:47 -0500 |
---|---|---|
committer | irungentoo <irungentoo@gmail.com> | 2014-03-02 19:46:47 -0500 |
commit | c0c660c99ac953cffd0828ba9b7f625507825cdf (patch) | |
tree | 3b3a6e15283b9796c47cf07ac40e6a971aebd2bc | |
parent | de69dcef241d54dc75ce01cdeae60f445660608f (diff) |
Small CPU optimizations to ping requests/reponses.
Same idea as last commit.
-rw-r--r-- | toxcore/ping.c | 43 |
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 | ||
49 | struct PING { | 50 | struct 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 | ||
89 | static uint64_t add_ping(PING *ping, IP_Port ipp) // O(n) | 90 | static 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); |