added internal buffers to encrypted sockets

This commit is contained in:
2025-11-06 22:27:41 +05:00
parent 375dd842d4
commit d36fe9e5b3
10 changed files with 233 additions and 126 deletions

View File

@@ -4,7 +4,7 @@
void ClientConnection_close(ClientConnection* conn){
if(conn == NULL)
return;
socket_close(conn->sock.sock);
EncryptedSocketTCP_destroy(&conn->sock);
free(conn->session_key.data);
free(conn);
}
@@ -26,19 +26,21 @@ Result(ClientConnection*) ClientConnection_accept(ServerCredentials* server_cred
conn->session_id = session_id;
conn->session_key = Array_alloc_size(AES_SESSION_KEY_SIZE);
Array(u8) enc_buf = Array_alloc_size(8*1024);
Defer(free(enc_buf.data));
Array(u8) dec_buf = Array_alloc_size(8*1024);
Defer(free(dec_buf.data));
u32 enc_size = 0, dec_size = 0;
Array(u8) buffer = Array_alloc_size(NETWORK_BUFFER_SIZE);
Defer(free(buffer.data));
// TODO: set socket timeout to 5 seconds
// receive message encrypted by server public key
try(enc_size, u,
u32 header_and_message_size = sizeof(PacketHeader) + sizeof(ClientHandshake);
Array(u8) bufferPart_encryptedClientHandshake = {
.data = (u8*)buffer.data + header_and_message_size,
.size = server_credentials->rsa_pk.nlen
};
try_void(
socket_recv(
sock_tcp,
Array_sliceBefore(enc_buf, server_credentials->rsa_pk.nlen),
bufferPart_encryptedClientHandshake,
SocketRecvFlag_WaitAll
)
);
@@ -46,42 +48,47 @@ Result(ClientConnection*) ClientConnection_accept(ServerCredentials* server_cred
// decrypt the message using server private key
RSADecryptor rsa_dec;
RSADecryptor_construct(&rsa_dec, &server_credentials->rsa_sk);
try(dec_size, u,
try(u32 rsa_dec_size, u,
RSADecryptor_decrypt(
&rsa_dec,
Array_sliceBefore(enc_buf, enc_size),
dec_buf
bufferPart_encryptedClientHandshake,
buffer
)
);
// validate client handshake
if(dec_size != sizeof(ClientHandshake)){
if(rsa_dec_size != header_and_message_size){
Return RESULT_ERROR_FMT(
"decrypted message (size: %u) is not a ClientHandshake (size: %u)",
dec_size, (u32)sizeof(ClientHandshake)
rsa_dec_size, header_and_message_size
);
}
ClientHandshake* client_handshake = dec_buf.data;
try_void(PacketHeader_validateMagic(&client_handshake->header));
if(client_handshake->header.type != PacketType_ClientHandshake){
PacketHeader* packet_header = buffer.data;
ClientHandshake* client_handshake = Array_sliceAfter(buffer, sizeof(PacketHeader)).data;
try_void(PacketHeader_validateMagic(packet_header));
if(packet_header->type != PacketType_ClientHandshake){
Return RESULT_ERROR_FMT(
"received message of unexpected type: %u",
client_handshake->header.type
packet_header->type
);
}
// use received session key
memcpy(conn->session_key.data, client_handshake->session_key, conn->session_key.size);
EncryptedSocketTCP_construct(&conn->sock, sock_tcp, conn->session_key);
EncryptedSocketTCP_construct(&conn->sock, sock_tcp, NETWORK_BUFFER_SIZE, conn->session_key);
// construct ServerHandshake in dec_buf
ServerHandshake_construct((ServerHandshake*)dec_buf.data, session_id);
// construct PacketHeader and ServerHandshake in buffer
PacketHeader_construct(buffer.data, PROTOCOL_VERSION,
PacketType_ServerHandshake, sizeof(ServerHandshake));
ServerHandshake_construct(
Array_sliceAfter(buffer, sizeof(PacketHeader)).data,
session_id);
// send ServerHandshake over encrypted TCP socket
header_and_message_size = sizeof(PacketHeader) + sizeof(ServerHandshake);
try_void(
EncryptedSocketTCP_send(
&conn->sock,
Array_sliceBefore(dec_buf, sizeof(ServerHandshake)),
enc_buf
Array_sliceBefore(buffer, header_and_message_size)
)
);

View File

@@ -4,6 +4,7 @@
#include "server.h"
#include "config.h"
#include "log.h"
#include "network/tcp-chat-protocol/v1.h"
typedef struct ConnectionHandlerArgs {
Socket accepted_socket;
@@ -88,7 +89,10 @@ static Result(void) try_handle_connection(ConnectionHandlerArgs* args, cstr log_
Defer(free(args));
ClientConnection* conn = NULL;
Defer(ClientConnection_close(conn));
Defer(
ClientConnection_close(conn);
logInfo(log_ctx, "session closed");
);
// establish encrypted connection
try(conn, p,
ClientConnection_accept(
@@ -98,10 +102,16 @@ static Result(void) try_handle_connection(ConnectionHandlerArgs* args, cstr log_
args->session_id
)
);
logDebug(log_ctx, "session accepted");
logInfo(log_ctx, "session accepted");
// handle requests
// Array(u8) buffer = Array_alloc_size(NETWORK_BUFFER_SIZE);
// Defer(free(buffer.data));
// u32 dec_size = 0;
while(true){
sleepMsec(10);
}