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