]>
git.kaiwu.me - nginx.git/log
Sergey Kandaurov [Mon, 23 Mar 2020 17:48:34 +0000 (20:48 +0300)]
Fixed client certificate verification.
For ngx_http_process_request() part to work, this required to set both
r->http_connection->ssl and c->ssl on a QUIC stream. To avoid damaging
global SSL object, ngx_ssl_shutdown() is managed to ignore QUIC streams.
Roman Arutyunyan [Mon, 23 Mar 2020 18:20:20 +0000 (21:20 +0300)]
Respect QUIC max_idle_timeout.
Roman Arutyunyan [Mon, 23 Mar 2020 16:42:09 +0000 (19:42 +0300)]
Allow ngx_queue_frame() to insert frame in the front.
Previously a frame could only be inserted after the first element of the list.
Roman Arutyunyan [Mon, 23 Mar 2020 16:26:24 +0000 (19:26 +0300)]
Support for HTTP/3 ALPN.
This is required by Chrome.
Roman Arutyunyan [Mon, 23 Mar 2020 12:32:24 +0000 (15:32 +0300)]
Put zero in 'First ACK Range' when acknowledging one packet.
This fixes Chrome CONNECTION_ID_LIMIT_ERROR with the reason:
"Underflow with first ack block length 2 largest acked is 1".
Roman Arutyunyan [Mon, 23 Mar 2020 16:19:44 +0000 (19:19 +0300)]
Avoid using QUIC connection after CONNECTION_CLOSE.
Roman Arutyunyan [Mon, 23 Mar 2020 12:49:31 +0000 (15:49 +0300)]
Better flow control and buffering for QUIC streams.
Roman Arutyunyan [Mon, 23 Mar 2020 15:47:17 +0000 (18:47 +0300)]
Limit output QUIC packets with client max_packet_size.
Additionally, receive larger packets than 512 bytes.
Sergey Kandaurov [Mon, 23 Mar 2020 15:20:42 +0000 (18:20 +0300)]
Fixed received ACK fields order in debug logging.
Vladimir Homutov [Mon, 23 Mar 2020 11:53:04 +0000 (14:53 +0300)]
Connection states code cleanup.
+ ngx_quic_init_ssl_methods() is no longer there, we setup methods on SSL
connection directly.
+ the handshake_handler is actually a generic quic input handler
+ updated c->log->action and debug to reflect changes and be more informative
+ c->quic is always set in ngx_quic_input()
+ the quic connection state is set by the results of SSL_do_handshake();
Vladimir Homutov [Mon, 23 Mar 2020 09:57:24 +0000 (12:57 +0300)]
Skip unknown transport parameters.
Vladimir Homutov [Mon, 23 Mar 2020 07:57:28 +0000 (10:57 +0300)]
Add unsupported version into log.
This makes it easier to understand what client wants.
Vladimir Homutov [Sat, 21 Mar 2020 17:51:59 +0000 (20:51 +0300)]
Added processing of client transport parameters.
note:
+ parameters are available in SSL connection since they are obtained by ssl
stack
quote:
During connection establishment, both endpoints make authenticated
declarations of their transport parameters. These declarations are
made unilaterally by each endpoint.
and really, we send our parameters before we read client's.
no handling of incoming parameters is made by this patch.
Sergey Kandaurov [Sun, 22 Mar 2020 09:15:54 +0000 (12:15 +0300)]
Fixed CRYPTO offset generation.
Sergey Kandaurov [Sun, 22 Mar 2020 08:35:15 +0000 (11:35 +0300)]
Closing connection on NGX_QUIC_FT_CONNECTION_CLOSE.
Vladimir Homutov [Sat, 21 Mar 2020 17:49:55 +0000 (20:49 +0300)]
Implemented parsing of remaining frame types.
Sergey Kandaurov [Sat, 21 Mar 2020 16:45:24 +0000 (19:45 +0300)]
Fixed parsing NGX_QUIC_FT_CONNECTION_CLOSE.
Sergey Kandaurov [Sat, 21 Mar 2020 16:22:39 +0000 (19:22 +0300)]
Fixed buffer overrun in create_transport_params() with -24.
It writes 16-bit prefix as designed, but length calculation assumed varint.
Sergey Kandaurov [Sat, 21 Mar 2020 15:44:10 +0000 (18:44 +0300)]
Fixed build with macOS's long long abomination.
Roman Arutyunyan [Fri, 20 Mar 2020 20:49:42 +0000 (23:49 +0300)]
Removed unused variable.
Vladimir Homutov [Fri, 20 Mar 2020 17:39:41 +0000 (20:39 +0300)]
Removed unused variable.
Vladimir Homutov [Fri, 20 Mar 2020 17:03:44 +0000 (20:03 +0300)]
Added checks for permitted frame types.
+ cleanup in macros for packet types
+ some style fixes in quic_transport.h (case, indentation)
Vladimir Homutov [Fri, 20 Mar 2020 12:14:00 +0000 (15:14 +0300)]
Fixed parsing of CONNECTION CLOSE2 frames.
The "frame_type" field is not passed in case of 0x1d frame.
Vladimir Homutov [Fri, 20 Mar 2020 11:50:05 +0000 (14:50 +0300)]
Added parsing of CONNECTION_CLOSE2 frame (0x1D).
The difference is that error code refers to application namespace, i.e.
quic error names cannot be used to convert it to string.
Vladimir Homutov [Fri, 20 Mar 2020 09:44:45 +0000 (12:44 +0300)]
Adedd the http "quic" variable.
The value is literal "quic" for requests passed over HTTP/3, and empty string
otherwise.
Vladimir Homutov [Fri, 20 Mar 2020 10:47:44 +0000 (13:47 +0300)]
Configurable transport parameters.
- integer parameters can be configured using the following directives:
quic_max_idle_timeout
quic_max_ack_delay
quic_max_packet_size
quic_initial_max_data
quic_initial_max_stream_data_bidi_local
quic_initial_max_stream_data_bidi_remote
quic_initial_max_stream_data_uni
quic_initial_max_streams_bidi
quic_initial_max_streams_uni
quic_ack_delay_exponent
quic_active_migration
quic_active_connection_id_limit
- only following parameters are actually sent:
active_connection_id_limit
initial_max_streams_uni
initial_max_streams_bidi
initial_max_stream_data_bidi_local
initial_max_stream_data_bidi_remote
initial_max_stream_data_uni
(other parameters are to be added into ngx_quic_create_transport_params()
function as needed, should be easy now)
- draft 24 and draft 27 are now supported
(at compile-time using quic_version macro)
Roman Arutyunyan [Thu, 19 Mar 2020 18:46:28 +0000 (21:46 +0300)]
Reset QUIC timeout on every datagram.
Roman Arutyunyan [Fri, 20 Mar 2020 07:14:58 +0000 (10:14 +0300)]
Double MAX_STREAMS on STREAMS_BLOCKED.
Roman Arutyunyan [Fri, 20 Mar 2020 06:23:31 +0000 (09:23 +0300)]
Fixed ACKs to packet numbers greater than 63.
Sergey Kandaurov [Thu, 19 Mar 2020 14:33:36 +0000 (17:33 +0300)]
Fixed specifiers in "quic packet length" logging.
Sergey Kandaurov [Thu, 19 Mar 2020 14:22:43 +0000 (17:22 +0300)]
Fixed build.
Vladimir Homutov [Thu, 19 Mar 2020 11:59:55 +0000 (14:59 +0300)]
The ngx_quic_frame_len() function is not really needed.
Vladimir Homutov [Thu, 19 Mar 2020 14:07:12 +0000 (17:07 +0300)]
Added boundaries checks into frame parser.
The ngx_quic_parse_frame() functions now has new 'pkt' argument: the packet
header of a currently processed frame. This allows to log errors/debug
closer to reasons and perform additional checks regarding possible frame
types. The handler only performs processing of good frames.
A number of functions like read_uint32(), parse_int[_multi] probably should
be implemented as a macro, but currently it is better to have them as
functions for simpler debugging.
Roman Arutyunyan [Thu, 19 Mar 2020 12:34:35 +0000 (15:34 +0300)]
Send a FIN frame when QUIC stream is closed.
Roman Arutyunyan [Thu, 19 Mar 2020 12:03:09 +0000 (15:03 +0300)]
Fixed header creation for header_only responses in HTTP/3.
Sergey Kandaurov [Wed, 18 Mar 2020 20:26:26 +0000 (23:26 +0300)]
MAX_DATA frame parser/handler.
Vladimir Homutov [Thu, 19 Mar 2020 08:15:43 +0000 (11:15 +0300)]
Added parsing of STREAMS BLOCKED frames.
While there, added hex prefix for debug to avoid frame type confusion.
Sergey Kandaurov [Wed, 18 Mar 2020 20:07:40 +0000 (23:07 +0300)]
Implemented send_alert callback, CONNECTION_CLOSE writer.
The callback produces a CONNECTION_CLOSE frame, as per quic-tls-24#section-4.9.
Roman Arutyunyan [Wed, 18 Mar 2020 17:28:28 +0000 (20:28 +0300)]
Added copying addr_text to QUIC stream connections.
Now $remote_addr holds client address.
Roman Arutyunyan [Wed, 18 Mar 2020 17:22:16 +0000 (20:22 +0300)]
HTTP/3 $request_line variable.
Roman Arutyunyan [Wed, 18 Mar 2020 13:37:16 +0000 (16:37 +0300)]
Moved setting QUIC methods to runtime.
This allows listening to both https and http3 in the same server.
Also, the change eliminates the ssl_quic directive.
Vladimir Homutov [Wed, 18 Mar 2020 13:35:11 +0000 (16:35 +0300)]
Added parsing of RESET_STREAM and STOP_SENDING frames
Roman Arutyunyan [Wed, 18 Mar 2020 12:28:20 +0000 (15:28 +0300)]
Fixed pointer increment while parsing HTTP/3 header.
Vladimir Homutov [Wed, 18 Mar 2020 10:49:39 +0000 (13:49 +0300)]
Implemented creation of server unidirectional streams.
The ngx_quic_create_stream() function is a generic function extracted from
the ngx_quic_handle_stream_frame() function.
Roman Arutyunyan [Wed, 18 Mar 2020 11:10:44 +0000 (14:10 +0300)]
Fixed HTTP/3 server stream creation.
Roman Arutyunyan [Wed, 18 Mar 2020 11:09:50 +0000 (14:09 +0300)]
Removed comment.
Roman Arutyunyan [Wed, 18 Mar 2020 10:46:35 +0000 (13:46 +0300)]
Refactored HTTP/3 parser.
Vladimir Homutov [Wed, 18 Mar 2020 10:02:19 +0000 (13:02 +0300)]
Style and handlers.
Cleanup in ngx_event_quic.c:
+ reorderded functions, structures
+ added missing prototypes
+ added separate handlers for each frame type
+ numerous indentation/comments/TODO fixes
+ removed non-implemented qc->state and corresponding enum;
this requires deep thinking, stub was unused.
+ streams inside quic connection are now in own structure
Vladimir Homutov [Wed, 18 Mar 2020 09:58:27 +0000 (12:58 +0300)]
Extracted transport part of the code into separate file.
All code dealing with serializing/deserializing
is moved int srv/event/ngx_event_quic_transport.c/h file.
All macros for dealing with data are internal to source file.
The header file exposes frame types and error codes.
The exported functions are currently packet header parsers and writers
and frames parser/writer.
The ngx_quic_header_t structure is updated with 'log' member. This avoids
passing extra argument to parsing functions that need to report errors.
Vladimir Homutov [Tue, 17 Mar 2020 11:10:37 +0000 (14:10 +0300)]
Firefox fixes.
+ support for more than one initial packet
+ workaround for trailing zeroes in packet
+ ignore application data packet if no keys yet (issue in draft 27/ff nightly)
+ fixed PING frame parser
+ STREAM frames need to be acknowledged
The following HTTP configuration is used for firefox (v74):
http {
ssl_certificate_key localhost.key;
ssl_certificate localhost.crt;
ssl_protocols TLSv1.2 TLSv1.3;
server {
listen 127.0.0.1:10368 reuseport http3;
ssl_quic on;
server_name localhost;
location / {
return 200 "This-is-QUICK\n";
}
}
server {
listen 127.0.0.1:5555 ssl; # point the browser here
server_name localhost;
location / {
add_header Alt-Svc 'h3-24=":10368";ma=100';
return 200 "ALT-SVC";
}
}
}
Vladimir Homutov [Mon, 16 Mar 2020 16:42:57 +0000 (19:42 +0300)]
Fixed a typo with OpenSSL.
Vladimir Homutov [Mon, 16 Mar 2020 16:00:47 +0000 (19:00 +0300)]
Split transport and crypto parts into separate files.
New files:
src/event/ngx_event_quic_protection.h
src/event/ngx_event_quic_protection.c
The protection.h header provides interface to the crypto part of the QUIC:
2 functions to initialize corresponding secrets:
ngx_quic_set_initial_secret()
ngx_quic_set_encryption_secret()
and 2 functions to deal with packet processing:
ngx_quic_encrypt()
ngx_quic_decrypt()
Also, structures representing secrets are defined there.
All functions require SSL connection and a pool, only crypto operations
inside, no access to nginx connections or events.
Currently pool->log is used for the logging (instead of original c->log).
Vladimir Homutov [Mon, 16 Mar 2020 10:06:43 +0000 (13:06 +0300)]
Added processing of CONNECTION CLOSE frames.
Contents is parsed and debug is output. No actions are taken.
Roman Arutyunyan [Sat, 14 Mar 2020 10:18:55 +0000 (13:18 +0300)]
Temporary fix for header null-termination in HTTP/3.
Sergey Kandaurov [Sat, 14 Mar 2020 00:15:09 +0000 (03:15 +0300)]
Fixed header protection application with pn length > 1.
Roman Arutyunyan [Fri, 13 Mar 2020 17:44:32 +0000 (20:44 +0300)]
Fixed sanitizer errors.
Vladimir Homutov [Fri, 13 Mar 2020 15:55:58 +0000 (18:55 +0300)]
Added check for initialized c->ssl before calling SSL shutdown.
Roman Arutyunyan [Fri, 13 Mar 2020 16:36:33 +0000 (19:36 +0300)]
HTTP/3.
Roman Arutyunyan [Fri, 13 Mar 2020 15:30:37 +0000 (18:30 +0300)]
Fixed infinite loop in ngx_quic_stream_send_chain().
Roman Arutyunyan [Fri, 13 Mar 2020 15:29:50 +0000 (18:29 +0300)]
Implemented tracking offset in STREAM frames.
Roman Arutyunyan [Fri, 13 Mar 2020 12:56:10 +0000 (15:56 +0300)]
Implemented ngx_quic_stream_send_chain() method.
- just call send in a loop
Vladimir Homutov [Fri, 13 Mar 2020 11:39:23 +0000 (14:39 +0300)]
Stream "connection" read/write methods.
Sergey Kandaurov [Thu, 12 Mar 2020 15:08:26 +0000 (18:08 +0300)]
Fix build.
Vladimir Homutov [Thu, 12 Mar 2020 11:23:27 +0000 (14:23 +0300)]
Removed hardcoded CRYPTO and ACK frame sizes.
Vladimir Homutov [Thu, 12 Mar 2020 13:54:43 +0000 (16:54 +0300)]
HTTP/QUIC interface reworked.
- events handling moved into src/event/ngx_event_quic.c
- http invokes once ngx_quic_run() and passes stream callback
(diff to original http_request.c is now minimal)
- streams are stored in rbtree using ID as a key
- when a new stream is registered, appropriate callback is called
- ngx_quic_stream_t type represents STREAM and stored in c->qs
Vladimir Homutov [Wed, 11 Mar 2020 12:41:35 +0000 (15:41 +0300)]
Initial parsing of STREAM frames.
Vladimir Homutov [Thu, 12 Mar 2020 11:43:24 +0000 (14:43 +0300)]
Added support of multiple QUIC packets in single datagram.
- now NEW_CONNECTION_ID frames can be received and parsed
The packet structure is created in ngx_quic_input() and passed
to all handlers (initial, handshake and application data).
The UDP datagram buffer is saved as pkt->raw;
The QUIC packet is stored as pkt->data and pkt->len (instead of pkt->buf)
(pkt->len is adjusted after parsing headers to actual length)
The pkt->pos is removed, pkt->raw->pos is used instead.
Vladimir Homutov [Wed, 11 Mar 2020 12:43:23 +0000 (15:43 +0300)]
Added more transport parameters.
Needed for client to start sending streams.
Sergey Kandaurov [Wed, 11 Mar 2020 18:53:02 +0000 (21:53 +0300)]
Compatibility with BoringSSL revised QUIC encryption secret APIs.
See for details: https://boringssl.googlesource.com/boringssl/+/
1e85905 %5E!/
Sergey Kandaurov [Tue, 10 Mar 2020 16:15:12 +0000 (19:15 +0300)]
Chacha20 header protection support with BoringSSL.
BoringSSL lacks EVP for Chacha20. Here we use CRYPTO_chacha_20() instead.
Sergey Kandaurov [Tue, 10 Mar 2020 16:13:09 +0000 (19:13 +0300)]
ChaCha20 / Poly1305 initial support.
Sergey Kandaurov [Tue, 10 Mar 2020 16:12:22 +0000 (19:12 +0300)]
Using SSL cipher suite id to obtain cipher/digest, part 2.
Ciphers negotiation handling refactored into ngx_quic_ciphers().
Sergey Kandaurov [Tue, 10 Mar 2020 15:40:18 +0000 (18:40 +0300)]
Fixed nonce in short packet protection.
Vladimir Homutov [Tue, 10 Mar 2020 15:24:39 +0000 (18:24 +0300)]
Generic payload handler for quic packets.
- added basic parsing of ACK, PING and PADDING frames on input
- added preliminary parsing of SHORT headers
The ngx_quic_output() is now called after processing of each input packet.
Frames are added into output queue according to their level: inital packets
go ahead of handshake and application data, so they can be merged properly.
The payload handler is called from both new, handshake and applicataion data
handlers (latter is a stub).
Sergey Kandaurov [Thu, 5 Mar 2020 17:05:40 +0000 (20:05 +0300)]
Fixed header protection with negotiated cipher suite.
Sergey Kandaurov [Thu, 5 Mar 2020 16:49:49 +0000 (19:49 +0300)]
Initial packets are protected with AEAD_AES_128_GCM.
Sergey Kandaurov [Thu, 5 Mar 2020 15:01:18 +0000 (18:01 +0300)]
Fixed write secret logging in set_encryption_secrets callback.
Vladimir Homutov [Thu, 5 Mar 2020 14:51:22 +0000 (17:51 +0300)]
Fixed format specifiers.
Vladimir Homutov [Thu, 5 Mar 2020 14:24:04 +0000 (17:24 +0300)]
Style.
Vladimir Homutov [Thu, 5 Mar 2020 14:18:33 +0000 (17:18 +0300)]
Added functions to decrypt long packets.
Sergey Kandaurov [Thu, 5 Mar 2020 12:26:15 +0000 (15:26 +0300)]
Fixed ngx_quic_varint_len misuse in the previous change.
Vladimir Homutov [Wed, 4 Mar 2020 20:24:51 +0000 (23:24 +0300)]
Macro for calculating size of varint.
Sergey Kandaurov [Thu, 5 Mar 2020 10:10:01 +0000 (13:10 +0300)]
Fixed packet "input" debug log message.
Sergey Kandaurov [Thu, 5 Mar 2020 10:00:59 +0000 (13:00 +0300)]
Using SSL cipher suite id to obtain cipher/digest, part 1.
While here, log the negotiated cipher just once, - after handshake.
Sergey Kandaurov [Thu, 5 Mar 2020 09:51:49 +0000 (12:51 +0300)]
Using cached ssl_conn in ngx_quic_handshake_input(), NFC.
Sergey Kandaurov [Wed, 4 Mar 2020 13:05:39 +0000 (16:05 +0300)]
Adjusted transport parameters stub for active_connection_id_limit.
As was objserved with ngtcp2 client, Finished CRYPTO frame within Handshake
packet may not be sent for some reason if there's nothing to append on 1-RTT.
This results in unnecessary retransmit. To avoid this edge case, a non-zero
active_connection_id_limit transport parameter is now used to append datagram
with NEW_CONNECTION_ID 1-RTT frames.
Vladimir Homutov [Wed, 4 Mar 2020 12:52:12 +0000 (15:52 +0300)]
Implemented improved version of quic_output().
Now handshake generates frames, and they are queued in c->quic->frames.
The ngx_quic_output() is called from ngx_quic_flush_flight() or manually,
processes the queue and encrypts all frames according to required encryption
level.
Sergey Kandaurov [Tue, 3 Mar 2020 14:25:02 +0000 (17:25 +0300)]
QUIC handshake final bits.
Added handling of client Finished, both feeding and acknowledgement.
This includes sending NST in 1-RTT triggered by a handshake process.
Vladimir Homutov [Tue, 3 Mar 2020 10:30:30 +0000 (13:30 +0300)]
Split frame and packet generation into separate steps.
While there, a number of QUIC constants from spec defined and magic numbers
were replaced.
Vladimir Homutov [Mon, 2 Mar 2020 18:38:03 +0000 (21:38 +0300)]
Aded the "ngx_quic_hexdump" macro.
ngx_quic_hexdump0(log, format, buffer, buffer_size);
- logs hexdump of buffer to specified error log
ngx_quic_hexdump0(c->log, "this is foo:", foo.data, foo.len);
ngx_quic_hexdump(log, format, buffer, buffer_size, ...)
- same as hexdump0, but more format/args possible:
ngx_quic_hexdump(c->log, "a=%d b=%d, foo is:", foo.data, foo.len, a, b);
Vladimir Homutov [Fri, 28 Feb 2020 13:23:25 +0000 (16:23 +0300)]
Moved all QUIC code into ngx_event_quic.c
Introduced ngx_quic_input() and ngx_quic_output() as interface between
nginx and protocol. They are the only functions that are exported.
While there, added copyrights.
Sergey Kandaurov [Fri, 28 Feb 2020 10:09:52 +0000 (13:09 +0300)]
Introduced quic_version macro, uint16/uint32 routines ported.
Sergey Kandaurov [Fri, 28 Feb 2020 10:09:52 +0000 (13:09 +0300)]
Cleanup.
Vladimir Homutov [Wed, 26 Feb 2020 13:56:47 +0000 (16:56 +0300)]
Generic function for HKDF expansion.
Sergey Kandaurov [Fri, 28 Feb 2020 10:09:52 +0000 (13:09 +0300)]
QUIC header protection routines, introduced ngx_quic_tls_hp().
Sergey Kandaurov [Fri, 28 Feb 2020 10:09:52 +0000 (13:09 +0300)]
AEAD routines, introduced ngx_quic_tls_open()/ngx_quic_tls_seal().
Sergey Kandaurov [Fri, 28 Feb 2020 10:09:52 +0000 (13:09 +0300)]
Transport parameters stub, to complete handshake.
Sergey Kandaurov [Fri, 28 Feb 2020 10:09:52 +0000 (13:09 +0300)]
Introduced ngx_quic_secret_t.
Sergey Kandaurov [Fri, 28 Feb 2020 10:09:52 +0000 (13:09 +0300)]
QUIC handshake handler, draft 24 bump.
Sergey Kandaurov [Fri, 28 Feb 2020 10:09:52 +0000 (13:09 +0300)]
Fixed indentation.