diff options
author | iphydf <iphydf@users.noreply.github.com> | 2018-08-01 23:02:13 +0000 |
---|---|---|
committer | iphydf <iphydf@users.noreply.github.com> | 2018-08-16 21:01:43 +0000 |
commit | d6d305feeb76735ee4b4e14c6bca737a5482bc19 (patch) | |
tree | 99005c635a452245006b3b5de44f1dd80da9f77f /toxcore/onion_announce.c | |
parent | 54066f338f185f2fbd6694d9a4877f42cbfa21c8 (diff) |
Use per-instance `Mono_Time` for Messenger and onion.
Diffstat (limited to 'toxcore/onion_announce.c')
-rw-r--r-- | toxcore/onion_announce.c | 29 |
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 | ||
52 | struct Onion_Announce { | 52 | struct 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 | ||
268 | typedef struct Cmp_data { | 269 | typedef 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 | ||
310 | static void sort_onion_announce_list(Onion_Announce_Entry *list, unsigned int length, const uint8_t *comp_public_key) | 312 | static 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 | ||
496 | Onion_Announce *new_onion_announce(DHT *dht) | 502 | Onion_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); |