summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2018-04-04 15:28:37 +0200
committerNikos Mavrogiannopoulos <nmav@redhat.com>2018-04-05 15:30:36 +0200
commitf00f47a9a08bf15eb19d05e92fdbc2425f9e063d (patch)
treec3db427c8d198c9e7c36e5810972f649e1f364e3
parent13d4a2ea73c74a867602b81bd084fbd364ab6894 (diff)
downloadgnutls-tmp-psk-tls1.3.tar.gz
psk: save the username on auth info struct under TLS1.3tmp-psk-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 <nmav@redhat.com>
-rw-r--r--lib/auth/psk.c1
-rw-r--r--lib/ext/pre_shared_key.c18
-rw-r--r--tests/psk-file.c7
3 files changed, 25 insertions, 1 deletions
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 <auth/psk.h>
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),