annotate lib/Test/Nginx/HTTP3.pm @ 1933:9bafe7cddd3c

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