Added support for passing SSL cert info to listener

This commit is contained in:
Cloaked9000 2016-12-15 17:59:39 +00:00
parent 7d3e0fe5c8
commit 509b37095f
4 changed files with 73 additions and 6 deletions

View File

@ -12,4 +12,4 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -m64 -fPIC -pthread -lmbedtls
set(SOURCE_FILES main.cpp src/TcpSocket.cpp include/TcpSocket.h src/TcpListener.cpp include/TcpListener.h src/Socket.cpp include/Socket.h src/Packet.cpp include/Packet.h include/NetworkEncoding.h src/SocketSelector.cpp include/SocketSelector.h src/HttpSocket.cpp include/HttpSocket.h src/HttpRequest.cpp include/HttpRequest.h src/HttpResponse.cpp include/HttpResponse.h src/Http.cpp include/Http.h src/SSLSocket.cpp include/SSLSocket.h src/SSLListener.cpp include/SSLListener.h)
add_executable(frnetlib ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(frnetlib ${MBEDTLS_LIBRARIES} -lmbedtls -lmbedx509 -lmbedcrypto)
TARGET_LINK_LIBRARIES(frnetlib ${MBEDTLS_LIBRARIES} -lmbedtls -lmbedx509 -lmbedcrypto -static)

View File

@ -26,7 +26,7 @@ namespace fr
class SSLListener : public Socket
{
public:
SSLListener() noexcept;
SSLListener(const std::string &crt_path, const std::string &pem_path, const std::string &private_key_path) noexcept;
virtual ~SSLListener() noexcept;
SSLListener(SSLListener &&o) noexcept = default;

View File

@ -11,6 +11,73 @@
int main()
{
//Bind to port
fr::SSLListener listener("key.crt", "key.pem", "private.key");
if(listener.listen("8080") != fr::Socket::Success)
{
//Error
}
//Create socket selector and add listener
fr::SocketSelector selector;
selector.add(listener);
//Create vector to store open connections
std::vector<std::unique_ptr<fr::Socket>> connections;
//Infinitely loop. No timeout is specified so it will not return false.
while(selector.wait())
{
//Check if it was the selector who sent data
if(selector.is_ready(listener))
{
std::unique_ptr<fr::HttpSocket<fr::SSLSocket>> socket(new fr::HttpSocket<fr::SSLSocket>);
if(listener.accept(*socket) == fr::Socket::Success)
{
selector.add(*socket);
connections.emplace_back(std::move(socket));
}
}
//Else it must have been one of the clients
else
{
//Find which client send the data
for(auto iter = connections.begin(); iter != connections.end();)
{
//Eww
fr::HttpSocket<fr::SSLSocket> &client = (fr::HttpSocket<fr::SSLSocket>&)**iter;
//Check if it's this client
if(selector.is_ready(client))
{
//It is, so receive their HTTP request
fr::HttpRequest request;
if(client.receive(request) == fr::Socket::Success)
{
//Send back a HTTP response containing 'Hello, World!'
fr::HttpResponse response;
response.set_body("<h1>frnetlib test page</h1>");
client.send(response);
//Remove them from the selector and close the connection
selector.remove(client);
client.close();
iter = connections.erase(iter);
}
else
{
iter++;
}
}
else
{
iter++;
}
}
}
}
return 0;
}

View File

@ -7,7 +7,7 @@
namespace fr
{
SSLListener::SSLListener() noexcept
SSLListener::SSLListener(const std::string &crt_path, const std::string &pem_path, const std::string &private_key_path) noexcept
{
//Initialise SSL objects required
mbedtls_net_init(&listen_fd);
@ -20,21 +20,21 @@ namespace fr
int error = 0;
//Load certificates and private key todo: Switch from inbuilt test certificates
error = mbedtls_x509_crt_parse(&srvcert, (const unsigned char *)mbedtls_test_srv_crt, mbedtls_test_srv_crt_len);
error = mbedtls_x509_crt_parse_file(&srvcert, crt_path.c_str());
if(error != 0)
{
std::cout << "Failed to initialise SSL listener. CRT Parse returned: " << error << std::endl;
return;
}
error = mbedtls_x509_crt_parse(&srvcert, (const unsigned char *)mbedtls_test_cas_pem, mbedtls_test_cas_pem_len);
error = mbedtls_x509_crt_parse_file(&srvcert, pem_path.c_str());
if(error != 0)
{
std::cout << "Failed to initialise SSL listener. PEM Parse returned: " << error << std::endl;
return;
}
error = mbedtls_pk_parse_key(&pkey, (const unsigned char *)mbedtls_test_srv_key, mbedtls_test_srv_key_len, NULL, 0);
error = mbedtls_pk_parse_keyfile(&pkey, private_key_path.c_str(), 0);
if(error != 0)
{
std::cout << "Failed to initialise SSL listener. Private Key Parse returned: " << error << std::endl;