1*b0d17251Schristos# Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. 213d40330Schristos# 3*b0d17251Schristos# Licensed under the Apache License 2.0 (the "License"). You may not use 413d40330Schristos# this file except in compliance with the License. You can obtain a copy 513d40330Schristos# in the file LICENSE in the source distribution or at 613d40330Schristos# https://www.openssl.org/source/license.html 713d40330Schristos 813d40330Schristosuse strict; 913d40330Schristos 1013d40330Schristospackage TLSProxy::EncryptedExtensions; 1113d40330Schristos 1213d40330Schristosuse vars '@ISA'; 1313d40330Schristospush @ISA, 'TLSProxy::Message'; 1413d40330Schristos 1513d40330Schristossub new 1613d40330Schristos{ 1713d40330Schristos my $class = shift; 1813d40330Schristos my ($server, 1913d40330Schristos $data, 2013d40330Schristos $records, 2113d40330Schristos $startoffset, 2213d40330Schristos $message_frag_lens) = @_; 2313d40330Schristos 2413d40330Schristos my $self = $class->SUPER::new( 2513d40330Schristos $server, 2613d40330Schristos TLSProxy::Message::MT_ENCRYPTED_EXTENSIONS, 2713d40330Schristos $data, 2813d40330Schristos $records, 2913d40330Schristos $startoffset, 3013d40330Schristos $message_frag_lens); 3113d40330Schristos 3213d40330Schristos $self->{extension_data} = ""; 3313d40330Schristos 3413d40330Schristos return $self; 3513d40330Schristos} 3613d40330Schristos 3713d40330Schristossub parse 3813d40330Schristos{ 3913d40330Schristos my $self = shift; 4013d40330Schristos 4113d40330Schristos my $extensions_len = unpack('n', $self->data); 4213d40330Schristos if (!defined $extensions_len) { 4313d40330Schristos $extensions_len = 0; 4413d40330Schristos } 4513d40330Schristos 4613d40330Schristos my $extension_data; 4713d40330Schristos if ($extensions_len != 0) { 4813d40330Schristos $extension_data = substr($self->data, 2); 4913d40330Schristos 5013d40330Schristos if (length($extension_data) != $extensions_len) { 5113d40330Schristos die "Invalid extension length\n"; 5213d40330Schristos } 5313d40330Schristos } else { 5413d40330Schristos if (length($self->data) != 2) { 5513d40330Schristos die "Invalid extension length\n"; 5613d40330Schristos } 5713d40330Schristos $extension_data = ""; 5813d40330Schristos } 5913d40330Schristos my %extensions = (); 6013d40330Schristos while (length($extension_data) >= 4) { 6113d40330Schristos my ($type, $size) = unpack("nn", $extension_data); 6213d40330Schristos my $extdata = substr($extension_data, 4, $size); 6313d40330Schristos $extension_data = substr($extension_data, 4 + $size); 6413d40330Schristos $extensions{$type} = $extdata; 6513d40330Schristos } 6613d40330Schristos 6713d40330Schristos $self->extension_data(\%extensions); 6813d40330Schristos 6913d40330Schristos print " Extensions Len:".$extensions_len."\n"; 7013d40330Schristos} 7113d40330Schristos 7213d40330Schristos#Reconstruct the on-the-wire message data following changes 7313d40330Schristossub set_message_contents 7413d40330Schristos{ 7513d40330Schristos my $self = shift; 7613d40330Schristos my $data; 7713d40330Schristos my $extensions = ""; 7813d40330Schristos 7913d40330Schristos foreach my $key (keys %{$self->extension_data}) { 8013d40330Schristos my $extdata = ${$self->extension_data}{$key}; 8113d40330Schristos $extensions .= pack("n", $key); 8213d40330Schristos $extensions .= pack("n", length($extdata)); 8313d40330Schristos $extensions .= $extdata; 8413d40330Schristos } 8513d40330Schristos 8613d40330Schristos $data = pack('n', length($extensions)); 8713d40330Schristos $data .= $extensions; 8813d40330Schristos $self->data($data); 8913d40330Schristos} 9013d40330Schristos 9113d40330Schristos#Read/write accessors 9213d40330Schristossub extension_data 9313d40330Schristos{ 9413d40330Schristos my $self = shift; 9513d40330Schristos if (@_) { 9613d40330Schristos $self->{extension_data} = shift; 9713d40330Schristos } 9813d40330Schristos return $self->{extension_data}; 9913d40330Schristos} 10013d40330Schristossub set_extension 10113d40330Schristos{ 10213d40330Schristos my ($self, $ext_type, $ext_data) = @_; 10313d40330Schristos $self->{extension_data}{$ext_type} = $ext_data; 10413d40330Schristos} 10513d40330Schristossub delete_extension 10613d40330Schristos{ 10713d40330Schristos my ($self, $ext_type) = @_; 10813d40330Schristos delete $self->{extension_data}{$ext_type}; 10913d40330Schristos} 11013d40330Schristos1; 111