diff options
Diffstat (limited to 'toxcore/onion.c')
-rw-r--r-- | toxcore/onion.c | 174 |
1 files changed, 92 insertions, 82 deletions
diff --git a/toxcore/onion.c b/toxcore/onion.c index ccb729f3..479c6209 100644 --- a/toxcore/onion.c +++ b/toxcore/onion.c | |||
@@ -26,8 +26,6 @@ | |||
26 | #include "onion.h" | 26 | #include "onion.h" |
27 | #include "util.h" | 27 | #include "util.h" |
28 | 28 | ||
29 | #define MAX_ONION_SIZE MAX_DATA_SIZE | ||
30 | |||
31 | #define RETURN_1 ONION_RETURN_1 | 29 | #define RETURN_1 ONION_RETURN_1 |
32 | #define RETURN_2 ONION_RETURN_2 | 30 | #define RETURN_2 ONION_RETURN_2 |
33 | #define RETURN_3 ONION_RETURN_3 | 31 | #define RETURN_3 ONION_RETURN_3 |
@@ -89,41 +87,43 @@ int create_onion_path(DHT *dht, Onion_Path *new_path, Node_format *nodes) | |||
89 | /* Create and send a onion packet. | 87 | /* Create and send a onion packet. |
90 | * | 88 | * |
91 | * Use Onion_Path path to send data of length to dest. | 89 | * Use Onion_Path path to send data of length to dest. |
90 | * Maximum length of data is ONION_MAX_DATA_SIZE. | ||
92 | * | 91 | * |
93 | * return -1 on failure. | 92 | * return -1 on failure. |
94 | * return 0 on success. | 93 | * return 0 on success. |
95 | */ | 94 | */ |
96 | int send_onion_packet(Networking_Core *net, Onion_Path *path, IP_Port dest, uint8_t *data, uint32_t length) | 95 | int send_onion_packet(Networking_Core *net, Onion_Path *path, IP_Port dest, uint8_t *data, uint32_t length) |
97 | { | 96 | { |
98 | if (1 + length + SEND_1 > MAX_ONION_SIZE || length == 0) | 97 | if (1 + length + SEND_1 > ONION_MAX_PACKET_SIZE || length == 0) |
99 | return -1; | 98 | return -1; |
100 | 99 | ||
101 | to_net_family(&dest.ip); | 100 | to_net_family(&dest.ip); |
102 | uint8_t step1[sizeof(IP_Port) + length]; | 101 | uint8_t step1[SIZE_IPPORT + length]; |
102 | |||
103 | 103 | ||
104 | memcpy(step1, &dest, sizeof(IP_Port)); | 104 | ipport_pack(step1, &dest); |
105 | memcpy(step1 + sizeof(IP_Port), data, length); | 105 | memcpy(step1 + SIZE_IPPORT, data, length); |
106 | 106 | ||
107 | uint8_t nonce[crypto_box_NONCEBYTES]; | 107 | uint8_t nonce[crypto_box_NONCEBYTES]; |
108 | random_nonce(nonce); | 108 | random_nonce(nonce); |
109 | 109 | ||
110 | uint8_t step2[sizeof(IP_Port) + SEND_BASE + length]; | 110 | uint8_t step2[SIZE_IPPORT + SEND_BASE + length]; |
111 | memcpy(step2, &path->ip_port3, sizeof(IP_Port)); | 111 | ipport_pack(step2, &path->ip_port3); |
112 | memcpy(step2 + sizeof(IP_Port), path->public_key3, crypto_box_PUBLICKEYBYTES); | 112 | memcpy(step2 + SIZE_IPPORT, path->public_key3, crypto_box_PUBLICKEYBYTES); |
113 | 113 | ||
114 | int len = encrypt_data_fast(path->shared_key3, nonce, step1, sizeof(step1), | 114 | int len = encrypt_data_symmetric(path->shared_key3, nonce, step1, sizeof(step1), |
115 | step2 + sizeof(IP_Port) + crypto_box_PUBLICKEYBYTES); | 115 | step2 + SIZE_IPPORT + crypto_box_PUBLICKEYBYTES); |
116 | 116 | ||
117 | if ((uint32_t)len != sizeof(IP_Port) + length + crypto_box_MACBYTES) | 117 | if ((uint32_t)len != SIZE_IPPORT + length + crypto_box_MACBYTES) |
118 | return -1; | 118 | return -1; |
119 | 119 | ||
120 | uint8_t step3[sizeof(IP_Port) + SEND_BASE * 2 + length]; | 120 | uint8_t step3[SIZE_IPPORT + SEND_BASE * 2 + length]; |
121 | memcpy(step3, &path->ip_port2, sizeof(IP_Port)); | 121 | ipport_pack(step3, &path->ip_port2); |
122 | memcpy(step3 + sizeof(IP_Port), path->public_key2, crypto_box_PUBLICKEYBYTES); | 122 | memcpy(step3 + SIZE_IPPORT, path->public_key2, crypto_box_PUBLICKEYBYTES); |
123 | len = encrypt_data_fast(path->shared_key2, nonce, step2, sizeof(step2), | 123 | len = encrypt_data_symmetric(path->shared_key2, nonce, step2, sizeof(step2), |
124 | step3 + sizeof(IP_Port) + crypto_box_PUBLICKEYBYTES); | 124 | step3 + SIZE_IPPORT + crypto_box_PUBLICKEYBYTES); |
125 | 125 | ||
126 | if ((uint32_t)len != sizeof(IP_Port) + SEND_BASE + length + crypto_box_MACBYTES) | 126 | if ((uint32_t)len != SIZE_IPPORT + SEND_BASE + length + crypto_box_MACBYTES) |
127 | return -1; | 127 | return -1; |
128 | 128 | ||
129 | uint8_t packet[1 + length + SEND_1]; | 129 | uint8_t packet[1 + length + SEND_1]; |
@@ -131,10 +131,10 @@ int send_onion_packet(Networking_Core *net, Onion_Path *path, IP_Port dest, uint | |||
131 | memcpy(packet + 1, nonce, crypto_box_NONCEBYTES); | 131 | memcpy(packet + 1, nonce, crypto_box_NONCEBYTES); |
132 | memcpy(packet + 1 + crypto_box_NONCEBYTES, path->public_key1, crypto_box_PUBLICKEYBYTES); | 132 | memcpy(packet + 1 + crypto_box_NONCEBYTES, path->public_key1, crypto_box_PUBLICKEYBYTES); |
133 | 133 | ||
134 | len = encrypt_data_fast(path->shared_key1, nonce, step3, sizeof(step3), | 134 | len = encrypt_data_symmetric(path->shared_key1, nonce, step3, sizeof(step3), |
135 | packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES); | 135 | packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES); |
136 | 136 | ||
137 | if ((uint32_t)len != sizeof(IP_Port) + SEND_BASE * 2 + length + crypto_box_MACBYTES) | 137 | if ((uint32_t)len != SIZE_IPPORT + SEND_BASE * 2 + length + crypto_box_MACBYTES) |
138 | return -1; | 138 | return -1; |
139 | 139 | ||
140 | if ((uint32_t)sendpacket(net, path->ip_port1, packet, sizeof(packet)) != sizeof(packet)) | 140 | if ((uint32_t)sendpacket(net, path->ip_port1, packet, sizeof(packet)) != sizeof(packet)) |
@@ -142,13 +142,18 @@ int send_onion_packet(Networking_Core *net, Onion_Path *path, IP_Port dest, uint | |||
142 | 142 | ||
143 | return 0; | 143 | return 0; |
144 | } | 144 | } |
145 | |||
145 | /* Create and send a onion response sent initially to dest with. | 146 | /* Create and send a onion response sent initially to dest with. |
147 | * Maximum length of data is ONION_RESPONSE_MAX_DATA_SIZE. | ||
146 | * | 148 | * |
147 | * return -1 on failure. | 149 | * return -1 on failure. |
148 | * return 0 on success. | 150 | * return 0 on success. |
149 | */ | 151 | */ |
150 | int send_onion_response(Networking_Core *net, IP_Port dest, uint8_t *data, uint32_t length, uint8_t *ret) | 152 | int send_onion_response(Networking_Core *net, IP_Port dest, uint8_t *data, uint32_t length, uint8_t *ret) |
151 | { | 153 | { |
154 | if (length > ONION_RESPONSE_MAX_DATA_SIZE || length == 0) | ||
155 | return -1; | ||
156 | |||
152 | uint8_t packet[1 + RETURN_3 + length]; | 157 | uint8_t packet[1 + RETURN_3 + length]; |
153 | packet[0] = NET_PACKET_ONION_RECV_3; | 158 | packet[0] = NET_PACKET_ONION_RECV_3; |
154 | memcpy(packet + 1, ret, RETURN_3); | 159 | memcpy(packet + 1, ret, RETURN_3); |
@@ -164,7 +169,7 @@ static int handle_send_initial(void *object, IP_Port source, uint8_t *packet, ui | |||
164 | { | 169 | { |
165 | Onion *onion = object; | 170 | Onion *onion = object; |
166 | 171 | ||
167 | if (length > MAX_ONION_SIZE) | 172 | if (length > ONION_MAX_PACKET_SIZE) |
168 | return 1; | 173 | return 1; |
169 | 174 | ||
170 | if (length <= 1 + SEND_1) | 175 | if (length <= 1 + SEND_1) |
@@ -172,11 +177,11 @@ static int handle_send_initial(void *object, IP_Port source, uint8_t *packet, ui | |||
172 | 177 | ||
173 | change_symmetric_key(onion); | 178 | change_symmetric_key(onion); |
174 | 179 | ||
175 | uint8_t plain[MAX_ONION_SIZE]; | 180 | uint8_t plain[ONION_MAX_PACKET_SIZE]; |
176 | uint8_t shared_key[crypto_box_BEFORENMBYTES]; | 181 | uint8_t shared_key[crypto_box_BEFORENMBYTES]; |
177 | get_shared_key(&onion->shared_keys_1, shared_key, onion->dht->self_secret_key, packet + 1 + crypto_box_NONCEBYTES); | 182 | get_shared_key(&onion->shared_keys_1, shared_key, onion->dht->self_secret_key, packet + 1 + crypto_box_NONCEBYTES); |
178 | int len = decrypt_data_fast(shared_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES, | 183 | int len = decrypt_data_symmetric(shared_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES, |
179 | length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES), plain); | 184 | length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES), plain); |
180 | 185 | ||
181 | if ((uint32_t)len != length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + crypto_box_MACBYTES)) | 186 | if ((uint32_t)len != length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + crypto_box_MACBYTES)) |
182 | return 1; | 187 | return 1; |
@@ -187,23 +192,26 @@ static int handle_send_initial(void *object, IP_Port source, uint8_t *packet, ui | |||
187 | int onion_send_1(Onion *onion, uint8_t *plain, uint32_t len, IP_Port source, uint8_t *nonce) | 192 | int onion_send_1(Onion *onion, uint8_t *plain, uint32_t len, IP_Port source, uint8_t *nonce) |
188 | { | 193 | { |
189 | IP_Port send_to; | 194 | IP_Port send_to; |
190 | memcpy(&send_to, plain, sizeof(IP_Port)); | 195 | ipport_unpack(&send_to, plain); |
191 | to_host_family(&send_to.ip); | 196 | to_host_family(&send_to.ip); |
192 | 197 | ||
193 | uint8_t data[MAX_ONION_SIZE]; | 198 | uint8_t ip_port[SIZE_IPPORT]; |
199 | ipport_pack(ip_port, &source); | ||
200 | |||
201 | uint8_t data[ONION_MAX_PACKET_SIZE]; | ||
194 | data[0] = NET_PACKET_ONION_SEND_1; | 202 | data[0] = NET_PACKET_ONION_SEND_1; |
195 | memcpy(data + 1, nonce, crypto_box_NONCEBYTES); | 203 | memcpy(data + 1, nonce, crypto_box_NONCEBYTES); |
196 | memcpy(data + 1 + crypto_box_NONCEBYTES, plain + sizeof(IP_Port), len - sizeof(IP_Port)); | 204 | memcpy(data + 1 + crypto_box_NONCEBYTES, plain + SIZE_IPPORT, len - SIZE_IPPORT); |
197 | uint32_t data_len = 1 + crypto_box_NONCEBYTES + (len - sizeof(IP_Port)); | 205 | uint32_t data_len = 1 + crypto_box_NONCEBYTES + (len - SIZE_IPPORT); |
198 | uint8_t *ret_part = data + data_len; | 206 | uint8_t *ret_part = data + data_len; |
199 | new_nonce(ret_part); | 207 | new_nonce(ret_part); |
200 | len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, (uint8_t *)&source, sizeof(IP_Port), | 208 | len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, ip_port, SIZE_IPPORT, |
201 | ret_part + crypto_secretbox_NONCEBYTES); | 209 | ret_part + crypto_box_NONCEBYTES); |
202 | 210 | ||
203 | if (len != sizeof(IP_Port) + crypto_secretbox_MACBYTES) | 211 | if (len != SIZE_IPPORT + crypto_box_MACBYTES) |
204 | return 1; | 212 | return 1; |
205 | 213 | ||
206 | data_len += crypto_secretbox_NONCEBYTES + len; | 214 | data_len += crypto_box_NONCEBYTES + len; |
207 | 215 | ||
208 | if ((uint32_t)sendpacket(onion->net, send_to, data, data_len) != data_len) | 216 | if ((uint32_t)sendpacket(onion->net, send_to, data, data_len) != data_len) |
209 | return 1; | 217 | return 1; |
@@ -215,7 +223,7 @@ static int handle_send_1(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
215 | { | 223 | { |
216 | Onion *onion = object; | 224 | Onion *onion = object; |
217 | 225 | ||
218 | if (length > MAX_ONION_SIZE) | 226 | if (length > ONION_MAX_PACKET_SIZE) |
219 | return 1; | 227 | return 1; |
220 | 228 | ||
221 | if (length <= 1 + SEND_2) | 229 | if (length <= 1 + SEND_2) |
@@ -223,36 +231,36 @@ static int handle_send_1(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
223 | 231 | ||
224 | change_symmetric_key(onion); | 232 | change_symmetric_key(onion); |
225 | 233 | ||
226 | uint8_t plain[MAX_ONION_SIZE]; | 234 | uint8_t plain[ONION_MAX_PACKET_SIZE]; |
227 | uint8_t shared_key[crypto_box_BEFORENMBYTES]; | 235 | uint8_t shared_key[crypto_box_BEFORENMBYTES]; |
228 | get_shared_key(&onion->shared_keys_2, shared_key, onion->dht->self_secret_key, packet + 1 + crypto_box_NONCEBYTES); | 236 | get_shared_key(&onion->shared_keys_2, shared_key, onion->dht->self_secret_key, packet + 1 + crypto_box_NONCEBYTES); |
229 | int len = decrypt_data_fast(shared_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES, | 237 | int len = decrypt_data_symmetric(shared_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES, |
230 | length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_1), plain); | 238 | length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_1), plain); |
231 | 239 | ||
232 | if ((uint32_t)len != length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_1 + crypto_box_MACBYTES)) | 240 | if ((uint32_t)len != length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_1 + crypto_box_MACBYTES)) |
233 | return 1; | 241 | return 1; |
234 | 242 | ||
235 | IP_Port send_to; | 243 | IP_Port send_to; |
236 | memcpy(&send_to, plain, sizeof(IP_Port)); | 244 | ipport_unpack(&send_to, plain); |
237 | to_host_family(&send_to.ip); | 245 | to_host_family(&send_to.ip); |
238 | 246 | ||
239 | uint8_t data[MAX_ONION_SIZE]; | 247 | uint8_t data[ONION_MAX_PACKET_SIZE]; |
240 | data[0] = NET_PACKET_ONION_SEND_2; | 248 | data[0] = NET_PACKET_ONION_SEND_2; |
241 | memcpy(data + 1, packet + 1, crypto_box_NONCEBYTES); | 249 | memcpy(data + 1, packet + 1, crypto_box_NONCEBYTES); |
242 | memcpy(data + 1 + crypto_box_NONCEBYTES, plain + sizeof(IP_Port), len - sizeof(IP_Port)); | 250 | memcpy(data + 1 + crypto_box_NONCEBYTES, plain + SIZE_IPPORT, len - SIZE_IPPORT); |
243 | uint32_t data_len = 1 + crypto_box_NONCEBYTES + (len - sizeof(IP_Port)); | 251 | uint32_t data_len = 1 + crypto_box_NONCEBYTES + (len - SIZE_IPPORT); |
244 | uint8_t *ret_part = data + data_len; | 252 | uint8_t *ret_part = data + data_len; |
245 | new_nonce(ret_part); | 253 | new_nonce(ret_part); |
246 | uint8_t ret_data[RETURN_1 + sizeof(IP_Port)]; | 254 | uint8_t ret_data[RETURN_1 + SIZE_IPPORT]; |
247 | memcpy(ret_data, &source, sizeof(IP_Port)); | 255 | ipport_pack(ret_data, &source); |
248 | memcpy(ret_data + sizeof(IP_Port), packet + (length - RETURN_1), RETURN_1); | 256 | memcpy(ret_data + SIZE_IPPORT, packet + (length - RETURN_1), RETURN_1); |
249 | len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, ret_data, sizeof(ret_data), | 257 | len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, ret_data, sizeof(ret_data), |
250 | ret_part + crypto_secretbox_NONCEBYTES); | 258 | ret_part + crypto_box_NONCEBYTES); |
251 | 259 | ||
252 | if (len != RETURN_2 - crypto_secretbox_NONCEBYTES) | 260 | if (len != RETURN_2 - crypto_box_NONCEBYTES) |
253 | return 1; | 261 | return 1; |
254 | 262 | ||
255 | data_len += crypto_secretbox_NONCEBYTES + len; | 263 | data_len += crypto_box_NONCEBYTES + len; |
256 | 264 | ||
257 | if ((uint32_t)sendpacket(onion->net, send_to, data, data_len) != data_len) | 265 | if ((uint32_t)sendpacket(onion->net, send_to, data, data_len) != data_len) |
258 | return 1; | 266 | return 1; |
@@ -264,7 +272,7 @@ static int handle_send_2(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
264 | { | 272 | { |
265 | Onion *onion = object; | 273 | Onion *onion = object; |
266 | 274 | ||
267 | if (length > MAX_ONION_SIZE) | 275 | if (length > ONION_MAX_PACKET_SIZE) |
268 | return 1; | 276 | return 1; |
269 | 277 | ||
270 | if (length <= 1 + SEND_3) | 278 | if (length <= 1 + SEND_3) |
@@ -272,31 +280,31 @@ static int handle_send_2(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
272 | 280 | ||
273 | change_symmetric_key(onion); | 281 | change_symmetric_key(onion); |
274 | 282 | ||
275 | uint8_t plain[MAX_ONION_SIZE]; | 283 | uint8_t plain[ONION_MAX_PACKET_SIZE]; |
276 | uint8_t shared_key[crypto_box_BEFORENMBYTES]; | 284 | uint8_t shared_key[crypto_box_BEFORENMBYTES]; |
277 | get_shared_key(&onion->shared_keys_3, shared_key, onion->dht->self_secret_key, packet + 1 + crypto_box_NONCEBYTES); | 285 | get_shared_key(&onion->shared_keys_3, shared_key, onion->dht->self_secret_key, packet + 1 + crypto_box_NONCEBYTES); |
278 | int len = decrypt_data_fast(shared_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES, | 286 | int len = decrypt_data_symmetric(shared_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES, |
279 | length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_2), plain); | 287 | length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_2), plain); |
280 | 288 | ||
281 | if ((uint32_t)len != length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_2 + crypto_box_MACBYTES)) | 289 | if ((uint32_t)len != length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_2 + crypto_box_MACBYTES)) |
282 | return 1; | 290 | return 1; |
283 | 291 | ||
284 | IP_Port send_to; | 292 | IP_Port send_to; |
285 | memcpy(&send_to, plain, sizeof(IP_Port)); | 293 | ipport_unpack(&send_to, plain); |
286 | to_host_family(&send_to.ip); | 294 | to_host_family(&send_to.ip); |
287 | 295 | ||
288 | uint8_t data[MAX_ONION_SIZE]; | 296 | uint8_t data[ONION_MAX_PACKET_SIZE]; |
289 | memcpy(data, plain + sizeof(IP_Port), len - sizeof(IP_Port)); | 297 | memcpy(data, plain + SIZE_IPPORT, len - SIZE_IPPORT); |
290 | uint32_t data_len = (len - sizeof(IP_Port)); | 298 | uint32_t data_len = (len - SIZE_IPPORT); |
291 | uint8_t *ret_part = data + (len - sizeof(IP_Port)); | 299 | uint8_t *ret_part = data + (len - SIZE_IPPORT); |
292 | new_nonce(ret_part); | 300 | new_nonce(ret_part); |
293 | uint8_t ret_data[RETURN_2 + sizeof(IP_Port)]; | 301 | uint8_t ret_data[RETURN_2 + SIZE_IPPORT]; |
294 | memcpy(ret_data, &source, sizeof(IP_Port)); | 302 | ipport_pack(ret_data, &source); |
295 | memcpy(ret_data + sizeof(IP_Port), packet + (length - RETURN_2), RETURN_2); | 303 | memcpy(ret_data + SIZE_IPPORT, packet + (length - RETURN_2), RETURN_2); |
296 | len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, ret_data, sizeof(ret_data), | 304 | len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, ret_data, sizeof(ret_data), |
297 | ret_part + crypto_secretbox_NONCEBYTES); | 305 | ret_part + crypto_box_NONCEBYTES); |
298 | 306 | ||
299 | if (len != RETURN_3 - crypto_secretbox_NONCEBYTES) | 307 | if (len != RETURN_3 - crypto_box_NONCEBYTES) |
300 | return 1; | 308 | return 1; |
301 | 309 | ||
302 | data_len += RETURN_3; | 310 | data_len += RETURN_3; |
@@ -312,7 +320,7 @@ static int handle_recv_3(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
312 | { | 320 | { |
313 | Onion *onion = object; | 321 | Onion *onion = object; |
314 | 322 | ||
315 | if (length > MAX_ONION_SIZE) | 323 | if (length > ONION_MAX_PACKET_SIZE) |
316 | return 1; | 324 | return 1; |
317 | 325 | ||
318 | if (length <= 1 + RETURN_3) | 326 | if (length <= 1 + RETURN_3) |
@@ -320,19 +328,19 @@ static int handle_recv_3(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
320 | 328 | ||
321 | change_symmetric_key(onion); | 329 | change_symmetric_key(onion); |
322 | 330 | ||
323 | uint8_t plain[sizeof(IP_Port) + RETURN_2]; | 331 | uint8_t plain[SIZE_IPPORT + RETURN_2]; |
324 | int len = decrypt_data_symmetric(onion->secret_symmetric_key, packet + 1, packet + 1 + crypto_secretbox_NONCEBYTES, | 332 | int len = decrypt_data_symmetric(onion->secret_symmetric_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES, |
325 | sizeof(IP_Port) + RETURN_2 + crypto_secretbox_MACBYTES, plain); | 333 | SIZE_IPPORT + RETURN_2 + crypto_box_MACBYTES, plain); |
326 | 334 | ||
327 | if ((uint32_t)len != sizeof(plain)) | 335 | if ((uint32_t)len != sizeof(plain)) |
328 | return 1; | 336 | return 1; |
329 | 337 | ||
330 | IP_Port send_to; | 338 | IP_Port send_to; |
331 | memcpy(&send_to, plain, sizeof(IP_Port)); | 339 | ipport_unpack(&send_to, plain); |
332 | 340 | ||
333 | uint8_t data[MAX_ONION_SIZE]; | 341 | uint8_t data[ONION_MAX_PACKET_SIZE]; |
334 | data[0] = NET_PACKET_ONION_RECV_2; | 342 | data[0] = NET_PACKET_ONION_RECV_2; |
335 | memcpy(data + 1, plain + sizeof(IP_Port), RETURN_2); | 343 | memcpy(data + 1, plain + SIZE_IPPORT, RETURN_2); |
336 | memcpy(data + 1 + RETURN_2, packet + 1 + RETURN_3, length - (1 + RETURN_3)); | 344 | memcpy(data + 1 + RETURN_2, packet + 1 + RETURN_3, length - (1 + RETURN_3)); |
337 | uint32_t data_len = 1 + RETURN_2 + (length - (1 + RETURN_3)); | 345 | uint32_t data_len = 1 + RETURN_2 + (length - (1 + RETURN_3)); |
338 | 346 | ||
@@ -346,7 +354,7 @@ static int handle_recv_2(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
346 | { | 354 | { |
347 | Onion *onion = object; | 355 | Onion *onion = object; |
348 | 356 | ||
349 | if (length > MAX_ONION_SIZE) | 357 | if (length > ONION_MAX_PACKET_SIZE) |
350 | return 1; | 358 | return 1; |
351 | 359 | ||
352 | if (length <= 1 + RETURN_2) | 360 | if (length <= 1 + RETURN_2) |
@@ -354,19 +362,19 @@ static int handle_recv_2(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
354 | 362 | ||
355 | change_symmetric_key(onion); | 363 | change_symmetric_key(onion); |
356 | 364 | ||
357 | uint8_t plain[sizeof(IP_Port) + RETURN_1]; | 365 | uint8_t plain[SIZE_IPPORT + RETURN_1]; |
358 | int len = decrypt_data_symmetric(onion->secret_symmetric_key, packet + 1, packet + 1 + crypto_secretbox_NONCEBYTES, | 366 | int len = decrypt_data_symmetric(onion->secret_symmetric_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES, |
359 | sizeof(IP_Port) + RETURN_1 + crypto_secretbox_MACBYTES, plain); | 367 | SIZE_IPPORT + RETURN_1 + crypto_box_MACBYTES, plain); |
360 | 368 | ||
361 | if ((uint32_t)len != sizeof(plain)) | 369 | if ((uint32_t)len != sizeof(plain)) |
362 | return 1; | 370 | return 1; |
363 | 371 | ||
364 | IP_Port send_to; | 372 | IP_Port send_to; |
365 | memcpy(&send_to, plain, sizeof(IP_Port)); | 373 | ipport_unpack(&send_to, plain); |
366 | 374 | ||
367 | uint8_t data[MAX_ONION_SIZE]; | 375 | uint8_t data[ONION_MAX_PACKET_SIZE]; |
368 | data[0] = NET_PACKET_ONION_RECV_1; | 376 | data[0] = NET_PACKET_ONION_RECV_1; |
369 | memcpy(data + 1, plain + sizeof(IP_Port), RETURN_1); | 377 | memcpy(data + 1, plain + SIZE_IPPORT, RETURN_1); |
370 | memcpy(data + 1 + RETURN_1, packet + 1 + RETURN_2, length - (1 + RETURN_2)); | 378 | memcpy(data + 1 + RETURN_1, packet + 1 + RETURN_2, length - (1 + RETURN_2)); |
371 | uint32_t data_len = 1 + RETURN_1 + (length - (1 + RETURN_2)); | 379 | uint32_t data_len = 1 + RETURN_1 + (length - (1 + RETURN_2)); |
372 | 380 | ||
@@ -380,7 +388,7 @@ static int handle_recv_1(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
380 | { | 388 | { |
381 | Onion *onion = object; | 389 | Onion *onion = object; |
382 | 390 | ||
383 | if (length > MAX_ONION_SIZE) | 391 | if (length > ONION_MAX_PACKET_SIZE) |
384 | return 1; | 392 | return 1; |
385 | 393 | ||
386 | if (length <= 1 + RETURN_1) | 394 | if (length <= 1 + RETURN_1) |
@@ -388,14 +396,16 @@ static int handle_recv_1(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
388 | 396 | ||
389 | change_symmetric_key(onion); | 397 | change_symmetric_key(onion); |
390 | 398 | ||
391 | IP_Port send_to; | 399 | uint8_t plain[SIZE_IPPORT]; |
392 | 400 | int len = decrypt_data_symmetric(onion->secret_symmetric_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES, | |
393 | int len = decrypt_data_symmetric(onion->secret_symmetric_key, packet + 1, packet + 1 + crypto_secretbox_NONCEBYTES, | 401 | SIZE_IPPORT + crypto_box_MACBYTES, plain); |
394 | sizeof(IP_Port) + crypto_secretbox_MACBYTES, (uint8_t *) &send_to); | ||
395 | 402 | ||
396 | if ((uint32_t)len != sizeof(IP_Port)) | 403 | if ((uint32_t)len != SIZE_IPPORT) |
397 | return 1; | 404 | return 1; |
398 | 405 | ||
406 | IP_Port send_to; | ||
407 | ipport_unpack(&send_to, plain); | ||
408 | |||
399 | uint32_t data_len = length - (1 + RETURN_1); | 409 | uint32_t data_len = length - (1 + RETURN_1); |
400 | 410 | ||
401 | if (onion->recv_1_function && send_to.ip.family != AF_INET && send_to.ip.family != AF_INET6) | 411 | if (onion->recv_1_function && send_to.ip.family != AF_INET && send_to.ip.family != AF_INET6) |
@@ -424,7 +434,7 @@ Onion *new_onion(DHT *dht) | |||
424 | return NULL; | 434 | return NULL; |
425 | 435 | ||
426 | onion->dht = dht; | 436 | onion->dht = dht; |
427 | onion->net = dht->c->lossless_udp->net; | 437 | onion->net = dht->net; |
428 | new_symmetric_key(onion->secret_symmetric_key); | 438 | new_symmetric_key(onion->secret_symmetric_key); |
429 | onion->timestamp = unix_time(); | 439 | onion->timestamp = unix_time(); |
430 | 440 | ||