/work/toxcore/onion_announce.h
Line | Count | Source |
1 | | /* SPDX-License-Identifier: GPL-3.0-or-later |
2 | | * Copyright © 2016-2025 The TokTok team. |
3 | | * Copyright © 2013 Tox project. |
4 | | */ |
5 | | |
6 | | /** |
7 | | * Implementation of the announce part of docs/Prevent_Tracking.txt |
8 | | */ |
9 | | #ifndef C_TOXCORE_TOXCORE_ONION_ANNOUNCE_H |
10 | | #define C_TOXCORE_TOXCORE_ONION_ANNOUNCE_H |
11 | | |
12 | | #include "DHT.h" |
13 | | #include "attributes.h" |
14 | | #include "crypto_core.h" |
15 | | #include "logger.h" |
16 | | #include "mem.h" |
17 | | #include "mono_time.h" |
18 | | #include "network.h" |
19 | | #include "onion.h" |
20 | | #include "timed_auth.h" |
21 | | |
22 | 11.7M | #define ONION_ANNOUNCE_MAX_ENTRIES 160 |
23 | 21.5M | #define ONION_ANNOUNCE_TIMEOUT 300 |
24 | 1.27M | #define ONION_PING_ID_SIZE TIMED_AUTH_SIZE |
25 | 61.6k | #define ONION_MAX_EXTRA_DATA_SIZE 136 |
26 | | |
27 | 801k | #define ONION_ANNOUNCE_SENDBACK_DATA_LENGTH (sizeof(uint64_t)) |
28 | | |
29 | 663 | #define MAX_SENT_GC_NODES 1 |
30 | 212k | #define ONION_ANNOUNCE_REQUEST_MIN_SIZE (1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE + ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_PUBLIC_KEY_SIZE + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH + CRYPTO_MAC_SIZE) |
31 | 4.48k | #define ONION_ANNOUNCE_REQUEST_MAX_SIZE (ONION_ANNOUNCE_REQUEST_MIN_SIZE + ONION_MAX_EXTRA_DATA_SIZE) |
32 | | |
33 | 236k | #define ONION_ANNOUNCE_RESPONSE_MIN_SIZE (2 + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH + CRYPTO_NONCE_SIZE + ONION_PING_ID_SIZE + CRYPTO_MAC_SIZE) |
34 | 58.6k | #define ONION_ANNOUNCE_RESPONSE_MAX_SIZE (ONION_ANNOUNCE_RESPONSE_MIN_SIZE + ONION_MAX_EXTRA_DATA_SIZE * MAX_SENT_NODES) |
35 | | |
36 | | /* TODO: DEPRECATE */ |
37 | 58.2k | #define ONION_ANNOUNCE_REQUEST_SIZE (1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE + ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_PUBLIC_KEY_SIZE + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH + CRYPTO_MAC_SIZE) |
38 | | |
39 | 7.19k | #define ONION_DATA_RESPONSE_MIN_SIZE (1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_MAC_SIZE) |
40 | | |
41 | 49.4k | #define ONION_DATA_REQUEST_MIN_SIZE (1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_MAC_SIZE) |
42 | 29.5k | #define MAX_DATA_REQUEST_SIZE (ONION_MAX_DATA_SIZE - ONION_DATA_REQUEST_MIN_SIZE) |
43 | | |
44 | | typedef struct Onion_Announce Onion_Announce; |
45 | | |
46 | | /** These two are not public; they are for tests only! */ |
47 | | uint8_t *_Nullable onion_announce_entry_public_key(Onion_Announce *_Nonnull onion_a, uint32_t entry); |
48 | | void onion_announce_entry_set_time(Onion_Announce *_Nonnull onion_a, uint32_t entry, uint64_t announce_time); |
49 | | |
50 | | /** @brief Create an onion announce request packet in packet of max_packet_length. |
51 | | * |
52 | | * Recommended value for max_packet_length is ONION_ANNOUNCE_REQUEST_MIN_SIZE. |
53 | | * |
54 | | * dest_client_id is the public key of the node the packet will be sent to. |
55 | | * public_key and secret_key is the kepair which will be used to encrypt the request. |
56 | | * ping_id is the ping id that will be sent in the request. |
57 | | * client_id is the client id of the node we are searching for. |
58 | | * data_public_key is the public key we want others to encrypt their data packets with. |
59 | | * sendback_data is the data of ONION_ANNOUNCE_SENDBACK_DATA_LENGTH length that we expect to |
60 | | * receive back in the response. |
61 | | * |
62 | | * return -1 on failure. |
63 | | * return packet length on success. |
64 | | */ |
65 | | int create_announce_request(const Memory *_Nonnull mem, const Random *_Nonnull rng, uint8_t *_Nonnull packet, uint16_t max_packet_length, const uint8_t *_Nonnull dest_client_id, |
66 | | const uint8_t *_Nonnull public_key, const uint8_t *_Nonnull secret_key, const uint8_t *_Nonnull ping_id, const uint8_t *_Nonnull client_id, const uint8_t *_Nonnull data_public_key, |
67 | | uint64_t sendback_data); |
68 | | |
69 | | /** @brief Create an onion data request packet in packet of max_packet_length. |
70 | | * |
71 | | * Recommended value for max_packet_length is ONION_ANNOUNCE_REQUEST_SIZE. |
72 | | * |
73 | | * public_key is the real public key of the node which we want to send the data of length length to. |
74 | | * encrypt_public_key is the public key used to encrypt the data packet. |
75 | | * |
76 | | * nonce is the nonce to encrypt this packet with |
77 | | * |
78 | | * return -1 on failure. |
79 | | * return 0 on success. |
80 | | */ |
81 | | int create_data_request(const Memory *_Nonnull mem, const Random *_Nonnull rng, uint8_t *_Nonnull packet, uint16_t max_packet_length, const uint8_t *_Nonnull public_key, |
82 | | const uint8_t *_Nonnull encrypt_public_key, const uint8_t *_Nonnull nonce, const uint8_t *_Nonnull data, uint16_t length); |
83 | | |
84 | | /** @brief Create and send an onion announce request packet. |
85 | | * |
86 | | * path is the path the request will take before it is sent to dest. |
87 | | * |
88 | | * public_key and secret_key is the kepair which will be used to encrypt the request. |
89 | | * ping_id is the ping id that will be sent in the request. |
90 | | * client_id is the client id of the node we are searching for. |
91 | | * data_public_key is the public key we want others to encrypt their data packets with. |
92 | | * sendback_data is the data of ONION_ANNOUNCE_SENDBACK_DATA_LENGTH length that we expect to |
93 | | * receive back in the response. |
94 | | * |
95 | | * return -1 on failure. |
96 | | * return 0 on success. |
97 | | */ |
98 | | int send_announce_request(const Logger *_Nonnull log, const Memory *_Nonnull mem, const Networking_Core *_Nonnull net, const Random *_Nonnull rng, const Onion_Path *_Nonnull path, |
99 | | const Node_format *_Nonnull dest, const uint8_t *_Nonnull public_key, const uint8_t *_Nonnull secret_key, const uint8_t *_Nonnull ping_id, const uint8_t *_Nonnull client_id, |
100 | | const uint8_t *_Nonnull data_public_key, uint64_t sendback_data); |
101 | | |
102 | | /** @brief Create and send an onion data request packet. |
103 | | * |
104 | | * path is the path the request will take before it is sent to dest. |
105 | | * (if dest knows the person with the public_key they should |
106 | | * send the packet to that person in the form of a response) |
107 | | * |
108 | | * public_key is the real public key of the node which we want to send the data of length length to. |
109 | | * encrypt_public_key is the public key used to encrypt the data packet. |
110 | | * |
111 | | * nonce is the nonce to encrypt this packet with |
112 | | * |
113 | | * The maximum length of data is MAX_DATA_REQUEST_SIZE. |
114 | | * |
115 | | * return -1 on failure. |
116 | | * return 0 on success. |
117 | | */ |
118 | | int send_data_request(const Logger *_Nonnull log, const Memory *_Nonnull mem, const Networking_Core *_Nonnull net, const Random *_Nonnull rng, const Onion_Path *_Nonnull path, |
119 | | const IP_Port *_Nonnull dest, const uint8_t *_Nonnull public_key, const uint8_t *_Nonnull encrypt_public_key, const uint8_t *_Nonnull nonce, const uint8_t *_Nonnull data, uint16_t length); |
120 | | |
121 | | typedef int pack_extra_data_cb(void *_Nonnull object, const Logger *_Nonnull logger, const Memory *_Nonnull mem, const Mono_Time *_Nonnull mono_time, |
122 | | uint8_t num_nodes, uint8_t *_Nonnull plain, uint16_t plain_size, |
123 | | uint8_t *_Nonnull response, uint16_t response_size, uint16_t offset); |
124 | | |
125 | | void onion_announce_extra_data_callback(Onion_Announce *_Nonnull onion_a, uint16_t extra_data_max_size, pack_extra_data_cb *_Nonnull extra_data_callback, void *_Nonnull extra_data_object); |
126 | | |
127 | | Onion_Announce *_Nullable new_onion_announce(const Logger *_Nonnull log, const Memory *_Nonnull mem, const Random *_Nonnull rng, const Mono_Time *_Nonnull mono_time, DHT *_Nonnull dht); |
128 | | |
129 | | void kill_onion_announce(Onion_Announce *_Nullable onion_a); |
130 | | #endif /* C_TOXCORE_TOXCORE_ONION_ANNOUNCE_H */ |