1# Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. 2# 3# Licensed under the OpenSSL license (the "License"). You may not use 4# this file except in compliance with the License. You can obtain a copy 5# in the file LICENSE in the source distribution or at 6# https://www.openssl.org/source/license.html 7 8use strict; 9 10package TLSProxy::ServerKeyExchange; 11 12use vars '@ISA'; 13push @ISA, 'TLSProxy::Message'; 14 15sub new 16{ 17 my $class = shift; 18 my ($server, 19 $data, 20 $records, 21 $startoffset, 22 $message_frag_lens) = @_; 23 24 my $self = $class->SUPER::new( 25 $server, 26 TLSProxy::Message::MT_SERVER_KEY_EXCHANGE, 27 $data, 28 $records, 29 $startoffset, 30 $message_frag_lens); 31 32 #DHE 33 $self->{p} = ""; 34 $self->{g} = ""; 35 $self->{pub_key} = ""; 36 $self->{sig} = ""; 37 38 return $self; 39} 40 41sub parse 42{ 43 my $self = shift; 44 45 #Minimal SKE parsing. Only supports DHE at the moment (if its not DHE 46 #the parsing data will be trash...which is ok as long as we don't try to 47 #use it) 48 49 my $p_len = unpack('n', $self->data); 50 my $ptr = 2; 51 my $p = substr($self->data, $ptr, $p_len); 52 $ptr += $p_len; 53 54 my $g_len = unpack('n', substr($self->data, $ptr)); 55 $ptr += 2; 56 my $g = substr($self->data, $ptr, $g_len); 57 $ptr += $g_len; 58 59 my $pub_key_len = unpack('n', substr($self->data, $ptr)); 60 $ptr += 2; 61 my $pub_key = substr($self->data, $ptr, $pub_key_len); 62 $ptr += $pub_key_len; 63 64 #We assume its signed 65 my $sig_len = unpack('n', substr($self->data, $ptr)); 66 my $sig = ""; 67 if (defined $sig_len) { 68 $ptr += 2; 69 $sig = substr($self->data, $ptr, $sig_len); 70 $ptr += $sig_len; 71 } 72 73 $self->p($p); 74 $self->g($g); 75 $self->pub_key($pub_key); 76 $self->sig($sig); 77} 78 79 80#Reconstruct the on-the-wire message data following changes 81sub set_message_contents 82{ 83 my $self = shift; 84 my $data; 85 86 $data = pack('n', length($self->p)); 87 $data .= $self->p; 88 $data .= pack('n', length($self->g)); 89 $data .= $self->g; 90 $data .= pack('n', length($self->pub_key)); 91 $data .= $self->pub_key; 92 if (length($self->sig) > 0) { 93 $data .= pack('n', length($self->sig)); 94 $data .= $self->sig; 95 } 96 97 $self->data($data); 98} 99 100#Read/write accessors 101#DHE 102sub p 103{ 104 my $self = shift; 105 if (@_) { 106 $self->{p} = shift; 107 } 108 return $self->{p}; 109} 110sub g 111{ 112 my $self = shift; 113 if (@_) { 114 $self->{g} = shift; 115 } 116 return $self->{g}; 117} 118sub pub_key 119{ 120 my $self = shift; 121 if (@_) { 122 $self->{pub_key} = shift; 123 } 124 return $self->{pub_key}; 125} 126sub sig 127{ 128 my $self = shift; 129 if (@_) { 130 $self->{sig} = shift; 131 } 132 return $self->{sig}; 133} 1341; 135