mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
TCP server now has onion functionality.
All the IP/Port related structs now have __attribute__ ((__packed__))
This commit is contained in:
parent
8aaa5fe996
commit
98cba889a7
|
@ -28,7 +28,7 @@ START_TEST(test_basic)
|
||||||
uint8_t self_public_key[crypto_box_PUBLICKEYBYTES];
|
uint8_t self_public_key[crypto_box_PUBLICKEYBYTES];
|
||||||
uint8_t self_secret_key[crypto_box_SECRETKEYBYTES];
|
uint8_t self_secret_key[crypto_box_SECRETKEYBYTES];
|
||||||
crypto_box_keypair(self_public_key, self_secret_key);
|
crypto_box_keypair(self_public_key, self_secret_key);
|
||||||
TCP_Server *tcp_s = new_TCP_server(1, NUM_PORTS, ports, self_public_key, self_secret_key);
|
TCP_Server *tcp_s = new_TCP_server(1, NUM_PORTS, ports, self_public_key, self_secret_key, NULL);
|
||||||
ck_assert_msg(tcp_s != NULL, "Failed to create TCP relay server");
|
ck_assert_msg(tcp_s != NULL, "Failed to create TCP relay server");
|
||||||
|
|
||||||
sock_t sock = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
|
sock_t sock = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
|
||||||
|
@ -202,7 +202,7 @@ START_TEST(test_some)
|
||||||
uint8_t self_public_key[crypto_box_PUBLICKEYBYTES];
|
uint8_t self_public_key[crypto_box_PUBLICKEYBYTES];
|
||||||
uint8_t self_secret_key[crypto_box_SECRETKEYBYTES];
|
uint8_t self_secret_key[crypto_box_SECRETKEYBYTES];
|
||||||
crypto_box_keypair(self_public_key, self_secret_key);
|
crypto_box_keypair(self_public_key, self_secret_key);
|
||||||
TCP_Server *tcp_s = new_TCP_server(1, NUM_PORTS, ports, self_public_key, self_secret_key);
|
TCP_Server *tcp_s = new_TCP_server(1, NUM_PORTS, ports, self_public_key, self_secret_key, NULL);
|
||||||
ck_assert_msg(tcp_s != NULL, "Failed to create TCP relay server");
|
ck_assert_msg(tcp_s != NULL, "Failed to create TCP relay server");
|
||||||
|
|
||||||
struct sec_TCP_con *con1 = new_TCP_con(tcp_s);
|
struct sec_TCP_con *con1 = new_TCP_con(tcp_s);
|
||||||
|
|
|
@ -167,6 +167,7 @@ static int add_accepted(TCP_Server *TCP_server, TCP_Secure_Connection *con)
|
||||||
memcpy(&TCP_server->accepted_connection_array[index], con, sizeof(TCP_Secure_Connection));
|
memcpy(&TCP_server->accepted_connection_array[index], con, sizeof(TCP_Secure_Connection));
|
||||||
TCP_server->accepted_connection_array[index].status = TCP_STATUS_CONFIRMED;
|
TCP_server->accepted_connection_array[index].status = TCP_STATUS_CONFIRMED;
|
||||||
++TCP_server->num_accepted_connections;
|
++TCP_server->num_accepted_connections;
|
||||||
|
TCP_server->accepted_connection_array[index].identifier = ++TCP_server->counter;
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -580,6 +581,29 @@ static int disconnect_conection_index(TCP_Server *TCP_server, TCP_Secure_Connect
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int handle_onion_recv_1(void *object, IP_Port dest, uint8_t *data, uint16_t length)
|
||||||
|
{
|
||||||
|
TCP_Server *TCP_server = object;
|
||||||
|
uint32_t index = dest.ip.ip6.uint32[0];
|
||||||
|
|
||||||
|
if (index >= TCP_server->size_accepted_connections)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
TCP_Secure_Connection *con = &TCP_server->accepted_connection_array[index];
|
||||||
|
|
||||||
|
if (con->identifier != dest.ip.ip6.uint64[1])
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
uint8_t packet[1 + length];
|
||||||
|
memcpy(packet + 1, data, length);
|
||||||
|
packet[0] = TCP_PACKET_ONION_RESPONSE;
|
||||||
|
|
||||||
|
if (write_packet_TCP_secure_connection(con, packet, sizeof(packet)) != 1)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* return 0 on success
|
/* return 0 on success
|
||||||
* return -1 on failure
|
* return -1 on failure
|
||||||
*/
|
*/
|
||||||
|
@ -627,16 +651,23 @@ static int handle_TCP_packet(TCP_Server *TCP_server, uint32_t con_id, uint8_t *d
|
||||||
}
|
}
|
||||||
|
|
||||||
case TCP_PACKET_ONION_REQUEST: {
|
case TCP_PACKET_ONION_REQUEST: {
|
||||||
//if (length <= 1 + crypto_box_NONCEBYTES + ONION_SEND_BASE*2)
|
if (TCP_server->onion) {
|
||||||
// return -1;
|
if (length <= 1 + crypto_box_NONCEBYTES + ONION_SEND_BASE * 2)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
IP_Port source;
|
||||||
|
source.ip.family = TCP_ONION_FAMILY;
|
||||||
|
source.ip.ip6.uint32[0] = con_id;
|
||||||
|
source.ip.ip6.uint64[1] = con->identifier;
|
||||||
|
onion_send_1(TCP_server->onion, data + 1 + crypto_box_NONCEBYTES, length - (1 + crypto_box_NONCEBYTES), source,
|
||||||
|
data + 1);
|
||||||
|
}
|
||||||
|
|
||||||
//TODO onion_send_1(Onion *onion, data + 1 + crypto_box_NONCEBYTES, length - (1 + crypto_box_NONCEBYTES), IP_Port source, data + 1);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case TCP_PACKET_ONION_RESPONSE: {
|
case TCP_PACKET_ONION_RESPONSE: {
|
||||||
|
return -1;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
|
@ -741,7 +772,7 @@ static sock_t new_listening_TCP_socket(int family, uint16_t port)
|
||||||
}
|
}
|
||||||
|
|
||||||
TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, uint16_t *ports, uint8_t *public_key,
|
TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, uint16_t *ports, uint8_t *public_key,
|
||||||
uint8_t *secret_key)
|
uint8_t *secret_key, Onion *onion)
|
||||||
{
|
{
|
||||||
if (num_sockets == 0 || ports == NULL)
|
if (num_sockets == 0 || ports == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -751,6 +782,11 @@ TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, uint16_t
|
||||||
if (temp == NULL)
|
if (temp == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (onion) {
|
||||||
|
temp->onion = onion;
|
||||||
|
set_callback_handle_recv_1(onion, &handle_onion_recv_1, temp);
|
||||||
|
}
|
||||||
|
|
||||||
temp->socks_listening = calloc(num_sockets, sizeof(sock_t));
|
temp->socks_listening = calloc(num_sockets, sizeof(sock_t));
|
||||||
|
|
||||||
if (temp->socks_listening == NULL) {
|
if (temp->socks_listening == NULL) {
|
||||||
|
@ -898,6 +934,10 @@ void kill_TCP_server(TCP_Server *TCP_server)
|
||||||
kill_sock(TCP_server->socks_listening[i]);
|
kill_sock(TCP_server->socks_listening[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (TCP_server->onion) {
|
||||||
|
set_callback_handle_recv_1(TCP_server->onion, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
free(TCP_server->socks_listening);
|
free(TCP_server->socks_listening);
|
||||||
free(TCP_server);
|
free(TCP_server);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "net_crypto.h"
|
#include "net_crypto.h"
|
||||||
|
#include "onion.h"
|
||||||
|
|
||||||
#define MAX_INCOMMING_CONNECTIONS 32
|
#define MAX_INCOMMING_CONNECTIONS 32
|
||||||
|
|
||||||
|
@ -46,6 +47,8 @@
|
||||||
|
|
||||||
#define ARRAY_ENTRY_SIZE 6
|
#define ARRAY_ENTRY_SIZE 6
|
||||||
|
|
||||||
|
#define TCP_ONION_FAMILY (AF_INET6 + 1)
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
TCP_STATUS_NO_STATUS,
|
TCP_STATUS_NO_STATUS,
|
||||||
TCP_STATUS_CONNECTED,
|
TCP_STATUS_CONNECTED,
|
||||||
|
@ -70,10 +73,13 @@ typedef struct TCP_Secure_Connection {
|
||||||
uint8_t last_packet[2 + MAX_PACKET_SIZE];
|
uint8_t last_packet[2 + MAX_PACKET_SIZE];
|
||||||
uint16_t last_packet_length;
|
uint16_t last_packet_length;
|
||||||
uint16_t last_packet_sent;
|
uint16_t last_packet_sent;
|
||||||
|
|
||||||
|
uint64_t identifier;
|
||||||
} TCP_Secure_Connection;
|
} TCP_Secure_Connection;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
Onion *onion;
|
||||||
sock_t *socks_listening;
|
sock_t *socks_listening;
|
||||||
unsigned int num_listening_socks;
|
unsigned int num_listening_socks;
|
||||||
|
|
||||||
|
@ -87,12 +93,14 @@ typedef struct {
|
||||||
TCP_Secure_Connection *accepted_connection_array;
|
TCP_Secure_Connection *accepted_connection_array;
|
||||||
uint32_t size_accepted_connections;
|
uint32_t size_accepted_connections;
|
||||||
uint32_t num_accepted_connections;
|
uint32_t num_accepted_connections;
|
||||||
|
|
||||||
|
uint64_t counter;
|
||||||
} TCP_Server;
|
} TCP_Server;
|
||||||
|
|
||||||
/* Create new TCP server instance.
|
/* Create new TCP server instance.
|
||||||
*/
|
*/
|
||||||
TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, uint16_t *ports, uint8_t *public_key,
|
TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, uint16_t *ports, uint8_t *public_key,
|
||||||
uint8_t *secret_key);
|
uint8_t *secret_key, Onion *onion);
|
||||||
|
|
||||||
/* Run the TCP_server
|
/* Run the TCP_server
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -161,21 +161,30 @@ typedef int sock_t;
|
||||||
#define TOX_PORTRANGE_TO 33545
|
#define TOX_PORTRANGE_TO 33545
|
||||||
#define TOX_PORT_DEFAULT TOX_PORTRANGE_FROM
|
#define TOX_PORT_DEFAULT TOX_PORTRANGE_FROM
|
||||||
|
|
||||||
typedef union {
|
|
||||||
|
/* TODO: remove padding bytes next time we need to break compatibility with old versions of core. */
|
||||||
|
|
||||||
|
typedef union __attribute__ ((__packed__))
|
||||||
|
{
|
||||||
uint8_t uint8[4];
|
uint8_t uint8[4];
|
||||||
uint16_t uint16[2];
|
uint16_t uint16[2];
|
||||||
uint32_t uint32;
|
uint32_t uint32;
|
||||||
struct in_addr in_addr;
|
struct in_addr in_addr;
|
||||||
} IP4;
|
}
|
||||||
|
IP4;
|
||||||
|
|
||||||
typedef union {
|
typedef union __attribute__ ((__packed__))
|
||||||
|
{
|
||||||
uint8_t uint8[16];
|
uint8_t uint8[16];
|
||||||
uint16_t uint16[8];
|
uint16_t uint16[8];
|
||||||
uint32_t uint32[4];
|
uint32_t uint32[4];
|
||||||
|
uint64_t uint64[2];
|
||||||
struct in6_addr in6_addr;
|
struct in6_addr in6_addr;
|
||||||
} IP6;
|
}
|
||||||
|
IP6;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct __attribute__ ((__packed__))
|
||||||
|
{
|
||||||
uint8_t family;
|
uint8_t family;
|
||||||
/* Not used for anything right now. */
|
/* Not used for anything right now. */
|
||||||
uint8_t padding[3];
|
uint8_t padding[3];
|
||||||
|
@ -183,9 +192,11 @@ typedef struct {
|
||||||
IP4 ip4;
|
IP4 ip4;
|
||||||
IP6 ip6;
|
IP6 ip6;
|
||||||
};
|
};
|
||||||
} IP;
|
}
|
||||||
|
IP;
|
||||||
|
|
||||||
typedef union {
|
typedef union __attribute__ ((__packed__))
|
||||||
|
{
|
||||||
struct {
|
struct {
|
||||||
IP4 ip;
|
IP4 ip;
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
|
@ -193,11 +204,13 @@ typedef union {
|
||||||
uint16_t padding;
|
uint16_t padding;
|
||||||
};
|
};
|
||||||
uint8_t uint8[8];
|
uint8_t uint8[8];
|
||||||
} IP4_Port;
|
}
|
||||||
|
IP4_Port;
|
||||||
|
|
||||||
typedef struct IP_Port {
|
typedef struct __attribute__ ((__packed__)) IP_Port {
|
||||||
IP ip;
|
IP ip;
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
|
uint16_t padding;
|
||||||
} IP_Port;
|
} IP_Port;
|
||||||
|
|
||||||
#define TOX_ENABLE_IPV6_DEFAULT 1
|
#define TOX_ENABLE_IPV6_DEFAULT 1
|
||||||
|
|
|
@ -398,13 +398,20 @@ static int handle_recv_1(void *object, IP_Port source, uint8_t *packet, uint32_t
|
||||||
|
|
||||||
uint32_t data_len = length - (1 + RETURN_1);
|
uint32_t data_len = length - (1 + RETURN_1);
|
||||||
|
|
||||||
|
if (onion->recv_1_function && send_to.ip.family != AF_INET && send_to.ip.family != AF_INET6)
|
||||||
|
return onion->recv_1_function(onion->callback_object, send_to, packet + (1 + RETURN_1), data_len);
|
||||||
|
|
||||||
if ((uint32_t)sendpacket(onion->net, send_to, packet + (1 + RETURN_1), data_len) != data_len)
|
if ((uint32_t)sendpacket(onion->net, send_to, packet + (1 + RETURN_1), data_len) != data_len)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_callback_handle_recv_1(Onion *onion, int (*function)(void *, IP_Port, uint8_t *, uint16_t), void *object)
|
||||||
|
{
|
||||||
|
onion->recv_1_function = function;
|
||||||
|
onion->callback_object = object;
|
||||||
|
}
|
||||||
|
|
||||||
Onion *new_onion(DHT *dht)
|
Onion *new_onion(DHT *dht)
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,6 +34,9 @@ typedef struct {
|
||||||
Shared_Keys shared_keys_1;
|
Shared_Keys shared_keys_1;
|
||||||
Shared_Keys shared_keys_2;
|
Shared_Keys shared_keys_2;
|
||||||
Shared_Keys shared_keys_3;
|
Shared_Keys shared_keys_3;
|
||||||
|
|
||||||
|
int (*recv_1_function)(void *, IP_Port, uint8_t *, uint16_t);
|
||||||
|
void *callback_object;
|
||||||
} Onion;
|
} Onion;
|
||||||
|
|
||||||
#define ONION_RETURN_1 (crypto_secretbox_NONCEBYTES + sizeof(IP_Port) + crypto_secretbox_MACBYTES)
|
#define ONION_RETURN_1 (crypto_secretbox_NONCEBYTES + sizeof(IP_Port) + crypto_secretbox_MACBYTES)
|
||||||
|
@ -92,9 +95,18 @@ int send_onion_response(Networking_Core *net, IP_Port dest, uint8_t *data, uint3
|
||||||
* return 1 on failure.
|
* return 1 on failure.
|
||||||
*
|
*
|
||||||
* Used to handle these packets that are received in a non traditional way (by TCP for example).
|
* Used to handle these packets that are received in a non traditional way (by TCP for example).
|
||||||
|
*
|
||||||
|
* Source family must be set to something else than AF_INET6 or AF_INET so that the callback gets called
|
||||||
|
* when the response is received.
|
||||||
*/
|
*/
|
||||||
int onion_send_1(Onion *onion, uint8_t *plain, uint32_t len, IP_Port source, uint8_t *nonce);
|
int onion_send_1(Onion *onion, uint8_t *plain, uint32_t len, IP_Port source, uint8_t *nonce);
|
||||||
|
|
||||||
|
/* Set the callback to be called when the dest ip_port doesn't have AF_INET6 or AF_INET as the family.
|
||||||
|
*
|
||||||
|
* Format: function(void *object, IP_Port dest, uint8_t *data, uint32_t length)
|
||||||
|
*/
|
||||||
|
void set_callback_handle_recv_1(Onion *onion, int (*function)(void *, IP_Port, uint8_t *, uint16_t), void *object);
|
||||||
|
|
||||||
Onion *new_onion(DHT *dht);
|
Onion *new_onion(DHT *dht);
|
||||||
|
|
||||||
void kill_onion(Onion *onion);
|
void kill_onion(Onion *onion);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user