@@ -39,7 +39,7 @@ sub new {
39
39
);
40
40
41
41
$self -> {repeat } = 0;
42
- $self -> {token } = ' ' ;
42
+ $self -> {token } = $extra { token } || ' ' ;
43
43
$self -> {psk_list } = $extra {psk_list } || [];
44
44
45
45
$self -> {sni } = exists $extra {sni } ? $extra {sni } : ' localhost' ;
@@ -56,23 +56,7 @@ sub new {
56
56
$self -> {buf } = ' ' ;
57
57
58
58
$self -> init();
59
- $self -> init_key_schedule();
60
- $self -> initial();
61
- return $self if $extra {probe };
62
- $self -> handshake() or return ;
63
-
64
- # RFC 9204, 4.3.1. Set Dynamic Table Capacity
65
-
66
- my $buf = pack (" B*" , ' 001' . ipack(5, $extra {capacity } || 400));
67
- $self -> {encoder_offset } = length ($buf ) + 1;
68
- $buf = " \x08\x02\x02 " . $buf ;
69
-
70
- # RFC 9114, 6.2.1. Control Streams
71
-
72
- $buf = " \x0a\x06\x03\x00\x04\x00 " . $buf ;
73
- $self -> {control_offset } = 3;
74
-
75
- $self -> raw_write($buf );
59
+ $self -> retry(%extra ) or return ;
76
60
77
61
return $self ;
78
62
}
@@ -99,12 +83,10 @@ sub init {
99
83
. " \x9a\xe6\xa4\xc8\x0c\xad\xcc\xbb\x7f\x0a " ;
100
84
$self -> {ncid } = [];
101
85
$self -> {early_data } = $early_data ;
102
-
103
- $self -> retry();
104
86
}
105
87
106
88
sub retry {
107
- my ($self ) = @_ ;
89
+ my ($self , %extra ) = @_ ;
108
90
my $prk = Crypt::KeyDerivation::hkdf_extract($self -> {dcid },
109
91
$self -> {salt }, ' SHA256' );
110
92
@@ -114,6 +96,24 @@ sub retry {
114
96
115
97
$self -> set_traffic_keys(' tls13 client in' , ' SHA256' , 32, 0, ' w' , $prk );
116
98
$self -> set_traffic_keys(' tls13 server in' , ' SHA256' , 32, 0, ' r' , $prk );
99
+
100
+ $self -> init_key_schedule();
101
+ $self -> initial();
102
+ return $self if $extra {probe };
103
+ $self -> handshake() or return ;
104
+
105
+ # RFC 9204, 4.3.1. Set Dynamic Table Capacity
106
+
107
+ my $buf = pack (" B*" , ' 001' . ipack(5, $extra {capacity } || 400));
108
+ $self -> {encoder_offset } = length ($buf ) + 1;
109
+ $buf = " \x08\x02\x02 " . $buf ;
110
+
111
+ # RFC 9114, 6.2.1. Control Streams
112
+
113
+ $buf = " \x0a\x06\x03\x00\x04\x00 " . $buf ;
114
+ $self -> {control_offset } = 3;
115
+
116
+ $self -> raw_write($buf );
117
117
}
118
118
119
119
sub init_key_schedule {
@@ -1803,15 +1803,27 @@ sub decrypt_retry {
1803
1803
my $tag = substr ($buf , -16);
1804
1804
my $pseudo = pack (" C" , length ($self -> {odcid })) . $self -> {odcid }
1805
1805
. substr ($buf , 0, -16);
1806
- return ($tag , retry_verify_tag($pseudo ), $token );
1806
+ $self -> {retry } = { token => $token , tag => $tag , pseudo => $pseudo };
1807
+ return $tag , ' ' , $token ;
1808
+ }
1809
+
1810
+ sub retry_token {
1811
+ my ($self ) = @_ ;
1812
+ return $self -> {retry }{token };
1813
+ }
1814
+
1815
+ sub retry_tag {
1816
+ my ($self ) = @_ ;
1817
+ return $self -> {retry }{tag };
1807
1818
}
1808
1819
1809
1820
sub retry_verify_tag {
1821
+ my ($self ) = @_ ;
1810
1822
my $key = " \xbe\x0c\x69\x0b\x9f\x66\x57\x5a "
1811
1823
. " \x1d\x76\x6b\x54\xe3\x68\xc8\x4e " ;
1812
1824
my $nonce = " \x46\x15\x99\xd3\x5d\x63\x2b\xf2\x23\x98\x25\xbb " ;
1813
1825
my (undef , $tag ) = Crypt::AuthEnc::GCM::gcm_encrypt_authenticate(' AES' ,
1814
- $key , $nonce , shift , ' ' );
1826
+ $key , $nonce , $self -> { retry }{ pseudo } , ' ' );
1815
1827
return $tag ;
1816
1828
}
1817
1829
@@ -2040,7 +2052,7 @@ again:
2040
2052
$self -> {buf } = ' ' ;
2041
2053
goto again;
2042
2054
}
2043
- goto retry if $self -> {token };
2055
+ $self -> retry(), return if $self -> {token };
2044
2056
$self -> handle_frames(parse_frames($plaintext ), $level );
2045
2057
@data = $self -> parse_stream();
2046
2058
return @data if @data ;
@@ -2101,7 +2113,7 @@ sub read_tls_message {
2101
2113
(my $level , my $plaintext , $$buf , $self -> {token })
2102
2114
= $self -> decrypt_aead($$buf );
2103
2115
return if !defined $plaintext ;
2104
- goto retry if $self -> {token };
2116
+ $self -> retry(), return 1 if $self -> {token };
2105
2117
$self -> handle_frames(parse_frames($plaintext ), $level );
2106
2118
return 1 if $type -> ($self );
2107
2119
}
0 commit comments