From 7d60d1e971ac8412b2592666a121008987e23f1e Mon Sep 17 00:00:00 2001 From: Nikos Mavrogiannopoulos Date: Wed, 4 Apr 2018 15:28:37 +0200 Subject: psk: save the username on auth info struct under TLS1.3 Add the necessary tests to verify that gnutls_psk_server_get_username() reports the right username under TLS1.2 and TLS1.3. Signed-off-by: Nikos Mavrogiannopoulos --- lib/auth/psk.c | 1 - lib/ext/pre_shared_key.c | 18 ++++++++++++++++++ tests/psk-file.c | 7 +++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/auth/psk.c b/lib/auth/psk.c index a2e7d9d9ea..6968bb8057 100644 --- a/lib/auth/psk.c +++ b/lib/auth/psk.c @@ -26,7 +26,6 @@ #include "errors.h" #include "auth.h" -#include "auth.h" #include "debug.h" #include "num.h" #include diff --git a/lib/ext/pre_shared_key.c b/lib/ext/pre_shared_key.c index 920ae17398..d4ea982cbb 100644 --- a/lib/ext/pre_shared_key.c +++ b/lib/ext/pre_shared_key.c @@ -261,6 +261,7 @@ static int server_recv_params(gnutls_session_t session, unsigned hash_size; psk_ext_parser_st psk_parser; struct psk_st psk; + psk_auth_info_t info; ret = _gnutls13_psk_ext_parser_init(&psk_parser, data, len); if (ret < 0) { @@ -319,6 +320,23 @@ static int server_recv_params(gnutls_session_t session, _gnutls_handshake_log("EXT[%p]: Selected PSK mode\n", session); } + /* save the username in psk_auth_info to make it available + * using gnutls_psk_server_get_username() */ + if (psk.ob_ticket_age == 0) { + if (psk.identity.size >= sizeof(info->username)) + return gnutls_assert_val(GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER); + + ret = _gnutls_auth_info_set(session, GNUTLS_CRD_PSK, sizeof(psk_auth_info_st), 1); + if (ret < 0) + return gnutls_assert_val(ret); + + info = _gnutls_get_auth_info(session, GNUTLS_CRD_PSK); + assert(info != NULL); + + memcpy(info->username, psk.identity.data, psk.identity.size); + info->username[psk.identity.size] = 0; + } + session->internals.hsk_flags |= HSK_PSK_SELECTED; /* Reference the selected pre-shared key */ diff --git a/tests/psk-file.c b/tests/psk-file.c index 59f6f2d4a2..a6df3f0467 100644 --- a/tests/psk-file.c +++ b/tests/psk-file.c @@ -179,6 +179,7 @@ static void server(int sd, const char *prio, const char *user, int expect_fail, gnutls_psk_server_credentials_t server_pskcred; int ret, kx; gnutls_session_t session; + const char *pskid; char buffer[MAX_BUF + 1]; char *psk_file = getenv("PSK_FILE"); char *desc; @@ -269,6 +270,12 @@ static void server(int sd, const char *prio, const char *user, int expect_fail, if (expect_fail) fail("server: expected failure but connection succeeded!\n"); + pskid = gnutls_psk_server_get_username(session); + if (pskid == NULL || strcmp(pskid, user) != 0) { + fail("server: username (%s), does not match expected (%s)\n", + pskid, user); + } + if (exp_kx && kx != exp_kx) { fail("server: expected key exchange %s, but got %s\n", gnutls_kx_get_name(exp_kx), -- cgit v1.2.1