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 ($server,
|
---|
19 | $data,
|
---|
20 | $records,
|
---|
21 | $startoffset,
|
---|
22 | $message_frag_lens) = @_;
|
---|
23 |
|
---|
24 | my $self = $class->SUPER::new(
|
---|
25 | $server,
|
---|
26 | TLSProxy::Message::MT_CERTIFICATE_VERIFY,
|
---|
27 | $data,
|
---|
28 | $records,
|
---|
29 | $startoffset,
|
---|
30 | $message_frag_lens);
|
---|
31 |
|
---|
32 | $self->{sigalg} = -1;
|
---|
33 | $self->{signature} = "";
|
---|
34 |
|
---|
35 | return $self;
|
---|
36 | }
|
---|
37 |
|
---|
38 | sub parse
|
---|
39 | {
|
---|
40 | my $self = shift;
|
---|
41 |
|
---|
42 | my $sigalg = -1;
|
---|
43 | my $remdata = $self->data;
|
---|
44 | my $record = ${$self->records}[0];
|
---|
45 |
|
---|
46 | if (TLSProxy::Proxy->is_tls13()
|
---|
47 | || $record->version() == TLSProxy::Record::VERS_TLS_1_2) {
|
---|
48 | $sigalg = unpack('n', $remdata);
|
---|
49 | $remdata = substr($remdata, 2);
|
---|
50 | }
|
---|
51 |
|
---|
52 | my $siglen = unpack('n', substr($remdata, 0, 2));
|
---|
53 | my $sig = substr($remdata, 2);
|
---|
54 |
|
---|
55 | die "Invalid CertificateVerify signature length" if length($sig) != $siglen;
|
---|
56 |
|
---|
57 | print " SigAlg:".$sigalg."\n";
|
---|
58 | print " Signature Len:".$siglen."\n";
|
---|
59 |
|
---|
60 | $self->sigalg($sigalg);
|
---|
61 | $self->signature($sig);
|
---|
62 | }
|
---|
63 |
|
---|
64 | #Reconstruct the on-the-wire message data following changes
|
---|
65 | sub set_message_contents
|
---|
66 | {
|
---|
67 | my $self = shift;
|
---|
68 | my $data = "";
|
---|
69 | my $sig = $self->signature();
|
---|
70 | my $olddata = $self->data();
|
---|
71 |
|
---|
72 | $data .= pack("n", $self->sigalg()) if ($self->sigalg() != -1);
|
---|
73 | $data .= pack("n", length($sig));
|
---|
74 | $data .= $sig;
|
---|
75 |
|
---|
76 | $self->data($data);
|
---|
77 | }
|
---|
78 |
|
---|
79 | #Read/write accessors
|
---|
80 | sub sigalg
|
---|
81 | {
|
---|
82 | my $self = shift;
|
---|
83 | if (@_) {
|
---|
84 | $self->{sigalg} = shift;
|
---|
85 | }
|
---|
86 | return $self->{sigalg};
|
---|
87 | }
|
---|
88 | sub signature
|
---|
89 | {
|
---|
90 | my $self = shift;
|
---|
91 | if (@_) {
|
---|
92 | $self->{signature} = shift;
|
---|
93 | }
|
---|
94 | return $self->{signature};
|
---|
95 | }
|
---|
96 | 1;
|
---|