blob: cb4cc7c7625a58946cdaa7cde9e2c090e4ce7e2f [file] [log] [blame]
Rich Salzac3d0e12016-04-20 10:20:59 -04001# Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
Matt Caswella1accbb2015-08-07 14:38:21 +01002#
Rich Salzac3d0e12016-04-20 10:20:59 -04003# 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 Caswella1accbb2015-08-07 14:38:21 +01007
8use strict;
9
10package TLSProxy::ServerKeyExchange;
11
Richard Levitte180df312016-02-21 22:43:29 +010012use vars '@ISA';
13push @ISA, 'TLSProxy::Message';
Matt Caswella1accbb2015-08-07 14:38:21 +010014
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} = "";
Matt Caswell79d8c162017-01-05 12:32:06 +000036 $self->{sigalg} = -1;
Matt Caswella1accbb2015-08-07 14:38:21 +010037 $self->{sig} = "";
38
39 return $self;
40}
41
42sub parse
43{
44 my $self = shift;
Matt Caswell79d8c162017-01-05 12:32:06 +000045 my $sigalg = -1;
Matt Caswella1accbb2015-08-07 14:38:21 +010046
Matt Caswell397f4f72016-12-28 15:01:57 +000047 #Minimal SKE parsing. Only supports one known DHE ciphersuite at the moment
Matt Caswell79d8c162017-01-05 12:32:06 +000048 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 Caswella1accbb2015-08-07 14:38:21 +010052
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 Levitte4deefd62015-08-13 19:14:34 +020066 $ptr += $pub_key_len;
Matt Caswella1accbb2015-08-07 14:38:21 +010067
68 #We assume its signed
Matt Caswell79d8c162017-01-05 12:32:06 +000069 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 Levitte4deefd62015-08-13 19:14:34 +020076 my $sig = "";
Matt Caswell79d8c162017-01-05 12:32:06 +000077 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 Levitte4deefd62015-08-13 19:14:34 +020084 }
Matt Caswella1accbb2015-08-07 14:38:21 +010085
86 $self->p($p);
87 $self->g($g);
88 $self->pub_key($pub_key);
Matt Caswell79d8c162017-01-05 12:32:06 +000089 $self->sigalg($sigalg) if defined $sigalg;
90 $self->signature($sig);
Matt Caswella1accbb2015-08-07 14:38:21 +010091}
92
93
94#Reconstruct the on-the-wire message data following changes
95sub 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 Caswell79d8c162017-01-05 12:32:06 +0000106 $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 Caswella1accbb2015-08-07 14:38:21 +0100110 }
111
112 $self->data($data);
113}
114
115#Read/write accessors
116#DHE
117sub p
118{
119 my $self = shift;
120 if (@_) {
121 $self->{p} = shift;
122 }
123 return $self->{p};
124}
125sub g
126{
127 my $self = shift;
128 if (@_) {
129 $self->{g} = shift;
130 }
131 return $self->{g};
132}
133sub pub_key
134{
135 my $self = shift;
136 if (@_) {
137 $self->{pub_key} = shift;
138 }
139 return $self->{pub_key};
140}
Matt Caswell79d8c162017-01-05 12:32:06 +0000141sub sigalg
142{
143 my $self = shift;
144 if (@_) {
145 $self->{sigalg} = shift;
146 }
147 return $self->{sigalg};
148}
149sub signature
Matt Caswella1accbb2015-08-07 14:38:21 +0100150{
151 my $self = shift;
152 if (@_) {
153 $self->{sig} = shift;
154 }
155 return $self->{sig};
156}
1571;