Add support for SSLKEYLOGFILE with OpenSSL
GnuTLS has support already built-in. Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de>
This commit is contained in:
@@ -109,6 +109,7 @@ struct _tls {
|
|||||||
X509 *client_cert;
|
X509 *client_cert;
|
||||||
void *channel_binding_data;
|
void *channel_binding_data;
|
||||||
size_t channel_binding_size;
|
size_t channel_binding_size;
|
||||||
|
FILE *keylogfile;
|
||||||
int lasterror;
|
int lasterror;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -556,6 +557,36 @@ static int _tls_password_callback(char *buf, int size, int rwflag, void *u)
|
|||||||
return tls_caching_password_callback(buf, size, u);
|
return tls_caching_password_callback(buf, size, u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER >= 0x10101000L
|
||||||
|
static void _keylog_cb(const SSL *ssl, const char *line)
|
||||||
|
{
|
||||||
|
xmpp_conn_t *conn = SSL_get_app_data(ssl);
|
||||||
|
fwrite(line, strlen(line), 1, conn->tls->keylogfile);
|
||||||
|
fputc('\n', conn->tls->keylogfile);
|
||||||
|
fflush(conn->tls->keylogfile);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void _try_open_keylogfile(tls_t *tls)
|
||||||
|
{
|
||||||
|
#if OPENSSL_VERSION_NUMBER >= 0x10101000L
|
||||||
|
const char *first_line = "# SSL Key logfile generated by libstrophe\n";
|
||||||
|
const char *SSLKEYLOGFILE = getenv("SSLKEYLOGFILE");
|
||||||
|
if (!SSLKEYLOGFILE || *SSLKEYLOGFILE == '\0')
|
||||||
|
return;
|
||||||
|
tls->keylogfile = fopen(SSLKEYLOGFILE, "abe");
|
||||||
|
if (!tls->keylogfile) {
|
||||||
|
strophe_warn(tls->ctx, "tls", "Could not open SSL keylog file %s",
|
||||||
|
SSLKEYLOGFILE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fwrite(first_line, strlen(first_line), 1, tls->keylogfile);
|
||||||
|
SSL_CTX_set_keylog_callback(tls->ssl_ctx, _keylog_cb);
|
||||||
|
#else
|
||||||
|
UNUSED(tls);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
tls_t *tls_new(xmpp_conn_t *conn)
|
tls_t *tls_new(xmpp_conn_t *conn)
|
||||||
{
|
{
|
||||||
tls_t *tls = strophe_alloc(conn->ctx, sizeof(*tls));
|
tls_t *tls = strophe_alloc(conn->ctx, sizeof(*tls));
|
||||||
@@ -699,6 +730,8 @@ tls_t *tls_new(xmpp_conn_t *conn)
|
|||||||
ret = SSL_set_fd(tls->ssl, conn->sock);
|
ret = SSL_set_fd(tls->ssl, conn->sock);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
goto err_free_ssl;
|
goto err_free_ssl;
|
||||||
|
|
||||||
|
_try_open_keylogfile(tls);
|
||||||
}
|
}
|
||||||
|
|
||||||
return tls;
|
return tls;
|
||||||
@@ -717,6 +750,8 @@ err:
|
|||||||
|
|
||||||
void tls_free(tls_t *tls)
|
void tls_free(tls_t *tls)
|
||||||
{
|
{
|
||||||
|
if (tls->keylogfile)
|
||||||
|
fclose(tls->keylogfile);
|
||||||
strophe_free(tls->ctx, tls->channel_binding_data);
|
strophe_free(tls->ctx, tls->channel_binding_data);
|
||||||
SSL_free(tls->ssl);
|
SSL_free(tls->ssl);
|
||||||
X509_free(tls->client_cert);
|
X509_free(tls->client_cert);
|
||||||
|
|||||||
Reference in New Issue
Block a user