summaryrefslogtreecommitdiff
path: root/toxcore
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2013-12-29 15:10:09 -0500
committerirungentoo <irungentoo@gmail.com>2013-12-29 15:10:09 -0500
commit346dc5265e5269fc4a01cd9cbfc718ef1e8c0a69 (patch)
tree6f86b770341a20bda28571b34c8da111714efb51 /toxcore
parent822c7d3dcaf8281738adfa8928ff0e83d9d3aa7b (diff)
onion.c now handles another packet type.
Diffstat (limited to 'toxcore')
-rw-r--r--toxcore/onion.c45
1 files changed, 41 insertions, 4 deletions
diff --git a/toxcore/onion.c b/toxcore/onion.c
index 0b0586fd..c4497078 100644
--- a/toxcore/onion.c
+++ b/toxcore/onion.c
@@ -84,13 +84,13 @@ static int handle_send_1(void *object, IP_Port source, uint8_t *packet, uint32_t
84 84
85 if (length <= 1 + SEND_2) 85 if (length <= 1 + SEND_2)
86 return 1; 86 return 1;
87 87
88 uint8_t plain[MAX_ONION_SIZE]; 88 uint8_t plain[MAX_ONION_SIZE];
89 89
90 int len = decrypt_data(packet + 1 + crypto_box_NONCEBYTES, onion->dht->self_secret_key, packet + 1, 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, 91 packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES,
92 length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_1), plain); 92 length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_1), plain);
93 93
94 if ((uint32_t)len != length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_1 + crypto_box_MACBYTES)) 94 if ((uint32_t)len != length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_1 + crypto_box_MACBYTES))
95 return 1; 95 return 1;
96 96
@@ -108,14 +108,15 @@ static int handle_send_1(void *object, IP_Port source, uint8_t *packet, uint32_t
108 memcpy(ret_data + sizeof(IP_Port), packet + (length - RETURN_1), RETURN_1); 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), 109 len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, ret_data, sizeof(ret_data),
110 ret_part + crypto_secretbox_NONCEBYTES); 110 ret_part + crypto_secretbox_NONCEBYTES);
111 111
112 if (len != RETURN_2 - crypto_secretbox_NONCEBYTES) 112 if (len != RETURN_2 - crypto_secretbox_NONCEBYTES)
113 return 1; 113 return 1;
114 114
115 data_len += len; 115 data_len += len;
116 116
117 if ((uint32_t)sendpacket(onion->net, send_to, data, data_len) != data_len) 117 if ((uint32_t)sendpacket(onion->net, send_to, data, data_len) != data_len)
118 return 1; 118 return 1;
119
119 return 0; 120 return 0;
120} 121}
121 122
@@ -123,6 +124,42 @@ static int handle_send_2(void *object, IP_Port source, uint8_t *packet, uint32_t
123{ 124{
124 Onion *onion = object; 125 Onion *onion = object;
125 126
127 if (length > MAX_ONION_SIZE)
128 return 1;
129
130 if (length <= 1 + SEND_3)
131 return 1;
132
133 uint8_t plain[MAX_ONION_SIZE];
134
135 int len = decrypt_data(packet + 1 + crypto_box_NONCEBYTES, onion->dht->self_secret_key, packet + 1,
136 packet + 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES,
137 length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_2), plain);
138
139 if ((uint32_t)len != length - (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + RETURN_2 + crypto_box_MACBYTES))
140 return 1;
141
142 IP_Port send_to;
143 memcpy(&send_to, plain, sizeof(IP_Port));
144 uint8_t data[MAX_ONION_SIZE];
145 memcpy(data, plain + sizeof(IP_Port), len - sizeof(IP_Port));
146 uint32_t data_len = (len - sizeof(IP_Port));
147 uint8_t *ret_part = data + (len - sizeof(IP_Port));
148 new_nonce(ret_part);
149 uint8_t ret_data[RETURN_2 + sizeof(IP_Port)];
150 memcpy(ret_data, &source, sizeof(IP_Port));
151 memcpy(ret_data + sizeof(IP_Port), packet + (length - RETURN_2), RETURN_2);
152 len = encrypt_data_symmetric(onion->secret_symmetric_key, ret_part, ret_data, sizeof(ret_data),
153 ret_part + crypto_secretbox_NONCEBYTES);
154
155 if (len != RETURN_3 - crypto_secretbox_NONCEBYTES)
156 return 1;
157
158 data_len += RETURN_3;
159
160 if ((uint32_t)sendpacket(onion->net, send_to, data, data_len) != data_len)
161 return 1;
162
126 return 0; 163 return 0;
127} 164}
128 165