diff options
author | notsecure <notsecure@marek.ca> | 2014-05-19 09:18:04 -0400 |
---|---|---|
committer | notsecure <notsecure@marek.ca> | 2014-05-19 09:18:04 -0400 |
commit | 0d711afbeca8b229d4161b2a07901ace51663c02 (patch) | |
tree | 6c91713fe149c4b9162e6b41422d27f7b8fe202c /toxcore/onion.c | |
parent | 207e87187d61b02098ae548426f84c6cce515525 (diff) |
IP_Port packing unpacking in onion.c
Diffstat (limited to 'toxcore/onion.c')
-rw-r--r-- | toxcore/onion.c | 91 |
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 | |||
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) |