Rich Salz | ac3d0e1 | 2016-04-20 10:20:59 -0400 | [diff] [blame] | 1 | # Copyright 2016 The OpenSSL Project Authors. All Rights Reserved. |
Matt Caswell | a1accbb | 2015-08-07 14:38:21 +0100 | [diff] [blame] | 2 | # |
Rich Salz | ac3d0e1 | 2016-04-20 10:20:59 -0400 | [diff] [blame] | 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 |
Matt Caswell | a1accbb | 2015-08-07 14:38:21 +0100 | [diff] [blame] | 7 | |
| 8 | use strict; |
| 9 | |
| 10 | package TLSProxy::ServerKeyExchange; |
| 11 | |
Richard Levitte | 180df31 | 2016-02-21 22:43:29 +0100 | [diff] [blame] | 12 | use vars '@ISA'; |
| 13 | push @ISA, 'TLSProxy::Message'; |
Matt Caswell | a1accbb | 2015-08-07 14:38:21 +0100 | [diff] [blame] | 14 | |
| 15 | sub 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} = ""; |
Matt Caswell | 79d8c16 | 2017-01-05 12:32:06 +0000 | [diff] [blame] | 36 | $self->{sigalg} = -1; |
Matt Caswell | a1accbb | 2015-08-07 14:38:21 +0100 | [diff] [blame] | 37 | $self->{sig} = ""; |
| 38 | |
| 39 | return $self; |
| 40 | } |
| 41 | |
| 42 | sub parse |
| 43 | { |
| 44 | my $self = shift; |
Matt Caswell | 79d8c16 | 2017-01-05 12:32:06 +0000 | [diff] [blame] | 45 | my $sigalg = -1; |
Matt Caswell | a1accbb | 2015-08-07 14:38:21 +0100 | [diff] [blame] | 46 | |
Matt Caswell | 397f4f7 | 2016-12-28 15:01:57 +0000 | [diff] [blame] | 47 | #Minimal SKE parsing. Only supports one known DHE ciphersuite at the moment |
Matt Caswell | 79d8c16 | 2017-01-05 12:32:06 +0000 | [diff] [blame] | 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; |
Matt Caswell | a1accbb | 2015-08-07 14:38:21 +0100 | [diff] [blame] | 52 | |
| 53 | my $p_len = unpack('n', $self->data); |
| 54 | my $ptr = 2; |
| 55 | my $p = substr($self->data, $ptr, $p_len); |
| 56 | $ptr += $p_len; |
| 57 | |
| 58 | my $g_len = unpack('n', substr($self->data, $ptr)); |
| 59 | $ptr += 2; |
| 60 | my $g = substr($self->data, $ptr, $g_len); |
| 61 | $ptr += $g_len; |
| 62 | |
| 63 | my $pub_key_len = unpack('n', substr($self->data, $ptr)); |
| 64 | $ptr += 2; |
| 65 | my $pub_key = substr($self->data, $ptr, $pub_key_len); |
Richard Levitte | 4deefd6 | 2015-08-13 19:14:34 +0200 | [diff] [blame] | 66 | $ptr += $pub_key_len; |
Matt Caswell | a1accbb | 2015-08-07 14:38:21 +0100 | [diff] [blame] | 67 | |
| 68 | #We assume its signed |
Matt Caswell | 79d8c16 | 2017-01-05 12:32:06 +0000 | [diff] [blame] | 69 | my $record = ${$self->records}[0]; |
| 70 | |
| 71 | if (TLSProxy::Proxy->is_tls13() |
| 72 | || $record->version() == TLSProxy::Record::VERS_TLS_1_2) { |
| 73 | $sigalg = unpack('n', substr($self->data, $ptr)); |
| 74 | $ptr += 2; |
| 75 | } |
Richard Levitte | 4deefd6 | 2015-08-13 19:14:34 +0200 | [diff] [blame] | 76 | my $sig = ""; |
Matt Caswell | 79d8c16 | 2017-01-05 12:32:06 +0000 | [diff] [blame] | 77 | if (defined $sigalg) { |
| 78 | my $sig_len = unpack('n', substr($self->data, $ptr)); |
| 79 | if (defined $sig_len) { |
| 80 | $ptr += 2; |
| 81 | $sig = substr($self->data, $ptr, $sig_len); |
| 82 | $ptr += $sig_len; |
| 83 | } |
Richard Levitte | 4deefd6 | 2015-08-13 19:14:34 +0200 | [diff] [blame] | 84 | } |
Matt Caswell | a1accbb | 2015-08-07 14:38:21 +0100 | [diff] [blame] | 85 | |
| 86 | $self->p($p); |
| 87 | $self->g($g); |
| 88 | $self->pub_key($pub_key); |
Matt Caswell | 79d8c16 | 2017-01-05 12:32:06 +0000 | [diff] [blame] | 89 | $self->sigalg($sigalg) if defined $sigalg; |
| 90 | $self->signature($sig); |
Matt Caswell | a1accbb | 2015-08-07 14:38:21 +0100 | [diff] [blame] | 91 | } |
| 92 | |
| 93 | |
| 94 | #Reconstruct the on-the-wire message data following changes |
| 95 | sub set_message_contents |
| 96 | { |
| 97 | my $self = shift; |
| 98 | my $data; |
| 99 | |
| 100 | $data = pack('n', length($self->p)); |
| 101 | $data .= $self->p; |
| 102 | $data .= pack('n', length($self->g)); |
| 103 | $data .= $self->g; |
| 104 | $data .= pack('n', length($self->pub_key)); |
| 105 | $data .= $self->pub_key; |
Matt Caswell | 79d8c16 | 2017-01-05 12:32:06 +0000 | [diff] [blame] | 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; |
Matt Caswell | a1accbb | 2015-08-07 14:38:21 +0100 | [diff] [blame] | 110 | } |
| 111 | |
| 112 | $self->data($data); |
| 113 | } |
| 114 | |
| 115 | #Read/write accessors |
| 116 | #DHE |
| 117 | sub p |
| 118 | { |
| 119 | my $self = shift; |
| 120 | if (@_) { |
| 121 | $self->{p} = shift; |
| 122 | } |
| 123 | return $self->{p}; |
| 124 | } |
| 125 | sub g |
| 126 | { |
| 127 | my $self = shift; |
| 128 | if (@_) { |
| 129 | $self->{g} = shift; |
| 130 | } |
| 131 | return $self->{g}; |
| 132 | } |
| 133 | sub pub_key |
| 134 | { |
| 135 | my $self = shift; |
| 136 | if (@_) { |
| 137 | $self->{pub_key} = shift; |
| 138 | } |
| 139 | return $self->{pub_key}; |
| 140 | } |
Matt Caswell | 79d8c16 | 2017-01-05 12:32:06 +0000 | [diff] [blame] | 141 | sub sigalg |
| 142 | { |
| 143 | my $self = shift; |
| 144 | if (@_) { |
| 145 | $self->{sigalg} = shift; |
| 146 | } |
| 147 | return $self->{sigalg}; |
| 148 | } |
| 149 | sub signature |
Matt Caswell | a1accbb | 2015-08-07 14:38:21 +0100 | [diff] [blame] | 150 | { |
| 151 | my $self = shift; |
| 152 | if (@_) { |
| 153 | $self->{sig} = shift; |
| 154 | } |
| 155 | return $self->{sig}; |
| 156 | } |
| 157 | 1; |