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