summaryrefslogtreecommitdiff
path: root/toxcore
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
parent207e87187d61b02098ae548426f84c6cce515525 (diff)
IP_Port packing unpacking in onion.c
Diffstat (limited to 'toxcore')
-rw-r--r--toxcore/network.c25
-rw-r--r--toxcore/network.h15
-rw-r--r--toxcore/onion.c91
-rw-r--r--toxcore/onion.h8
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 */
895void ip_pack(uint8_t *data, IP *source)
896{
897 data[0] = source->family;
898 memcpy(data + 1, &source->ip6, SIZE_IP6);
899}
900
901void ip_unpack(IP *target, uint8_t *data)
902{
903 target->family = data[0];
904 memcpy(&target->ip6, data + 1, SIZE_IP6);
905}
906
907void 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
913void 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}
193IP_Port; 193IP_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 */
230void ipport_copy(IP_Port *target, IP_Port *source); 237void ipport_copy(IP_Port *target, IP_Port *source);
231 238
239
240void ip_pack(uint8_t *data, IP *source);
241void ip_unpack(IP *target, uint8_t *data);
242void ipport_pack(uint8_t *data, IP_Port *source);
243void 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
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)
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)