added internal buffers to encrypted sockets
This commit is contained in:
@@ -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)
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user