diff options
Diffstat (limited to 'toxcore')
-rw-r--r-- | toxcore/network.c | 25 | ||||
-rw-r--r-- | toxcore/network.h | 15 | ||||
-rw-r--r-- | toxcore/onion.c | 91 | ||||
-rw-r--r-- | toxcore/onion.h | 8 |
4 files changed, 90 insertions, 49 deletions
diff --git a/toxcore/network.c b/toxcore/network.c index 4b71d70b..63d0c3d7 100644 --- a/toxcore/network.c +++ b/toxcore/network.c | |||
@@ -891,6 +891,31 @@ void ipport_copy(IP_Port *target, IP_Port *source) | |||
891 | memcpy(target, source, sizeof(IP_Port)); | 891 | memcpy(target, source, sizeof(IP_Port)); |
892 | }; | 892 | }; |
893 | 893 | ||
894 | /* packing and unpacking functions */ | ||
895 | void ip_pack(uint8_t *data, IP *source) | ||
896 | { | ||
897 | data[0] = source->family; | ||
898 | memcpy(data + 1, &source->ip6, SIZE_IP6); | ||
899 | } | ||
900 | |||
901 | void ip_unpack(IP *target, uint8_t *data) | ||
902 | { | ||
903 | target->family = data[0]; | ||
904 | memcpy(&target->ip6, data + 1, SIZE_IP6); | ||
905 | } | ||
906 | |||
907 | void ipport_pack(uint8_t *data, IP_Port *source) | ||
908 | { | ||
909 | ip_pack(data, &source.ip); | ||
910 | memcpy(data + SIZE_IP, &source->port, SIZE_PORT); | ||
911 | } | ||
912 | |||
913 | void ipport_unpack(IP_Port *target, uint8_t *data) | ||
914 | { | ||
915 | ip_unpack(&target.ip, data); | ||
916 | memcpy(&target->port, data + SIZE_IP, SIZE_PORT); | ||
917 | } | ||
918 | |||
894 | /* ip_ntoa | 919 | /* ip_ntoa |
895 | * converts ip into a string | 920 | * converts ip into a string |
896 | * uses a static buffer, so mustn't used multiple times in the same output | 921 | * uses a static buffer, so mustn't used multiple times in the same output |
diff --git a/toxcore/network.h b/toxcore/network.h index c9fb4637..ffd3d6db 100644 --- a/toxcore/network.h +++ b/toxcore/network.h | |||
@@ -89,7 +89,7 @@ typedef int sock_t; | |||
89 | #endif | 89 | #endif |
90 | 90 | ||
91 | #if defined(__sun__) | 91 | #if defined(__sun__) |
92 | #define __EXTENSIONS__ 1 // SunOS! | 92 | #define __EXTENSIONS__ 1 // SunOS! |
93 | #if defined(__SunOS5_6__) || defined(__SunOS5_7__) || defined(__SunOS5_8__) || defined(__SunOS5_9__) || defined(__SunOS5_10__) | 93 | #if defined(__SunOS5_6__) || defined(__SunOS5_7__) || defined(__SunOS5_8__) || defined(__SunOS5_9__) || defined(__SunOS5_10__) |
94 | //Nothing needed | 94 | //Nothing needed |
95 | #else | 95 | #else |
@@ -192,6 +192,13 @@ typedef struct __attribute__ ((__packed__)) __attribute__((gcc_struct)) | |||
192 | } | 192 | } |
193 | IP_Port; | 193 | IP_Port; |
194 | 194 | ||
195 | |||
196 | #define SIZE_IP4 4 | ||
197 | #define SIZE_IP6 16 | ||
198 | #define SIZE_IP (1 + SIZEOF_IP6) | ||
199 | #define SIZE_PORT 2 | ||
200 | #define SIZE_IPPORT (SIZE_IP + SIZE_PORT) | ||
201 | |||
195 | #define TOX_ENABLE_IPV6_DEFAULT 1 | 202 | #define TOX_ENABLE_IPV6_DEFAULT 1 |
196 | 203 | ||
197 | /* ip_ntoa | 204 | /* ip_ntoa |
@@ -229,6 +236,12 @@ void ip_copy(IP *target, IP *source); | |||
229 | /* copies an ip_port structure */ | 236 | /* copies an ip_port structure */ |
230 | void ipport_copy(IP_Port *target, IP_Port *source); | 237 | void ipport_copy(IP_Port *target, IP_Port *source); |
231 | 238 | ||
239 | |||
240 | void ip_pack(uint8_t *data, IP *source); | ||
241 | void ip_unpack(IP *target, uint8_t *data); | ||
242 | void ipport_pack(uint8_t *data, IP_Port *source); | ||
243 | void ipport_unpack(IP_Port *target, uint8_t *data); | ||
244 | |||
232 | /* | 245 | /* |
233 | * addr_resolve(): | 246 | * addr_resolve(): |
234 | * uses getaddrinfo to resolve an address into an IP address | 247 | * uses getaddrinfo to resolve an address into an IP address |
diff --git a/toxcore/onion.c b/toxcore/onion.c index 8cc851c2..067b3907 100644 --- a/toxcore/onion.c +++ b/toxcore/onion.c | |||
@@ -98,31 +98,32 @@ int send_onion_packet(Networking_Core *net, Onion_Path *path, IP_Port dest, uint | |||
98 | return -1; | 98 | return -1; |
99 | 99 | ||
100 | to_net_family(&dest.ip); | 100 | to_net_family(&dest.ip); |
101 | uint8_t step1[sizeof(IP_Port) + length]; | 101 | uint8_t step1[SIZE_IPPORT + length]; |
102 | 102 | ||
103 | memcpy(step1, &dest, sizeof(IP_Port)); | 103 | |
104 | memcpy(step1 + sizeof(IP_Port), data, length); | 104 | ipport_pack(step1, &dest); |
105 | memcpy(step1 + SIZE_IPPORT, data, length); | ||
105 | 106 | ||
106 | uint8_t nonce[crypto_box_NONCEBYTES]; | 107 | uint8_t nonce[crypto_box_NONCEBYTES]; |
107 | random_nonce(nonce); | 108 | random_nonce(nonce); |
108 | 109 | ||
109 | uint8_t step2[sizeof(IP_Port) + SEND_BASE + length]; | 110 | uint8_t step2[SIZE_IPPORT + SEND_BASE + length]; |
110 | memcpy(step2, &path->ip_port3, sizeof(IP_Port)); | 111 | ipport_pack(step2, &path->ip_port3); |
111 | memcpy(step2 + sizeof(IP_Port), path->public_key3, crypto_box_PUBLICKEYBYTES); | 112 | memcpy(step2 + SIZE_IPPORT, path->public_key3, crypto_box_PUBLICKEYBYTES); |
112 | 113 | ||
113 | int len = encrypt_data_symmetric(path->shared_key3, nonce, step1, sizeof(step1), | 114 | int len = encrypt_data_symmetric(path->shared_key3, nonce, step1, sizeof(step1), |
114 | step2 + sizeof(IP_Port) + crypto_box_PUBLICKEYBYTES); | 115 | step2 + SIZE_IPPORT + crypto_box_PUBLICKEYBYTES); |
115 | 116 | ||
116 | if ((uint32_t)len != sizeof(IP_Port) + length + crypto_box_MACBYTES) | 117 | if ((uint32_t)len != SIZE_IPPORT + length + crypto_box_MACBYTES) |
117 | return -1; | 118 | return -1; |
118 | 119 | ||
119 | uint8_t step3[sizeof(IP_Port) + SEND_BASE * 2 + length]; | 120 | uint8_t step3[SIZE_IPPORT + SEND_BASE * 2 + length]; |
120 | memcpy(step3, &path->ip_port2, sizeof(IP_Port)); | 121 | ipport_pack(step3, &path->ip_port2); |
121 | memcpy(step3 + sizeof(IP_Port), path->public_key2, crypto_box_PUBLICKEYBYTES); | 122 | memcpy(step3 + SIZE_IPPORT, path->public_key2, crypto_box_PUBLICKEYBYTES); |
122 | len = encrypt_data_symmetric(path->shared_key2, nonce, step2, sizeof(step2), | 123 | len = encrypt_data_symmetric(path->shared_key2, nonce, step2, sizeof(step2), |
123 | step3 + sizeof(IP_Port) + crypto_box_PUBLICKEYBYTES); | 124 | step3 + SIZE_IPPORT + crypto_box_PUBLICKEYBYTES); |
124 | 125 | ||
125 | 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) |
126 | return -1; | 127 | return -1; |
127 | 128 | ||
128 | uint8_t packet[1 + length + SEND_1]; | 129 | uint8_t packet[1 + length + SEND_1]; |
@@ -133,7 +134,7 @@ int send_onion_packet(Networking_Core *net, Onion_Path *path, IP_Port dest, uint | |||
133 | len = encrypt_data_symmetric(path->shared_key1, nonce, step3, sizeof(step3), | 134 | len = encrypt_data_symmetric(path->shared_key1, nonce, step3, sizeof(step3), |
134 | packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES); | 135 | packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES); |
135 | 136 | ||
136 | 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) |
137 | return -1; | 138 | return -1; |
138 | 139 | ||
139 | 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)) |
@@ -191,20 +192,20 @@ static int handle_send_initial(void *object, IP_Port source, uint8_t *packet, ui | |||
191 | 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) |
192 | { | 193 | { |
193 | IP_Port send_to; | 194 | IP_Port send_to; |
194 | memcpy(&send_to, plain, sizeof(IP_Port)); | 195 | ipport_unpack(&send_to, plain); |
195 | to_host_family(&send_to.ip); | 196 | to_host_family(&send_to.ip); |
196 | 197 | ||
197 | uint8_t data[ONION_MAX_PACKET_SIZE]; | 198 | uint8_t data[ONION_MAX_PACKET_SIZE]; |
198 | data[0] = NET_PACKET_ONION_SEND_1; | 199 | data[0] = NET_PACKET_ONION_SEND_1; |
199 | memcpy(data + 1, nonce, crypto_box_NONCEBYTES); | 200 | memcpy(data + 1, nonce, crypto_box_NONCEBYTES); |
200 | memcpy(data + 1 + crypto_box_NONCEBYTES, plain + sizeof(IP_Port), len - sizeof(IP_Port)); | 201 | memcpy(data + 1 + crypto_box_NONCEBYTES, plain + SIZE_IPPORT, len - SIZE_IPPORT); |
201 | uint32_t data_len = 1 + crypto_box_NONCEBYTES + (len - sizeof(IP_Port)); | 202 | uint32_t data_len = 1 + crypto_box_NONCEBYTES + (len - SIZE_IPPORT); |
202 | uint8_t *ret_part = data + data_len; | 203 | uint8_t *ret_part = data + data_len; |
203 | new_nonce(ret_part); | 204 | new_nonce(ret_part); |
204 | len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, (uint8_t *)&source, sizeof(IP_Port), | 205 | len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, (uint8_t *)&source, SIZE_IPPORT, |
205 | ret_part + crypto_box_NONCEBYTES); | 206 | ret_part + crypto_box_NONCEBYTES); |
206 | 207 | ||
207 | if (len != sizeof(IP_Port) + crypto_box_MACBYTES) | 208 | if (len != SIZE_IPPORT + crypto_box_MACBYTES) |
208 | return 1; | 209 | return 1; |
209 | 210 | ||
210 | data_len += crypto_box_NONCEBYTES + len; | 211 | data_len += crypto_box_NONCEBYTES + len; |
@@ -237,19 +238,19 @@ static int handle_send_1(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
237 | return 1; | 238 | return 1; |
238 | 239 | ||
239 | IP_Port send_to; | 240 | IP_Port send_to; |
240 | memcpy(&send_to, plain, sizeof(IP_Port)); | 241 | ipport_unpack(&send_to, plain); |
241 | to_host_family(&send_to.ip); | 242 | to_host_family(&send_to.ip); |
242 | 243 | ||
243 | uint8_t data[ONION_MAX_PACKET_SIZE]; | 244 | uint8_t data[ONION_MAX_PACKET_SIZE]; |
244 | data[0] = NET_PACKET_ONION_SEND_2; | 245 | data[0] = NET_PACKET_ONION_SEND_2; |
245 | memcpy(data + 1, packet + 1, crypto_box_NONCEBYTES); | 246 | memcpy(data + 1, packet + 1, crypto_box_NONCEBYTES); |
246 | memcpy(data + 1 + crypto_box_NONCEBYTES, plain + sizeof(IP_Port), len - sizeof(IP_Port)); | 247 | memcpy(data + 1 + crypto_box_NONCEBYTES, plain + SIZE_IPPORT, len - SIZE_IPPORT); |
247 | uint32_t data_len = 1 + crypto_box_NONCEBYTES + (len - sizeof(IP_Port)); | 248 | uint32_t data_len = 1 + crypto_box_NONCEBYTES + (len - SIZE_IPPORT); |
248 | uint8_t *ret_part = data + data_len; | 249 | uint8_t *ret_part = data + data_len; |
249 | new_nonce(ret_part); | 250 | new_nonce(ret_part); |
250 | uint8_t ret_data[RETURN_1 + sizeof(IP_Port)]; | 251 | uint8_t ret_data[RETURN_1 + SIZE_IPPORT]; |
251 | memcpy(ret_data, &source, sizeof(IP_Port)); | 252 | ipport_pack(ret_data, &source); |
252 | memcpy(ret_data + sizeof(IP_Port), packet + (length - RETURN_1), RETURN_1); | 253 | memcpy(ret_data + SIZE_IPPORT, packet + (length - RETURN_1), RETURN_1); |
253 | len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, ret_data, sizeof(ret_data), | 254 | len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, ret_data, sizeof(ret_data), |
254 | ret_part + crypto_box_NONCEBYTES); | 255 | ret_part + crypto_box_NONCEBYTES); |
255 | 256 | ||
@@ -286,17 +287,17 @@ static int handle_send_2(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
286 | return 1; | 287 | return 1; |
287 | 288 | ||
288 | IP_Port send_to; | 289 | IP_Port send_to; |
289 | memcpy(&send_to, plain, sizeof(IP_Port)); | 290 | ipport_unpack(&send_to, plain); |
290 | to_host_family(&send_to.ip); | 291 | to_host_family(&send_to.ip); |
291 | 292 | ||
292 | uint8_t data[ONION_MAX_PACKET_SIZE]; | 293 | uint8_t data[ONION_MAX_PACKET_SIZE]; |
293 | memcpy(data, plain + sizeof(IP_Port), len - sizeof(IP_Port)); | 294 | memcpy(data, plain + SIZE_IPPORT, len - SIZE_IPPORT); |
294 | uint32_t data_len = (len - sizeof(IP_Port)); | 295 | uint32_t data_len = (len - SIZE_IPPORT); |
295 | uint8_t *ret_part = data + (len - sizeof(IP_Port)); | 296 | uint8_t *ret_part = data + (len - SIZE_IPPORT); |
296 | new_nonce(ret_part); | 297 | new_nonce(ret_part); |
297 | uint8_t ret_data[RETURN_2 + sizeof(IP_Port)]; | 298 | uint8_t ret_data[RETURN_2 + SIZE_IPPORT]; |
298 | memcpy(ret_data, &source, sizeof(IP_Port)); | 299 | ipport_pack(ret_data, &source); |
299 | memcpy(ret_data + sizeof(IP_Port), packet + (length - RETURN_2), RETURN_2); | 300 | memcpy(ret_data + SIZE_IPPORT, packet + (length - RETURN_2), RETURN_2); |
300 | len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, ret_data, sizeof(ret_data), | 301 | len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, ret_data, sizeof(ret_data), |
301 | ret_part + crypto_box_NONCEBYTES); | 302 | ret_part + crypto_box_NONCEBYTES); |
302 | 303 | ||
@@ -324,19 +325,19 @@ static int handle_recv_3(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
324 | 325 | ||
325 | change_symmetric_key(onion); | 326 | change_symmetric_key(onion); |
326 | 327 | ||
327 | uint8_t plain[sizeof(IP_Port) + RETURN_2]; | 328 | uint8_t plain[SIZE_IPPORT + RETURN_2]; |
328 | int len = decrypt_data_symmetric(onion->secret_symmetric_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES, | 329 | int len = decrypt_data_symmetric(onion->secret_symmetric_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES, |
329 | sizeof(IP_Port) + RETURN_2 + crypto_box_MACBYTES, plain); | 330 | SIZE_IPPORT + RETURN_2 + crypto_box_MACBYTES, plain); |
330 | 331 | ||
331 | if ((uint32_t)len != sizeof(plain)) | 332 | if ((uint32_t)len != sizeof(plain)) |
332 | return 1; | 333 | return 1; |
333 | 334 | ||
334 | IP_Port send_to; | 335 | IP_Port send_to; |
335 | memcpy(&send_to, plain, sizeof(IP_Port)); | 336 | ipport_unpack(&send_to, plain); |
336 | 337 | ||
337 | uint8_t data[ONION_MAX_PACKET_SIZE]; | 338 | uint8_t data[ONION_MAX_PACKET_SIZE]; |
338 | data[0] = NET_PACKET_ONION_RECV_2; | 339 | data[0] = NET_PACKET_ONION_RECV_2; |
339 | memcpy(data + 1, plain + sizeof(IP_Port), RETURN_2); | 340 | memcpy(data + 1, plain + SIZE_IPPORT, RETURN_2); |
340 | memcpy(data + 1 + RETURN_2, packet + 1 + RETURN_3, length - (1 + RETURN_3)); | 341 | memcpy(data + 1 + RETURN_2, packet + 1 + RETURN_3, length - (1 + RETURN_3)); |
341 | uint32_t data_len = 1 + RETURN_2 + (length - (1 + RETURN_3)); | 342 | uint32_t data_len = 1 + RETURN_2 + (length - (1 + RETURN_3)); |
342 | 343 | ||
@@ -358,19 +359,19 @@ static int handle_recv_2(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
358 | 359 | ||
359 | change_symmetric_key(onion); | 360 | change_symmetric_key(onion); |
360 | 361 | ||
361 | uint8_t plain[sizeof(IP_Port) + RETURN_1]; | 362 | uint8_t plain[SIZE_IPPORT + RETURN_1]; |
362 | int len = decrypt_data_symmetric(onion->secret_symmetric_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES, | 363 | int len = decrypt_data_symmetric(onion->secret_symmetric_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES, |
363 | sizeof(IP_Port) + RETURN_1 + crypto_box_MACBYTES, plain); | 364 | SIZE_IPPORT + RETURN_1 + crypto_box_MACBYTES, plain); |
364 | 365 | ||
365 | if ((uint32_t)len != sizeof(plain)) | 366 | if ((uint32_t)len != sizeof(plain)) |
366 | return 1; | 367 | return 1; |
367 | 368 | ||
368 | IP_Port send_to; | 369 | IP_Port send_to; |
369 | memcpy(&send_to, plain, sizeof(IP_Port)); | 370 | ipport_unpack(&send_to, plain); |
370 | 371 | ||
371 | uint8_t data[ONION_MAX_PACKET_SIZE]; | 372 | uint8_t data[ONION_MAX_PACKET_SIZE]; |
372 | data[0] = NET_PACKET_ONION_RECV_1; | 373 | data[0] = NET_PACKET_ONION_RECV_1; |
373 | memcpy(data + 1, plain + sizeof(IP_Port), RETURN_1); | 374 | memcpy(data + 1, plain + SIZE_IPPORT, RETURN_1); |
374 | memcpy(data + 1 + RETURN_1, packet + 1 + RETURN_2, length - (1 + RETURN_2)); | 375 | memcpy(data + 1 + RETURN_1, packet + 1 + RETURN_2, length - (1 + RETURN_2)); |
375 | uint32_t data_len = 1 + RETURN_1 + (length - (1 + RETURN_2)); | 376 | uint32_t data_len = 1 + RETURN_1 + (length - (1 + RETURN_2)); |
376 | 377 | ||
@@ -392,14 +393,16 @@ static int handle_recv_1(void *object, IP_Port source, uint8_t *packet, uint32_t | |||
392 | 393 | ||
393 | change_symmetric_key(onion); | 394 | change_symmetric_key(onion); |
394 | 395 | ||
395 | IP_Port send_to; | 396 | uint8_t plain[SIZE_IPPORT]; |
396 | |||
397 | int len = decrypt_data_symmetric(onion->secret_symmetric_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES, | 397 | int len = decrypt_data_symmetric(onion->secret_symmetric_key, packet + 1, packet + 1 + crypto_box_NONCEBYTES, |
398 | sizeof(IP_Port) + crypto_box_MACBYTES, (uint8_t *) &send_to); | 398 | SIZE_IPPORT + crypto_box_MACBYTES, plain); |
399 | 399 | ||
400 | if ((uint32_t)len != sizeof(IP_Port)) | 400 | if ((uint32_t)len != SIZE_IPPORT) |
401 | return 1; | 401 | return 1; |
402 | 402 | ||
403 | IP_Port send_to; | ||
404 | ipport_unpack(&send_to, plain); | ||
405 | |||
403 | uint32_t data_len = length - (1 + RETURN_1); | 406 | uint32_t data_len = length - (1 + RETURN_1); |
404 | 407 | ||
405 | if (onion->recv_1_function && send_to.ip.family != AF_INET && send_to.ip.family != AF_INET6) | 408 | if (onion->recv_1_function && send_to.ip.family != AF_INET && send_to.ip.family != AF_INET6) |
diff --git a/toxcore/onion.h b/toxcore/onion.h index 712bbf13..13dc8f52 100644 --- a/toxcore/onion.h +++ b/toxcore/onion.h | |||
@@ -41,11 +41,11 @@ typedef struct { | |||
41 | 41 | ||
42 | #define ONION_MAX_PACKET_SIZE 1400 | 42 | #define ONION_MAX_PACKET_SIZE 1400 |
43 | 43 | ||
44 | #define ONION_RETURN_1 (crypto_box_NONCEBYTES + sizeof(IP_Port) + crypto_box_MACBYTES) | 44 | #define ONION_RETURN_1 (crypto_box_NONCEBYTES + SIZE_IPPORT + crypto_box_MACBYTES) |
45 | #define ONION_RETURN_2 (crypto_box_NONCEBYTES + sizeof(IP_Port) + crypto_box_MACBYTES + ONION_RETURN_1) | 45 | #define ONION_RETURN_2 (crypto_box_NONCEBYTES + SIZE_IPPORT + crypto_box_MACBYTES + ONION_RETURN_1) |
46 | #define ONION_RETURN_3 (crypto_box_NONCEBYTES + sizeof(IP_Port) + crypto_box_MACBYTES + ONION_RETURN_2) | 46 | #define ONION_RETURN_3 (crypto_box_NONCEBYTES + SIZE_IPPORT + crypto_box_MACBYTES + ONION_RETURN_2) |
47 | 47 | ||
48 | #define ONION_SEND_BASE (crypto_box_PUBLICKEYBYTES + sizeof(IP_Port) + crypto_box_MACBYTES) | 48 | #define ONION_SEND_BASE (crypto_box_PUBLICKEYBYTES + SIZE_IPPORT + crypto_box_MACBYTES) |
49 | #define ONION_SEND_3 (crypto_box_NONCEBYTES + ONION_SEND_BASE + ONION_RETURN_2) | 49 | #define ONION_SEND_3 (crypto_box_NONCEBYTES + ONION_SEND_BASE + ONION_RETURN_2) |
50 | #define ONION_SEND_2 (crypto_box_NONCEBYTES + ONION_SEND_BASE*2 + ONION_RETURN_1) | 50 | #define ONION_SEND_2 (crypto_box_NONCEBYTES + ONION_SEND_BASE*2 + ONION_RETURN_1) |
51 | #define ONION_SEND_1 (crypto_box_NONCEBYTES + ONION_SEND_BASE*3) | 51 | #define ONION_SEND_1 (crypto_box_NONCEBYTES + ONION_SEND_BASE*3) |