Coverage Report

Created: 2019-12-03 15:21

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