summaryrefslogtreecommitdiffhomepage
path: root/src (follow)
AgeCommit message (Collapse)AuthorFilesLines
2020-03-18Removed comment.Roman Arutyunyan1-1/+0
2020-03-18Refactored HTTP/3 parser.Roman Arutyunyan9-694/+1872
2020-03-18Style and handlers.Vladimir Homutov1-773/+812
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
2020-03-18Extracted transport part of the code into separate file.Vladimir Homutov7-744/+808
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.
2020-03-17Firefox fixes.Vladimir Homutov2-8/+62
+ 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"; } } }
2020-03-16Fixed a typo with OpenSSL.Vladimir Homutov1-1/+1
2020-03-16Split transport and crypto parts into separate files.Vladimir Homutov5-1218/+1203
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).
2020-03-16Added processing of CONNECTION CLOSE frames.Vladimir Homutov1-5/+71
Contents is parsed and debug is output. No actions are taken.
2020-03-14Temporary fix for header null-termination in HTTP/3.Roman Arutyunyan2-2/+14
2020-03-14Fixed header protection application with pn length > 1.Sergey Kandaurov1-1/+4
2020-03-13Fixed sanitizer errors.Roman Arutyunyan2-10/+11
2020-03-13Added check for initialized c->ssl before calling SSL shutdown.Vladimir Homutov1-1/+3
2020-03-13HTTP/3.Roman Arutyunyan15-60/+2982
2020-03-13Fixed infinite loop in ngx_quic_stream_send_chain().Roman Arutyunyan1-3/+1
2020-03-13Implemented tracking offset in STREAM frames.Roman Arutyunyan1-2/+4
2020-03-13Implemented ngx_quic_stream_send_chain() method.Roman Arutyunyan1-1/+35
- just call send in a loop
2020-03-13Stream "connection" read/write methods.Vladimir Homutov2-9/+256
2020-03-13Auth basic: explicitly zero out password buffer.Ruslan Ermilov1-19/+18
2020-03-16Version bump.Ruslan Ermilov1-2/+2
2020-03-12Fix build.Sergey Kandaurov1-1/+2
2020-03-12Removed hardcoded CRYPTO and ACK frame sizes.Vladimir Homutov1-2/+18
2020-03-12HTTP/QUIC interface reworked.Vladimir Homutov5-96/+293
- 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
2020-03-11Initial parsing of STREAM frames.Vladimir Homutov1-1/+68
2020-03-12Added support of multiple QUIC packets in single datagram.Vladimir Homutov1-99/+170
- 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.
2020-03-11Added more transport parameters.Vladimir Homutov1-3/+10
Needed for client to start sending streams.
2020-03-11Compatibility with BoringSSL revised QUIC encryption secret APIs.Sergey Kandaurov1-0/+147
See for details: https://boringssl.googlesource.com/boringssl/+/1e85905%5E!/
2020-03-10Chacha20 header protection support with BoringSSL.Sergey Kandaurov2-1/+15
BoringSSL lacks EVP for Chacha20. Here we use CRYPTO_chacha_20() instead.
2020-03-10ChaCha20 / Poly1305 initial support.Sergey Kandaurov1-0/+14
2020-03-10Using SSL cipher suite id to obtain cipher/digest, part 2.Sergey Kandaurov1-107/+114
Ciphers negotiation handling refactored into ngx_quic_ciphers().
2020-03-10Fixed nonce in short packet protection.Sergey Kandaurov1-1/+3
2020-03-10Generic payload handler for quic packets.Vladimir Homutov1-184/+367
- 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).
2020-03-05Fixed header protection with negotiated cipher suite.Sergey Kandaurov1-29/+33
2020-03-05Initial packets are protected with AEAD_AES_128_GCM.Sergey Kandaurov1-9/+14
2020-03-05Fixed write secret logging in set_encryption_secrets callback.Sergey Kandaurov1-1/+1
2020-03-05Fixed format specifiers.Vladimir Homutov1-2/+2
2020-03-05Style.Vladimir Homutov1-8/+10
2020-03-05Added functions to decrypt long packets.Vladimir Homutov1-179/+264
2020-03-05Fixed ngx_quic_varint_len misuse in the previous change.Sergey Kandaurov1-1/+1
2020-03-04Macro for calculating size of varint.Vladimir Homutov1-6/+3
2020-03-05Fixed packet "input" debug log message.Sergey Kandaurov1-1/+1
2020-03-05Using SSL cipher suite id to obtain cipher/digest, part 1.Sergey Kandaurov1-33/+32
While here, log the negotiated cipher just once, - after handshake.
2020-03-05Using cached ssl_conn in ngx_quic_handshake_input(), NFC.Sergey Kandaurov1-10/+11
2020-03-04Adjusted transport parameters stub for active_connection_id_limit.Sergey Kandaurov1-1/+2
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.
2020-03-04Implemented improved version of quic_output().Vladimir Homutov1-95/+276
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.
2020-03-03QUIC handshake final bits.Sergey Kandaurov1-9/+207
Added handling of client Finished, both feeding and acknowledgement. This includes sending NST in 1-RTT triggered by a handshake process.
2020-03-03Split frame and packet generation into separate steps.Vladimir Homutov1-90/+181
While there, a number of QUIC constants from spec defined and magic numbers were replaced.
2020-03-02Aded the "ngx_quic_hexdump" macro.Vladimir Homutov1-176/+69
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);
2020-02-28Simplified subrequest finalization.Roman Arutyunyan1-23/+11
Now it looks similar to what it was before background subrequests were introduced in 9552758a786e.
2020-03-02Fixed premature background subrequest finalization.Dmitry Volyntsev1-9/+9
When "aio" or "aio threads" is used while processing the response body of an in-memory background subrequest, the subrequest could be finalized with an aio operation still in progress. Upon aio completion either parent request is woken or the old r->write_event_handler is called again. The latter may result in request errors. In either case post_subrequest handler is never called with the full response body, which is typically expected when using in-memory subrequests. Currently in nginx background subrequests are created by the upstream module and the mirror module. The issue does not manifest itself with these subrequests because they are header-only. But it can manifest itself with third-party modules which create in-memory background subrequests.
2020-02-28Added default overwrite in error_page 494.Maxim Dounin1-0/+1
We used to have default error_page overwrite for 495, 496, and 497, so a configuration like error_page 495 /error; will result in error 400, much like without any error_page configured. The 494 status code was introduced later (in 3848:de59ad6bf557, nginx 0.9.4), and relevant changes to ngx_http_core_error_page() were missed, resulting in inconsistent behaviour of "error_page 494" - with error_page configured it results in 494 being returned instead of 400. Reported by Frank Liu, http://mailman.nginx.org/pipermail/nginx/2020-February/058957.html.