]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
gnutls_init: add flag to omit EndOfEarlyData messages
authorDaiki Ueno <ueno@gnu.org>
Thu, 29 Apr 2021 06:35:02 +0000 (08:35 +0200)
committerDaiki Ueno <ueno@gnu.org>
Thu, 13 May 2021 09:19:17 +0000 (11:19 +0200)
The message is prohibited in QUIC:
https://tools.ietf.org/html/draft-ietf-quic-tls-34#section-8.3

Signed-off-by: Daiki Ueno <ueno@gnu.org>
lib/includes/gnutls/gnutls.h.in
lib/tls13/early_data.c

index ef33a921c2e371eb360f189f22226bfccca95c88..ca01fc9bdc45af041fb128313654efe6d34021eb 100644 (file)
@@ -480,6 +480,7 @@ typedef enum {
  * @GNUTLS_ENABLE_RAWPK: Allows raw public-keys to be negotiated during the handshake. Since 3.6.6.
  * @GNUTLS_NO_AUTO_SEND_TICKET: Under TLS1.3 disable auto-sending of
  *    session tickets during the handshake.
+ * @GNUTLS_NO_END_OF_EARLY_DATA: Under TLS1.3 suppress sending EndOfEarlyData message. Since 3.7.2.
  *
  * Enumeration of different flags for gnutls_init() function. All the flags
  * can be combined except @GNUTLS_SERVER and @GNUTLS_CLIENT which are mutually
@@ -511,7 +512,8 @@ typedef enum {
        GNUTLS_ENABLE_RAWPK = (1<<18),
        GNUTLS_AUTO_REAUTH = (1<<19),
        GNUTLS_ENABLE_EARLY_DATA = (1<<20),
-       GNUTLS_NO_AUTO_SEND_TICKET = (1<<21)
+       GNUTLS_NO_AUTO_SEND_TICKET = (1<<21),
+       GNUTLS_NO_END_OF_EARLY_DATA = (1<<22)
 } gnutls_init_flags_t;
 
 /* compatibility defines (previous versions of gnutls
index ccace901b90273e26d89db2af57b5af0e302c9a4..3d565d54b331df1cfe97321182cde4c8a6aa5d24 100644 (file)
@@ -61,6 +61,10 @@ int _gnutls13_send_end_of_early_data(gnutls_session_t session, unsigned again)
              session->internals.hsk_flags & HSK_EARLY_DATA_ACCEPTED))
                return 0;
 
+       if (session->internals.flags & GNUTLS_NO_END_OF_EARLY_DATA) {
+               return 0;
+       }
+
        if (again == 0) {
                ret = _gnutls_buffer_init_handshake_mbuffer(&buf);
                if (ret < 0)
@@ -81,14 +85,16 @@ int _gnutls13_recv_end_of_early_data(gnutls_session_t session)
              session->internals.hsk_flags & HSK_EARLY_DATA_ACCEPTED))
                return 0;
 
-       ret = _gnutls_recv_handshake(session, GNUTLS_HANDSHAKE_END_OF_EARLY_DATA, 0, &buf);
-       if (ret < 0)
-               return gnutls_assert_val(ret);
+       if (!(session->internals.flags & GNUTLS_NO_END_OF_EARLY_DATA)) {
+               ret = _gnutls_recv_handshake(session, GNUTLS_HANDSHAKE_END_OF_EARLY_DATA, 0, &buf);
+               if (ret < 0)
+                       return gnutls_assert_val(ret);
 
-       if (buf.length != 0) {
-               gnutls_assert();
-               ret = GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER;
-               goto cleanup;
+               if (buf.length != 0) {
+                       gnutls_assert();
+                       ret = GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER;
+                       goto cleanup;
+               }
        }
 
        session->internals.hsk_flags &= ~HSK_EARLY_DATA_IN_FLIGHT;