Coverage Report

Created: 2020-02-14 15:38

/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.65k
   {
38
6.65k
   std::unique_ptr<MessageAuthenticationCode> hmac = MessageAuthenticationCode::create_or_throw("HMAC(SHA-256)");
39
6.65k
   hmac->set_key(secret_key);
40
6.65k
41
6.65k
   hmac->update_be(static_cast<uint64_t>(client_hello_bits.size()));
42
6.65k
   hmac->update(client_hello_bits);
43
6.65k
   hmac->update_be(static_cast<uint64_t>(client_identity.size()));
44
6.65k
   hmac->update(client_identity);
45
6.65k
46
6.65k
   m_cookie.resize(hmac->output_length());
47
6.65k
   hmac->final(m_cookie.data());
48
6.65k
   }
49
50
std::vector<uint8_t> Hello_Verify_Request::serialize() const
51
6.65k
   {
52
6.65k
   /* DTLS 1.2 server implementations SHOULD use DTLS version 1.0
53
6.65k
      regardless of the version of TLS that is expected to be
54
6.65k
      negotiated (RFC 6347, section 4.2.1)
55
6.65k
   */
56
6.65k
57
6.65k
   Protocol_Version format_version(Protocol_Version::DTLS_V10);
58
6.65k
59
6.65k
   std::vector<uint8_t> bits;
60
6.65k
   bits.push_back(format_version.major_version());
61
6.65k
   bits.push_back(format_version.minor_version());
62
6.65k
   bits.push_back(static_cast<uint8_t>(m_cookie.size()));
63
6.65k
   bits += m_cookie;
64
6.65k
   return bits;
65
6.65k
   }
66
67
}
68
69
}