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