CertificateRequest.pm 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. # Copyright 2016-2024 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. use strict;
  8. package TLSProxy::CertificateRequest;
  9. use vars '@ISA';
  10. push @ISA, 'TLSProxy::Message';
  11. sub new
  12. {
  13. my $class = shift;
  14. my ($isdtls,
  15. $server,
  16. $msgseq,
  17. $msgfrag,
  18. $msgfragoffs,
  19. $data,
  20. $records,
  21. $startoffset,
  22. $message_frag_lens) = @_;
  23. my $self = $class->SUPER::new(
  24. $isdtls,
  25. $server,
  26. TLSProxy::Message::MT_CERTIFICATE_REQUEST,
  27. $msgseq,
  28. $msgfrag,
  29. $msgfragoffs,
  30. $data,
  31. $records,
  32. $startoffset,
  33. $message_frag_lens);
  34. $self->{extension_data} = "";
  35. return $self;
  36. }
  37. sub parse
  38. {
  39. my $self = shift;
  40. my $ptr = 1;
  41. if (TLSProxy::Proxy->is_tls13()) {
  42. my $request_ctx_len = unpack('C', $self->data);
  43. my $request_ctx = substr($self->data, $ptr, $request_ctx_len);
  44. $ptr += $request_ctx_len;
  45. my $extensions_len = unpack('n', substr($self->data, $ptr));
  46. $ptr += 2;
  47. my $extension_data = substr($self->data, $ptr);
  48. if (length($extension_data) != $extensions_len) {
  49. die "Invalid extension length\n";
  50. }
  51. my %extensions = ();
  52. while (length($extension_data) >= 4) {
  53. my ($type, $size) = unpack("nn", $extension_data);
  54. my $extdata = substr($extension_data, 4, $size);
  55. $extension_data = substr($extension_data, 4 + $size);
  56. $extensions{$type} = $extdata;
  57. }
  58. $self->extension_data(\%extensions);
  59. print " Extensions Len:".$extensions_len."\n";
  60. }
  61. # else parse TLSv1.2 version - we don't support that at the moment
  62. }
  63. #Reconstruct the on-the-wire message data following changes
  64. sub set_message_contents
  65. {
  66. my $self = shift;
  67. my $data;
  68. my $extensions = "";
  69. foreach my $key (keys %{$self->extension_data}) {
  70. my $extdata = ${$self->extension_data}{$key};
  71. $extensions .= pack("n", $key);
  72. $extensions .= pack("n", length($extdata));
  73. $extensions .= $extdata;
  74. }
  75. $data = pack('n', length($extensions));
  76. $data .= $extensions;
  77. $self->data($data);
  78. }
  79. #Read/write accessors
  80. sub extension_data
  81. {
  82. my $self = shift;
  83. if (@_) {
  84. $self->{extension_data} = shift;
  85. }
  86. return $self->{extension_data};
  87. }
  88. sub set_extension
  89. {
  90. my ($self, $ext_type, $ext_data) = @_;
  91. $self->{extension_data}{$ext_type} = $ext_data;
  92. }
  93. sub delete_extension
  94. {
  95. my ($self, $ext_type) = @_;
  96. delete $self->{extension_data}{$ext_type};
  97. }
  98. 1;