summaryrefslogtreecommitdiff
path: root/toxcore/onion.c
diff options
context:
space:
mode:
authornotsecure <notsecure@marek.ca>2014-05-19 09:18:04 -0400
committernotsecure <notsecure@marek.ca>2014-05-19 09:18:04 -0400
commit0d711afbeca8b229d4161b2a07901ace51663c02 (patch)
tree6c91713fe149c4b9162e6b41422d27f7b8fe202c /toxcore/onion.c
parent207e87187d61b02098ae548426f84c6cce515525 (diff)
IP_Port packing unpacking in onion.c
Diffstat (limited to 'toxcore/onion.c')
-rw-r--r--toxcore/onion.c91
1 files changed, 47 insertions, 44 deletions
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
191int 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)
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)