package TLSProxy::ClientHello;
-use parent 'TLSProxy::Message';
-
-use constant {
- EXT_ENCRYPT_THEN_MAC => 22,
- EXT_SESSION_TICKET => 35
-};
+use vars '@ISA';
+push @ISA, 'TLSProxy::Message';
sub new
{
$records,
$startoffset,
$message_frag_lens) = @_;
-
+
my $self = $class->SUPER::new(
$server,
1,
$self->{comp_meth_len} = 0;
$self->{comp_meths} = [];
$self->{extensions_len} = 0;
- $self->{extensions_data} = "";
+ $self->{extension_data} = "";
return $self;
}
#For now we just deal with this as a block of data. In the future we will
#want to parse this
my $extension_data = substr($self->data, $ptr);
-
+
if (length($extension_data) != $extensions_len) {
die "Invalid extension length\n";
}
#Clear any state from a previous run
TLSProxy::Record->etm(0);
- if (exists $extensions{&EXT_ENCRYPT_THEN_MAC}) {
+ if (exists $extensions{TLSProxy::Message::EXT_ENCRYPT_THEN_MAC}) {
TLSProxy::Record->etm(1);
}
}
{
my $self = shift;
my $data;
+ my $extensions = "";
$data = pack('n', $self->client_version);
$data .= $self->random;
$data .= pack("n*", @{$self->ciphersuites});
$data .= pack('C', $self->comp_meth_len);
$data .= pack("C*", @{$self->comp_meths});
- $data .= pack('n', $self->extensions_len);
+
foreach my $key (keys %{$self->extension_data}) {
my $extdata = ${$self->extension_data}{$key};
- $data .= pack("n", $key);
- $data .= pack("n", length($extdata));
- $data .= $extdata;
+ $extensions .= pack("n", $key);
+ $extensions .= pack("n", length($extdata));
+ $extensions .= $extdata;
+ if ($key == TLSProxy::Message::EXT_DUPLICATE_EXTENSION) {
+ $extensions .= pack("n", $key);
+ $extensions .= pack("n", length($extdata));
+ $extensions .= $extdata;
+ }
}
+ $data .= pack('n', length($extensions));
+ $data .= $extensions;
+
$self->data($data);
}
}
return $self->{extension_data};
}
+sub set_extension
+{
+ my ($self, $ext_type, $ext_data) = @_;
+ $self->{extension_data}{$ext_type} = $ext_data;
+}
+sub delete_extension
+{
+ my ($self, $ext_type) = @_;
+ delete $self->{extension_data}{$ext_type};
+}
1;