1*4724848cSchristos# Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. 2*4724848cSchristos# 3*4724848cSchristos# Licensed under the OpenSSL license (the "License"). You may not use 4*4724848cSchristos# this file except in compliance with the License. You can obtain a copy 5*4724848cSchristos# in the file LICENSE in the source distribution or at 6*4724848cSchristos# https://www.openssl.org/source/license.html 7*4724848cSchristos 8*4724848cSchristosuse strict; 9*4724848cSchristos 10*4724848cSchristospackage TLSProxy::EncryptedExtensions; 11*4724848cSchristos 12*4724848cSchristosuse vars '@ISA'; 13*4724848cSchristospush @ISA, 'TLSProxy::Message'; 14*4724848cSchristos 15*4724848cSchristossub new 16*4724848cSchristos{ 17*4724848cSchristos my $class = shift; 18*4724848cSchristos my ($server, 19*4724848cSchristos $data, 20*4724848cSchristos $records, 21*4724848cSchristos $startoffset, 22*4724848cSchristos $message_frag_lens) = @_; 23*4724848cSchristos 24*4724848cSchristos my $self = $class->SUPER::new( 25*4724848cSchristos $server, 26*4724848cSchristos TLSProxy::Message::MT_ENCRYPTED_EXTENSIONS, 27*4724848cSchristos $data, 28*4724848cSchristos $records, 29*4724848cSchristos $startoffset, 30*4724848cSchristos $message_frag_lens); 31*4724848cSchristos 32*4724848cSchristos $self->{extension_data} = ""; 33*4724848cSchristos 34*4724848cSchristos return $self; 35*4724848cSchristos} 36*4724848cSchristos 37*4724848cSchristossub parse 38*4724848cSchristos{ 39*4724848cSchristos my $self = shift; 40*4724848cSchristos 41*4724848cSchristos my $extensions_len = unpack('n', $self->data); 42*4724848cSchristos if (!defined $extensions_len) { 43*4724848cSchristos $extensions_len = 0; 44*4724848cSchristos } 45*4724848cSchristos 46*4724848cSchristos my $extension_data; 47*4724848cSchristos if ($extensions_len != 0) { 48*4724848cSchristos $extension_data = substr($self->data, 2); 49*4724848cSchristos 50*4724848cSchristos if (length($extension_data) != $extensions_len) { 51*4724848cSchristos die "Invalid extension length\n"; 52*4724848cSchristos } 53*4724848cSchristos } else { 54*4724848cSchristos if (length($self->data) != 2) { 55*4724848cSchristos die "Invalid extension length\n"; 56*4724848cSchristos } 57*4724848cSchristos $extension_data = ""; 58*4724848cSchristos } 59*4724848cSchristos my %extensions = (); 60*4724848cSchristos while (length($extension_data) >= 4) { 61*4724848cSchristos my ($type, $size) = unpack("nn", $extension_data); 62*4724848cSchristos my $extdata = substr($extension_data, 4, $size); 63*4724848cSchristos $extension_data = substr($extension_data, 4 + $size); 64*4724848cSchristos $extensions{$type} = $extdata; 65*4724848cSchristos } 66*4724848cSchristos 67*4724848cSchristos $self->extension_data(\%extensions); 68*4724848cSchristos 69*4724848cSchristos print " Extensions Len:".$extensions_len."\n"; 70*4724848cSchristos} 71*4724848cSchristos 72*4724848cSchristos#Reconstruct the on-the-wire message data following changes 73*4724848cSchristossub set_message_contents 74*4724848cSchristos{ 75*4724848cSchristos my $self = shift; 76*4724848cSchristos my $data; 77*4724848cSchristos my $extensions = ""; 78*4724848cSchristos 79*4724848cSchristos foreach my $key (keys %{$self->extension_data}) { 80*4724848cSchristos my $extdata = ${$self->extension_data}{$key}; 81*4724848cSchristos $extensions .= pack("n", $key); 82*4724848cSchristos $extensions .= pack("n", length($extdata)); 83*4724848cSchristos $extensions .= $extdata; 84*4724848cSchristos } 85*4724848cSchristos 86*4724848cSchristos $data = pack('n', length($extensions)); 87*4724848cSchristos $data .= $extensions; 88*4724848cSchristos $self->data($data); 89*4724848cSchristos} 90*4724848cSchristos 91*4724848cSchristos#Read/write accessors 92*4724848cSchristossub extension_data 93*4724848cSchristos{ 94*4724848cSchristos my $self = shift; 95*4724848cSchristos if (@_) { 96*4724848cSchristos $self->{extension_data} = shift; 97*4724848cSchristos } 98*4724848cSchristos return $self->{extension_data}; 99*4724848cSchristos} 100*4724848cSchristossub set_extension 101*4724848cSchristos{ 102*4724848cSchristos my ($self, $ext_type, $ext_data) = @_; 103*4724848cSchristos $self->{extension_data}{$ext_type} = $ext_data; 104*4724848cSchristos} 105*4724848cSchristossub delete_extension 106*4724848cSchristos{ 107*4724848cSchristos my ($self, $ext_type) = @_; 108*4724848cSchristos delete $self->{extension_data}{$ext_type}; 109*4724848cSchristos} 110*4724848cSchristos1; 111