xref: /freebsd/crypto/openssl/util/perl/TLSProxy/HelloVerifyRequest.pm (revision e7be843b4a162e68651d3911f0357ed464915629)
1*e7be843bSPierre Pronchery# Copyright 2016-2024 The OpenSSL Project Authors. All Rights Reserved.
2*e7be843bSPierre Pronchery#
3*e7be843bSPierre Pronchery# Licensed under the Apache License 2.0 (the "License").  You may not use
4*e7be843bSPierre Pronchery# this file except in compliance with the License.  You can obtain a copy
5*e7be843bSPierre Pronchery# in the file LICENSE in the source distribution or at
6*e7be843bSPierre Pronchery# https://www.openssl.org/source/license.html
7*e7be843bSPierre Pronchery
8*e7be843bSPierre Proncheryuse strict;
9*e7be843bSPierre Pronchery
10*e7be843bSPierre Proncherypackage TLSProxy::HelloVerifyRequest;
11*e7be843bSPierre Pronchery
12*e7be843bSPierre Proncheryuse TLSProxy::Record;
13*e7be843bSPierre Pronchery
14*e7be843bSPierre Proncheryuse vars '@ISA';
15*e7be843bSPierre Proncherypush @ISA, 'TLSProxy::Message';
16*e7be843bSPierre Pronchery
17*e7be843bSPierre Pronchery
18*e7be843bSPierre Proncherysub new
19*e7be843bSPierre Pronchery{
20*e7be843bSPierre Pronchery    my $class = shift;
21*e7be843bSPierre Pronchery    my ($isdtls,
22*e7be843bSPierre Pronchery        $server,
23*e7be843bSPierre Pronchery        $msgseq,
24*e7be843bSPierre Pronchery        $msgfrag,
25*e7be843bSPierre Pronchery        $msgfragoffs,
26*e7be843bSPierre Pronchery        $data,
27*e7be843bSPierre Pronchery        $records,
28*e7be843bSPierre Pronchery        $startoffset,
29*e7be843bSPierre Pronchery        $message_frag_lens) = @_;
30*e7be843bSPierre Pronchery
31*e7be843bSPierre Pronchery    my $self = $class->SUPER::new(
32*e7be843bSPierre Pronchery        $isdtls,
33*e7be843bSPierre Pronchery        $server,
34*e7be843bSPierre Pronchery        TLSProxy::Message::MT_HELLO_VERIFY_REQUEST,
35*e7be843bSPierre Pronchery        $msgseq,
36*e7be843bSPierre Pronchery        $msgfrag,
37*e7be843bSPierre Pronchery        $msgfragoffs,
38*e7be843bSPierre Pronchery        $data,
39*e7be843bSPierre Pronchery        $records,
40*e7be843bSPierre Pronchery        $startoffset,
41*e7be843bSPierre Pronchery        $message_frag_lens);
42*e7be843bSPierre Pronchery
43*e7be843bSPierre Pronchery    $self->{server_version} = 0;
44*e7be843bSPierre Pronchery    $self->{cookie_len} = 0;
45*e7be843bSPierre Pronchery    $self->{cookie} = "";
46*e7be843bSPierre Pronchery
47*e7be843bSPierre Pronchery    return $self;
48*e7be843bSPierre Pronchery}
49*e7be843bSPierre Pronchery
50*e7be843bSPierre Proncherysub parse
51*e7be843bSPierre Pronchery{
52*e7be843bSPierre Pronchery    my $self = shift;
53*e7be843bSPierre Pronchery
54*e7be843bSPierre Pronchery    my ($server_version) = unpack('n', $self->data);
55*e7be843bSPierre Pronchery    my $ptr = 2;
56*e7be843bSPierre Pronchery    my $cookie_len = unpack('C', substr($self->data, $ptr));
57*e7be843bSPierre Pronchery    $ptr++;
58*e7be843bSPierre Pronchery    my $cookie = substr($self->data, $ptr, $cookie_len);
59*e7be843bSPierre Pronchery
60*e7be843bSPierre Pronchery    $self->server_version($server_version);
61*e7be843bSPierre Pronchery    $self->cookie_len($cookie_len);
62*e7be843bSPierre Pronchery    $self->cookie($cookie);
63*e7be843bSPierre Pronchery
64*e7be843bSPierre Pronchery    $self->process_data();
65*e7be843bSPierre Pronchery
66*e7be843bSPierre Pronchery    print "    Server Version:".$TLSProxy::Record::tls_version{$server_version}."\n";
67*e7be843bSPierre Pronchery    print "    Cookie Len:".$cookie_len."\n";
68*e7be843bSPierre Pronchery}
69*e7be843bSPierre Pronchery
70*e7be843bSPierre Pronchery#Perform any actions necessary based on the data we've seen
71*e7be843bSPierre Proncherysub process_data
72*e7be843bSPierre Pronchery{
73*e7be843bSPierre Pronchery    my $self = shift;
74*e7be843bSPierre Pronchery    #Intentional no-op
75*e7be843bSPierre Pronchery}
76*e7be843bSPierre Pronchery
77*e7be843bSPierre Pronchery#Reconstruct the on-the-wire message data following changes
78*e7be843bSPierre Proncherysub set_message_contents
79*e7be843bSPierre Pronchery{
80*e7be843bSPierre Pronchery    my $self = shift;
81*e7be843bSPierre Pronchery    my $data;
82*e7be843bSPierre Pronchery
83*e7be843bSPierre Pronchery    $data = pack('n', $self->server_version);
84*e7be843bSPierre Pronchery    $data .= pack('C', $self->cookie_len);
85*e7be843bSPierre Pronchery    $data .= $self->cookie;
86*e7be843bSPierre Pronchery
87*e7be843bSPierre Pronchery    $self->data($data);
88*e7be843bSPierre Pronchery}
89*e7be843bSPierre Pronchery
90*e7be843bSPierre Pronchery#Read/write accessors
91*e7be843bSPierre Proncherysub server_version
92*e7be843bSPierre Pronchery{
93*e7be843bSPierre Pronchery    my $self = shift;
94*e7be843bSPierre Pronchery    if (@_) {
95*e7be843bSPierre Pronchery      $self->{server_version} = shift;
96*e7be843bSPierre Pronchery    }
97*e7be843bSPierre Pronchery    return $self->{server_version};
98*e7be843bSPierre Pronchery}
99*e7be843bSPierre Proncherysub cookie_len
100*e7be843bSPierre Pronchery{
101*e7be843bSPierre Pronchery    my $self = shift;
102*e7be843bSPierre Pronchery    if (@_) {
103*e7be843bSPierre Pronchery      $self->{cookie_len} = shift;
104*e7be843bSPierre Pronchery    }
105*e7be843bSPierre Pronchery    return $self->{cookie_len};
106*e7be843bSPierre Pronchery}
107*e7be843bSPierre Proncherysub cookie
108*e7be843bSPierre Pronchery{
109*e7be843bSPierre Pronchery    my $self = shift;
110*e7be843bSPierre Pronchery    if (@_) {
111*e7be843bSPierre Pronchery      $self->{cookie} = shift;
112*e7be843bSPierre Pronchery    }
113*e7be843bSPierre Pronchery    return $self->{cookie};
114*e7be843bSPierre Pronchery}
115*e7be843bSPierre Pronchery1;
116