]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
tls13 handshake: allow certificate messages after handshake
authorNikos Mavrogiannopoulos <nmav@redhat.com>
Wed, 27 Jun 2018 12:19:02 +0000 (14:19 +0200)
committerNikos Mavrogiannopoulos <nmav@gnutls.org>
Mon, 2 Jul 2018 08:39:50 +0000 (08:39 +0000)
This allows post-handshake authentication even when PSK
is negotiated.

Resolves #489

Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
lib/tls13/certificate.c
lib/tls13/certificate_request.c
lib/tls13/certificate_verify.c
lib/tls13/post_handshake.c

index 90bd366854d77b451d6b14d90e891dbc1612a84f..b9a54df3557765ceb1a28b96d25c6f948afd7900 100644 (file)
@@ -38,7 +38,8 @@ int _gnutls13_recv_certificate(gnutls_session_t session)
        gnutls_buffer_st buf;
        unsigned optional = 0;
 
-       if (session->internals.hsk_flags & HSK_PSK_SELECTED)
+       if (!session->internals.initial_negotiation_completed &&
+           session->internals.hsk_flags & HSK_PSK_SELECTED)
                return 0;
 
        if (session->security_parameters.entity == GNUTLS_SERVER) {
@@ -201,8 +202,10 @@ int _gnutls13_send_certificate(gnutls_session_t session, unsigned again)
        gnutls_certificate_credentials_t cred;
 
        if (again == 0) {
-               if (session->internals.hsk_flags & HSK_PSK_SELECTED)
+               if (!session->internals.initial_negotiation_completed &&
+                   session->internals.hsk_flags & HSK_PSK_SELECTED)
                        return 0;
+
                if (session->security_parameters.entity == GNUTLS_SERVER &&
                    session->internals.resumed)
                        return 0;
index 09fb56d0bd012ea4e2e44af7809744cb331ed301..a7ec0e2fd9aace2b1192ef42ba98b267bb93f758 100644 (file)
@@ -192,7 +192,8 @@ int _gnutls13_recv_certificate_request(gnutls_session_t session)
        int ret;
        gnutls_buffer_st buf;
 
-       if (session->internals.hsk_flags & HSK_PSK_SELECTED)
+       if (!session->internals.initial_negotiation_completed &&
+           session->internals.hsk_flags & HSK_PSK_SELECTED)
                return 0;
 
        if (unlikely(session->security_parameters.entity != GNUTLS_CLIENT))
@@ -254,7 +255,8 @@ int _gnutls13_send_certificate_request(gnutls_session_t session, unsigned again)
        if (again == 0) {
                unsigned char rnd[12];
 
-               if (session->internals.hsk_flags & HSK_PSK_SELECTED)
+               if (!session->internals.initial_negotiation_completed &&
+                   session->internals.hsk_flags & HSK_PSK_SELECTED)
                        return 0;
 
                if (session->internals.send_cert_req == 0)
index f1dbabab05fe7eb596894755195334b7a861748b..96076e4e4691b99738b21cc0089b2e573482c269 100644 (file)
@@ -154,8 +154,10 @@ int _gnutls13_send_certificate_verify(gnutls_session_t session, unsigned again)
        bool server = 0;
 
        if (again == 0) {
-               if (session->internals.hsk_flags & HSK_PSK_SELECTED)
+               if (!session->internals.initial_negotiation_completed &&
+                   session->internals.hsk_flags & HSK_PSK_SELECTED)
                        return 0;
+
                if (session->security_parameters.entity == GNUTLS_SERVER &&
                    session->internals.resumed)
                        return 0;
index b12c0ba22120fa2773197c0a65e5fec6be210e03..ddab66f9a35a7b75baffc15b799f540dfe507555 100644 (file)
@@ -225,7 +225,13 @@ int _gnutls13_reauth_server(gnutls_session_t session)
  *
  * Prior to calling this function in server side, the function
  * gnutls_certificate_server_set_request() must be called setting expectations
- * for the received certificate (request or require).
+ * for the received certificate (request or require). If none are set
+ * this function will return with %GNUTLS_E_INVALID_REQUEST.
+ *
+ * Note that post handshake authentication is available irrespective
+ * of the initial negotiation type (PSK or certificate). In all cases
+ * however, certificate credentials must be set to the session prior
+ * to calling this function.
  *
  * Returns: %GNUTLS_E_SUCCESS on a successful authentication, otherwise a negative error code.
  **/