Mercurial > hg > nginx-tests
annotate lib/Test/Nginx/HTTP3.pm @ 1910:e0b53fbdb5cf
Tests: TLS_AES_128_CCM_SHA256 support in QUIC handshake.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Tue, 13 Jun 2023 17:58:46 +0400 |
parents | 46bb1ffbb960 |
children | afbf4c06c014 |
rev | line source |
---|---|
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1 package Test::Nginx::HTTP3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
3 # (C) Sergey Kandaurov |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
4 # (C) Nginx, Inc. |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
5 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
6 # Module for nginx QUIC tests. |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
7 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
8 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
9 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
10 use warnings; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
11 use strict; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
12 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
13 use IO::Socket::INET; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
14 use IO::Select; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
15 use Data::Dumper; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
16 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
17 use Test::Nginx; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
18 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
19 sub new { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
20 my $self = {}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
21 bless $self, shift @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
22 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
23 my ($port, %extra) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
24 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
25 require Crypt::KeyDerivation; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
26 require Crypt::PK::X25519; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
27 require Crypt::PRNG; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
28 require Crypt::AuthEnc::GCM; |
1910
e0b53fbdb5cf
Tests: TLS_AES_128_CCM_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1909
diff
changeset
|
29 require Crypt::AuthEnc::CCM; |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
30 require Crypt::AuthEnc::ChaCha20Poly1305; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
31 require Crypt::Mode::CTR; |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
32 require Crypt::Stream::ChaCha; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
33 require Crypt::Digest; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
34 require Crypt::Mac::HMAC; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
35 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
36 $self->{socket} = IO::Socket::INET->new( |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
37 Proto => "udp", |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
38 PeerAddr => '127.0.0.1:' . port($port || 8980), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
39 ); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
40 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
41 $self->{repeat} = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
42 $self->{token} = ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
43 $self->{psk_list} = $extra{psk_list} || []; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
44 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
45 $self->{sni} = exists $extra{sni} ? $extra{sni} : 'localhost'; |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
46 $self->{cipher} = 0x1301; |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
47 $self->{ciphers} = $extra{ciphers} || "\x13\x01"; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
48 $self->{opts} = $extra{opts}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
49 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
50 $self->{zero} = pack("x5"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
51 |
1875
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
52 $self->{static_encode} = [ static_table() ]; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
53 $self->{static_decode} = [ static_table() ]; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
54 $self->{dynamic_encode} = []; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
55 $self->{last_stream} = -4; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
56 $self->{buf} = ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
57 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
58 $self->init(); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
59 $self->init_key_schedule(); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
60 $self->initial(); |
1887
1023354f3a41
Tests: ssl_reject_handshake tests with HTTP/3.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1886
diff
changeset
|
61 return $self if $extra{probe}; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
62 $self->handshake() or return; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
63 |
1875
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
64 # RFC 9204, 4.3.1. Set Dynamic Table Capacity |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
65 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
66 my $buf = pack("B*", '001' . ipack(5, $extra{capacity} || 400)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
67 $self->{encoder_offset} = length($buf) + 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
68 $buf = "\x08\x02\x02" . $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
69 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
70 # RFC 9114, 6.2.1. Control Streams |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
71 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
72 $buf = "\x0a\x06\x03\x00\x04\x00" . $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
73 $self->{control_offset} = 3; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
74 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
75 $self->raw_write($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
76 |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
77 return $self; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
78 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
79 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
80 sub init { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
81 my ($self, $early_data) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
82 $self->{keys} = []; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
83 $self->{pn} = [[-1, -1, -1, -1], [-1, -1, -1, -1]]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
84 $self->{crypto_in} = [[],[],[],[]]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
85 $self->{stream_in} = []; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
86 $self->{frames_in} = []; |
1875
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
87 $self->{frames_incomplete} = []; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
88 $self->{tlsm} = (); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
89 $self->{tlsm}{$_} = '' |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
90 for 'ch', 'sh', 'ee', 'cert', 'cv', 'sf', 'cf', 'nst'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
91 $self->{requests} = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
92 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
93 # Initial |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
94 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
95 $self->{odcid} = undef; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
96 $self->{scid} = Crypt::PRNG::random_bytes(17); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
97 $self->{dcid} = Crypt::PRNG::random_bytes(18); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
98 $self->{salt} = "\x38\x76\x2c\xf7\xf5\x59\x34\xb3\x4d\x17" |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
99 . "\x9a\xe6\xa4\xc8\x0c\xad\xcc\xbb\x7f\x0a"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
100 $self->{ncid} = []; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
101 $self->{early_data} = $early_data; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
102 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
103 $self->retry(); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
104 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
105 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
106 sub retry { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
107 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
108 my $prk = Crypt::KeyDerivation::hkdf_extract($self->{dcid}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
109 $self->{salt}, 'SHA256'); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
110 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
111 Test::Nginx::log_core('||', "scid = " . unpack("H*", $self->{scid})); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
112 Test::Nginx::log_core('||', "dcid = " . unpack("H*", $self->{dcid})); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
113 Test::Nginx::log_core('||', "prk = " . unpack("H*", $prk)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
114 |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
115 $self->set_traffic_keys('tls13 client in', 'SHA256', 32, 0, 'w', $prk); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
116 $self->set_traffic_keys('tls13 server in', 'SHA256', 32, 0, 'r', $prk); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
117 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
118 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
119 sub init_key_schedule { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
120 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
121 $self->{psk} = $self->{psk_list}[0]; |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
122 my ($hash, $hlen) = $self->{psk} && $self->{psk}{cipher} == 0x1302 ? |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
123 ('SHA384', 48) : ('SHA256', 32); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
124 $self->{es_prk} = Crypt::KeyDerivation::hkdf_extract( |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
125 $self->{psk}->{secret} || pack("x$hlen"), pack("x$hlen"), |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
126 $hash); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
127 Test::Nginx::log_core('||', "es = " . unpack("H*", $self->{es_prk})); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
128 $self->{sk} = Crypt::PK::X25519->new->generate_key; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
129 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
130 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
131 sub initial { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
132 my ($self, $ed) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
133 $self->{tlsm}{ch} = $self->build_tls_client_hello(); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
134 my $ch = $self->{tlsm}{ch}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
135 my $crypto = build_crypto($ch); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
136 my $padding = 1200 - length($crypto); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
137 $padding = 0 if $padding < 0 || $self->{psk}->{ed}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
138 my $payload = $crypto . pack("x$padding"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
139 my $initial = $self->encrypt_aead($payload, 0); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
140 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
141 if ($ed && $self->{psk}->{ed}) { |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
142 my ($hash, $hlen) = $self->{psk}{cipher} == 0x1302 ? |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
143 ('SHA384', 48) : ('SHA256', 32); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
144 $self->set_traffic_keys('tls13 c e traffic', $hash, $hlen, 1, |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
145 'w', $self->{es_prk}, Crypt::Digest::digest_data($hash, |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
146 $self->{tlsm}{ch})); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
147 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
148 # my $ed = "\x0a\x02\x08\x00\x04\x02\x06\x1f\x0d\x00\x0a" |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
149 # . $self->build_stream("\x01\x06\x00\x00\xc0"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
150 $payload = $ed; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
151 # $payload = $self->build_stream("GET /\n"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
152 $padding = 1200 - length($crypto) - length($payload); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
153 $payload .= pack("x$padding") if $padding > 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
154 $initial .= $self->encrypt_aead($payload, 1); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
155 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
156 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
157 $self->{socket}->syswrite($initial); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
158 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
159 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
160 sub handshake { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
161 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
162 my $buf = ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
163 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
164 $self->read_tls_message(\$buf, \&parse_tls_server_hello) or return; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
165 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
166 my $sh = $self->{tlsm}{sh}; |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
167 $self->{cipher} = unpack("n", substr($sh, 6 + 32 + 1, 2)); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
168 |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
169 my $extens_len = unpack("C*", substr($sh, 6 + 32 + 4, 2)) * 8 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
170 + unpack("C*", substr($sh, 6 + 32 + 5, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
171 my $extens = substr($sh, 6 + 32 + 4 + 2, $extens_len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
172 my $pub = key_share($extens); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
173 Test::Nginx::log_core('||', "pub = " . unpack("H*", $pub)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
174 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
175 my $pk = Crypt::PK::X25519->new; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
176 $pk->import_key_raw($pub, "public"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
177 my $shared_secret = $self->{sk}->shared_secret($pk); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
178 Test::Nginx::log_core('||', "shared = " . unpack("H*", $shared_secret)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
179 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
180 # tls13_advance_key_schedule |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
181 |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
182 my ($hash, $hlen) = $self->{cipher} == 0x1302 ? |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
183 ('SHA384', 48) : ('SHA256', 32); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
184 |
1884
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
185 my $psk = pre_shared_key($extens); |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
186 $self->{psk} = (defined $psk && $self->{psk_list}[$psk]) || undef; |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
187 $self->{es_prk} = Crypt::KeyDerivation::hkdf_extract( |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
188 $self->{psk}->{secret} || pack("x$hlen"), pack("x$hlen"), |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
189 $hash); |
1884
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
190 |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
191 $self->{hs_prk} = hkdf_advance($hash, $hlen, $shared_secret, |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
192 $self->{es_prk}); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
193 Test::Nginx::log_core('||', "es = " . unpack("H*", $self->{es_prk})); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
194 Test::Nginx::log_core('||', "hs = " . unpack("H*", $self->{hs_prk})); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
195 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
196 # derive_secret_with_transcript |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
197 |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
198 my $digest = Crypt::Digest::digest_data($hash, $self->{tlsm}{ch} |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
199 . $self->{tlsm}{sh}); |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
200 $self->set_traffic_keys('tls13 c hs traffic', $hash, $hlen, 2, 'w', |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
201 $self->{hs_prk}, $digest); |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
202 $self->set_traffic_keys('tls13 s hs traffic', $hash, $hlen, 2, 'r', |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
203 $self->{hs_prk}, $digest); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
204 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
205 $self->read_tls_message(\$buf, \&parse_tls_encrypted_extensions); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
206 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
207 unless (keys %{$self->{psk}}) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
208 $self->read_tls_message(\$buf, \&parse_tls_certificate); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
209 $self->read_tls_message(\$buf, \&parse_tls_certificate_verify); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
210 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
211 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
212 $self->read_tls_message(\$buf, \&parse_tls_finished); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
213 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
214 # tls13_advance_key_schedule(application) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
215 |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
216 $self->{ms_prk} = hkdf_advance($hash, $hlen, pack("x$hlen"), |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
217 $self->{hs_prk}); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
218 Test::Nginx::log_core('||', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
219 "master = " . unpack("H*", $self->{ms_prk})); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
220 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
221 # derive_secret_with_transcript(application) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
222 |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
223 $digest = Crypt::Digest::digest_data($hash, $self->{tlsm}{ch} |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
224 . $self->{tlsm}{sh} . $self->{tlsm}{ee} . $self->{tlsm}{cert} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
225 . $self->{tlsm}{cv} . $self->{tlsm}{sf}); |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
226 $self->set_traffic_keys('tls13 c ap traffic', $hash, $hlen, 3, 'w', |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
227 $self->{ms_prk}, $digest); |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
228 $self->set_traffic_keys('tls13 s ap traffic', $hash, $hlen, 3, 'r', |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
229 $self->{ms_prk}, $digest); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
230 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
231 # client finished |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
232 |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
233 my $finished = tls13_finished($hash, $hlen, $self->{keys}[2]{w}{prk}, |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
234 $digest); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
235 Test::Nginx::log_core('||', "finished = " . unpack("H*", $finished)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
236 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
237 $self->{tlsm}{cf} = $finished; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
238 |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
239 $digest = Crypt::Digest::digest_data($hash, $self->{tlsm}{ch} |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
240 . $self->{tlsm}{sh} . $self->{tlsm}{ee} . $self->{tlsm}{cert} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
241 . $self->{tlsm}{cv} . $self->{tlsm}{sf} . $self->{tlsm}{cf}); |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
242 $self->{rms_prk} = hkdf_expand_label("tls13 res master", $hash, $hlen, |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
243 $self->{ms_prk}, $digest); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
244 Test::Nginx::log_core('||', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
245 "resumption = " . unpack("H*", $self->{rms_prk})); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
246 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
247 my $crypto = build_crypto($finished); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
248 $self->{socket}->syswrite($self->encrypt_aead($crypto, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
249 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
250 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
251 #if (!$psk->{ed}) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
252 # my $r = "\x0a\x02\x08\x00\x04\x02\x06\x1f\x0d\x00\x0a"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
253 # $s->syswrite(encrypt_aead($r, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
254 # $r = "\x01\x06\x00\x00\xc0"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
255 # $s->syswrite(encrypt_aead($self->build_stream($r), 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
256 #} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
257 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
258 sub DESTROY { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
259 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
260 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
261 return unless $self->{socket}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
262 return unless $self->{keys}[3]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
263 my $frame = build_cc(0, "graceful shutdown"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
264 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
265 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
266 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
267 sub ping { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
268 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
269 my $frame = "\x01\x00\x00\x00"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
270 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
271 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
272 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
273 sub reset_stream { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
274 my ($self, $sid, $code) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
275 my $final_size = $self->{streams}{$sid}{sent}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
276 my $frame = "\x04" . build_int($sid) . build_int($code) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
277 . build_int($final_size); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
278 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
279 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
280 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
281 sub stop_sending { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
282 my ($self, $sid, $code) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
283 my $frame = "\x05" . build_int($sid) . build_int($code); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
284 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
285 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
286 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
287 sub new_connection_id { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
288 my ($self, $seqno, $ret, $id, $token) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
289 my $frame = "\x18" . build_int($seqno) . build_int($ret) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
290 . pack("C", length($id)) . $id . $token; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
291 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
292 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
293 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
294 sub path_challenge { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
295 my ($self, $data) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
296 my $frame = "\x1a" . $data; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
297 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
298 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
299 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
300 sub path_response { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
301 my ($self, $data) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
302 my $frame = "\x1b" . $data; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
303 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
304 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
305 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
306 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
307 |
1875
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
308 # HTTP/3 routines |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
309 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
310 # 4.3.2. Insert with Name Reference |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
311 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
312 sub insert_reference { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
313 my ($self, $name, $value, %extra) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
314 my $table = $extra{dyn} |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
315 ? $self->{dynamic_encode} |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
316 : $self->{static_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
317 my $huff = $extra{huff}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
318 my $hbit = $huff ? '1' : '0'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
319 my $dbit = $extra{dyn} ? '0' : '1'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
320 my ($index, $buf) = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
321 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
322 ++$index until $index > $#$table |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
323 or $table->[$index][0] eq $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
324 $table = $self->{dynamic_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
325 splice @$table, 0, 0, [ $name, $value ]; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
326 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
327 $value = $huff ? huff($value) : $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
328 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
329 $buf = pack('B*', '1' . $dbit . ipack(6, $index)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
330 $buf .= pack('B*', $hbit . ipack(7, length($value))) . $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
331 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
332 my $offset = $self->{encoder_offset}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
333 my $length = length($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
334 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
335 $self->{encoder_offset} += $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
336 $self->raw_write("\x0e\x02" |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
337 . build_int($offset) . build_int($length) . $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
338 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
339 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
340 # 4.3.3. Insert with Literal Name |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
341 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
342 sub insert_literal { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
343 my ($self, $name, $value, %extra) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
344 my $table = $self->{dynamic_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
345 my $huff = $extra{huff}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
346 my $hbit = $huff ? '1' : '0'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
347 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
348 splice @$table, 0, 0, [ $name, $value ]; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
349 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
350 $name = $huff ? huff($name) : $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
351 $value = $huff ? huff($value) : $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
352 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
353 my $buf = pack('B*', '01' . $hbit . ipack(5, length($name))) . $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
354 $buf .= pack('B*', $hbit . ipack(7, length($value))) . $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
355 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
356 my $offset = $self->{encoder_offset}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
357 my $length = length($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
358 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
359 $self->{encoder_offset} += $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
360 $self->raw_write("\x0e\x02" |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
361 . build_int($offset) . build_int($length) . $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
362 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
363 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
364 # 4.3.4. Duplicate |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
365 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
366 sub duplicate { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
367 my ($self, $name, $value, %extra) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
368 my $table = $self->{dynamic_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
369 my $index = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
370 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
371 ++$index until $index > $#$table |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
372 or $table->[$index][0] eq $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
373 splice @$table, 0, 0, [ $table->[$index][0], $table->[$index][1] ]; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
374 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
375 my $buf = pack('B*', '000' . ipack(5, $index)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
376 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
377 my $offset = $self->{encoder_offset}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
378 my $length = length($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
379 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
380 $self->{encoder_offset} += $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
381 $self->raw_write("\x0e\x02" |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
382 . build_int($offset) . build_int($length) . $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
383 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
384 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
385 sub max_push_id { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
386 my ($self, $val) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
387 $val = build_int($val); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
388 my $buf = "\x0d" . build_int(length($val)) . $val; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
389 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
390 my $offset = $self->{control_offset}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
391 my $length = length($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
392 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
393 $self->{control_offset} += $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
394 $self->raw_write("\x0e\x06" |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
395 . build_int($offset) . build_int($length) . $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
396 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
397 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
398 sub cancel_push { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
399 my ($self, $val) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
400 $val = build_int($val); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
401 my $buf = "\x03" . build_int(length($val)) . $val; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
402 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
403 my $offset = $self->{control_offset}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
404 my $length = length($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
405 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
406 $self->{control_offset} += $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
407 $self->raw_write("\x0e\x06" |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
408 . build_int($offset) . build_int($length) . $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
409 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
410 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
411 sub new_stream { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
412 my ($self, $uri, $stream) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
413 my ($input, $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
414 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
415 $self->{headers} = ''; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
416 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
417 my $host = $uri->{host} || 'localhost'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
418 my $method = $uri->{method} || 'GET'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
419 my $scheme = $uri->{scheme} || 'http'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
420 my $path = $uri->{path} || '/'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
421 my $headers = $uri->{headers}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
422 my $body = $uri->{body}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
423 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
424 if ($stream) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
425 $self->{last_stream} = $stream; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
426 } else { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
427 $self->{last_stream} += 4; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
428 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
429 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
430 unless ($headers) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
431 $input = qpack($self, ":method", $method); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
432 $input .= qpack($self, ":scheme", $scheme); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
433 $input .= qpack($self, ":path", $path); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
434 $input .= qpack($self, ":authority", $host); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
435 $input .= qpack($self, "content-length", length($body)) |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
436 if $body; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
437 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
438 } else { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
439 $input = join '', map { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
440 qpack($self, $_->{name}, $_->{value}, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
441 mode => $_->{mode}, huff => $_->{huff}, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
442 idx => $_->{idx}, dyn => $_->{dyn}) |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
443 } @$headers if $headers; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
444 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
445 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
446 # encoded field section prefix |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
447 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
448 my $table = $self->{dynamic_encode}; |
1883
ff50c265a5ac
Tests: HTTP/3 tests with streams blocked on insert count.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1875
diff
changeset
|
449 my $ric = $uri->{ric} ? $uri->{ric} : @$table ? @$table + 1 : 0; |
1875
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
450 my $base = $uri->{base} || 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
451 $base = $base < 0 ? 0x80 + abs($base) - 1 : $base; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
452 $input = pack("CC", $ric, $base) . $input; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
453 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
454 # set length, attach headers, body |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
455 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
456 $buf = pack("C", 1); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
457 $buf .= build_int(length($input)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
458 $buf .= $input; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
459 $buf .= pack_body($self, $body) if defined $body; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
460 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
461 $self->{streams}{$self->{last_stream}}{sent} = length($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
462 $self->raw_write($self->build_stream($buf, start => $uri->{body_more})); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
463 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
464 return $self->{last_stream}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
465 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
466 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
467 sub h3_body { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
468 my ($self, $body, $sid, $extra) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
469 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
470 my $buf = pack_body($self, $body) if defined $body; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
471 my $offset = $self->{streams}{$sid}{sent}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
472 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
473 $self->{streams}{$sid}{sent} += length($body); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
474 $self->raw_write($self->build_stream($buf, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
475 start => $extra->{body_more}, sid => $sid, offset => $offset)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
476 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
477 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
478 sub pack_body { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
479 my ($self, $body) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
480 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
481 my $buf .= pack("C", 0); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
482 $buf .= build_int(length($body)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
483 $buf .= $body; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
484 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
485 |
1889
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
486 sub h3_max_data { |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
487 my ($self, $val, $stream) = @_; |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
488 |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
489 my $buf = defined $stream |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
490 ? "\x11" . build_int($stream) . build_int($val) |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
491 : "\x10" . build_int($val); |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
492 return $self->raw_write($buf); |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
493 } |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
494 |
1875
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
495 my %cframe = ( |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
496 0 => { name => 'DATA', value => \&data }, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
497 1 => { name => 'HEADERS', value => \&headers }, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
498 # 3 => { name => 'CANCEL_PUSH', value => \&cancel_push }, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
499 4 => { name => 'SETTINGS', value => \&settings }, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
500 5 => { name => 'PUSH_PROMISE', value => \&push_promise }, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
501 7 => { name => 'GOAWAY', value => \&goaway }, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
502 ); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
503 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
504 sub read { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
505 my ($self, %extra) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
506 my (@got); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
507 my $s = $self->{socket}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
508 my $wait = $extra{wait}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
509 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
510 local $Data::Dumper::Terse = 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
511 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
512 while (1) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
513 my ($frame, $length, $uni); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
514 my ($stream, $buf, $eof) = $self->read_stream_message($wait); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
515 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
516 unless (defined $stream) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
517 return \@got unless scalar @{$self->{frames_in}}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
518 goto frames; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
519 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
520 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
521 if (length($self->{frames_incomplete}[$stream]{buf})) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
522 $buf = $self->{frames_incomplete}[$stream]{buf} . $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
523 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
524 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
525 again: |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
526 if (($stream % 4) == 3) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
527 unless (defined $self->{stream_uni}{$stream}{stream}) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
528 (my $len, $uni) = parse_int(substr($buf, 0)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
529 $self->{stream_uni}{$stream}{stream} = $uni; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
530 $buf = substr($buf, $len); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
531 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
532 } else { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
533 $uni = $self->{stream_uni}{$stream}{stream}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
534 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
535 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
536 # push stream |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
537 if ($uni == 1 && !$self->{stream_uni}{$stream}{push}) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
538 $self->{stream_uni}{$stream}{push} = 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
539 ($frame, $length) = push_stream($buf, $stream); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
540 goto push_me; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
541 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
542 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
543 # decoder |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
544 if ($uni == 3) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
545 ($frame, $length) = push_decoder($buf, $stream); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
546 goto push_me; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
547 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
548 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
549 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
550 my $offset = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
551 my ($len, $type); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
552 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
553 if (!length($self->{frames_incomplete}[$stream]{buf})) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
554 ($len, $type) = parse_int(substr($buf, $offset)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
555 $offset += $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
556 ($len, $length) = parse_int(substr($buf, $offset)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
557 $offset += $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
558 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
559 $self->{frames_incomplete}[$stream]{type} = $type; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
560 $self->{frames_incomplete}[$stream]{length} = $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
561 $self->{frames_incomplete}[$stream]{offset} = $offset; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
562 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
563 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
564 if (length($buf) < $self->{frames_incomplete}[$stream]{length} |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
565 + $self->{frames_incomplete}[$stream]{offset}) |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
566 { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
567 $self->{frames_incomplete}[$stream]{buf} = $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
568 next; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
569 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
570 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
571 $type = $self->{frames_incomplete}[$stream]{type}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
572 $length = $self->{frames_incomplete}[$stream]{length}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
573 $offset = $self->{frames_incomplete}[$stream]{offset}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
574 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
575 $buf = substr($buf, $offset); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
576 $self->{frames_incomplete}[$stream]{buf} = ""; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
577 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
578 $frame = $cframe{$type}{value}($self, $buf, $length); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
579 $frame->{length} = $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
580 $frame->{type} = $cframe{$type}{name}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
581 $frame->{flags} = $eof && length($buf) == $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
582 $frame->{sid} = $stream; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
583 $frame->{uni} = $uni if defined $uni; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
584 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
585 push_me: |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
586 push @got, $frame; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
587 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
588 Test::Nginx::log_core('||', $_) for split "\n", Dumper $frame; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
589 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
590 $buf = substr($buf, $length); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
591 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
592 last unless $extra{all} && test_fin($frame, $extra{all}); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
593 goto again if length($buf) > 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
594 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
595 frames: |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
596 while ($frame = shift @{$self->{frames_in}}) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
597 push @got, $frame; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
598 Test::Nginx::log_core('||', $_) for split "\n", |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
599 Dumper $frame; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
600 return \@got unless test_fin($frame, $extra{all}); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
601 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
602 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
603 return \@got; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
604 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
605 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
606 sub push_stream { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
607 my ($buf, $stream) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
608 my $frame = { sid => $stream, uni => 1, type => 'PUSH header' }; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
609 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
610 my ($len, $id) = parse_int($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
611 $frame->{push_id} = $id; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
612 $frame->{length} = $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
613 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
614 return ($frame, $len); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
615 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
616 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
617 sub push_decoder { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
618 my ($buf, $stream) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
619 my ($skip, $val) = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
620 my $frame = { sid => $stream, uni => 3 }; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
621 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
622 if ($skip < length($buf)) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
623 my $bits = unpack("\@$skip B8", $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
624 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
625 if (substr($bits, 0, 1) eq '1') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
626 ($val, $skip) = iunpack(7, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
627 $frame->{type} = 'DECODER_SA'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
628 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
629 } elsif (substr($bits, 0, 2) eq '01') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
630 ($val, $skip) = iunpack(6, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
631 $frame->{type} = 'DECODER_C'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
632 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
633 } elsif (substr($bits, 0, 2) eq '00') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
634 ($val, $skip) = iunpack(6, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
635 $frame->{type} = 'DECODER_ICI'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
636 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
637 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
638 $frame->{val} = $val; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
639 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
640 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
641 return ($frame, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
642 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
643 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
644 sub test_fin { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
645 my ($frame, $all) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
646 my @test = @{$all}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
647 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
648 # wait for the specified DATA length |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
649 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
650 for (@test) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
651 if ($_->{length} && $frame->{type} eq 'DATA') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
652 # check also for StreamID if needed |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
653 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
654 if (!$_->{sid} || $_->{sid} == $frame->{sid}) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
655 $_->{length} -= $frame->{length}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
656 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
657 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
658 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
659 @test = grep { !(defined $_->{length} && $_->{length} == 0) } @test; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
660 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
661 # wait for the fin flag |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
662 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
663 @test = grep { !(defined $_->{fin} |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
664 && (!defined $_->{sid} || $_->{sid} == $frame->{sid}) |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
665 && $_->{fin} & $frame->{flags}) |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
666 } @test if defined $frame->{flags}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
667 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
668 # wait for the specified frame |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
669 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
670 @test = grep { !($_->{type} && $_->{type} eq $frame->{type}) } @test; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
671 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
672 @{$all} = @test; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
673 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
674 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
675 sub data { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
676 my ($self, $buf, $len) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
677 return { data => substr($buf, 0, $len) }; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
678 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
679 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
680 sub headers { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
681 my ($self, $buf, $len) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
682 my ($ric, $base); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
683 $self->{headers} = substr($buf, 0, $len); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
684 my $skip = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
685 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
686 ($ric, $skip) = iunpack(8, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
687 ($base, $skip) = iunpack(7, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
688 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
689 $buf = substr($buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
690 $len -= $skip; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
691 { headers => qunpack($self, $buf, $len) }; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
692 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
693 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
694 sub settings { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
695 my ($self, $buf, $length) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
696 my %payload; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
697 my ($offset, $len) = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
698 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
699 while ($offset < $length) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
700 my ($id, $val); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
701 ($len, $id) = parse_int(substr($buf, $offset)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
702 $offset += $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
703 ($len, $val) = parse_int(substr($buf, $offset)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
704 $offset += $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
705 $payload{$id} = $val; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
706 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
707 return \%payload; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
708 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
709 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
710 sub push_promise { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
711 my ($self, $buf, $length) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
712 my %payload; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
713 my ($offset, $len, $id) = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
714 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
715 ($len, $id) = parse_int($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
716 $offset += $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
717 $payload{push_id} = $id; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
718 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
719 my ($ric, $base); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
720 my $skip = $offset; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
721 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
722 ($ric, $skip) = iunpack(8, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
723 ($base, $skip) = iunpack(7, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
724 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
725 $buf = substr($buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
726 $length -= $skip; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
727 $payload{headers} = qunpack($self, $buf, $length); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
728 return \%payload; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
729 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
730 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
731 sub goaway { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
732 my ($self, $buf, $length) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
733 my ($len, $stream) = parse_int($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
734 { last_sid => $stream } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
735 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
736 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
737 # RFC 7541, 5.1. Integer Representation |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
738 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
739 sub ipack { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
740 my ($base, $d) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
741 return sprintf("%.*b", $base, $d) if $d < 2**$base - 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
742 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
743 my $o = sprintf("%${base}b", 2**$base - 1); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
744 $d -= 2**$base - 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
745 while ($d >= 128) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
746 $o .= sprintf("%8b", $d % 128 + 128); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
747 $d /= 128; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
748 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
749 $o .= sprintf("%08b", $d); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
750 return $o; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
751 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
752 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
753 sub iunpack { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
754 my ($base, $b, $s) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
755 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
756 my $len = unpack("\@$s B8", $b); $s++; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
757 my $huff = substr($len, 8 - $base - 1, 1); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
758 $len = '0' x (8 - $base) . substr($len, 8 - $base); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
759 $len = unpack("C", pack("B8", $len)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
760 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
761 return ($len, $s, $huff) if $len < 2**$base - 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
762 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
763 my $m = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
764 my $d; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
765 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
766 do { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
767 $d = unpack("\@$s C", $b); $s++; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
768 $len += ($d & 127) * 2**$m; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
769 $m += $base; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
770 } while (($d & 128) == 128); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
771 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
772 return ($len, $s, $huff); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
773 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
774 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
775 sub qpack { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
776 my ($ctx, $name, $value, %extra) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
777 my $mode = defined $extra{mode} ? $extra{mode} : 4; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
778 my $huff = $extra{huff}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
779 my $hbit = $huff ? '1' : '0'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
780 my $ibit = $extra{ni} ? '1' : '0'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
781 my $dbit = $extra{dyn} ? '0' : '1'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
782 my $table = $extra{dyn} ? $ctx->{dynamic_encode} : $ctx->{static_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
783 my ($index, $buf) = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
784 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
785 # 4.5.2. Indexed Field Line |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
786 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
787 if ($mode == 0) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
788 ++$index until $index > $#$table |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
789 or $table->[$index][0] eq $name |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
790 and $table->[$index][1] eq $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
791 $buf = pack('B*', '1' . $dbit . ipack(6, $index)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
792 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
793 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
794 # 4.5.3. Indexed Field Line with Post-Base Index |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
795 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
796 if ($mode == 1) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
797 $table = $ctx->{dynamic_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
798 ++$index until $index > $#$table |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
799 or $table->[$index][0] eq $name |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
800 and $table->[$index][1] eq $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
801 $buf = pack('B*', '0001' . ipack(4, 0)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
802 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
803 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
804 # 4.5.4. Literal Field Line with Name Reference |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
805 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
806 if ($mode == 2) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
807 ++$index until $index > $#$table |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
808 or $table->[$index][0] eq $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
809 $value = $huff ? huff($value) : $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
810 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
811 $buf = pack('B*', '01' . $ibit . $dbit . ipack(4, $index)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
812 $buf .= pack('B*', $hbit . ipack(7, length($value))) . $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
813 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
814 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
815 # 4.5.5. Literal Field Line with Post-Base Name Reference |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
816 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
817 if ($mode == 3) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
818 $table = $ctx->{dynamic_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
819 ++$index until $index > $#$table |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
820 or $table->[$index][0] eq $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
821 $value = $huff ? huff($value) : $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
822 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
823 $buf = pack('B*', '0000' . $ibit . ipack(3, $index)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
824 $buf .= pack('B*', $hbit . ipack(7, length($value))) . $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
825 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
826 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
827 # 4.5.6. Literal Field Line with Literal Name |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
828 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
829 if ($mode == 4) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
830 $name = $huff ? huff($name) : $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
831 $value = $huff ? huff($value) : $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
832 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
833 $buf = pack('B*', '001' . $ibit . |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
834 $hbit . ipack(3, length($name))) . $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
835 $buf .= pack('B*', $hbit . ipack(7, length($value))) . $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
836 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
837 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
838 return $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
839 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
840 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
841 sub qunpack { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
842 my ($ctx, $data, $length) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
843 my $table = $ctx->{static_decode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
844 my %headers; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
845 my $skip = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
846 my ($index, $name, $value, $size); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
847 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
848 my $field = sub { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
849 my ($base, $b) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
850 my ($len, $s, $huff) = iunpack(@_); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
851 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
852 my $field = substr($b, $s, $len); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
853 $field = $huff ? dehuff($field) : $field; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
854 $s += $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
855 return ($field, $s); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
856 }; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
857 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
858 my $add = sub { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
859 my ($h, $n, $v) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
860 return $h->{$n} = $v unless exists $h->{$n}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
861 $h->{$n} = [ $h->{$n} ] unless ref $h->{$n}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
862 push @{$h->{$n}}, $v; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
863 }; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
864 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
865 while ($skip < $length) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
866 my $ib = unpack("\@$skip B8", $data); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
867 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
868 # 4.5.2. Indexed Field Line |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
869 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
870 if (substr($ib, 0, 2) eq '11') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
871 ($index, $skip) = iunpack(6, $data, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
872 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
873 $add->(\%headers, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
874 $table->[$index][0], $table->[$index][1]); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
875 next; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
876 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
877 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
878 # 4.5.4. Literal Field Line with Name Reference |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
879 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
880 if (substr($ib, 0, 4) eq '0101') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
881 ($index, $skip) = iunpack(4, $data, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
882 $name = $table->[$index][0]; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
883 ($value, $skip) = $field->(7, $data, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
884 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
885 $add->(\%headers, $name, $value); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
886 next; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
887 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
888 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
889 # 4.5.6. Literal Field Line with Literal Name |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
890 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
891 if (substr($ib, 0, 4) eq '0010') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
892 ($name, $skip) = $field->(3, $data, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
893 ($value, $skip) = $field->(7, $data, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
894 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
895 $add->(\%headers, $name, $value); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
896 next; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
897 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
898 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
899 last; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
900 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
901 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
902 return \%headers; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
903 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
904 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
905 sub static_table { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
906 [ ':authority', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
907 [ ':path', '/' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
908 [ 'age', '0' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
909 [ 'content-disposition', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
910 [ 'content-length', '0' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
911 [ 'cookie', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
912 [ 'date', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
913 [ 'etag', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
914 [ 'if-modified-since', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
915 [ 'if-none-match', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
916 [ 'last-modified', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
917 [ 'link', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
918 [ 'location', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
919 [ 'referer', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
920 [ 'set-cookie', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
921 [ ':method', 'CONNECT' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
922 [ ':method', 'DELETE' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
923 [ ':method', 'GET' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
924 [ ':method', 'HEAD' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
925 [ ':method', 'OPTIONS' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
926 [ ':method', 'POST' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
927 [ ':method', 'PUT' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
928 [ ':scheme', 'http' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
929 [ ':scheme', 'https' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
930 [ ':status', '103' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
931 [ ':status', '200' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
932 [ ':status', '304' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
933 [ ':status', '404' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
934 [ ':status', '503' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
935 [ 'accept', '*/*' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
936 [ 'accept', 'application/dns-message' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
937 [ 'accept-encoding', 'gzip, deflate, br' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
938 [ 'accept-ranges', 'bytes' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
939 [ 'access-control-allow-headers', 'cache-control' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
940 [ 'access-control-allow-headers', 'content-type' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
941 [ 'access-control-allow-origin', '*' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
942 [ 'cache-control', 'max-age=0' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
943 [ 'cache-control', 'max-age=2592000' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
944 [ 'cache-control', 'max-age=604800' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
945 [ 'cache-control', 'no-cache' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
946 [ 'cache-control', 'no-store' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
947 [ 'cache-control', 'public, max-age=31536000' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
948 [ 'content-encoding', 'br' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
949 [ 'content-encoding', 'gzip' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
950 [ 'content-type', 'application/dns-message' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
951 [ 'content-type', 'application/javascript' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
952 [ 'content-type', 'application/json' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
953 [ 'content-type', 'application/x-www-form-urlencoded' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
954 [ 'content-type', 'image/gif' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
955 [ 'content-type', 'image/jpeg' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
956 [ 'content-type', 'image/png' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
957 [ 'content-type', 'text/css' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
958 [ 'content-type', 'text/html; charset=utf-8' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
959 [ 'content-type', 'text/plain' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
960 [ 'content-type', 'text/plain;charset=utf-8' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
961 [ 'range', 'bytes=0-' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
962 [ 'strict-transport-security', 'max-age=31536000' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
963 [ 'strict-transport-security', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
964 'max-age=31536000; includesubdomains' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
965 [ 'strict-transport-security', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
966 'max-age=31536000; includesubdomains; preload' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
967 [ 'vary', 'accept-encoding' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
968 [ 'vary', 'origin' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
969 [ 'x-content-type-options', 'nosniff' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
970 [ 'x-xss-protection', '1; mode=block' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
971 [ ':status', '100' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
972 [ ':status', '204' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
973 [ ':status', '206' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
974 [ ':status', '302' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
975 [ ':status', '400' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
976 [ ':status', '403' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
977 [ ':status', '421' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
978 [ ':status', '425' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
979 [ ':status', '500' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
980 [ 'accept-language', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
981 [ 'access-control-allow-credentials', 'FALSE' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
982 [ 'access-control-allow-credentials', 'TRUE' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
983 [ 'access-control-allow-headers', '*' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
984 [ 'access-control-allow-methods', 'get' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
985 [ 'access-control-allow-methods', 'get, post, options' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
986 [ 'access-control-allow-methods', 'options' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
987 [ 'access-control-expose-headers', 'content-length' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
988 [ 'access-control-request-headers', 'content-type' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
989 [ 'access-control-request-method', 'get' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
990 [ 'access-control-request-method', 'post' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
991 [ 'alt-svc', 'clear' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
992 [ 'authorization', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
993 [ 'content-security-policy', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
994 "script-src 'none'; object-src 'none'; base-uri 'none'" ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
995 [ 'early-data', '1' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
996 [ 'expect-ct', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
997 [ 'forwarded', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
998 [ 'if-range', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
999 [ 'origin', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1000 [ 'purpose', 'prefetch' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1001 [ 'server', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1002 [ 'timing-allow-origin', '*' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1003 [ 'upgrade-insecure-requests', '1' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1004 [ 'user-agent', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1005 [ 'x-forwarded-for', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1006 [ 'x-frame-options', 'deny' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1007 [ 'x-frame-options', 'sameorigin' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1008 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1009 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1010 sub huff_code { scalar { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1011 pack('C', 0) => '1111111111000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1012 pack('C', 1) => '11111111111111111011000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1013 pack('C', 2) => '1111111111111111111111100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1014 pack('C', 3) => '1111111111111111111111100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1015 pack('C', 4) => '1111111111111111111111100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1016 pack('C', 5) => '1111111111111111111111100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1017 pack('C', 6) => '1111111111111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1018 pack('C', 7) => '1111111111111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1019 pack('C', 8) => '1111111111111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1020 pack('C', 9) => '111111111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1021 pack('C', 10) => '111111111111111111111111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1022 pack('C', 11) => '1111111111111111111111101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1023 pack('C', 12) => '1111111111111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1024 pack('C', 13) => '111111111111111111111111111101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1025 pack('C', 14) => '1111111111111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1026 pack('C', 15) => '1111111111111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1027 pack('C', 16) => '1111111111111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1028 pack('C', 17) => '1111111111111111111111101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1029 pack('C', 18) => '1111111111111111111111101111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1030 pack('C', 19) => '1111111111111111111111110000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1031 pack('C', 20) => '1111111111111111111111110001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1032 pack('C', 21) => '1111111111111111111111110010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1033 pack('C', 22) => '111111111111111111111111111110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1034 pack('C', 23) => '1111111111111111111111110011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1035 pack('C', 24) => '1111111111111111111111110100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1036 pack('C', 25) => '1111111111111111111111110101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1037 pack('C', 26) => '1111111111111111111111110110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1038 pack('C', 27) => '1111111111111111111111110111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1039 pack('C', 28) => '1111111111111111111111111000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1040 pack('C', 29) => '1111111111111111111111111001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1041 pack('C', 30) => '1111111111111111111111111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1042 pack('C', 31) => '1111111111111111111111111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1043 pack('C', 32) => '010100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1044 pack('C', 33) => '1111111000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1045 pack('C', 34) => '1111111001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1046 pack('C', 35) => '111111111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1047 pack('C', 36) => '1111111111001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1048 pack('C', 37) => '010101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1049 pack('C', 38) => '11111000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1050 pack('C', 39) => '11111111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1051 pack('C', 40) => '1111111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1052 pack('C', 41) => '1111111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1053 pack('C', 42) => '11111001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1054 pack('C', 43) => '11111111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1055 pack('C', 44) => '11111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1056 pack('C', 45) => '010110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1057 pack('C', 46) => '010111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1058 pack('C', 47) => '011000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1059 pack('C', 48) => '00000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1060 pack('C', 49) => '00001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1061 pack('C', 50) => '00010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1062 pack('C', 51) => '011001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1063 pack('C', 52) => '011010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1064 pack('C', 53) => '011011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1065 pack('C', 54) => '011100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1066 pack('C', 55) => '011101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1067 pack('C', 56) => '011110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1068 pack('C', 57) => '011111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1069 pack('C', 58) => '1011100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1070 pack('C', 59) => '11111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1071 pack('C', 60) => '111111111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1072 pack('C', 61) => '100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1073 pack('C', 62) => '111111111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1074 pack('C', 63) => '1111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1075 pack('C', 64) => '1111111111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1076 pack('C', 65) => '100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1077 pack('C', 66) => '1011101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1078 pack('C', 67) => '1011110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1079 pack('C', 68) => '1011111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1080 pack('C', 69) => '1100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1081 pack('C', 70) => '1100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1082 pack('C', 71) => '1100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1083 pack('C', 72) => '1100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1084 pack('C', 73) => '1100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1085 pack('C', 74) => '1100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1086 pack('C', 75) => '1100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1087 pack('C', 76) => '1100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1088 pack('C', 77) => '1101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1089 pack('C', 78) => '1101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1090 pack('C', 79) => '1101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1091 pack('C', 80) => '1101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1092 pack('C', 81) => '1101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1093 pack('C', 82) => '1101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1094 pack('C', 83) => '1101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1095 pack('C', 84) => '1101111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1096 pack('C', 85) => '1110000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1097 pack('C', 86) => '1110001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1098 pack('C', 87) => '1110010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1099 pack('C', 88) => '11111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1100 pack('C', 89) => '1110011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1101 pack('C', 90) => '11111101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1102 pack('C', 91) => '1111111111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1103 pack('C', 92) => '1111111111111110000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1104 pack('C', 93) => '1111111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1105 pack('C', 94) => '11111111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1106 pack('C', 95) => '100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1107 pack('C', 96) => '111111111111101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1108 pack('C', 97) => '00011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1109 pack('C', 98) => '100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1110 pack('C', 99) => '00100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1111 pack('C', 100) => '100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1112 pack('C', 101) => '00101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1113 pack('C', 102) => '100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1114 pack('C', 103) => '100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1115 pack('C', 104) => '100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1116 pack('C', 105) => '00110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1117 pack('C', 106) => '1110100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1118 pack('C', 107) => '1110101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1119 pack('C', 108) => '101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1120 pack('C', 109) => '101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1121 pack('C', 110) => '101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1122 pack('C', 111) => '00111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1123 pack('C', 112) => '101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1124 pack('C', 113) => '1110110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1125 pack('C', 114) => '101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1126 pack('C', 115) => '01000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1127 pack('C', 116) => '01001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1128 pack('C', 117) => '101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1129 pack('C', 118) => '1110111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1130 pack('C', 119) => '1111000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1131 pack('C', 120) => '1111001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1132 pack('C', 121) => '1111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1133 pack('C', 122) => '1111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1134 pack('C', 123) => '111111111111110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1135 pack('C', 124) => '11111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1136 pack('C', 125) => '11111111111101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1137 pack('C', 126) => '1111111111101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1138 pack('C', 127) => '1111111111111111111111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1139 pack('C', 128) => '11111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1140 pack('C', 129) => '1111111111111111010010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1141 pack('C', 130) => '11111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1142 pack('C', 131) => '11111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1143 pack('C', 132) => '1111111111111111010011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1144 pack('C', 133) => '1111111111111111010100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1145 pack('C', 134) => '1111111111111111010101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1146 pack('C', 135) => '11111111111111111011001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1147 pack('C', 136) => '1111111111111111010110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1148 pack('C', 137) => '11111111111111111011010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1149 pack('C', 138) => '11111111111111111011011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1150 pack('C', 139) => '11111111111111111011100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1151 pack('C', 140) => '11111111111111111011101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1152 pack('C', 141) => '11111111111111111011110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1153 pack('C', 142) => '111111111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1154 pack('C', 143) => '11111111111111111011111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1155 pack('C', 144) => '111111111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1156 pack('C', 145) => '111111111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1157 pack('C', 146) => '1111111111111111010111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1158 pack('C', 147) => '11111111111111111100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1159 pack('C', 148) => '111111111111111111101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1160 pack('C', 149) => '11111111111111111100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1161 pack('C', 150) => '11111111111111111100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1162 pack('C', 151) => '11111111111111111100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1163 pack('C', 152) => '11111111111111111100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1164 pack('C', 153) => '111111111111111011100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1165 pack('C', 154) => '1111111111111111011000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1166 pack('C', 155) => '11111111111111111100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1167 pack('C', 156) => '1111111111111111011001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1168 pack('C', 157) => '11111111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1169 pack('C', 158) => '11111111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1170 pack('C', 159) => '111111111111111111101111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1171 pack('C', 160) => '1111111111111111011010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1172 pack('C', 161) => '111111111111111011101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1173 pack('C', 162) => '11111111111111101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1174 pack('C', 163) => '1111111111111111011011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1175 pack('C', 164) => '1111111111111111011100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1176 pack('C', 165) => '11111111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1177 pack('C', 166) => '11111111111111111101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1178 pack('C', 167) => '111111111111111011110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1179 pack('C', 168) => '11111111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1180 pack('C', 169) => '1111111111111111011101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1181 pack('C', 170) => '1111111111111111011110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1182 pack('C', 171) => '111111111111111111110000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1183 pack('C', 172) => '111111111111111011111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1184 pack('C', 173) => '1111111111111111011111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1185 pack('C', 174) => '11111111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1186 pack('C', 175) => '11111111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1187 pack('C', 176) => '111111111111111100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1188 pack('C', 177) => '111111111111111100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1189 pack('C', 178) => '1111111111111111100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1190 pack('C', 179) => '111111111111111100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1191 pack('C', 180) => '11111111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1192 pack('C', 181) => '1111111111111111100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1193 pack('C', 182) => '11111111111111111101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1194 pack('C', 183) => '11111111111111111101111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1195 pack('C', 184) => '11111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1196 pack('C', 185) => '1111111111111111100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1197 pack('C', 186) => '1111111111111111100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1198 pack('C', 187) => '1111111111111111100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1199 pack('C', 188) => '11111111111111111110000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1200 pack('C', 189) => '1111111111111111100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1201 pack('C', 190) => '1111111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1202 pack('C', 191) => '11111111111111111110001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1203 pack('C', 192) => '11111111111111111111100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1204 pack('C', 193) => '11111111111111111111100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1205 pack('C', 194) => '11111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1206 pack('C', 195) => '1111111111111110001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1207 pack('C', 196) => '1111111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1208 pack('C', 197) => '11111111111111111110010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1209 pack('C', 198) => '1111111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1210 pack('C', 199) => '1111111111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1211 pack('C', 200) => '11111111111111111111100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1212 pack('C', 201) => '11111111111111111111100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1213 pack('C', 202) => '11111111111111111111100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1214 pack('C', 203) => '111111111111111111111011110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1215 pack('C', 204) => '111111111111111111111011111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1216 pack('C', 205) => '11111111111111111111100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1217 pack('C', 206) => '111111111111111111110001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1218 pack('C', 207) => '1111111111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1219 pack('C', 208) => '1111111111111110010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1220 pack('C', 209) => '111111111111111100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1221 pack('C', 210) => '11111111111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1222 pack('C', 211) => '111111111111111111111100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1223 pack('C', 212) => '111111111111111111111100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1224 pack('C', 213) => '11111111111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1225 pack('C', 214) => '111111111111111111111100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1226 pack('C', 215) => '111111111111111111110010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1227 pack('C', 216) => '111111111111111100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1228 pack('C', 217) => '111111111111111100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1229 pack('C', 218) => '11111111111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1230 pack('C', 219) => '11111111111111111111101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1231 pack('C', 220) => '1111111111111111111111111101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1232 pack('C', 221) => '111111111111111111111100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1233 pack('C', 222) => '111111111111111111111100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1234 pack('C', 223) => '111111111111111111111100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1235 pack('C', 224) => '11111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1236 pack('C', 225) => '111111111111111111110011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1237 pack('C', 226) => '11111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1238 pack('C', 227) => '111111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1239 pack('C', 228) => '1111111111111111101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1240 pack('C', 229) => '111111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1241 pack('C', 230) => '111111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1242 pack('C', 231) => '11111111111111111110011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1243 pack('C', 232) => '1111111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1244 pack('C', 233) => '1111111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1245 pack('C', 234) => '1111111111111111111101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1246 pack('C', 235) => '1111111111111111111101111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1247 pack('C', 236) => '111111111111111111110100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1248 pack('C', 237) => '111111111111111111110101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1249 pack('C', 238) => '11111111111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1250 pack('C', 239) => '11111111111111111110100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1251 pack('C', 240) => '11111111111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1252 pack('C', 241) => '111111111111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1253 pack('C', 242) => '11111111111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1254 pack('C', 243) => '11111111111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1255 pack('C', 244) => '111111111111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1256 pack('C', 245) => '111111111111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1257 pack('C', 246) => '111111111111111111111101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1258 pack('C', 247) => '111111111111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1259 pack('C', 248) => '111111111111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1260 pack('C', 249) => '1111111111111111111111111110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1261 pack('C', 250) => '111111111111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1262 pack('C', 251) => '111111111111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1263 pack('C', 252) => '111111111111111111111101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1264 pack('C', 253) => '111111111111111111111101111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1265 pack('C', 254) => '111111111111111111111110000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1266 pack('C', 255) => '11111111111111111111101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1267 '_eos' => '111111111111111111111111111111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1268 }}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1269 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1270 sub huff { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1271 my ($string) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1272 my $code = &huff_code; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1273 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1274 my $ret = join '', map { $code->{$_} } (split //, $string); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1275 my $len = length($ret) + (8 - length($ret) % 8); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1276 $ret .= $code->{_eos}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1277 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1278 return pack("B$len", $ret); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1279 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1280 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1281 sub dehuff { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1282 my ($string) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1283 my $code = &huff_code; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1284 my %decode = reverse %$code; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1285 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1286 my $ret = ''; my $c = ''; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1287 for (split //, unpack('B*', $string)) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1288 $c .= $_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1289 next unless exists $decode{$c}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1290 last if $decode{$c} eq '_eos'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1291 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1292 $ret .= $decode{$c}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1293 $c = ''; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1294 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1295 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1296 return $ret; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1297 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1298 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1299 sub raw_write { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1300 my ($self, $message) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1301 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1302 if ($self->{chaining}) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1303 return add_chain($self, $message); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1304 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1305 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1306 $self->{socket}->syswrite($self->encrypt_aead($message, 3)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1307 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1308 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1309 sub start_chain { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1310 my ($self) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1311 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1312 $self->{chaining} = 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1313 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1314 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1315 sub add_chain { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1316 my ($self, $buf) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1317 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1318 if ($self->{chained_buf}) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1319 $self->{chained_buf} .= $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1320 } else { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1321 $self->{chained_buf} = $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1322 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1323 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1324 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1325 sub send_chain { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1326 my ($self) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1327 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1328 undef $self->{chaining}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1329 $self->raw_write($self->{chained_buf}) if $self->{chained_buf}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1330 undef $self->{chained_buf}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1331 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1332 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1333 ############################################################################### |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1334 |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1335 sub parse_frames { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1336 my ($buf) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1337 my @frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1338 my $offset = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1339 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1340 while ($offset < length($buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1341 my ($tlen, $type) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1342 $offset += $tlen; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1343 next if $type == 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1344 my $frame = { type => $type }; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1345 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1346 if ($type == 1) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1347 $frame->{type} = 'PING'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1348 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1349 if ($type == 2) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1350 $frame->{type} = 'ACK'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1351 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1352 $frame->{largest} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1353 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1354 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1355 $frame->{delay} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1356 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1357 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1358 $frame->{count} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1359 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1360 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1361 $frame->{first} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1362 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1363 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1364 if ($type == 4) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1365 $frame->{type} = 'RESET_STREAM'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1366 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1367 $frame->{sid} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1368 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1369 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1370 $frame->{code} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1371 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1372 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1373 $frame->{final_size} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1374 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1375 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1376 if ($type == 5) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1377 $frame->{type} = 'STOP_SENDING'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1378 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1379 $frame->{sid} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1380 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1381 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1382 $frame->{code} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1383 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1384 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1385 if ($type == 6) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1386 my ($olen, $off) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1387 $offset += $olen; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1388 my ($llen, $len) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1389 $offset += $llen; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1390 $frame->{type} = 'CRYPTO'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1391 $frame->{length} = $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1392 $frame->{offset} = $off; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1393 $frame->{payload} = substr($buf, $offset, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1394 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1395 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1396 if ($type == 7) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1397 $frame->{type} = 'NEW_TOKEN'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1398 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1399 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1400 $frame->{token} = substr($buf, $offset, $val); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1401 $offset += $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1402 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1403 if (($type & 0xf8) == 0x08) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1404 $frame->{type} = 'STREAM'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1405 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1406 $frame->{id} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1407 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1408 if ($type & 0x4) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1409 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1410 $frame->{offset} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1411 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1412 } else { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1413 $frame->{offset} = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1414 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1415 if ($type & 0x2) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1416 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1417 $frame->{length} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1418 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1419 } else { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1420 $frame->{length} = length($buf) - $offset; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1421 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1422 if ($type & 0x1) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1423 $frame->{fin} = 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1424 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1425 $frame->{payload} = |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1426 substr($buf, $offset, $frame->{length}); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1427 $offset += $frame->{length}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1428 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1429 if ($type == 18 || $type == 19) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1430 $frame->{type} = 'MAX_STREAMS'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1431 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1432 $frame->{val} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1433 $frame->{uni} = 1 if $type == 19; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1434 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1435 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1436 if ($type == 24) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1437 $frame->{type} = 'NCID'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1438 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1439 $frame->{seqno} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1440 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1441 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1442 $frame->{rpt} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1443 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1444 $len = unpack("C", substr($buf, $offset, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1445 $frame->{length} = $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1446 $offset += 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1447 $frame->{cid} = substr($buf, $offset, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1448 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1449 $frame->{token} = substr($buf, $offset, 16); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1450 $offset += 16; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1451 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1452 if ($type == 26) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1453 $frame->{type} = 'PATH_CHALLENGE'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1454 $frame->{data} = substr($buf, $offset, 8); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1455 $offset += 8; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1456 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1457 if ($type == 27) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1458 $frame->{type} = 'PATH_RESPONSE'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1459 $frame->{data} = substr($buf, $offset, 8); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1460 $offset += 8; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1461 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1462 if ($type == 28 || $type == 29) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1463 $frame->{type} = 'CONNECTION_CLOSE'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1464 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1465 $frame->{error} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1466 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1467 if ($type == 28) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1468 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1469 $frame->{frame_type} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1470 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1471 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1472 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1473 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1474 $frame->{phrase} = substr($buf, $offset, $val); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1475 $offset += $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1476 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1477 if ($type == 30) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1478 $frame->{type} = 'HANDSHAKE_DONE'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1479 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1480 push @frames, $frame; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1481 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1482 return \@frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1483 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1484 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1485 sub handle_frames { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1486 my ($self, $frames, $level) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1487 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1488 my @frames = grep { $_->{type} eq 'CRYPTO' } @$frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1489 while (my $frame = shift @frames) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1490 insert_crypto($self->{crypto_in}[$level], [ |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1491 $frame->{offset}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1492 $frame->{length}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1493 $frame->{payload}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1494 ]); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1495 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1496 $self->parse_tls_nst() if $level == 3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1497 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1498 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1499 @frames = grep { $_->{type} eq 'STREAM' } @$frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1500 while (my $frame = shift @frames) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1501 $self->{stream_in}[$frame->{id}] ||= { buf => [], pos => 0 }; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1502 insert_crypto($self->{stream_in}[$frame->{id}]->{buf}, [ |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1503 $frame->{offset}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1504 $frame->{length}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1505 $frame->{payload}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1506 $frame->{fin}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1507 ]); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1508 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1509 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1510 @frames = grep { $_->{type} eq 'NCID' } @$frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1511 while (my $frame = shift @frames) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1512 push @{$self->{ncid}}, $frame; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1513 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1514 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1515 my $ack = $self->{ack}[$level]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1516 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1517 # stop tracking acknowledged ACK ranges |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1518 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1519 @frames = grep { $_->{type} eq 'ACK' } @$frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1520 while (my $frame = shift @frames) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1521 my $max = $frame->{largest}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1522 my $min = $max - $frame->{first}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1523 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1524 for my $num ($min .. $max) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1525 for my $pn (keys %$ack) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1526 delete $ack->{$pn} if $ack->{$pn} == $num; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1527 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1528 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1529 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1530 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1531 $self->{socket}->syswrite($self->encrypt_aead(build_ack($ack), $level)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1532 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1533 for my $pn (keys %$ack) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1534 $ack->{$pn} = $self->{pn}[0][$level] if $ack->{$pn} == -1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1535 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1536 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1537 my ($frame) = grep { $_->{type} eq 'NEW_TOKEN' } @$frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1538 $self->{token} = $frame->{token} || ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1539 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1540 push @{$self->{frames_in}}, grep { $_->{type} ne 'CRYPTO' |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1541 && $_->{type} ne 'STREAM' } @$frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1542 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1543 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1544 sub insert_crypto { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1545 my ($crypto, $frame) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1546 my $i; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1547 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1548 for ($i = 0; $i < scalar @$crypto; $i++) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1549 # frame][crypto][frame |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1550 my $this = @$crypto[$i]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1551 if (@$frame[0] <= @$this[0] && |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1552 @$frame[0] + @$frame[1] >= @$this[0] + @$this[1]) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1553 { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1554 my $old = substr(@$frame[2], @$this[0] - @$frame[0], |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1555 @$this[1]); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1556 die "bad inner" if $old ne @$this[2]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1557 splice @$crypto, $i, 1; $i--; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1558 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1559 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1560 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1561 return push @$crypto, $frame if !@$crypto; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1562 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1563 for ($i = 0; $i < @$crypto; $i++) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1564 if (@$frame[0] <= @{@$crypto[$i]}[0] + @{@$crypto[$i]}[1]) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1565 last; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1566 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1567 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1568 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1569 return push @$crypto, $frame if $i == @$crypto; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1570 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1571 my $this = @$crypto[$i]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1572 my $next = @$crypto[$i + 1]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1573 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1574 if (@$frame[0] + @$frame[1] == @$this[0]) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1575 # frame][crypto |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1576 @$this[0] = @$frame[0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1577 @$this[1] += @$frame[1]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1578 @$this[2] = @$frame[2] . @$this[2]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1579 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1580 } elsif (@$this[0] + @$this[1] == @$frame[0]) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1581 # crypto][frame |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1582 @$this[1] += @$frame[1]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1583 @$this[2] .= @$frame[2]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1584 @$this[3] = @$frame[3]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1585 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1586 } elsif (@$frame[0] + @$frame[1] < @$this[0]) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1587 # frame..crypto |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1588 return splice @$crypto, $i, 0, $frame; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1589 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1590 } else { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1591 # overlay |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1592 my ($b1, $b2) = @$this[0] < @$frame[0] |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1593 ? ($this, $frame) : ($frame, $this); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1594 my ($o1, $o2) = @$this[0] + @$this[1] < @$frame[0] + @$frame[1] |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1595 ? ($this, $frame) : ($frame, $this); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1596 my $offset = @$b2[0] - @$b1[0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1597 my $length = @$o1[0] + @$o1[1] - @$b2[0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1598 my $old = substr @$b1[2], $offset, $length, @$b2[2]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1599 die "bad repl" if substr(@$b1[2], $offset, $length) ne $old; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1600 @$this = (@$b1[0], @$o2[0] + @$o2[1] - @$b1[0], @$b1[2]); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1601 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1602 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1603 return if !defined $next; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1604 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1605 # combine with next overlay if any |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1606 if (@$this[0] + @$this[1] >= @$next[0]) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1607 my $offset = @$next[0] - @$this[0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1608 my $length = @$this[0] + @$this[1] - @$next[0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1609 my $old = substr @$this[2], $offset, $length, @$next[2]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1610 die "bad repl2" if substr(@$this[2], $offset, $length) ne $old; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1611 @$this[1] = @$next[0] + @$next[1] - @$this[0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1612 splice @$crypto, $i + 1, 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1613 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1614 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1615 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1616 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1617 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1618 sub save_session_tickets { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1619 my ($self, $content) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1620 |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1621 my ($hash, $hlen) = $self->{cipher} == 0x1302 ? |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1622 ('SHA384', 48) : ('SHA256', 32); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1623 |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1624 my $nst_len = unpack("n", substr($content, 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1625 my $nst = substr($content, 4, $nst_len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1626 |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1627 my $psk = { cipher => $self->{cipher} }; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1628 my $lifetime = substr($nst, 0, 4); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1629 $psk->{age_add} = substr($nst, 4, 4); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1630 my $nonce_len = unpack("C", substr($nst, 8, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1631 my $nonce = substr($nst, 9, $nonce_len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1632 my $len = unpack("n", substr($nst, 8 + 1 + $nonce_len, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1633 $psk->{ticket} = substr($nst, 11 + $nonce_len, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1634 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1635 my $extens_len = unpack("n", substr($nst, 11 + $nonce_len + $len, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1636 my $extens = substr($nst, 11 + $nonce_len + $len + 2, $extens_len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1637 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1638 $psk->{ed} = early_data($extens); |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1639 $psk->{secret} = hkdf_expand_label("tls13 resumption", $hash, $hlen, |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1640 $self->{rms_prk}, $nonce); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1641 push @{$self->{psk_list}}, $psk; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1642 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1643 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1644 sub decode_pn { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1645 my ($self, $pn, $pnl, $level) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1646 my $expected = $self->{pn}[1][$level] + 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1647 my $pn_win = 1 << $pnl * 8; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1648 my $pn_hwin = $pn_win / 2; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1649 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1650 $pn |= $expected & ~($pn_win - 1); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1651 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1652 if ($pn <= $expected - $pn_hwin && $pn < (1 << 62) - $pn_win) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1653 $pn += $pn_win; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1654 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1655 } elsif ($pn > $expected + $pn_hwin && $pn >= $pn_win) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1656 $pn -= $pn_win; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1657 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1658 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1659 return $pn; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1660 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1661 |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1662 sub decrypt_aead_f { |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1663 my ($level, $cipher) = @_; |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1664 if ($level == 0 || $cipher == 0x1301 || $cipher == 0x1302) { |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1665 return \&Crypt::AuthEnc::GCM::gcm_decrypt_verify, 'AES'; |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1666 } |
1910
e0b53fbdb5cf
Tests: TLS_AES_128_CCM_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1909
diff
changeset
|
1667 if ($cipher == 0x1304) { |
e0b53fbdb5cf
Tests: TLS_AES_128_CCM_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1909
diff
changeset
|
1668 return \&Crypt::AuthEnc::CCM::ccm_decrypt_verify, 'AES'; |
e0b53fbdb5cf
Tests: TLS_AES_128_CCM_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1909
diff
changeset
|
1669 } |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1670 \&Crypt::AuthEnc::ChaCha20Poly1305::chacha20poly1305_decrypt_verify; |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1671 } |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1672 |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1673 sub decrypt_aead { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1674 my ($self, $buf) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1675 my $flags = unpack("C", substr($buf, 0, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1676 return 0, $self->decrypt_retry($buf) if ($flags & 0xf0) == 0xf0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1677 my $level = $flags & 0x80 ? $flags - 0xc0 >> 4 : 3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1678 my $offpn = 1 + length($self->{scid}) if $level == 3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1679 $offpn = ( |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1680 $offpn = unpack("C", substr($buf, 5, 1)), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1681 $self->{scid} = substr($buf, 6, $offpn), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1682 $offpn = unpack("C", substr($buf, 6 + length($self->{scid}), 1)), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1683 $self->{dcid} = |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1684 substr($buf, 6 + length($self->{scid}) + 1, $offpn), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1685 7 + ($level == 0) + length($self->{scid}) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1686 + length($self->{dcid})) if $level != 3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1687 my ($len, $val) = $level != 3 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1688 ? parse_int(substr($buf, $offpn)) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1689 : (0, length($buf) - $offpn); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1690 $offpn += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1691 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1692 my $sample = substr($buf, $offpn + 4, 16); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1693 my ($ad, $pnl, $pn) = $self->decrypt_ad($buf, |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1694 $self->{keys}[$level]{r}{hp}, $sample, $offpn, $level); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1695 Test::Nginx::log_core('||', "ad = " . unpack("H*", $ad)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1696 $pn = $self->decode_pn($pn, $pnl, $level); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1697 my $nonce = substr(pack("x12") . pack("N", $pn), -12) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1698 ^ $self->{keys}[$level]{r}{iv}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1699 my $ciphertext = substr($buf, $offpn + $pnl, $val - 16 - $pnl); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1700 my $tag = substr($buf, $offpn + $val - 16, 16); |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1701 my ($f, @args) = decrypt_aead_f($level, $self->{cipher}); |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1702 my $plaintext = $f->(@args, |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1703 $self->{keys}[$level]{r}{key}, $nonce, $ad, $ciphertext, $tag); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1704 return if !defined $plaintext; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1705 Test::Nginx::log_core('||', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1706 "pn = $pn, level = $level, length = " . length($plaintext)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1707 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1708 $self->{pn}[1][$level] = $pn; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1709 $self->{ack}[$level]{$pn} = -1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1710 $self->{ack}[$_] = undef for (0 .. $level - 1); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1711 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1712 return ($level, $plaintext, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1713 substr($buf, length($ad . $ciphertext . $tag)), ''); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1714 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1715 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1716 sub decrypt_ad { |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1717 my ($self, $buf, $hp, $sample, $offset, $level) = @_; |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1718 |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1719 goto aes if $level == 0 || $self->{cipher} != 0x1303; |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1720 |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1721 my $counter = unpack("V", substr($sample, 0, 4)); |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1722 my $nonce = substr($sample, 4, 12); |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1723 my $stream = Crypt::Stream::ChaCha->new($hp, $nonce, $counter); |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1724 my $mask = $stream->crypt($self->{zero}); |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1725 goto mask; |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1726 aes: |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1727 my $m = Crypt::Mode::CTR->new('AES'); |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1728 $mask = $m->encrypt($self->{zero}, $hp, $sample); |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1729 mask: |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1730 substr($buf, 0, 1) ^= substr($mask, 0, 1) |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1731 & ($level == 3 ? "\x1f" : "\x0f"); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1732 my $pnl = unpack("C", substr($buf, 0, 1) & "\x03") + 1; |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1733 substr($buf, $offset, $pnl) ^= substr($mask, 1); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1734 my $pn = unpack("C", substr($buf, $offset, $pnl)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1735 my $ad = substr($buf, 0, $offset + $pnl); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1736 return ($ad, $pnl, $pn); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1737 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1738 |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1739 sub encrypt_aead_f { |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1740 my ($level, $cipher) = @_; |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1741 if ($level == 0 || $cipher == 0x1301 || $cipher == 0x1302) { |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1742 return \&Crypt::AuthEnc::GCM::gcm_encrypt_authenticate, 'AES'; |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1743 } |
1910
e0b53fbdb5cf
Tests: TLS_AES_128_CCM_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1909
diff
changeset
|
1744 if ($cipher == 0x1304) { |
e0b53fbdb5cf
Tests: TLS_AES_128_CCM_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1909
diff
changeset
|
1745 return \&Crypt::AuthEnc::CCM::ccm_encrypt_authenticate, 'AES'; |
e0b53fbdb5cf
Tests: TLS_AES_128_CCM_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1909
diff
changeset
|
1746 } |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1747 \&Crypt::AuthEnc::ChaCha20Poly1305::chacha20poly1305_encrypt_authenticate; |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1748 } |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1749 |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1750 sub encrypt_aead { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1751 my ($self, $payload, $level) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1752 my $pn = ++$self->{pn}[0][$level]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1753 my $ad = pack("C", $level == 3 ? 0x40 : 0xc + $level << 4) | "\x03"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1754 $ad .= "\x00\x00\x00\x01" unless $level == 3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1755 $ad .= $level == 3 ? $self->{dcid} : |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1756 pack("C", length($self->{dcid})) . $self->{dcid} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1757 . pack("C", length($self->{scid})) . $self->{scid}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1758 $ad .= build_int(length($self->{token})) . $self->{token} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1759 if $level == 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1760 $ad .= build_int(length($payload) + 16 + 4) unless $level == 3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1761 $ad .= pack("N", $pn); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1762 my $nonce = substr(pack("x12") . pack("N", $pn), -12) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1763 ^ $self->{keys}[$level]{w}{iv}; |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1764 my ($f, @args) = encrypt_aead_f($level, $self->{cipher}); |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1765 my ($ciphertext, $tag) = $f->(@args, |
1910
e0b53fbdb5cf
Tests: TLS_AES_128_CCM_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1909
diff
changeset
|
1766 $self->{keys}[$level]{w}{key}, $nonce, $ad, |
e0b53fbdb5cf
Tests: TLS_AES_128_CCM_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1909
diff
changeset
|
1767 $self->{cipher} == 0x1304 ? 16 : (), $payload); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1768 my $sample = substr($ciphertext . $tag, 0, 16); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1769 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1770 $ad = $self->encrypt_ad($ad, $self->{keys}[$level]{w}{hp}, |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1771 $sample, $level); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1772 return $ad . $ciphertext . $tag; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1773 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1774 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1775 sub encrypt_ad { |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1776 my ($self, $ad, $hp, $sample, $level) = @_; |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1777 |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1778 goto aes if $level == 0 || $self->{cipher} != 0x1303; |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1779 |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1780 my $counter = unpack("V", substr($sample, 0, 4)); |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1781 my $nonce = substr($sample, 4, 12); |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1782 my $stream = Crypt::Stream::ChaCha->new($hp, $nonce, $counter); |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1783 my $mask = $stream->crypt($self->{zero}); |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1784 goto mask; |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1785 aes: |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1786 my $m = Crypt::Mode::CTR->new('AES'); |
1909
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1787 $mask = $m->encrypt($self->{zero}, $hp, $sample); |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1788 mask: |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1789 substr($ad, 0, 1) ^= substr($mask, 0, 1) |
46bb1ffbb960
Tests: TLS_CHACHA20_POLY1305_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1908
diff
changeset
|
1790 & ($level == 3 ? "\x1f" : "\x0f"); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1791 substr($ad, -4) ^= substr($mask, 1); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1792 return $ad; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1793 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1794 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1795 sub decrypt_retry { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1796 my ($self, $buf) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1797 my $off = unpack("C", substr($buf, 5, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1798 $self->{scid} = substr($buf, 6, $off); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1799 $self->{odcid} = $self->{dcid}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1800 $self->{dcid} = unpack("C", substr($buf, 6 + $off, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1801 $self->{dcid} = substr($buf, 6 + $off + 1, $self->{dcid}); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1802 my $token = substr($buf, 6 + $off + 1 + length($self->{dcid}), -16); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1803 my $tag = substr($buf, -16); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1804 my $pseudo = pack("C", length($self->{odcid})) . $self->{odcid} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1805 . substr($buf, 0, -16); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1806 return ($tag, retry_verify_tag($pseudo), $token); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1807 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1808 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1809 sub retry_verify_tag { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1810 my $key = "\xbe\x0c\x69\x0b\x9f\x66\x57\x5a" |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1811 . "\x1d\x76\x6b\x54\xe3\x68\xc8\x4e"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1812 my $nonce = "\x46\x15\x99\xd3\x5d\x63\x2b\xf2\x23\x98\x25\xbb"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1813 my (undef, $tag) = Crypt::AuthEnc::GCM::gcm_encrypt_authenticate('AES', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1814 $key, $nonce, shift, ''); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1815 return $tag; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1816 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1817 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1818 sub set_traffic_keys { |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1819 my ($self, $label, $hash, $hlen, $level, $direction, $secret, $digest) |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1820 = @_; |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1821 my $prk = hkdf_expand_label($label, $hash, $hlen, $secret, $digest); |
1910
e0b53fbdb5cf
Tests: TLS_AES_128_CCM_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1909
diff
changeset
|
1822 my $klen = $self->{cipher} == 0x1301 || $self->{cipher} == 0x1304 |
e0b53fbdb5cf
Tests: TLS_AES_128_CCM_SHA256 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1909
diff
changeset
|
1823 ? 16 : 32; |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1824 my $key = hkdf_expand_label("tls13 quic key", $hash, $klen, $prk); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1825 my $iv = hkdf_expand_label("tls13 quic iv", $hash, 12, $prk); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1826 my $hp = hkdf_expand_label("tls13 quic hp", $hash, $klen, $prk); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1827 $self->{keys}[$level]{$direction}{prk} = $prk; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1828 $self->{keys}[$level]{$direction}{key} = $key; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1829 $self->{keys}[$level]{$direction}{iv} = $iv; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1830 $self->{keys}[$level]{$direction}{hp} = $hp; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1831 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1832 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1833 sub hmac_finished { |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1834 my ($hash, $hlen, $key, $digest) = @_; |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1835 my $expand = hkdf_expand_label("tls13 finished", $hash, $hlen, $key); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1836 Crypt::Mac::HMAC::hmac($hash, $expand, $digest); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1837 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1838 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1839 sub tls13_finished { |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1840 my $hmac = hmac_finished(@_); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1841 "\x14\x00" . pack('n', length($hmac)) . $hmac; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1842 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1843 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1844 sub binders { |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1845 my $hmac = hmac_finished(@_); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1846 pack('n', length($hmac) + 1) . pack('C', length($hmac)) . $hmac; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1847 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1848 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1849 sub hkdf_advance { |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1850 my ($hash, $hlen, $secret, $prk) = @_; |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1851 my $expand = hkdf_expand_label("tls13 derived", $hash, $hlen, $prk, |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1852 Crypt::Digest::digest_data($hash, '')); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1853 Crypt::KeyDerivation::hkdf_extract($secret, $expand, $hash); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1854 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1855 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1856 sub hkdf_expand_label { |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1857 my ($label, $hash, $len, $prk, $context) = @_; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1858 $context = '' if !defined $context; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1859 my $info = pack("C3", 0, $len, length($label)) . $label |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1860 . pack("C", length($context)) . $context; |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
1861 Crypt::KeyDerivation::hkdf_expand($prk, $hash, $len, $info); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1862 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1863 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1864 sub key_share { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1865 my ($extens) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1866 my $offset = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1867 while ($offset < length($extens)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1868 my $ext = substr($extens, $offset, 2); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1869 my $len = unpack("C", substr($extens, $offset + 2, 1)) * 8 + |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1870 unpack("C", substr($extens, $offset + 3, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1871 if ($ext eq "\x00\x33") { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1872 return substr($extens, $offset + 4 + 4, $len - 4); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1873 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1874 $offset += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1875 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1876 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1877 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1878 sub early_data { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1879 my ($extens) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1880 my $offset = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1881 while ($offset < length($extens)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1882 my $ext = substr($extens, $offset, 2); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1883 my $len = unpack("C", substr($extens, $offset + 2, 1)) * 8 + |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1884 unpack("C", substr($extens, $offset + 3, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1885 if ($ext eq "\x00\x2a") { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1886 return substr($extens, $offset + 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1887 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1888 $offset += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1889 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1890 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1891 |
1884
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1892 sub pre_shared_key { |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1893 my ($extens) = @_; |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1894 my $offset = 0; |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1895 while ($offset < length($extens)) { |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1896 my $ext = substr($extens, $offset, 2); |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1897 my $len = unpack("C", substr($extens, $offset + 2, 1)) * 8 + |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1898 unpack("C", substr($extens, $offset + 3, 1)); |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1899 if ($ext eq "\x00\x29") { |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1900 return unpack("n", substr($extens, $offset + 4, $len)); |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1901 } |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1902 $offset += 4 + $len; |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1903 } |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1904 return; |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1905 } |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1906 |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1907 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1908 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1909 sub build_cc { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1910 my ($code, $reason) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1911 "\x1d" . build_int($code) . build_int(length($reason)) . $reason; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1912 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1913 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1914 sub build_ack { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1915 my ($ack) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1916 my @keys = sort { $b <=> $a } keys %$ack; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1917 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1918 return "\x02" . build_int($keys[0]) . "\x00\x00\x00" if @keys == 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1919 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1920 my $min = my $max = shift @keys; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1921 my @acks = (); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1922 for my $next (@keys) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1923 if ($next == $min - 1) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1924 $min = $next; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1925 next if $next != $keys[-1]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1926 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1927 push @acks, $max, $min; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1928 $min = $max = $next; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1929 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1930 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1931 ($max, $min) = splice @acks, 0, 2; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1932 my $ranges = @acks / 2; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1933 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1934 $ack = "\x02" . build_int($max) . "\x00" . build_int($ranges) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1935 . build_int($max - $min); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1936 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1937 for (my $smallest = $min; $ranges--; ) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1938 my ($max, $min) = splice @acks, 0, 2; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1939 $ack .= build_int($smallest - $max - 2); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1940 $ack .= build_int($max - $min); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1941 $smallest = $min; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1942 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1943 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1944 return $ack; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1945 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1946 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1947 sub build_crypto { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1948 my ($tlsm) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1949 "\x06\x00" . build_int(length($tlsm)) . $tlsm; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1950 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1951 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1952 sub build_stream { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1953 my ($self, $r, %extra) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1954 my $stream = $extra{start} ? 0xe : 0xf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1955 my $length = $extra{length} ? $extra{length} : build_int(length($r)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1956 my $offset = build_int($extra{offset} ? $extra{offset} : 0); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1957 my $sid = defined $extra{sid} ? $extra{sid} : $self->{requests}++; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1958 pack("CC", $stream, 4 * $sid) . $offset . $length . $r; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1959 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1960 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1961 sub parse_int { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1962 my ($buf) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1963 my $val = unpack("C", substr($buf, 0, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1964 my $len = my $plen = 1 << ($val >> 6); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1965 $val = $val & 0x3f; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1966 while (--$len) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1967 $val = ($val << 8) + unpack("C", substr($buf, $plen - $len, 1)) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1968 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1969 return ($plen, $val); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1970 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1971 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1972 sub build_int { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1973 my ($value) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1974 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1975 my $build_int_set = sub { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1976 my ($value, $len, $bits) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1977 (($value >> ($len * 8)) & 0xff) | ($bits << 6); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1978 }; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1979 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1980 if ($value < 1 << 6) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1981 pack("C", $build_int_set->($value, 0, 0)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1982 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1983 } elsif ($value < 1 << 14) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1984 pack("C*", |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1985 $build_int_set->($value, 1, 1), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1986 $build_int_set->($value, 0, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1987 ); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1988 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1989 } elsif ($value < 1 << 30) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1990 pack("C*", |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1991 $build_int_set->($value, 3, 2), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1992 $build_int_set->($value, 2, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1993 $build_int_set->($value, 1, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1994 $build_int_set->($value, 0, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1995 ); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1996 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1997 } else { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1998 pack("C*", |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1999 build_int_set->($value, 7, 3), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2000 build_int_set->($value, 6, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2001 build_int_set->($value, 5, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2002 build_int_set->($value, 4, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2003 build_int_set->($value, 3, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2004 build_int_set->($value, 2, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2005 build_int_set->($value, 1, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2006 build_int_set->($value, 0, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2007 ); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2008 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2009 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2010 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2011 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2012 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2013 sub read_stream_message { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2014 my ($self, $timo) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2015 my ($level, $plaintext, @data); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2016 my $s = $self->{socket}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2017 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2018 while (1) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2019 @data = $self->parse_stream(); |
1905
f35824e75b66
Tests: fixed reading QUIC streams on Perl < 5.24.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1889
diff
changeset
|
2020 return @data if @data; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2021 return if scalar @{$self->{frames_in}}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2022 |
1886
90a310f3cee6
Tests: workaround for QUIC routing while reloading nginx.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1884
diff
changeset
|
2023 again: |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2024 my $txt; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2025 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2026 if (!length($self->{buf})) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2027 return unless IO::Select->new($s)->can_read($timo || 3); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2028 $s->sysread($self->{buf}, 65527); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2029 $txt = "recv"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2030 } else { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2031 $txt = "remaining"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2032 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2033 my $len = length $self->{buf}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2034 Test::Nginx::log_core('||', sprintf("$txt = [%d]", $len)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2035 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2036 while ($self->{buf}) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2037 ($level, $plaintext, $self->{buf}, $self->{token}) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2038 = $self->decrypt_aead($self->{buf}); |
1886
90a310f3cee6
Tests: workaround for QUIC routing while reloading nginx.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1884
diff
changeset
|
2039 if (!defined $plaintext) { |
90a310f3cee6
Tests: workaround for QUIC routing while reloading nginx.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1884
diff
changeset
|
2040 $self->{buf} = ''; |
90a310f3cee6
Tests: workaround for QUIC routing while reloading nginx.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1884
diff
changeset
|
2041 goto again; |
90a310f3cee6
Tests: workaround for QUIC routing while reloading nginx.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1884
diff
changeset
|
2042 } |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2043 goto retry if $self->{token}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2044 $self->handle_frames(parse_frames($plaintext), $level); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2045 @data = $self->parse_stream(); |
1905
f35824e75b66
Tests: fixed reading QUIC streams on Perl < 5.24.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1889
diff
changeset
|
2046 return @data if @data; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2047 return if scalar @{$self->{frames_in}}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2048 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2049 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2050 return; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2051 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2052 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2053 sub parse_stream { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2054 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2055 my $data; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2056 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2057 for my $i (0 .. $#{$self->{stream_in}}) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2058 my $stream = $self->{stream_in}[$i]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2059 next if !defined $stream; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2060 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2061 my $buf = $stream->{buf}[0][2]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2062 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2063 if ($stream->{buf}[0][3]) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2064 $stream->{buf}[0][3] = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2065 $stream->{eof} = 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2066 $data = ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2067 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2068 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2069 if (length($buf) > $stream->{pos}) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2070 $data = substr($buf, $stream->{pos}); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2071 $stream->{pos} = length($buf); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2072 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2073 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2074 next if !defined $data; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2075 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2076 return ($i, $data, $stream->{eof} ? 1 : 0); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2077 } |
1905
f35824e75b66
Tests: fixed reading QUIC streams on Perl < 5.24.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1889
diff
changeset
|
2078 return; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2079 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2080 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2081 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2082 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2083 sub read_tls_message { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2084 my ($self, $buf, $type) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2085 my $s = $self->{socket}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2086 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2087 while (!$type->($self)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2088 my $txt; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2089 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2090 if (!length($$buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2091 return unless IO::Select->new($s)->can_read(3); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2092 $s->sysread($$buf, 65527); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2093 $txt = "recv"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2094 } else { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2095 $txt = "remaining"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2096 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2097 my $len = length $$buf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2098 Test::Nginx::log_core('||', sprintf("$txt = [%d]", $len)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2099 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2100 while ($$buf) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2101 (my $level, my $plaintext, $$buf, $self->{token}) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2102 = $self->decrypt_aead($$buf); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2103 return if !defined $plaintext; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2104 goto retry if $self->{token}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2105 $self->handle_frames(parse_frames($plaintext), $level); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2106 return 1 if $type->($self); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2107 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2108 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2109 return; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2110 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2111 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2112 sub parse_tls_server_hello { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2113 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2114 my $buf = $self->{crypto_in}[0][0][2] if $self->{crypto_in}[0][0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2115 return 0 if !$buf || length($buf) < 4; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2116 my $type = unpack("C", substr($buf, 0, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2117 my $len = unpack("n", substr($buf, 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2118 my $content = substr($buf, 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2119 return 0 if length($content) < $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2120 $self->{tlsm}{sh} = substr($buf, 0, 4) . $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2121 return $self->{tlsm}{sh}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2122 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2123 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2124 sub parse_tls_encrypted_extensions { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2125 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2126 my $buf = $self->{crypto_in}[2][0][2] if $self->{crypto_in}[2][0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2127 return 0 if !$buf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2128 my $off = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2129 my $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2130 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2131 while ($off < length($buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2132 return 0 if length($buf) < 4; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2133 my $type = unpack("C", substr($buf, $off, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2134 my $len = unpack("n", substr($buf, $off + 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2135 $content = substr($buf, $off + 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2136 return 0 if length($content) < $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2137 last if $type == 8; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2138 $off += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2139 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2140 $self->{tlsm}{ee} = substr($buf, $off, 4) . $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2141 return $self->{tlsm}{ee}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2142 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2143 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2144 sub parse_tls_certificate { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2145 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2146 my $buf = $self->{crypto_in}[2][0][2] if $self->{crypto_in}[2][0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2147 return 0 if !$buf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2148 my $off = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2149 my $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2150 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2151 while ($off < length($buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2152 return 0 if length($buf) < 4; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2153 my $type = unpack("C", substr($buf, $off, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2154 my $len = unpack("n", substr($buf, $off + 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2155 $content = substr($buf, $off + 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2156 return 0 if length($content) < $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2157 last if $type == 11; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2158 $off += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2159 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2160 $self->{tlsm}{cert} = substr($buf, $off, 4) . $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2161 return $self->{tlsm}{cert}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2162 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2163 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2164 sub parse_tls_certificate_verify { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2165 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2166 my $buf = $self->{crypto_in}[2][0][2] if $self->{crypto_in}[2][0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2167 return 0 if !$buf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2168 my $off = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2169 my $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2170 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2171 while ($off < length($buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2172 return 0 if length($buf) < 4; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2173 my $type = unpack("C", substr($buf, $off, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2174 my $len = unpack("n", substr($buf, $off + 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2175 $content = substr($buf, $off + 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2176 return 0 if length($content) < $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2177 last if $type == 15; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2178 $off += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2179 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2180 $self->{tlsm}{cv} = substr($buf, $off, 4) . $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2181 return $self->{tlsm}{cv}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2182 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2183 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2184 sub parse_tls_finished { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2185 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2186 my $buf = $self->{crypto_in}[2][0][2] if $self->{crypto_in}[2][0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2187 return 0 if !$buf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2188 my $off = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2189 my $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2190 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2191 while ($off < length($buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2192 return 0 if length($buf) < 4; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2193 my $type = unpack("C", substr($buf, $off, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2194 my $len = unpack("n", substr($buf, $off + 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2195 $content = substr($buf, $off + 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2196 return 0 if length($content) < $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2197 last if $type == 20; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2198 $off += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2199 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2200 $self->{tlsm}{sf} = substr($buf, $off, 4) . $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2201 return $self->{tlsm}{sf}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2202 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2203 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2204 sub parse_tls_nst { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2205 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2206 my $buf = $self->{crypto_in}[3][0][2] if $self->{crypto_in}[3][0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2207 return 0 if !$buf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2208 my $off = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2209 my $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2210 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2211 while ($off < length($buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2212 return 0 if length($buf) < 4; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2213 my $type = unpack("C", substr($buf, $off, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2214 my $len = unpack("n", substr($buf, $off + 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2215 $content = substr($buf, $off + 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2216 return 0 if length($content) < $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2217 $self->{tlsm}{nst} .= substr($buf, $off, 4) . $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2218 $self->save_session_tickets(substr($buf, $off, 4) . $content); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2219 $off += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2220 substr($self->{crypto_in}[3][0][2], 0, $off) = ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2221 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2222 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2223 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2224 sub build_tls_client_hello { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2225 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2226 my $key_share = $self->{sk}->export_key_raw('public'); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2227 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2228 my $version = "\x03\x03"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2229 my $random = Crypt::PRNG::random_bytes(32); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2230 my $session = "\x00"; |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
2231 my $cipher = pack('n', length($self->{ciphers})) . $self->{ciphers}; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2232 my $compr = "\x01\x00"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2233 my $ext = build_tlsext_server_name($self->{sni}) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2234 . build_tlsext_supported_groups(29) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2235 . build_tlsext_alpn("h3", "hq-interop") |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2236 . build_tlsext_sigalgs(0x0804, 0x0805, 0x0806) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2237 . build_tlsext_supported_versions(0x0304) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2238 . build_tlsext_ke_modes(1) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2239 . build_tlsext_key_share(29, $key_share) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2240 . build_tlsext_quic_tp($self->{scid}, $self->{opts}); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2241 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2242 $ext .= build_tlsext_early_data($self->{psk}) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2243 . build_tlsext_psk($self->{psk}) if keys %{$self->{psk}}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2244 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2245 my $len = pack('n', length($ext)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2246 my $ch = $version . $random . $session . $cipher . $compr . $len . $ext; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2247 $ch = "\x01\x00" . pack('n', length($ch)) . $ch; |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
2248 $ch = build_tls_ch_with_binder($ch, $self->{psk}, $self->{es_prk}) |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2249 if keys %{$self->{psk}}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2250 return $ch; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2251 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2252 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2253 sub build_tlsext_server_name { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2254 my ($name) = @_; |
1887
1023354f3a41
Tests: ssl_reject_handshake tests with HTTP/3.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1886
diff
changeset
|
2255 return '' if !defined $name; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2256 my $sname = pack('xn', length($name)) . $name; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2257 my $snamelist = pack('n', length($sname)) . $sname; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2258 pack('n2', 0, length($snamelist)) . $snamelist; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2259 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2260 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2261 sub build_tlsext_supported_groups { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2262 my $ngrouplist = pack('n*', @_ * 2, @_); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2263 pack('n2', 10, length($ngrouplist)) . $ngrouplist; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2264 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2265 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2266 sub build_tlsext_alpn { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2267 my $protoname = pack('(C/a*)*', @_); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2268 my $protonamelist = pack('n', length($protoname)) . $protoname; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2269 pack('n2', 16, length($protonamelist)) . $protonamelist; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2270 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2271 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2272 sub build_tlsext_sigalgs { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2273 my $sschemelist = pack('n*', @_ * 2, @_); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2274 pack('n2', 13, length($sschemelist)) . $sschemelist; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2275 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2276 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2277 sub build_tlsext_supported_versions { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2278 my $versions = pack('Cn*', @_ * 2, @_); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2279 pack('n2', 43, length($versions)) . $versions; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2280 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2281 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2282 sub build_tlsext_ke_modes { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2283 my $versions = pack('C*', scalar(@_), @_); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2284 pack('n2', 45, length($versions)) . $versions; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2285 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2286 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2287 sub build_tlsext_key_share { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2288 my ($group, $share) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2289 my $kse = pack("n2", $group, length($share)) . $share; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2290 my $ksch = pack("n", length($kse)) . $kse; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2291 pack('n2', 51, length($ksch)) . $ksch; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2292 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2293 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2294 sub build_tlsext_quic_tp { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2295 my ($scid, $opts) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2296 my $tp = ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2297 my $quic_tp_tlv = sub { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2298 my ($id, $val) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2299 $val = $opts->{$id} // $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2300 $val = build_int($val) unless $id == 15; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2301 $tp .= build_int($id) . pack("C*", length($val)) . $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2302 }; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2303 $quic_tp_tlv->(1, 30000); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2304 $quic_tp_tlv->(4, 1048576); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2305 $quic_tp_tlv->(5, 262144); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2306 $quic_tp_tlv->(7, 262144); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2307 $quic_tp_tlv->(9, 100); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2308 $quic_tp_tlv->(15, $scid); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2309 pack('n2', 57, length($tp)) . $tp; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2310 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2311 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2312 sub build_tlsext_early_data { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2313 my ($psk) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2314 $psk->{ed} ? pack('n2', 42, 0) : ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2315 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2316 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2317 sub build_tlsext_psk { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2318 my ($psk) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2319 my $identity = pack('n', length($psk->{ticket})) . $psk->{ticket} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2320 . $psk->{age_add}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2321 my $identities = pack('n', length($identity)) . $identity; |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
2322 my $hash = $psk->{cipher} == 0x1302 ? pack('x48') : pack('x32'); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2323 my $binder = pack('C', length($hash)) . $hash; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2324 my $binders = pack('n', length($binder)) . $binder; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2325 pack('n2', 41, length($identities . $binders)) . $identities . $binders; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2326 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2327 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2328 sub build_tls_ch_with_binder { |
1908
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
2329 my ($ch, $psk, $prk) = @_; |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
2330 my ($hash, $hlen) = $psk->{cipher} == 0x1302 ? |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
2331 ('SHA384', 48) : ('SHA256', 32); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
2332 my $key = hkdf_expand_label("tls13 res binder", $hash, $hlen, $prk, |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
2333 Crypt::Digest::digest_data($hash, '')); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
2334 my $truncated = substr($ch, 0, -3 - $hlen); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
2335 my $context = Crypt::Digest::digest_data($hash, $truncated); |
1baf5fe1d86c
Tests: TLS_AES_256_GCM_SHA384 support in QUIC handshake.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1905
diff
changeset
|
2336 $truncated . binders($hash, $hlen, $key, $context); |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2337 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2338 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2339 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2340 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2341 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2342 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2343 ############################################################################### |