summaryrefslogtreecommitdiff
path: root/toxcore
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2014-03-04 15:36:29 -0500
committerirungentoo <irungentoo@gmail.com>2014-03-04 15:36:29 -0500
commitb6fe49e59a39cb12334cbcad82b07a6247eb22d5 (patch)
tree76c0f3a954569bfac756a1767e5912d71c8f46ec /toxcore
parenta251e71a97d40342bada58d88c2234f3ba25c700 (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.c47
-rw-r--r--toxcore/DHT.h20
-rw-r--r--toxcore/ping.c2
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 */
119void 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
149struct 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
148typedef struct { 161typedef 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 */
190void DHT_get_shared_key(DHT *dht, uint8_t *shared_key, uint8_t *client_id);
191
192
173void DHT_getnodes(DHT *dht, IP_Port *from_ipp, uint8_t *from_id, uint8_t *which_id); 193void 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,