mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
Some work done on the client part.
This commit is contained in:
parent
ea7d1a726d
commit
83e9890d6b
|
@ -31,8 +31,6 @@
|
||||||
|
|
||||||
#define ANNOUNCE_REQUEST_SIZE (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + ONION_PING_ID_SIZE + crypto_box_PUBLICKEYBYTES + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH + crypto_box_MACBYTES)
|
#define ANNOUNCE_REQUEST_SIZE (1 + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + ONION_PING_ID_SIZE + crypto_box_PUBLICKEYBYTES + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH + crypto_box_MACBYTES)
|
||||||
#define ANNOUNCE_REQUEST_SIZE_RECV (ANNOUNCE_REQUEST_SIZE + ONION_RETURN_3)
|
#define ANNOUNCE_REQUEST_SIZE_RECV (ANNOUNCE_REQUEST_SIZE + ONION_RETURN_3)
|
||||||
#define ANNOUNCE_RESPONSE_MIN_SIZE (1 + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH + crypto_box_NONCEBYTES + ONION_PING_ID_SIZE + crypto_box_MACBYTES)
|
|
||||||
#define ANNOUNCE_RESPONSE_MAX_SIZE (ANNOUNCE_RESPONSE_MIN_SIZE + sizeof(Node_format)*MAX_SENT_NODES)
|
|
||||||
|
|
||||||
#define DATA_REQUEST_MIN_SIZE (1 + crypto_box_PUBLICKEYBYTES + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + crypto_box_MACBYTES)
|
#define DATA_REQUEST_MIN_SIZE (1 + crypto_box_PUBLICKEYBYTES + crypto_box_NONCEBYTES + crypto_box_PUBLICKEYBYTES + crypto_box_MACBYTES)
|
||||||
#define DATA_REQUEST_MIN_SIZE_RECV (DATA_REQUEST_MIN_SIZE + ONION_RETURN_3)
|
#define DATA_REQUEST_MIN_SIZE_RECV (DATA_REQUEST_MIN_SIZE + ONION_RETURN_3)
|
||||||
|
@ -252,8 +250,10 @@ static int handle_announce_request(void *object, IP_Port source, uint8_t *packet
|
||||||
|
|
||||||
memcpy(pl + ONION_PING_ID_SIZE, nodes_list, num_nodes * sizeof(Node_format));
|
memcpy(pl + ONION_PING_ID_SIZE, nodes_list, num_nodes * sizeof(Node_format));
|
||||||
|
|
||||||
uint8_t data[ANNOUNCE_RESPONSE_MAX_SIZE];
|
uint8_t data[ONION_ANNOUNCE_RESPONSE_MAX_SIZE];
|
||||||
len = encrypt_data(packet + 1 + crypto_box_NONCEBYTES, onion_a->dht->self_secret_key, nonce, pl, ONION_PING_ID_SIZE + num_nodes * sizeof(Node_format), data + 1 + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH + crypto_box_NONCEBYTES);
|
len = encrypt_data(packet + 1 + crypto_box_NONCEBYTES, onion_a->dht->self_secret_key, nonce, pl,
|
||||||
|
ONION_PING_ID_SIZE + num_nodes * sizeof(Node_format),
|
||||||
|
data + 1 + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH + crypto_box_NONCEBYTES);
|
||||||
|
|
||||||
if ((uint32_t)len != ONION_PING_ID_SIZE + num_nodes * sizeof(Node_format) + crypto_box_MACBYTES)
|
if ((uint32_t)len != ONION_PING_ID_SIZE + num_nodes * sizeof(Node_format) + crypto_box_MACBYTES)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -31,6 +31,9 @@
|
||||||
|
|
||||||
#define ONION_ANNOUNCE_SENDBACK_DATA_LENGTH (crypto_secretbox_NONCEBYTES + sizeof(uint64_t) + crypto_box_PUBLICKEYBYTES + crypto_secretbox_MACBYTES)
|
#define ONION_ANNOUNCE_SENDBACK_DATA_LENGTH (crypto_secretbox_NONCEBYTES + sizeof(uint64_t) + crypto_box_PUBLICKEYBYTES + crypto_secretbox_MACBYTES)
|
||||||
|
|
||||||
|
#define ONION_ANNOUNCE_RESPONSE_MIN_SIZE (1 + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH + crypto_box_NONCEBYTES + ONION_PING_ID_SIZE + crypto_box_MACBYTES)
|
||||||
|
#define ONION_ANNOUNCE_RESPONSE_MAX_SIZE (ONION_ANNOUNCE_RESPONSE_MIN_SIZE + sizeof(Node_format)*MAX_SENT_NODES)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t public_key[crypto_box_PUBLICKEYBYTES];
|
uint8_t public_key[crypto_box_PUBLICKEYBYTES];
|
||||||
IP_Port ret_ip_port;
|
IP_Port ret_ip_port;
|
||||||
|
|
|
@ -25,12 +25,84 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "onion_client.h"
|
#include "onion_client.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
#define ANNOUNCE_TIMEOUT 10
|
||||||
|
|
||||||
|
/* Creates a sendback for use in an announce request.
|
||||||
|
* Public key is the key we will be sending it to.
|
||||||
|
*
|
||||||
|
* sendback must be at least ONION_ANNOUNCE_SENDBACK_DATA_LENGTH big
|
||||||
|
*
|
||||||
|
* return -1 on failure
|
||||||
|
* return 0 on success
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static int new_sendback(Onion_Client *onion_c, uint8_t *public_key, uint8_t *sendback)
|
||||||
|
{
|
||||||
|
uint8_t plain[sizeof(uint64_t) + crypto_box_PUBLICKEYBYTES];
|
||||||
|
uint64_t time = unix_time();
|
||||||
|
memcpy(plain, &time, sizeof(uint64_t));
|
||||||
|
memcpy(plain + sizeof(uint64_t), public_key, crypto_box_PUBLICKEYBYTES);
|
||||||
|
|
||||||
|
int len = encrypt_data_symmetric(onion_c->secret_symmetric_key, sendback, plain, sizeof(plain),
|
||||||
|
sendback + crypto_secretbox_NONCEBYTES);
|
||||||
|
|
||||||
|
if ((uint32_t)len + crypto_secretbox_NONCEBYTES != ONION_ANNOUNCE_SENDBACK_DATA_LENGTH)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Checks if the sendback is valid and returns the public key contained in it in returned_pubkey
|
||||||
|
*
|
||||||
|
* sendback is the sendback ONION_ANNOUNCE_SENDBACK_DATA_LENGTH big
|
||||||
|
* returned_pubkey must be at least crypto_box_PUBLICKEYBYTES big
|
||||||
|
*
|
||||||
|
* return -1 on failure
|
||||||
|
* return 0 on success
|
||||||
|
*/
|
||||||
|
static int check_sendback(Onion_Client *onion_c, uint8_t *sendback, uint8_t *returned_pubkey)
|
||||||
|
{
|
||||||
|
uint8_t plain[sizeof(uint64_t) + crypto_box_PUBLICKEYBYTES];
|
||||||
|
int len = decrypt_data_symmetric(onion_c->secret_symmetric_key, sendback, sendback + crypto_secretbox_NONCEBYTES,
|
||||||
|
ONION_ANNOUNCE_SENDBACK_DATA_LENGTH - crypto_secretbox_NONCEBYTES, plain);
|
||||||
|
|
||||||
|
if ((uint32_t)len != sizeof(plain))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
uint64_t timestamp;
|
||||||
|
memcpy(×tamp, plain, sizeof(uint64_t));
|
||||||
|
uint64_t temp_time = unix_time();
|
||||||
|
|
||||||
|
if (timestamp + ANNOUNCE_TIMEOUT < temp_time || temp_time < timestamp)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
memcpy(returned_pubkey, plain + sizeof(uint64_t), crypto_box_PUBLICKEYBYTES);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int handle_announce_response(void *object, IP_Port source, uint8_t *packet, uint32_t length)
|
static int handle_announce_response(void *object, IP_Port source, uint8_t *packet, uint32_t length)
|
||||||
{
|
{
|
||||||
Onion_Client *onion_c = object;
|
Onion_Client *onion_c = object;
|
||||||
|
|
||||||
|
if (length < ONION_ANNOUNCE_RESPONSE_MIN_SIZE || length > ONION_ANNOUNCE_RESPONSE_MAX_SIZE)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if ((length - ONION_ANNOUNCE_RESPONSE_MIN_SIZE) % sizeof(Node_format) != 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
uint16_t num_nodes = (length - ONION_ANNOUNCE_RESPONSE_MIN_SIZE) / sizeof(Node_format);
|
||||||
|
|
||||||
|
uint8_t public_key[crypto_box_PUBLICKEYBYTES];
|
||||||
|
|
||||||
|
if (check_sendback(onion_c, packet + 1, public_key) == -1)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
uint8_t plain[ONION_PING_ID_SIZE + num_nodes * sizeof(Node_format)];
|
||||||
|
|
||||||
|
//int len = decrypt_data(uint8_t *public_key, uint8_t *secret_key, uint8_t *nonce, uint8_t *encrypted, uint32_t length, uint8_t *plain);
|
||||||
|
//TODO
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,13 +124,32 @@ static int handle_data_response(void *object, IP_Port source, uint8_t *packet, u
|
||||||
int random_path(Onion_Client *onion_c, Node_format *nodes)
|
int random_path(Onion_Client *onion_c, Node_format *nodes)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void do_friend(Onion_Client *onion_c, uint16_t friendnum)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void do_announce(Onion_Client *onion_c)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_ONION_CLIENTS; ++i) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_onion_client(Onion_Client *onion_c)
|
void do_onion_client(Onion_Client *onion_c)
|
||||||
{
|
{
|
||||||
|
uint32_t i;
|
||||||
|
do_announce(onion_c);
|
||||||
|
|
||||||
|
for (i = 0; i < onion_c->num_friends; ++i) {
|
||||||
|
do_friend(onion_c, i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Onion_Client *new_onion_client(DHT *dht)
|
Onion_Client *new_onion_client(DHT *dht)
|
||||||
|
@ -73,6 +164,7 @@ Onion_Client *new_onion_client(DHT *dht)
|
||||||
|
|
||||||
onion_c->dht = dht;
|
onion_c->dht = dht;
|
||||||
onion_c->net = dht->c->lossless_udp->net;
|
onion_c->net = dht->c->lossless_udp->net;
|
||||||
|
new_symmetric_key(onion_c->secret_symmetric_key);
|
||||||
|
|
||||||
networking_registerhandler(onion_c->net, NET_PACKET_ANNOUNCE_RESPONSE, &handle_announce_response, onion_c);
|
networking_registerhandler(onion_c->net, NET_PACKET_ANNOUNCE_RESPONSE, &handle_announce_response, onion_c);
|
||||||
networking_registerhandler(onion_c->net, NET_PACKET_ONION_DATA_RESPONSE, &handle_data_response, onion_c);
|
networking_registerhandler(onion_c->net, NET_PACKET_ONION_DATA_RESPONSE, &handle_data_response, onion_c);
|
||||||
|
|
|
@ -29,9 +29,14 @@
|
||||||
#define MAX_ONION_CLIENTS 8
|
#define MAX_ONION_CLIENTS 8
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Node_format clients_list[MAX_ONION_CLIENTS];
|
uint8_t client_id[CLIENT_ID_SIZE];
|
||||||
|
IP_Port ip_port;
|
||||||
|
uint8_t ping_id[ONION_PING_ID_SIZE];
|
||||||
|
uint64_t timestamp;
|
||||||
|
} Onion_Node;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Onion_Node clients_list[MAX_ONION_CLIENTS];
|
||||||
} Onion_Friend;
|
} Onion_Friend;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -40,7 +45,9 @@ typedef struct {
|
||||||
Onion_Friend *friends_list;
|
Onion_Friend *friends_list;
|
||||||
uint16_t num_friends;
|
uint16_t num_friends;
|
||||||
|
|
||||||
Node_format clients_annouce_list[MAX_ONION_CLIENTS];
|
Onion_Node clients_announce_list[MAX_ONION_CLIENTS];
|
||||||
|
|
||||||
|
uint8_t secret_symmetric_key[crypto_secretbox_KEYBYTES];
|
||||||
} Onion_Client;
|
} Onion_Client;
|
||||||
|
|
||||||
int onion_addfriend(Onion_Client *onion_c, uint8_t *client_id);
|
int onion_addfriend(Onion_Client *onion_c, uint8_t *client_id);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user