summaryrefslogtreecommitdiff
path: root/toxcore/onion.c
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2013-12-28 21:51:09 -0500
committerirungentoo <irungentoo@gmail.com>2013-12-28 21:51:09 -0500
commit822c7d3dcaf8281738adfa8928ff0e83d9d3aa7b (patch)
tree8e9ee3b02f3b59036e7a2d334201be055f18c87c /toxcore/onion.c
parent86aff82a9fb172ef020050a3b14565d4b24ecb1a (diff)
Another packet type is now handled by onion.c
Diffstat (limited to 'toxcore/onion.c')
-rw-r--r--toxcore/onion.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/toxcore/onion.c b/toxcore/onion.c
index 7947bd2d..0b0586fd 100644
--- a/toxcore/onion.c
+++ b/toxcore/onion.c
@@ -58,7 +58,8 @@ static int handle_send_initial(void *object, IP_Port source, uint8_t *packet, ui
58 data[0] = NET_PACKET_ONION_SEND_1; 58 data[0] = NET_PACKET_ONION_SEND_1;
59 memcpy(data + 1, packet + 1, crypto_box_NONCEBYTES); 59 memcpy(data + 1, packet + 1, crypto_box_NONCEBYTES);
60 memcpy(data + 1 + crypto_box_NONCEBYTES, plain + sizeof(IP_Port), len - sizeof(IP_Port)); 60 memcpy(data + 1 + crypto_box_NONCEBYTES, plain + sizeof(IP_Port), len - sizeof(IP_Port));
61 uint8_t *ret_part = data + 1 + crypto_box_NONCEBYTES + (len - sizeof(IP_Port)); 61 uint32_t data_len = 1 + crypto_box_NONCEBYTES + (len - sizeof(IP_Port));
62 uint8_t *ret_part = data + data_len;
62 new_nonce(ret_part); 63 new_nonce(ret_part);
63 len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, (uint8_t *)&source, sizeof(IP_Port), 64 len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, (uint8_t *)&source, sizeof(IP_Port),
64 ret_part + crypto_secretbox_NONCEBYTES); 65 ret_part + crypto_secretbox_NONCEBYTES);
@@ -66,7 +67,7 @@ static int handle_send_initial(void *object, IP_Port source, uint8_t *packet, ui
66 if (len != sizeof(IP_Port) + crypto_secretbox_MACBYTES) 67 if (len != sizeof(IP_Port) + crypto_secretbox_MACBYTES)
67 return 1; 68 return 1;
68 69
69 uint32_t data_len = 1 + crypto_box_NONCEBYTES + (len - sizeof(IP_Port)) + len; 70 data_len += len;
70 71
71 if ((uint32_t)sendpacket(onion->net, send_to, data, data_len) != data_len) 72 if ((uint32_t)sendpacket(onion->net, send_to, data, data_len) != data_len)
72 return 1; 73 return 1;
@@ -78,6 +79,43 @@ static int handle_send_1(void *object, IP_Port source, uint8_t *packet, uint32_t
78{ 79{
79 Onion *onion = object; 80 Onion *onion = object;
80 81
82 if (length > MAX_ONION_SIZE)
83 return 1;
84
85 if (length <= 1 + SEND_2)
86 return 1;
87
88 uint8_t plain[MAX_ONION_SIZE];
89
90 int len = decrypt_data(packet + 1 + crypto_box_NONCEBYTES, onion->dht->self_secret_key, packet + 1,
91 packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES,
92 length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_1), plain);
93
94 if ((uint32_t)len != length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_1 + crypto_box_MACBYTES))
95 return 1;
96
97 IP_Port send_to;
98 memcpy(&send_to, plain, sizeof(IP_Port));
99 uint8_t data[MAX_ONION_SIZE];
100 data[0] = NET_PACKET_ONION_SEND_2;
101 memcpy(data + 1, packet + 1, crypto_box_NONCEBYTES);
102 memcpy(data + 1 + crypto_box_NONCEBYTES, plain + sizeof(IP_Port), len - sizeof(IP_Port));
103 uint32_t data_len = 1 + crypto_box_NONCEBYTES + (len - sizeof(IP_Port));
104 uint8_t *ret_part = data + data_len;
105 new_nonce(ret_part);
106 uint8_t ret_data[RETURN_1 + sizeof(IP_Port)];
107 memcpy(ret_data, &source, sizeof(IP_Port));
108 memcpy(ret_data + sizeof(IP_Port), packet + (length - RETURN_1), RETURN_1);
109 len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, ret_data, sizeof(ret_data),
110 ret_part + crypto_secretbox_NONCEBYTES);
111
112 if (len != RETURN_2 - crypto_secretbox_NONCEBYTES)
113 return 1;
114
115 data_len += len;
116
117 if ((uint32_t)sendpacket(onion->net, send_to, data, data_len) != data_len)
118 return 1;
81 return 0; 119 return 0;
82} 120}
83 121