ServerKeyExchange.pm 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. # Written by Matt Caswell for the OpenSSL project.
  2. # ====================================================================
  3. # Copyright (c) 1998-2015 The OpenSSL Project. All rights reserved.
  4. #
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions
  7. # are met:
  8. #
  9. # 1. Redistributions of source code must retain the above copyright
  10. # notice, this list of conditions and the following disclaimer.
  11. #
  12. # 2. Redistributions in binary form must reproduce the above copyright
  13. # notice, this list of conditions and the following disclaimer in
  14. # the documentation and/or other materials provided with the
  15. # distribution.
  16. #
  17. # 3. All advertising materials mentioning features or use of this
  18. # software must display the following acknowledgment:
  19. # "This product includes software developed by the OpenSSL Project
  20. # for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
  21. #
  22. # 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  23. # endorse or promote products derived from this software without
  24. # prior written permission. For written permission, please contact
  25. # openssl-core@openssl.org.
  26. #
  27. # 5. Products derived from this software may not be called "OpenSSL"
  28. # nor may "OpenSSL" appear in their names without prior written
  29. # permission of the OpenSSL Project.
  30. #
  31. # 6. Redistributions of any form whatsoever must retain the following
  32. # acknowledgment:
  33. # "This product includes software developed by the OpenSSL Project
  34. # for use in the OpenSSL Toolkit (http://www.openssl.org/)"
  35. #
  36. # THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  37. # EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  38. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  39. # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
  40. # ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  41. # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  42. # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  43. # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  44. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  45. # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  46. # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  47. # OF THE POSSIBILITY OF SUCH DAMAGE.
  48. # ====================================================================
  49. #
  50. # This product includes cryptographic software written by Eric Young
  51. # (eay@cryptsoft.com). This product includes software written by Tim
  52. # Hudson (tjh@cryptsoft.com).
  53. use strict;
  54. package TLSProxy::ServerKeyExchange;
  55. use parent 'TLSProxy::Message';
  56. sub new
  57. {
  58. my $class = shift;
  59. my ($server,
  60. $data,
  61. $records,
  62. $startoffset,
  63. $message_frag_lens) = @_;
  64. my $self = $class->SUPER::new(
  65. $server,
  66. TLSProxy::Message::MT_SERVER_KEY_EXCHANGE,
  67. $data,
  68. $records,
  69. $startoffset,
  70. $message_frag_lens);
  71. #DHE
  72. $self->{p} = "";
  73. $self->{g} = "";
  74. $self->{pub_key} = "";
  75. $self->{sig} = "";
  76. return $self;
  77. }
  78. sub parse
  79. {
  80. my $self = shift;
  81. #Minimal SKE parsing. Only supports DHE at the moment (if its not DHE
  82. #the parsing data will be trash...which is ok as long as we don't try to
  83. #use it)
  84. my $p_len = unpack('n', $self->data);
  85. my $ptr = 2;
  86. my $p = substr($self->data, $ptr, $p_len);
  87. $ptr += $p_len;
  88. my $g_len = unpack('n', substr($self->data, $ptr));
  89. $ptr += 2;
  90. my $g = substr($self->data, $ptr, $g_len);
  91. $ptr += $g_len;
  92. my $pub_key_len = unpack('n', substr($self->data, $ptr));
  93. $ptr += 2;
  94. my $pub_key = substr($self->data, $ptr, $pub_key_len);
  95. $ptr += $pub_key_len;
  96. #We assume its signed
  97. my $sig_len = unpack('n', substr($self->data, $ptr));
  98. my $sig = "";
  99. if (defined $sig_len) {
  100. $ptr += 2;
  101. $sig = substr($self->data, $ptr, $sig_len);
  102. $ptr += $sig_len;
  103. }
  104. $self->p($p);
  105. $self->g($g);
  106. $self->pub_key($pub_key);
  107. $self->sig($sig);
  108. }
  109. #Reconstruct the on-the-wire message data following changes
  110. sub set_message_contents
  111. {
  112. my $self = shift;
  113. my $data;
  114. $data = pack('n', length($self->p));
  115. $data .= $self->p;
  116. $data .= pack('n', length($self->g));
  117. $data .= $self->g;
  118. $data .= pack('n', length($self->pub_key));
  119. $data .= $self->pub_key;
  120. if (length($self->sig) > 0) {
  121. $data .= pack('n', length($self->sig));
  122. $data .= $self->sig;
  123. }
  124. $self->data($data);
  125. }
  126. #Read/write accessors
  127. #DHE
  128. sub p
  129. {
  130. my $self = shift;
  131. if (@_) {
  132. $self->{p} = shift;
  133. }
  134. return $self->{p};
  135. }
  136. sub g
  137. {
  138. my $self = shift;
  139. if (@_) {
  140. $self->{g} = shift;
  141. }
  142. return $self->{g};
  143. }
  144. sub pub_key
  145. {
  146. my $self = shift;
  147. if (@_) {
  148. $self->{pub_key} = shift;
  149. }
  150. return $self->{pub_key};
  151. }
  152. sub sig
  153. {
  154. my $self = shift;
  155. if (@_) {
  156. $self->{sig} = shift;
  157. }
  158. return $self->{sig};
  159. }
  160. 1;