summaryrefslogtreecommitdiff
path: root/toxcore/onion_announce.c
diff options
context:
space:
mode:
authoriphydf <iphydf@users.noreply.github.com>2018-08-01 23:02:13 +0000
committeriphydf <iphydf@users.noreply.github.com>2018-08-16 21:01:43 +0000
commitd6d305feeb76735ee4b4e14c6bca737a5482bc19 (patch)
tree99005c635a452245006b3b5de44f1dd80da9f77f /toxcore/onion_announce.c
parent54066f338f185f2fbd6694d9a4877f42cbfa21c8 (diff)
Use per-instance `Mono_Time` for Messenger and onion.
Diffstat (limited to 'toxcore/onion_announce.c')
-rw-r--r--toxcore/onion_announce.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/toxcore/onion_announce.c b/toxcore/onion_announce.c
index d368face..f7f06681 100644
--- a/toxcore/onion_announce.c
+++ b/toxcore/onion_announce.c
@@ -50,6 +50,7 @@ typedef struct Onion_Announce_Entry {
50} Onion_Announce_Entry; 50} Onion_Announce_Entry;
51 51
52struct Onion_Announce { 52struct Onion_Announce {
53 Mono_Time *mono_time;
53 DHT *dht; 54 DHT *dht;
54 Networking_Core *net; 55 Networking_Core *net;
55 Onion_Announce_Entry entries[ONION_ANNOUNCE_MAX_ENTRIES]; 56 Onion_Announce_Entry entries[ONION_ANNOUNCE_MAX_ENTRIES];
@@ -256,7 +257,7 @@ static int in_entries(const Onion_Announce *onion_a, const uint8_t *public_key)
256 unsigned int i; 257 unsigned int i;
257 258
258 for (i = 0; i < ONION_ANNOUNCE_MAX_ENTRIES; ++i) { 259 for (i = 0; i < ONION_ANNOUNCE_MAX_ENTRIES; ++i) {
259 if (!is_timeout(onion_a->entries[i].time, ONION_ANNOUNCE_TIMEOUT) 260 if (!mono_time_is_timeout(onion_a->mono_time, onion_a->entries[i].time, ONION_ANNOUNCE_TIMEOUT)
260 && public_key_cmp(onion_a->entries[i].public_key, public_key) == 0) { 261 && public_key_cmp(onion_a->entries[i].public_key, public_key) == 0) {
261 return i; 262 return i;
262 } 263 }
@@ -266,6 +267,7 @@ static int in_entries(const Onion_Announce *onion_a, const uint8_t *public_key)
266} 267}
267 268
268typedef struct Cmp_data { 269typedef struct Cmp_data {
270 const Mono_Time *mono_time;
269 const uint8_t *base_public_key; 271 const uint8_t *base_public_key;
270 Onion_Announce_Entry entry; 272 Onion_Announce_Entry entry;
271} Cmp_data; 273} Cmp_data;
@@ -279,8 +281,8 @@ static int cmp_entry(const void *a, const void *b)
279 Onion_Announce_Entry entry2 = cmp2.entry; 281 Onion_Announce_Entry entry2 = cmp2.entry;
280 const uint8_t *cmp_public_key = cmp1.base_public_key; 282 const uint8_t *cmp_public_key = cmp1.base_public_key;
281 283
282 int t1 = is_timeout(entry1.time, ONION_ANNOUNCE_TIMEOUT); 284 int t1 = mono_time_is_timeout(cmp1.mono_time, entry1.time, ONION_ANNOUNCE_TIMEOUT);
283 int t2 = is_timeout(entry2.time, ONION_ANNOUNCE_TIMEOUT); 285 int t2 = mono_time_is_timeout(cmp1.mono_time, entry2.time, ONION_ANNOUNCE_TIMEOUT);
284 286
285 if (t1 && t2) { 287 if (t1 && t2) {
286 return 0; 288 return 0;
@@ -307,13 +309,15 @@ static int cmp_entry(const void *a, const void *b)
307 return 0; 309 return 0;
308} 310}
309 311
310static void sort_onion_announce_list(Onion_Announce_Entry *list, unsigned int length, const uint8_t *comp_public_key) 312static void sort_onion_announce_list(Onion_Announce_Entry *list, unsigned int length, const Mono_Time *mono_time,
313 const uint8_t *comp_public_key)
311{ 314{
312 // Pass comp_public_key to qsort with each Client_data entry, so the 315 // Pass comp_public_key to qsort with each Client_data entry, so the
313 // comparison function can use it as the base of comparison. 316 // comparison function can use it as the base of comparison.
314 VLA(Cmp_data, cmp_list, length); 317 VLA(Cmp_data, cmp_list, length);
315 318
316 for (uint32_t i = 0; i < length; ++i) { 319 for (uint32_t i = 0; i < length; ++i) {
320 cmp_list[i].mono_time = mono_time;
317 cmp_list[i].base_public_key = comp_public_key; 321 cmp_list[i].base_public_key = comp_public_key;
318 cmp_list[i].entry = list[i]; 322 cmp_list[i].entry = list[i];
319 } 323 }
@@ -338,7 +342,7 @@ static int add_to_entries(Onion_Announce *onion_a, IP_Port ret_ip_port, const ui
338 342
339 if (pos == -1) { 343 if (pos == -1) {
340 for (unsigned i = 0; i < ONION_ANNOUNCE_MAX_ENTRIES; ++i) { 344 for (unsigned i = 0; i < ONION_ANNOUNCE_MAX_ENTRIES; ++i) {
341 if (is_timeout(onion_a->entries[i].time, ONION_ANNOUNCE_TIMEOUT)) { 345 if (mono_time_is_timeout(onion_a->mono_time, onion_a->entries[i].time, ONION_ANNOUNCE_TIMEOUT)) {
342 pos = i; 346 pos = i;
343 } 347 }
344 } 348 }
@@ -358,9 +362,10 @@ static int add_to_entries(Onion_Announce *onion_a, IP_Port ret_ip_port, const ui
358 onion_a->entries[pos].ret_ip_port = ret_ip_port; 362 onion_a->entries[pos].ret_ip_port = ret_ip_port;
359 memcpy(onion_a->entries[pos].ret, ret, ONION_RETURN_3); 363 memcpy(onion_a->entries[pos].ret, ret, ONION_RETURN_3);
360 memcpy(onion_a->entries[pos].data_public_key, data_public_key, CRYPTO_PUBLIC_KEY_SIZE); 364 memcpy(onion_a->entries[pos].data_public_key, data_public_key, CRYPTO_PUBLIC_KEY_SIZE);
361 onion_a->entries[pos].time = unix_time(); 365 onion_a->entries[pos].time = mono_time_get(onion_a->mono_time);
362 366
363 sort_onion_announce_list(onion_a->entries, ONION_ANNOUNCE_MAX_ENTRIES, dht_get_self_public_key(onion_a->dht)); 367 sort_onion_announce_list(onion_a->entries, ONION_ANNOUNCE_MAX_ENTRIES, onion_a->mono_time,
368 dht_get_self_public_key(onion_a->dht));
364 return in_entries(onion_a, public_key); 369 return in_entries(onion_a, public_key);
365} 370}
366 371
@@ -374,7 +379,8 @@ static int handle_announce_request(void *object, IP_Port source, const uint8_t *
374 379
375 const uint8_t *packet_public_key = packet + 1 + CRYPTO_NONCE_SIZE; 380 const uint8_t *packet_public_key = packet + 1 + CRYPTO_NONCE_SIZE;
376 uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE]; 381 uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE];
377 get_shared_key(&onion_a->shared_keys_recv, shared_key, dht_get_self_secret_key(onion_a->dht), packet_public_key); 382 get_shared_key(onion_a->mono_time, &onion_a->shared_keys_recv, shared_key, dht_get_self_secret_key(onion_a->dht),
383 packet_public_key);
378 384
379 uint8_t plain[ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_PUBLIC_KEY_SIZE + 385 uint8_t plain[ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_PUBLIC_KEY_SIZE +
380 ONION_ANNOUNCE_SENDBACK_DATA_LENGTH]; 386 ONION_ANNOUNCE_SENDBACK_DATA_LENGTH];
@@ -387,10 +393,10 @@ static int handle_announce_request(void *object, IP_Port source, const uint8_t *
387 } 393 }
388 394
389 uint8_t ping_id1[ONION_PING_ID_SIZE]; 395 uint8_t ping_id1[ONION_PING_ID_SIZE];
390 generate_ping_id(onion_a, unix_time(), packet_public_key, source, ping_id1); 396 generate_ping_id(onion_a, mono_time_get(onion_a->mono_time), packet_public_key, source, ping_id1);
391 397
392 uint8_t ping_id2[ONION_PING_ID_SIZE]; 398 uint8_t ping_id2[ONION_PING_ID_SIZE];
393 generate_ping_id(onion_a, unix_time() + PING_ID_TIMEOUT, packet_public_key, source, ping_id2); 399 generate_ping_id(onion_a, mono_time_get(onion_a->mono_time) + PING_ID_TIMEOUT, packet_public_key, source, ping_id2);
394 400
395 int index; 401 int index;
396 402
@@ -493,7 +499,7 @@ static int handle_data_request(void *object, IP_Port source, const uint8_t *pack
493 return 0; 499 return 0;
494} 500}
495 501
496Onion_Announce *new_onion_announce(DHT *dht) 502Onion_Announce *new_onion_announce(Mono_Time *mono_time, DHT *dht)
497{ 503{
498 if (dht == nullptr) { 504 if (dht == nullptr) {
499 return nullptr; 505 return nullptr;
@@ -505,6 +511,7 @@ Onion_Announce *new_onion_announce(DHT *dht)
505 return nullptr; 511 return nullptr;
506 } 512 }
507 513
514 onion_a->mono_time = mono_time;
508 onion_a->dht = dht; 515 onion_a->dht = dht;
509 onion_a->net = dht_get_net(dht); 516 onion_a->net = dht_get_net(dht);
510 new_symmetric_key(onion_a->secret_bytes); 517 new_symmetric_key(onion_a->secret_bytes);