implemented EncryptedSocketTCP_recvStruct and EncryptedSocketTCP_recvRSA
This commit is contained in:
@@ -25,74 +25,42 @@ Result(ClientConnection*) ClientConnection_accept(ServerCredentials* server_cred
|
||||
conn->client_end = client_end;
|
||||
conn->session_id = session_id;
|
||||
conn->session_key = Array_alloc_size(AES_SESSION_KEY_SIZE);
|
||||
|
||||
Array(u8) buffer = Array_alloc_size(NETWORK_BUFFER_SIZE);
|
||||
// fix for valgrind false detected errors about uninitialized memory
|
||||
Array_memset(buffer, 0xCC);
|
||||
Defer(free(buffer.data));
|
||||
|
||||
// correct session key will be received from client later
|
||||
Array_memset(conn->session_key, 0);
|
||||
EncryptedSocketTCP_construct(&conn->sock, sock_tcp, NETWORK_BUFFER_SIZE, conn->session_key);
|
||||
// TODO: set socket timeout to 5 seconds
|
||||
|
||||
// receive message encrypted by server public key
|
||||
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,
|
||||
bufferPart_encryptedClientHandshake,
|
||||
SocketRecvFlag_WaitAll
|
||||
)
|
||||
);
|
||||
|
||||
// decrypt the message using server private key
|
||||
|
||||
// decrypt the rsa messages using server private key
|
||||
RSADecryptor rsa_dec;
|
||||
RSADecryptor_construct(&rsa_dec, &server_credentials->rsa_sk);
|
||||
try(u32 rsa_dec_size, u,
|
||||
RSADecryptor_decrypt(
|
||||
&rsa_dec,
|
||||
bufferPart_encryptedClientHandshake,
|
||||
buffer
|
||||
)
|
||||
);
|
||||
|
||||
// validate client handshake
|
||||
if(rsa_dec_size != header_and_message_size){
|
||||
Return RESULT_ERROR_FMT(
|
||||
"decrypted message (size: %u) is not a ClientHandshake (size: %u)",
|
||||
rsa_dec_size, header_and_message_size
|
||||
);
|
||||
}
|
||||
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){
|
||||
|
||||
// receive PacketHeader
|
||||
PacketHeader packet_header;
|
||||
try_void(EncryptedSocketTCP_recvStructRSA(&conn->sock, &rsa_dec, &packet_header));
|
||||
try_void(PacketHeader_validateMagic(&packet_header));
|
||||
if(packet_header.type != PacketType_ClientHandshake){
|
||||
Return RESULT_ERROR_FMT(
|
||||
"received message of unexpected type: %u",
|
||||
packet_header->type
|
||||
packet_header.type
|
||||
);
|
||||
}
|
||||
|
||||
// receive ClientHandshake
|
||||
ClientHandshake client_handshake;
|
||||
try_void(EncryptedSocketTCP_recvStructRSA(&conn->sock, &rsa_dec, &client_handshake));
|
||||
|
||||
// use received session key
|
||||
memcpy(conn->session_key.data, client_handshake->session_key, conn->session_key.size);
|
||||
EncryptedSocketTCP_construct(&conn->sock, sock_tcp, NETWORK_BUFFER_SIZE, conn->session_key);
|
||||
memcpy(conn->session_key.data, client_handshake.session_key, conn->session_key.size);
|
||||
EncryptedSocketTCP_changeKey(&conn->sock, conn->session_key);
|
||||
|
||||
// construct PacketHeader and ServerHandshake in buffer
|
||||
PacketHeader_construct(buffer.data, PROTOCOL_VERSION,
|
||||
PacketType_ServerHandshake, sizeof(ServerHandshake));
|
||||
ServerHandshake_construct(
|
||||
Array_sliceAfter(buffer, sizeof(PacketHeader)).data,
|
||||
// send PacketHeader and ServerHandshake over encrypted TCP socket
|
||||
PacketHeader_construct(&packet_header,
|
||||
PROTOCOL_VERSION, PacketType_ServerHandshake, sizeof(ServerHandshake));
|
||||
ServerHandshake server_handshake;
|
||||
ServerHandshake_construct(&server_handshake,
|
||||
session_id);
|
||||
// send ServerHandshake over encrypted TCP socket
|
||||
header_and_message_size = sizeof(PacketHeader) + sizeof(ServerHandshake);
|
||||
try_void(
|
||||
EncryptedSocketTCP_send(
|
||||
&conn->sock,
|
||||
Array_sliceBefore(buffer, header_and_message_size)
|
||||
)
|
||||
);
|
||||
try_void(EncryptedSocketTCP_sendStruct(&conn->sock, &packet_header));
|
||||
try_void(EncryptedSocketTCP_sendStruct(&conn->sock, &server_handshake));
|
||||
|
||||
success = true;
|
||||
Return RESULT_VALUE(p, conn);
|
||||
|
||||
@@ -72,7 +72,7 @@ Result(void) server_run(cstr server_endpoint_cstr, cstr config_path){
|
||||
//TODO: use async IO instead of threads to not waste system resources
|
||||
// while waiting for incoming data in 100500 threads
|
||||
try_stderrcode(pthread_create(&conn_thread, NULL, handle_connection, args));
|
||||
try_stderrcode(pthread_detach(&conn_thread));
|
||||
try_stderrcode(pthread_detach(conn_thread));
|
||||
}
|
||||
|
||||
Return RESULT_VOID;
|
||||
@@ -113,15 +113,9 @@ static Result(void) try_handle_connection(ConnectionHandlerArgs* args, cstr log_
|
||||
);
|
||||
logInfo(log_ctx, "session accepted");
|
||||
|
||||
// handle requests
|
||||
|
||||
Array(u8) buffer = Array_alloc_size(NETWORK_BUFFER_SIZE);
|
||||
// fix for valgrind false detected errors about uninitialized memory
|
||||
Array_memset(buffer, 0xCC);
|
||||
Defer(free(buffer.data));
|
||||
u32 dec_size = 0;
|
||||
|
||||
// handle unauthorized requests
|
||||
while(true){
|
||||
|
||||
sleepMsec(10);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user