1 # Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
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
10 package TLSProxy::ServerKeyExchange;
13 push @ISA, 'TLSProxy::Message';
22 $message_frag_lens) = @_;
24 my $self = $class->SUPER::new(
26 TLSProxy::Message::MT_SERVER_KEY_EXCHANGE,
35 $self->{pub_key} = "";
47 #Minimal SKE parsing. Only supports one known DHE ciphersuite at the moment
48 return if TLSProxy::Proxy->ciphersuite()
49 != TLSProxy::Message::CIPHER_ADH_AES_128_SHA
50 && TLSProxy::Proxy->ciphersuite()
51 != TLSProxy::Message::CIPHER_DHE_RSA_AES_128_SHA;
53 my $p_len = unpack('n', $self->data);
55 my $p = substr($self->data, $ptr, $p_len);
58 my $g_len = unpack('n', substr($self->data, $ptr));
60 my $g = substr($self->data, $ptr, $g_len);
63 my $pub_key_len = unpack('n', substr($self->data, $ptr));
65 my $pub_key = substr($self->data, $ptr, $pub_key_len);
69 my $record = ${$self->records}[0];
71 if (TLSProxy::Proxy->is_tls13()
72 || $record->version() == TLSProxy::Record::VERS_TLS_1_2) {
73 $sigalg = unpack('n', substr($self->data, $ptr));
77 if (defined $sigalg) {
78 my $sig_len = unpack('n', substr($self->data, $ptr));
79 if (defined $sig_len) {
81 $sig = substr($self->data, $ptr, $sig_len);
88 $self->pub_key($pub_key);
89 $self->sigalg($sigalg) if defined $sigalg;
90 $self->signature($sig);
94 #Reconstruct the on-the-wire message data following changes
95 sub set_message_contents
100 $data = pack('n', length($self->p));
102 $data .= pack('n', length($self->g));
104 $data .= pack('n', length($self->pub_key));
105 $data .= $self->pub_key;
106 $data .= pack('n', $self->sigalg) if ($self->sigalg != -1);
107 if (length($self->signature) > 0) {
108 $data .= pack('n', length($self->signature));
109 $data .= $self->signature;
115 #Read/write accessors
137 $self->{pub_key} = shift;
139 return $self->{pub_key};
145 $self->{sigalg} = shift;
147 return $self->{sigalg};
153 $self->{sig} = shift;