From adbccfd8a2ed638db325bbc7010d9371a1a15721 Mon Sep 17 00:00:00 2001 From: David Garske Date: Wed, 27 Oct 2021 11:38:05 -0700 Subject: [PATCH] Fix for TLS v1.3 key log examples (#273) --- tls/README.md | 9 +++-- tls/client-tls13.c | 23 ++++++++++-- tls/server-tls13.c | 91 +++++++++++++++++++++++++++++++++++----------- 3 files changed, 96 insertions(+), 27 deletions(-) diff --git a/tls/README.md b/tls/README.md index 9c71130a..42a4ee35 100644 --- a/tls/README.md +++ b/tls/README.md @@ -1198,19 +1198,22 @@ See the `client-tls-cryptocb.c` example for demonstrating the `--enable-cryptocb Build wolfSSL with `HAVE_SECRET_CALLBACK` included: -``` +```sh ./configure --enable-tls13 CFLAGS="-DHAVE_SECRET_CALLBACK" && make && sudo make install ``` In wolfssl-examples/tls: -``` + +```sh make clean && make ./server-tls13 & ./client-tls13 127.0.0.1 + +# Execute client-tls13 again with the message "shutdown" in order to end the execution of the server. ``` Wireshark can decode traffic using the created "sslkeylog.log". To configure in Wireshark Prferences go to Protocols -> TLS. In the "(Pre)-Master-Secret log filename" choose the "sslkeylog.log" file in this directory. -Capture TLS traffic and all packets will be decrypted (handshake and application data). +Capture TLS traffic and all packets will be decrypted (handshake and application data). To see application data decrypted you may have to right-click on packet click "Follow" -> "TLS Stream". ## TLS over UART Example diff --git a/tls/client-tls13.c b/tls/client-tls13.c index 0aa79cad..ba073920 100644 --- a/tls/client-tls13.c +++ b/tls/client-tls13.c @@ -34,6 +34,7 @@ #include #include #include +#include #define DEFAULT_PORT 11111 @@ -52,7 +53,7 @@ static int Tls13SecretCallback(WOLFSSL* ssl, int id, const unsigned char* secret int i; const char* str = NULL; unsigned char clientRandom[32]; - size_t clientRandomSz; + int clientRandomSz; XFILE fp = stderr; if (ctx) { fp = XFOPEN((const char*)ctx, "ab"); @@ -61,9 +62,18 @@ static int Tls13SecretCallback(WOLFSSL* ssl, int id, const unsigned char* secret } } - clientRandomSz = wolfSSL_get_client_random(ssl, clientRandom, + clientRandomSz = (int)wolfSSL_get_client_random(ssl, clientRandom, sizeof(clientRandom)); + if (clientRandomSz <= 0) { + printf("Error getting client random %d\n", clientRandomSz); + } + +#if 0 + printf("TLS Client Secret CB: Rand %d, Secret %d\n", + clientRandomSz, secretSz); +#endif + switch (id) { case CLIENT_EARLY_TRAFFIC_SECRET: str = "CLIENT_EARLY_TRAFFIC_SECRET"; break; @@ -82,7 +92,7 @@ static int Tls13SecretCallback(WOLFSSL* ssl, int id, const unsigned char* secret } fprintf(fp, "%s ", str); - for (i = 0; i < (int)clientRandomSz; i++) { + for (i = 0; i < clientRandomSz; i++) { fprintf(fp, "%02x", clientRandom[i]); } fprintf(fp, " "); @@ -182,6 +192,9 @@ int main(int argc, char** argv) } #ifdef HAVE_SECRET_CALLBACK + /* required for getting random used */ + wolfSSL_KeepArrays(ssl); + /* optional logging for wireshark */ wolfSSL_set_tls13_secret_cb(ssl, Tls13SecretCallback, (void*)WOLFSSL_SSLKEYLOGFILE_OUTPUT); @@ -193,6 +206,10 @@ int main(int argc, char** argv) goto exit; } +#ifdef HAVE_SECRET_CALLBACK + wolfSSL_FreeArrays(ssl); +#endif + /* Get a message for the server from stdin */ printf("Message for server: "); memset(buff, 0, sizeof(buff)); diff --git a/tls/server-tls13.c b/tls/server-tls13.c index b4df0e5f..bf05d50a 100644 --- a/tls/server-tls13.c +++ b/tls/server-tls13.c @@ -30,16 +30,23 @@ #include #include +#define HAVE_SIGNAL +#ifdef HAVE_SIGNAL +#include /* signal */ +#endif + /* wolfSSL */ #include #include #include +#include #define DEFAULT_PORT 11111 #define CERT_FILE "../certs/server-cert.pem" #define KEY_FILE "../certs/server-key.pem" + #if defined(WOLFSSL_TLS13) && defined(HAVE_SECRET_CALLBACK) #ifndef WOLFSSL_SSLKEYLOGFILE_OUTPUT @@ -53,7 +60,7 @@ static int Tls13SecretCallback(WOLFSSL* ssl, int id, const unsigned char* secret int i; const char* str = NULL; unsigned char serverRandom[32]; - size_t serverRandomSz; + int serverRandomSz; XFILE fp = stderr; if (ctx) { fp = XFOPEN((const char*)ctx, "ab"); @@ -62,9 +69,18 @@ static int Tls13SecretCallback(WOLFSSL* ssl, int id, const unsigned char* secret } } - serverRandomSz = wolfSSL_get_server_random(ssl, serverRandom, + serverRandomSz = (int)wolfSSL_get_server_random(ssl, serverRandom, sizeof(serverRandom)); + if (serverRandomSz <= 0) { + printf("Error getting server random %d\n", serverRandomSz); + } + +#if 0 + printf("TLS Server Secret CB: Rand %d, Secret %d\n", + serverRandomSz, secretSz); +#endif + switch (id) { case CLIENT_EARLY_TRAFFIC_SECRET: str = "CLIENT_EARLY_TRAFFIC_SECRET"; break; @@ -100,31 +116,53 @@ static int Tls13SecretCallback(WOLFSSL* ssl, int id, const unsigned char* secret } #endif /* WOLFSSL_TLS13 && HAVE_SECRET_CALLBACK */ +static int mSockfd = SOCKET_INVALID; +static int mConnd = SOCKET_INVALID; +static int mShutdown = 0; + +#ifdef HAVE_SIGNAL +static void sig_handler(const int sig) +{ + fprintf(stderr, "SIGINT handled = %d.\n", sig); + + mShutdown = 1; + if (mConnd != SOCKET_INVALID) { + close(mConnd); /* Close the connection to the client */ + mConnd = SOCKET_INVALID; + } + if (mSockfd != SOCKET_INVALID) { + close(mSockfd); /* Close the socket listening for clients */ + mSockfd = SOCKET_INVALID; + } +} +#endif + int main(int argc, char** argv) { int ret = 0; #ifdef WOLFSSL_TLS13 - int sockfd = SOCKET_INVALID; - int connd = SOCKET_INVALID; struct sockaddr_in servAddr; struct sockaddr_in clientAddr; socklen_t size = sizeof(clientAddr); char buff[256]; size_t len; - int shutdown = 0; const char* reply = "I hear ya fa shizzle!\n"; /* declare wolfSSL objects */ WOLFSSL_CTX* ctx = NULL; WOLFSSL* ssl = NULL; +#ifdef HAVE_SIGNAL + signal(SIGINT, sig_handler); +#endif + /* Initialize wolfSSL */ wolfSSL_Init(); /* Create a socket that uses an internet IPv4 address, * Sets the socket to be stream based (TCP), * 0 means choose the default protocol. */ - if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { + if ((mSockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "ERROR: failed to create the socket\n"); goto exit; } @@ -163,24 +201,23 @@ int main(int argc, char** argv) /* Bind the server socket to our port */ - if (bind(sockfd, (struct sockaddr*)&servAddr, sizeof(servAddr)) == -1) { + if (bind(mSockfd, (struct sockaddr*)&servAddr, sizeof(servAddr)) == -1) { fprintf(stderr, "ERROR: failed to bind\n"); goto exit; } /* Listen for a new connection, allow 5 pending connections */ - if (listen(sockfd, 5) == -1) { + if (listen(mSockfd, 5) == -1) { fprintf(stderr, "ERROR: failed to listen\n"); goto exit; } - - /* Continue to accept clients until shutdown is issued */ - while (!shutdown) { + /* Continue to accept clients until mShutdown is issued */ + while (!mShutdown) { printf("Waiting for a connection...\n"); /* Accept client connections */ - if ((connd = accept(sockfd, (struct sockaddr*)&clientAddr, &size)) + if ((mConnd = accept(mSockfd, (struct sockaddr*)&clientAddr, &size)) == -1) { fprintf(stderr, "ERROR: failed to accept the connection\n\n"); ret = -1; goto exit; @@ -193,9 +230,12 @@ int main(int argc, char** argv) } /* Attach wolfSSL to the socket */ - wolfSSL_set_fd(ssl, connd); + wolfSSL_set_fd(ssl, mConnd); #ifdef HAVE_SECRET_CALLBACK + /* required for getting random used */ + wolfSSL_KeepArrays(ssl); + /* optional logging for wireshark */ wolfSSL_set_tls13_secret_cb(ssl, Tls13SecretCallback, (void*)WOLFSSL_SSLKEYLOGFILE_OUTPUT); @@ -210,6 +250,10 @@ int main(int argc, char** argv) printf("Client connected successfully\n"); + #ifdef HAVE_SECRET_CALLBACK + wolfSSL_FreeArrays(ssl); + #endif + /* Read the client data into our buff array */ memset(buff, 0, sizeof(buff)); if ((ret = wolfSSL_read(ssl, buff, sizeof(buff)-1)) < 0) { @@ -223,7 +267,7 @@ int main(int argc, char** argv) /* Check for server shutdown command */ if (strncmp(buff, "shutdown", 8) == 0) { printf("Shutdown command issued!\n"); - shutdown = 1; + mShutdown = 1; } /* Write our reply into buff */ @@ -238,13 +282,14 @@ int main(int argc, char** argv) } /* Cleanup after this connection */ + wolfSSL_shutdown(ssl); if (ssl) { wolfSSL_free(ssl); /* Free the wolfSSL object */ ssl = NULL; } - if (connd != SOCKET_INVALID) { - close(connd); /* Close the connection to the client */ - connd = SOCKET_INVALID; + if (mConnd != SOCKET_INVALID) { + close(mConnd); /* Close the connection to the client */ + mConnd = SOCKET_INVALID; } } @@ -254,10 +299,14 @@ exit: /* Cleanup and return */ if (ssl) wolfSSL_free(ssl); /* Free the wolfSSL object */ - if (connd != SOCKET_INVALID) - close(connd); /* Close the connection to the client */ - if (sockfd != SOCKET_INVALID) - close(sockfd); /* Close the socket listening for clients */ + if (mConnd != SOCKET_INVALID) { + close(mConnd); /* Close the connection to the client */ + mConnd = SOCKET_INVALID; + } + if (mSockfd != SOCKET_INVALID) { + close(mSockfd); /* Close the socket listening for clients */ + mSockfd = SOCKET_INVALID; + } if (ctx) wolfSSL_CTX_free(ctx); /* Free the wolfSSL context object */ wolfSSL_Cleanup(); /* Cleanup the wolfSSL environment */