exchanging ecc keys on client connect

This commit is contained in:
Václav Šmejkal 2025-02-01 21:44:37 +01:00
parent c1ee049f32
commit f3f5533763
Signed by: ENGO150
GPG Key ID: 4A57E86482968843

View File

@ -500,6 +500,76 @@ unsigned long get_latest_id()
return returning;
}
why2_bool perform_key_exchange_client(int connection)
{
//VARIABLES
char *client_pubkey = why2_chat_ecc_serialize_public_key(); //GET PUBLIC KEY
char *server_pubkey;
char *read = NULL;
char *read_code = NULL;
why2_bool exiting_read = 0;
why2_send_socket_code(client_pubkey, NULL, connection, WHY2_CHAT_CODE_CLIENT_SERVER_KEY_EXCHANGE); //SEND pubkey TO SERVER
why2_deallocate(client_pubkey); //DEALLOCATE client_pubkey
//GET SERVER PUBKEY
do
{
why2_deallocate(read);
why2_deallocate(read_code);
read = read_socket_raw(connection);
read_code = get_string_from_json_string(read, "code");
exiting_read = read_code != NULL && strcmp(read_code, WHY2_CHAT_CODE_SERVER_CLIENT_KEY_EXCHANGE) == 0;
} while (!exiting_read);
why2_deallocate(read_code);
server_pubkey = get_string_from_json_string(read, "message");
//DEALLOCATION
why2_deallocate(read);
return 0;
}
why2_bool perform_key_exchange_server(int connection)
{
//VARIABLES
char *server_pubkey;
char *client_pubkey;
char *read = NULL;
char *read_code = NULL;
why2_bool exiting_read = 0;
//GET CLIENT PUBKEY
do
{
why2_deallocate(read);
why2_deallocate(read_code);
read = read_socket_raw(connection);
read_code = get_string_from_json_string(read, "code");
exiting_read = read_code != NULL && strcmp(read_code, WHY2_CHAT_CODE_CLIENT_SERVER_KEY_EXCHANGE) == 0;
} while (!exiting_read);
why2_deallocate(read_code);
client_pubkey = get_string_from_json_string(read, "message"); //GET client_pubkey
if (client_pubkey == NULL) return 1; //client is funi
//SEND CLIENT PUBKEY
server_pubkey = why2_chat_ecc_serialize_public_key();
why2_send_socket_code(server_pubkey, NULL, connection, WHY2_CHAT_CODE_SERVER_CLIENT_KEY_EXCHANGE);
//DEALLOCATION
why2_deallocate(server_pubkey);
why2_deallocate(read);
return 0;
}
//GLOBAL
void why2_send_socket(char *text, char *username, int socket)
{
@ -515,6 +585,13 @@ void *why2_communicate_thread(void *arg)
{
int connection = *(int*) arg;
//PERFORM KEY EXCHANGE
if (perform_key_exchange_server(connection))
{
close(connection);
return NULL;
}
printf("User connected.\t\t%d\n", connection);
send_welcome_packet(connection); //TELL USER ALL THE INFO THEY NEED
@ -1080,6 +1157,11 @@ void why2_clean_threads(void)
void *why2_listen_server(void *socket)
{
int connection = *(int*) socket;
//PERFORM KEY EXCHANGE
if (perform_key_exchange_client(connection)) return NULL;
//STUFF
char *read = NULL;
why2_bool exiting = 0;
@ -1106,7 +1188,7 @@ void *why2_listen_server(void *socket)
{
continuing = 0;
read = read_socket_raw(*((int*) socket));
read = read_socket_raw(connection);
if (read == NULL) continue;
//GET CONTENT