diff options
author | irungentoo <irungentoo@gmail.com> | 2013-12-28 21:51:09 -0500 |
---|---|---|
committer | irungentoo <irungentoo@gmail.com> | 2013-12-28 21:51:09 -0500 |
commit | 822c7d3dcaf8281738adfa8928ff0e83d9d3aa7b (patch) | |
tree | 8e9ee3b02f3b59036e7a2d334201be055f18c87c /toxcore/onion.c | |
parent | 86aff82a9fb172ef020050a3b14565d4b24ecb1a (diff) |
Another packet type is now handled by onion.c
Diffstat (limited to 'toxcore/onion.c')
-rw-r--r-- | toxcore/onion.c | 42 |
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 | ||