xref: /netbsd-src/crypto/external/bsd/openssl/dist/util/perl/TLSProxy/EncryptedExtensions.pm (revision b0d1725196a7921d003d2c66a14f186abda4176b)
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