diff options
author | irungentoo <irungentoo@gmail.com> | 2013-12-29 15:10:09 -0500 |
---|---|---|
committer | irungentoo <irungentoo@gmail.com> | 2013-12-29 15:10:09 -0500 |
commit | 346dc5265e5269fc4a01cd9cbfc718ef1e8c0a69 (patch) | |
tree | 6f86b770341a20bda28571b34c8da111714efb51 /toxcore | |
parent | 822c7d3dcaf8281738adfa8928ff0e83d9d3aa7b (diff) |
onion.c now handles another packet type.
Diffstat (limited to 'toxcore')
-rw-r--r-- | toxcore/onion.c | 45 |
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 | ||