xref: /netbsd-src/crypto/external/bsd/openssl/dist/util/perl/TLSProxy/ServerKeyExchange.pm (revision 16dce51364ebe8aeafbae46bc5aa167b8115bc45)
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