summaryrefslogtreecommitdiff
path: root/toxcore/onion.c
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2014-08-13 06:41:35 -0400
committerirungentoo <irungentoo@gmail.com>2014-08-13 06:41:35 -0400
commit70d338703dd95f66f8f3e11abe67379551e106eb (patch)
treee21ec1e36bdee46847a3d0e42f79fde49561caa9 /toxcore/onion.c
parent19b07f7e80097f1a65c1e358140cd441d6ba67b6 (diff)
Added function to create onion packets to send via TCP.
Diffstat (limited to 'toxcore/onion.c')
-rw-r--r--toxcore/onion.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/toxcore/onion.c b/toxcore/onion.c
index 33bb54ca..938b861e 100644
--- a/toxcore/onion.c
+++ b/toxcore/onion.c
@@ -141,6 +141,54 @@ int create_onion_packet(uint8_t *packet, uint16_t max_packet_length, const Onion
141 return 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + len; 141 return 1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + len;
142} 142}
143 143
144/* Create a onion packet to be sent over tcp.
145 *
146 * Use Onion_Path path to create packet for data of length to dest.
147 * Maximum length of data is ONION_MAX_DATA_SIZE.
148 * packet should be at least ONION_MAX_PACKET_SIZE big.
149 *
150 * return -1 on failure.
151 * return length of created packet on success.
152 */
153int create_onion_packet_tcp(uint8_t *packet, uint16_t max_packet_length, const Onion_Path *path, IP_Port dest,
154 const uint8_t *data, uint32_t length)
155{
156 if (crypto_box_NONCEBYTES + SIZE_IPPORT + SEND_BASE * 2 + length > max_packet_length || length == 0)
157 return -1;
158
159 to_net_family(&dest.ip);
160 uint8_t step1[SIZE_IPPORT + length];
161
162
163 ipport_pack(step1, &dest);
164 memcpy(step1 + SIZE_IPPORT, data, length);
165
166 uint8_t nonce[crypto_box_NONCEBYTES];
167 random_nonce(nonce);
168
169 uint8_t step2[SIZE_IPPORT + SEND_BASE + length];
170 ipport_pack(step2, &path->ip_port3);
171 memcpy(step2 + SIZE_IPPORT, path->public_key3, crypto_box_PUBLICKEYBYTES);
172
173 int len = encrypt_data_symmetric(path->shared_key3, nonce, step1, sizeof(step1),
174 step2 + SIZE_IPPORT + crypto_box_PUBLICKEYBYTES);
175
176 if ((uint32_t)len != SIZE_IPPORT + length + crypto_box_MACBYTES)
177 return -1;
178
179 ipport_pack(packet + crypto_box_NONCEBYTES, &path->ip_port2);
180 memcpy(packet + crypto_box_NONCEBYTES + SIZE_IPPORT, path->public_key2, crypto_box_PUBLICKEYBYTES);
181 len = encrypt_data_symmetric(path->shared_key2, nonce, step2, sizeof(step2),
182 packet + crypto_box_NONCEBYTES + SIZE_IPPORT + crypto_box_PUBLICKEYBYTES);
183
184 if ((uint32_t)len != SIZE_IPPORT + SEND_BASE + length + crypto_box_MACBYTES)
185 return -1;
186
187 memcpy(packet, nonce, crypto_box_NONCEBYTES);
188
189 return crypto_box_NONCEBYTES + SIZE_IPPORT + crypto_box_PUBLICKEYBYTES + len;
190}
191
144/* Create and send a onion packet. 192/* Create and send a onion packet.
145 * 193 *
146 * Use Onion_Path path to send data of length to dest. 194 * Use Onion_Path path to send data of length to dest.