7640b3f55bd53e6300a5a5a414e83926bef018d5
[openssl.git] / util / TLSProxy / ServerKeyExchange.pm
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
8 use strict;
9
10 package TLSProxy::ServerKeyExchange;
11
12 use vars '@ISA';
13 push @ISA, 'TLSProxy::Message';
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} = "";
36     $self->{sig} = "";
37
38     return $self;
39 }
40
41 sub parse
42 {
43     my $self = shift;
44
45     #Minimal SKE parsing. Only supports one known DHE ciphersuite at the moment
46     return if (TLSProxy::Proxy->ciphersuite()
47                != TLSProxy::Message::CIPHER_ADH_AES_128_SHA);
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
81 sub 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
102 sub p
103 {
104     my $self = shift;
105     if (@_) {
106       $self->{p} = shift;
107     }
108     return $self->{p};
109 }
110 sub g
111 {
112     my $self = shift;
113     if (@_) {
114       $self->{g} = shift;
115     }
116     return $self->{g};
117 }
118 sub pub_key
119 {
120     my $self = shift;
121     if (@_) {
122       $self->{pub_key} = shift;
123     }
124     return $self->{pub_key};
125 }
126 sub sig
127 {
128     my $self = shift;
129     if (@_) {
130       $self->{sig} = shift;
131     }
132     return $self->{sig};
133 }
134 1;