summaryrefslogtreecommitdiff
path: root/toxcore/onion.c
diff options
context:
space:
mode:
Diffstat (limited to 'toxcore/onion.c')
-rw-r--r--toxcore/onion.c174
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 */
96int send_onion_packet(Networking_Core *net, Onion_Path *path, IP_Port dest, uint8_t *data, uint32_t length) 95int 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 */
150int send_onion_response(Networking_Core *net, IP_Port dest, uint8_t *data, uint32_t length, uint8_t *ret) 152int 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
187int onion_send_1(Onion *onion, uint8_t *plain, uint32_t len, IP_Port source, uint8_t *nonce) 192int 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