Handle DTLS 1.2 in CertificateVerify messages
[openssl.git] / util / perl / TLSProxy / CertificateVerify.pm
1 # Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.
2 #
3 # Licensed under the Apache License 2.0 (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::CertificateVerify;
11
12 use vars '@ISA';
13 push @ISA, 'TLSProxy::Message';
14
15 sub new
16 {
17     my $class = shift;
18     my ($isdtls,
19         $server,
20         $msgseq,
21         $msgfrag,
22         $msgfragoffs,
23         $data,
24         $records,
25         $startoffset,
26         $message_frag_lens) = @_;
27
28     my $self = $class->SUPER::new(
29         $isdtls,
30         $server,
31         TLSProxy::Message::MT_CERTIFICATE_VERIFY,
32         $msgseq,
33         $msgfrag,
34         $msgfragoffs,
35         $data,
36         $records,
37         $startoffset,
38         $message_frag_lens);
39
40     $self->{sigalg} = -1;
41     $self->{signature} = "";
42
43     return $self;
44 }
45
46 sub parse
47 {
48     my $self = shift;
49
50     my $sigalg = -1;
51     my $remdata = $self->data;
52     my $record = ${$self->records}[0];
53
54     if (TLSProxy::Proxy->is_tls13()
55             || $record->version() == TLSProxy::Record::VERS_TLS_1_2
56             || $record->version() == TLSProxy::Record::VERS_DTLS_1_2) {
57         $sigalg = unpack('n', $remdata);
58         $remdata = substr($remdata, 2);
59     }
60
61     my $siglen = unpack('n', substr($remdata, 0, 2));
62     my $sig = substr($remdata, 2);
63
64     die "Invalid CertificateVerify signature length" if length($sig) != $siglen;
65
66     print "    SigAlg:".$sigalg."\n";
67     print "    Signature Len:".$siglen."\n";
68
69     $self->sigalg($sigalg);
70     $self->signature($sig);
71 }
72
73 #Reconstruct the on-the-wire message data following changes
74 sub set_message_contents
75 {
76     my $self = shift;
77     my $data = "";
78     my $sig = $self->signature();
79     my $olddata = $self->data();
80
81     $data .= pack("n", $self->sigalg()) if ($self->sigalg() != -1);
82     $data .= pack("n", length($sig));
83     $data .= $sig;
84
85     $self->data($data);
86 }
87
88 #Read/write accessors
89 sub sigalg
90 {
91     my $self = shift;
92     if (@_) {
93       $self->{sigalg} = shift;
94     }
95     return $self->{sigalg};
96 }
97 sub signature
98 {
99     my $self = shift;
100     if (@_) {
101       $self->{signature} = shift;
102     }
103     return $self->{signature};
104 }
105 1;