diff options
author | irungentoo <irungentoo@gmail.com> | 2014-03-04 15:36:29 -0500 |
---|---|---|
committer | irungentoo <irungentoo@gmail.com> | 2014-03-04 15:36:29 -0500 |
commit | b6fe49e59a39cb12334cbcad82b07a6247eb22d5 (patch) | |
tree | 76c0f3a954569bfac756a1767e5912d71c8f46ec /toxcore | |
parent | a251e71a97d40342bada58d88c2234f3ba25c700 (diff) |
CPU usage improvements.
Shared keys for recieved DHT packets are now stored in a special array
so that they don't need to be recomputed for nodes that send us lots of
packets.
Diffstat (limited to 'toxcore')
-rw-r--r-- | toxcore/DHT.c | 47 | ||||
-rw-r--r-- | toxcore/DHT.h | 20 | ||||
-rw-r--r-- | toxcore/ping.c | 2 |
3 files changed, 67 insertions, 2 deletions
diff --git a/toxcore/DHT.c b/toxcore/DHT.c index d7e626c4..be68116c 100644 --- a/toxcore/DHT.c +++ b/toxcore/DHT.c | |||
@@ -114,6 +114,51 @@ static int client_id_cmp(ClientPair p1, ClientPair p2) | |||
114 | return c; | 114 | return c; |
115 | } | 115 | } |
116 | 116 | ||
117 | /* Copy shared_key to decrypt DHT packet from client_id into shared_key | ||
118 | */ | ||
119 | void DHT_get_shared_key(DHT *dht, uint8_t *shared_key, uint8_t *client_id) | ||
120 | { | ||
121 | uint32_t i, num = ~0, curr = 0; | ||
122 | |||
123 | for (i = 0; i < MAX_KEYS_PER_SLOT; ++i) { | ||
124 | int index = client_id[30] * MAX_KEYS_PER_SLOT + i; | ||
125 | |||
126 | if (dht->shared_keys.keys[index].stored) { | ||
127 | if (memcmp(client_id, dht->shared_keys.keys[index].client_id, CLIENT_ID_SIZE) == 0) { | ||
128 | memcpy(shared_key, dht->shared_keys.keys[index].shared_key, crypto_box_BEFORENMBYTES); | ||
129 | ++dht->shared_keys.keys[index].times_requested; | ||
130 | dht->shared_keys.keys[index].time_last_requested = unix_time(); | ||
131 | return; | ||
132 | } | ||
133 | |||
134 | if (num != 0) { | ||
135 | if (is_timeout(dht->shared_keys.keys[index].time_last_requested, KEYS_TIMEOUT)) { | ||
136 | num = 0; | ||
137 | curr = index; | ||
138 | } else if (num > dht->shared_keys.keys[index].times_requested) { | ||
139 | num = dht->shared_keys.keys[index].times_requested; | ||
140 | curr = index; | ||
141 | } | ||
142 | } | ||
143 | } else { | ||
144 | if (num != 0) { | ||
145 | num = 0; | ||
146 | curr = index; | ||
147 | } | ||
148 | } | ||
149 | } | ||
150 | |||
151 | encrypt_precompute(client_id, dht->self_secret_key, shared_key); | ||
152 | |||
153 | if (num != (uint32_t)~0) { | ||
154 | dht->shared_keys.keys[curr].stored = 1; | ||
155 | dht->shared_keys.keys[curr].times_requested = 1; | ||
156 | memcpy(dht->shared_keys.keys[curr].client_id, client_id, CLIENT_ID_SIZE); | ||
157 | memcpy(dht->shared_keys.keys[curr].shared_key, shared_key, crypto_box_BEFORENMBYTES); | ||
158 | dht->shared_keys.keys[curr].time_last_requested = unix_time(); | ||
159 | } | ||
160 | } | ||
161 | |||
117 | /* Check if client with client_id is already in list of length length. | 162 | /* Check if client with client_id is already in list of length length. |
118 | * If it is then set its corresponding timestamp to current time. | 163 | * If it is then set its corresponding timestamp to current time. |
119 | * If the id is already in the list with a different ip_port, update it. | 164 | * If the id is already in the list with a different ip_port, update it. |
@@ -991,7 +1036,7 @@ static int handle_getnodes(void *object, IP_Port source, uint8_t *packet, uint32 | |||
991 | uint8_t plain[CLIENT_ID_SIZE + NODES_ENCRYPTED_MESSAGE_LENGTH]; | 1036 | uint8_t plain[CLIENT_ID_SIZE + NODES_ENCRYPTED_MESSAGE_LENGTH]; |
992 | uint8_t shared_key[crypto_box_BEFORENMBYTES]; | 1037 | uint8_t shared_key[crypto_box_BEFORENMBYTES]; |
993 | 1038 | ||
994 | encrypt_precompute(packet + 1, dht->self_secret_key, shared_key); | 1039 | DHT_get_shared_key(dht, shared_key, packet + 1); |
995 | int len = decrypt_data_fast( shared_key, | 1040 | int len = decrypt_data_fast( shared_key, |
996 | packet + 1 + CLIENT_ID_SIZE, | 1041 | packet + 1 + CLIENT_ID_SIZE, |
997 | packet + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES, | 1042 | packet + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES, |
diff --git a/toxcore/DHT.h b/toxcore/DHT.h index 490d2306..32abdc64 100644 --- a/toxcore/DHT.h +++ b/toxcore/DHT.h | |||
@@ -143,7 +143,20 @@ typedef struct { | |||
143 | } Node_format; | 143 | } Node_format; |
144 | 144 | ||
145 | /*----------------------------------------------------------------------------------*/ | 145 | /*----------------------------------------------------------------------------------*/ |
146 | /* struct to store some shared keys so we don't have to regenerate them for each request. */ | ||
147 | #define MAX_KEYS_PER_SLOT 4 | ||
148 | #define KEYS_TIMEOUT 600 | ||
149 | struct SHARED_KEYS { | ||
150 | struct { | ||
151 | uint8_t client_id[CLIENT_ID_SIZE]; | ||
152 | uint8_t shared_key[crypto_box_BEFORENMBYTES]; | ||
153 | uint32_t times_requested; | ||
154 | uint8_t stored; /* 0 if not, 1 if is */ | ||
155 | uint64_t time_last_requested; | ||
156 | } keys[256 * MAX_KEYS_PER_SLOT]; | ||
157 | }; | ||
146 | 158 | ||
159 | /*----------------------------------------------------------------------------------*/ | ||
147 | 160 | ||
148 | typedef struct { | 161 | typedef struct { |
149 | Net_Crypto *c; | 162 | Net_Crypto *c; |
@@ -162,6 +175,8 @@ typedef struct { | |||
162 | DHT_Friend *friends_list; | 175 | DHT_Friend *friends_list; |
163 | uint16_t num_friends; | 176 | uint16_t num_friends; |
164 | 177 | ||
178 | struct SHARED_KEYS shared_keys; | ||
179 | |||
165 | struct PING *ping; | 180 | struct PING *ping; |
166 | #ifdef ENABLE_ASSOC_DHT | 181 | #ifdef ENABLE_ASSOC_DHT |
167 | struct Assoc *assoc; | 182 | struct Assoc *assoc; |
@@ -170,6 +185,11 @@ typedef struct { | |||
170 | } DHT; | 185 | } DHT; |
171 | /*----------------------------------------------------------------------------------*/ | 186 | /*----------------------------------------------------------------------------------*/ |
172 | 187 | ||
188 | /* Copy shared_key to decrypt DHT packet from client_id into shared_key | ||
189 | */ | ||
190 | void DHT_get_shared_key(DHT *dht, uint8_t *shared_key, uint8_t *client_id); | ||
191 | |||
192 | |||
173 | void DHT_getnodes(DHT *dht, IP_Port *from_ipp, uint8_t *from_id, uint8_t *which_id); | 193 | void DHT_getnodes(DHT *dht, IP_Port *from_ipp, uint8_t *from_id, uint8_t *which_id); |
174 | 194 | ||
175 | /* Add a new friend to the friends list. | 195 | /* Add a new friend to the friends list. |
diff --git a/toxcore/ping.c b/toxcore/ping.c index 2bc1f07d..ff410f39 100644 --- a/toxcore/ping.c +++ b/toxcore/ping.c | |||
@@ -218,7 +218,7 @@ static int handle_ping_request(void *_dht, IP_Port source, uint8_t *packet, uint | |||
218 | uint8_t shared_key[crypto_box_BEFORENMBYTES]; | 218 | uint8_t shared_key[crypto_box_BEFORENMBYTES]; |
219 | 219 | ||
220 | // Decrypt ping_id | 220 | // Decrypt ping_id |
221 | encrypt_precompute(packet + 1, ping->dht->self_secret_key, shared_key); | 221 | DHT_get_shared_key(dht, shared_key, packet + 1); |
222 | rc = decrypt_data_fast(shared_key, | 222 | rc = decrypt_data_fast(shared_key, |
223 | packet + 1 + CLIENT_ID_SIZE, | 223 | packet + 1 + CLIENT_ID_SIZE, |
224 | packet + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES, | 224 | packet + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES, |