Coverage Report

Created: 2020-05-23 13:54

/src/botan/src/lib/tls/msg_hello_verify.cpp
Line
Count
Source (jump to first uncovered line)
1
/*
2
* DTLS Hello Verify Request
3
* (C) 2012 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7
8
#include <botan/tls_messages.h>
9
#include <botan/mac.h>
10
11
namespace Botan {
12
13
namespace TLS {
14
15
Hello_Verify_Request::Hello_Verify_Request(const std::vector<uint8_t>& buf)
16
0
   {
17
0
   if(buf.size() < 3)
18
0
      throw Decoding_Error("Hello verify request too small");
19
0
20
0
   Protocol_Version version(buf[0], buf[1]);
21
0
22
0
   if(version != Protocol_Version::DTLS_V10 &&
23
0
      version != Protocol_Version::DTLS_V12)
24
0
      {
25
0
      throw Decoding_Error("Unknown version from server in hello verify request");
26
0
      }
27
0
28
0
   if(static_cast<size_t>(buf[2]) + 3 != buf.size())
29
0
      throw Decoding_Error("Bad length in hello verify request");
30
0
31
0
   m_cookie.assign(buf.begin() + 3, buf.end());
32
0
   }
33
34
Hello_Verify_Request::Hello_Verify_Request(const std::vector<uint8_t>& client_hello_bits,
35
                                           const std::string& client_identity,
36
                                           const SymmetricKey& secret_key)
37
6.75k
   {
38
6.75k
   std::unique_ptr<MessageAuthenticationCode> hmac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-256)");
39
6.75k
   hmac->set_key(secret_key);
40
6.75k
41
6.75k
   hmac->update_be(static_cast<uint64_t>(client_hello_bits.size()));
42
6.75k
   hmac->update(client_hello_bits);
43
6.75k
   hmac->update_be(static_cast<uint64_t>(client_identity.size()));
44
6.75k
   hmac->update(client_identity);
45
6.75k
46
6.75k
   m_cookie.resize(hmac->output_length());
47
6.75k
   hmac->final(m_cookie.data());
48
6.75k
   }
49
50
std::vector<uint8_t> Hello_Verify_Request::serialize() const
51
6.75k
   {
52
6.75k
   /* DTLS 1.2 server implementations SHOULD use DTLS version 1.0
53
6.75k
      regardless of the version of TLS that is expected to be
54
6.75k
      negotiated (RFC 6347, section 4.2.1)
55
6.75k
   */
56
6.75k
57
6.75k
   Protocol_Version format_version(Protocol_Version::DTLS_V10);
58
6.75k
59
6.75k
   std::vector<uint8_t> bits;
60
6.75k
   bits.push_back(format_version.major_version());
61
6.75k
   bits.push_back(format_version.minor_version());
62
6.75k
   bits.push_back(static_cast<uint8_t>(m_cookie.size()));
63
6.75k
   bits += m_cookie;
64
6.75k
   return bits;
65
6.75k
   }
66
67
}
68
69
}