summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2014-03-03 11:21:55 -0500
committerirungentoo <irungentoo@gmail.com>2014-03-03 11:21:55 -0500
commit325395820dc5d9f2f6393ee74afefd8c19c224d1 (patch)
tree8b1877f483c2254dc382d165f4959196a2ef579f
parentc0c660c99ac953cffd0828ba9b7f625507825cdf (diff)
Some CPU optimizations and fixes to onion_announce_request.
-rw-r--r--toxcore/onion_announce.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/toxcore/onion_announce.c b/toxcore/onion_announce.c
index 481e995c..65be8b27 100644
--- a/toxcore/onion_announce.c
+++ b/toxcore/onion_announce.c
@@ -216,26 +216,30 @@ static int handle_announce_request(void *object, IP_Port source, uint8_t *packet
216 if (length != ANNOUNCE_REQUEST_SIZE_RECV) 216 if (length != ANNOUNCE_REQUEST_SIZE_RECV)
217 return 1; 217 return 1;
218 218
219 uint8_t *packet_public_key = packet + 1 + crypto_box_NONCEBYTES;
220 uint8_t shared_key[crypto_box_BEFORENMBYTES];
221 encrypt_precompute(packet_public_key, onion_a->dht->self_secret_key, shared_key);
222
219 uint8_t plain[ONION_PING_ID_SIZE + crypto_box_PUBLICKEYBYTES + crypto_box_PUBLICKEYBYTES + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH]; 223 uint8_t plain[ONION_PING_ID_SIZE + crypto_box_PUBLICKEYBYTES + crypto_box_PUBLICKEYBYTES + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH];
220 int len = decrypt_data(packet + 1 + crypto_box_NONCEBYTES, onion_a->dht->self_secret_key, packet + 1, 224 int len = decrypt_data_fast(shared_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES,
221 packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES, 225 ONION_PING_ID_SIZE + crypto_box_PUBLICKEYBYTES + crypto_box_PUBLICKEYBYTES + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH +
222 ONION_PING_ID_SIZE + crypto_box_PUBLICKEYBYTES + crypto_box_PUBLICKEYBYTES + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH + 226 crypto_box_MACBYTES, plain);
223 crypto_box_MACBYTES, plain);
224 227
225 if ((uint32_t)len != sizeof(plain)) 228 if ((uint32_t)len != sizeof(plain))
226 return 1; 229 return 1;
227 230
228 uint8_t ping_id1[ONION_PING_ID_SIZE]; 231 uint8_t ping_id1[ONION_PING_ID_SIZE];
229 generate_ping_id(onion_a, unix_time(), packet + 1 + crypto_box_NONCEBYTES, source, ping_id1); 232 generate_ping_id(onion_a, unix_time(), packet_public_key, source, ping_id1);
230 233
231 uint8_t ping_id2[ONION_PING_ID_SIZE]; 234 uint8_t ping_id2[ONION_PING_ID_SIZE];
232 generate_ping_id(onion_a, unix_time() + PING_ID_TIMEOUT, packet + 1 + crypto_box_NONCEBYTES, source, ping_id2); 235 generate_ping_id(onion_a, unix_time() + PING_ID_TIMEOUT, packet_public_key, source, ping_id2);
233 236
234 int index = -1; 237 int index = -1;
235 238
239 uint8_t *data_public_key = plain + ONION_PING_ID_SIZE + crypto_box_PUBLICKEYBYTES;
240
236 if (memcmp(ping_id1, plain, ONION_PING_ID_SIZE) == 0 || memcmp(ping_id2, plain, ONION_PING_ID_SIZE) == 0) { 241 if (memcmp(ping_id1, plain, ONION_PING_ID_SIZE) == 0 || memcmp(ping_id2, plain, ONION_PING_ID_SIZE) == 0) {
237 index = add_to_entries(onion_a, source, packet + 1 + crypto_box_NONCEBYTES, 242 index = add_to_entries(onion_a, source, packet_public_key, data_public_key,
238 plain + ONION_PING_ID_SIZE + crypto_box_PUBLICKEYBYTES,
239 packet + (ANNOUNCE_REQUEST_SIZE_RECV - ONION_RETURN_3)); 243 packet + (ANNOUNCE_REQUEST_SIZE_RECV - ONION_RETURN_3));
240 } else { 244 } else {
241 index = in_entries(onion_a, plain + ONION_PING_ID_SIZE); 245 index = in_entries(onion_a, plain + ONION_PING_ID_SIZE);
@@ -260,16 +264,21 @@ static int handle_announce_request(void *object, IP_Port source, uint8_t *packet
260 pl[0] = 0; 264 pl[0] = 0;
261 memcpy(pl + 1, ping_id2, ONION_PING_ID_SIZE); 265 memcpy(pl + 1, ping_id2, ONION_PING_ID_SIZE);
262 } else { 266 } else {
263 pl[0] = 1; 267 if (memcmp(onion_a->entries[index].public_key, packet_public_key, crypto_box_PUBLICKEYBYTES) == 0
264 memcpy(pl + 1, onion_a->entries[index].data_public_key, crypto_box_PUBLICKEYBYTES); 268 && memcmp(onion_a->entries[index].data_public_key, data_public_key, crypto_box_PUBLICKEYBYTES) != 0) {
269 pl[0] = 0;
270 memcpy(pl + 1, ping_id2, ONION_PING_ID_SIZE);
271 } else {
272 pl[0] = 1;
273 memcpy(pl + 1, onion_a->entries[index].data_public_key, crypto_box_PUBLICKEYBYTES);
274 }
265 } 275 }
266 276
267 memcpy(pl + 1 + ONION_PING_ID_SIZE, nodes_list, num_nodes * sizeof(Node_format)); 277 memcpy(pl + 1 + ONION_PING_ID_SIZE, nodes_list, num_nodes * sizeof(Node_format));
268 278
269 uint8_t data[ONION_ANNOUNCE_RESPONSE_MAX_SIZE]; 279 uint8_t data[ONION_ANNOUNCE_RESPONSE_MAX_SIZE];
270 len = encrypt_data(packet + 1 + crypto_box_NONCEBYTES, onion_a->dht->self_secret_key, nonce, pl, 280 len = encrypt_data_fast(shared_key, nonce, pl, 1 + ONION_PING_ID_SIZE + num_nodes * sizeof(Node_format),
271 1 + ONION_PING_ID_SIZE + num_nodes * sizeof(Node_format), 281 data + 1 + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH + crypto_box_NONCEBYTES);
272 data + 1 + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH + crypto_box_NONCEBYTES);
273 282
274 if ((uint32_t)len != 1 + ONION_PING_ID_SIZE + num_nodes * sizeof(Node_format) + crypto_box_MACBYTES) 283 if ((uint32_t)len != 1 + ONION_PING_ID_SIZE + num_nodes * sizeof(Node_format) + crypto_box_MACBYTES)
275 return 1; 284 return 1;