diff options
author | irungentoo <irungentoo@gmail.com> | 2014-03-03 11:21:55 -0500 |
---|---|---|
committer | irungentoo <irungentoo@gmail.com> | 2014-03-03 11:21:55 -0500 |
commit | 325395820dc5d9f2f6393ee74afefd8c19c224d1 (patch) | |
tree | 8b1877f483c2254dc382d165f4959196a2ef579f | |
parent | c0c660c99ac953cffd0828ba9b7f625507825cdf (diff) |
Some CPU optimizations and fixes to onion_announce_request.
-rw-r--r-- | toxcore/onion_announce.c | 35 |
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; |