]> git.kaiwu.me - nginx.git/commitdiff
QUIC: relocated ngx_quic_init_streams() for 0-RTT.
authorRoman Arutyunyan <arut@nginx.com>
Tue, 10 Jan 2023 13:24:10 +0000 (17:24 +0400)
committerRoman Arutyunyan <arut@nginx.com>
Tue, 10 Jan 2023 13:24:10 +0000 (17:24 +0400)
Previously, streams were initialized in early keys handler.  However, client
transport parameters may not be available by then.  This happens, for example,
when using QuicTLS.  Now streams are initialized in ngx_quic_crypto_input()
after calling SSL_do_handshake() for both 0-RTT and 1-RTT.

src/event/quic/ngx_event_quic_ssl.c

index fd0d8252e9de6d1d8233c6490cc5d4ca0e0b7a22..0c982bc62d497c7b8d4fc45f6d055eccd81cd984 100644 (file)
@@ -67,12 +67,6 @@ ngx_quic_set_read_secret(ngx_ssl_conn_t *ssl_conn,
         return 0;
     }
 
-    if (level == ssl_encryption_early_data) {
-        if (ngx_quic_init_streams(c) != NGX_OK) {
-            return 0;
-        }
-    }
-
     return 1;
 }
 
@@ -138,10 +132,6 @@ ngx_quic_set_encryption_secrets(ngx_ssl_conn_t *ssl_conn,
     }
 
     if (level == ssl_encryption_early_data) {
-        if (ngx_quic_init_streams(c) != NGX_OK) {
-            return 0;
-        }
-
         return 1;
     }
 
@@ -455,11 +445,17 @@ ngx_quic_crypto_input(ngx_connection_t *c, ngx_chain_t *data)
             qc->error_reason = "handshake failed";
             return NGX_ERROR;
         }
-
-        return NGX_OK;
     }
 
-    if (SSL_in_init(ssl_conn)) {
+    if (n <= 0 || SSL_in_init(ssl_conn)) {
+        if (ngx_quic_keys_available(qc->keys, ssl_encryption_early_data)
+            && qc->client_tp_done)
+        {
+            if (ngx_quic_init_streams(c) != NGX_OK) {
+                return NGX_ERROR;
+            }
+        }
+
         return NGX_OK;
     }