Skip to content
This repository was archived by the owner on Aug 24, 2025. It is now read-only.

Commit 1bfb786

Browse files
Handle partial messages in TLSProxy
Reviewed-by: Matt Caswell <matt@openssl.org> (Merged from openssl#5726)
1 parent 813bcdf commit 1bfb786

File tree

2 files changed

+31
-14
lines changed

2 files changed

+31
-14
lines changed

util/perl/TLSProxy/Proxy.pm

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ sub new
5252
debug => $debug,
5353
cipherc => "",
5454
ciphers => "AES128-SHA",
55-
flight => 0,
55+
flight => -1,
56+
direction => -1,
57+
partial => ["", ""],
5658
record_list => [],
5759
message_list => [],
5860
};
@@ -128,7 +130,9 @@ sub clearClient
128130
my $self = shift;
129131

130132
$self->{cipherc} = "";
131-
$self->{flight} = 0;
133+
$self->{flight} = -1;
134+
$self->{direction} = -1;
135+
$self->{partial} = ["", ""];
132136
$self->{record_list} = [];
133137
$self->{message_list} = [];
134138
$self->{clientflags} = "";
@@ -344,34 +348,38 @@ sub process_packet
344348
print "Received client packet\n";
345349
}
346350

351+
if ($self->{direction} != $server) {
352+
$self->{flight} = $self->{flight} + 1;
353+
$self->{direction} = $server;
354+
}
355+
347356
print "Packet length = ".length($packet)."\n";
348357
print "Processing flight ".$self->flight."\n";
349358

350359
#Return contains the list of record found in the packet followed by the
351-
#list of messages in those records
352-
my @ret = TLSProxy::Record->get_records($server, $self->flight, $packet);
360+
#list of messages in those records and any partial message
361+
my @ret = TLSProxy::Record->get_records($server, $self->flight, $self->{partial}[$server].$packet);
362+
$self->{partial}[$server] = $ret[2];
353363
push @{$self->record_list}, @{$ret[0]};
354364
push @{$self->{message_list}}, @{$ret[1]};
355365

356366
print "\n";
357367

368+
if (scalar(@{$ret[0]}) == 0 or length($ret[2]) != 0) {
369+
return "";
370+
}
371+
358372
#Finished parsing. Call user provided filter here
359-
if(defined $self->filter) {
373+
if (defined $self->filter) {
360374
$self->filter->($self);
361375
}
362376

363377
#Reconstruct the packet
364378
$packet = "";
365379
foreach my $record (@{$self->record_list}) {
366-
#We only replay the records for the current flight
367-
if ($record->flight != $self->flight) {
368-
next;
369-
}
370380
$packet .= $record->reconstruct_record();
371381
}
372382

373-
$self->{flight} = $self->{flight} + 1;
374-
375383
print "Forwarded packet length = ".length($packet)."\n\n";
376384

377385
return $packet;

util/perl/TLSProxy/Record.pm

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ sub get_records
5959
my $server = shift;
6060
my $flight = shift;
6161
my $packet = shift;
62+
my $partial = "";
6263
my @record_list = ();
6364
my @message_list = ();
6465
my $data;
@@ -77,8 +78,10 @@ sub get_records
7778
print " (client -> server)\n";
7879
}
7980
#Get the record header
80-
if (length($packet) < TLS_RECORD_HEADER_LENGTH) {
81+
if (length($packet) < TLS_RECORD_HEADER_LENGTH
82+
|| length($packet) < 5 + unpack("n", substr($packet, 3, 2))) {
8183
print "Partial data : ".length($packet)." bytes\n";
84+
$partial = $packet;
8285
$packet = "";
8386
} else {
8487
($content_type, $version, $len) = unpack('CnnC*', $packet);
@@ -127,7 +130,7 @@ sub get_records
127130
}
128131
}
129132

130-
return (\@record_list, \@message_list);
133+
return (\@record_list, \@message_list, $partial);
131134
}
132135

133136
sub clear
@@ -186,7 +189,8 @@ sub new
186189
decrypt_len => $decrypt_len,
187190
data => $data,
188191
decrypt_data => $decrypt_data,
189-
orig_decrypt_data => $decrypt_data
192+
orig_decrypt_data => $decrypt_data,
193+
sent => 0
190194
};
191195

192196
return bless $self, $class;
@@ -252,6 +256,11 @@ sub reconstruct_record
252256
my $self = shift;
253257
my $data;
254258

259+
if ($self->{sent}) {
260+
return "";
261+
}
262+
$self->{sent} = 1;
263+
255264
if ($self->sslv2) {
256265
$data = pack('n', $self->len | 0x8000);
257266
} else {

0 commit comments

Comments
 (0)