@@ -41,6 +41,7 @@ sub new {
41
41
$self -> {repeat } = 0;
42
42
$self -> {token } = $extra {token } || ' ' ;
43
43
$self -> {psk_list } = $extra {psk_list } || [];
44
+ $self -> {early_data } = $extra {early_data };
44
45
45
46
$self -> {sni } = exists $extra {sni } ? $extra {sni } : ' localhost' ;
46
47
$self -> {cipher } = 0x1301;
@@ -62,7 +63,7 @@ sub new {
62
63
}
63
64
64
65
sub init {
65
- my ($self , $early_data ) = @_ ;
66
+ my ($self ) = @_ ;
66
67
$self -> {keys } = [];
67
68
$self -> {pn } = [[-1, -1, -1, -1], [-1, -1, -1, -1]];
68
69
$self -> {crypto_in } = [[],[],[],[]];
@@ -82,7 +83,6 @@ sub init {
82
83
$self -> {salt } = " \x38\x76\x2c\xf7\xf5\x59\x34\xb3\x4d\x17 "
83
84
. " \x9a\xe6\xa4\xc8\x0c\xad\xcc\xbb\x7f\x0a " ;
84
85
$self -> {ncid } = [];
85
- $self -> {early_data } = $early_data ;
86
86
}
87
87
88
88
sub retry {
@@ -129,26 +129,24 @@ sub init_key_schedule {
129
129
}
130
130
131
131
sub initial {
132
- my ($self , $ed ) = @_ ;
132
+ my ($self ) = @_ ;
133
133
$self -> {tlsm }{ch } = $self -> build_tls_client_hello();
134
134
my $ch = $self -> {tlsm }{ch };
135
135
my $crypto = build_crypto($ch );
136
136
my $padding = 1200 - length ($crypto );
137
- $padding = 0 if $padding < 0 || $self -> {psk }-> {ed };
137
+ $padding = 0 if $padding < 0;
138
+ $padding = 0 if $self -> {psk }{ed } && $self -> {early_data };
138
139
my $payload = $crypto . pack (" x$padding " );
139
140
my $initial = $self -> encrypt_aead($payload , 0);
140
141
141
- if ($ed && $self -> {psk }-> {ed }) {
142
+ if ($self -> { early_data } && $self -> {psk }-> {ed }) {
142
143
my ($hash , $hlen ) = $self -> {psk }{cipher } == 0x1302 ?
143
144
(' SHA384' , 48) : (' SHA256' , 32);
144
145
$self -> set_traffic_keys(' tls13 c e traffic' , $hash , $hlen , 1,
145
146
' w' , $self -> {es_prk }, Crypt::Digest::digest_data($hash ,
146
147
$self -> {tlsm }{ch }));
147
148
148
- # my $ed = "\x0a\x02\x08\x00\x04\x02\x06\x1f\x0d\x00\x0a"
149
- # . $self->build_stream("\x01\x06\x00\x00\xc0");
150
- $payload = $ed ;
151
- # $payload = $self->build_stream("GET /\n");
149
+ $payload = $self -> build_new_stream($self -> {early_data });
152
150
$padding = 1200 - length ($crypto ) - length ($payload );
153
151
$payload .= pack (" x$padding " ) if $padding > 0;
154
152
$initial .= $self -> encrypt_aead($payload , 1);
@@ -248,13 +246,6 @@ sub handshake {
248
246
$self -> {socket }-> syswrite ($self -> encrypt_aead($crypto , 2));
249
247
}
250
248
251
- # if (!$psk->{ed}) {
252
- # my $r = "\x0a\x02\x08\x00\x04\x02\x06\x1f\x0d\x00\x0a";
253
- # $s->syswrite(encrypt_aead($r, 3));
254
- # $r = "\x01\x06\x00\x00\xc0";
255
- # $s->syswrite(encrypt_aead($self->build_stream($r), 3));
256
- # }
257
-
258
249
sub DESTROY {
259
250
my ($self ) = @_ ;
260
251
@@ -408,7 +399,7 @@ sub cancel_push {
408
399
. build_int($offset ) . build_int($length ) . $buf );
409
400
}
410
401
411
- sub new_stream {
402
+ sub build_new_stream {
412
403
my ($self , $uri , $stream ) = @_ ;
413
404
my ($input , $buf );
414
405
@@ -459,8 +450,12 @@ sub new_stream {
459
450
$buf .= pack_body($self , $body ) if defined $body ;
460
451
461
452
$self -> {streams }{$self -> {last_stream }}{sent } = length ($buf );
462
- $self -> raw_write($self -> build_stream($buf , start => $uri -> {body_more }));
453
+ $self -> build_stream($buf , start => $uri -> {body_more });
454
+ }
463
455
456
+ sub new_stream {
457
+ my ($self , $uri , $stream ) = @_ ;
458
+ $self -> raw_write($self -> build_new_stream($uri , $stream ));
464
459
return $self -> {last_stream };
465
460
}
466
461
0 commit comments