Coverage Report

Created: 2022-06-23 06:44

/src/botan/src/lib/tls/tls_version.cpp
Line
Count
Source (jump to first uncovered line)
1
/*
2
* TLS Protocol Version Management
3
* (C) 2012 Jack Lloyd
4
*     2021 Elektrobit Automotive GmbH
5
*     2022 René Meusel, Hannes Rantzsch - neXenio GmbH
6
*
7
* Botan is released under the Simplified BSD License (see license.txt)
8
*/
9
10
#include <botan/tls_version.h>
11
#include <botan/tls_exceptn.h>
12
13
namespace Botan::TLS {
14
15
std::string Protocol_Version::to_string() const
16
3
   {
17
3
   const uint8_t maj = major_version();
18
3
   const uint8_t min = minor_version();
19
20
3
   if(maj == 3 && min == 0)
21
0
      return "SSL v3";
22
23
3
   if(maj == 3 && min >= 1) // TLS v1.x
24
1
      return "TLS v1." + std::to_string(min-1);
25
26
2
   if(maj == 254) // DTLS 1.x
27
2
      return "DTLS v1." + std::to_string(255 - min);
28
29
   // Some very new or very old protocol (or bogus data)
30
0
   return "Unknown " + std::to_string(maj) + "." + std::to_string(min);
31
2
   }
32
33
bool Protocol_Version::is_datagram_protocol() const
34
343k
   {
35
343k
   return major_version() > 250;
36
343k
   }
37
38
bool Protocol_Version::is_pre_tls_13() const
39
0
   {
40
0
   return (!is_datagram_protocol() && *this <= Protocol_Version::TLS_V12) ||
41
0
          ( is_datagram_protocol() && *this <= Protocol_Version::DTLS_V12);
42
0
   }
43
44
45
bool Protocol_Version::operator>(const Protocol_Version& other) const
46
20.9k
   {
47
20.9k
   if(this->is_datagram_protocol() != other.is_datagram_protocol())
48
0
      throw TLS_Exception(Alert::PROTOCOL_VERSION,
49
0
                          "Version comparing " + to_string() +
50
0
                          " with " + other.to_string());
51
52
20.9k
   if(this->is_datagram_protocol())
53
1.03k
      return m_version < other.m_version; // goes backwards
54
55
19.9k
   return m_version > other.m_version;
56
20.9k
   }
57
58
bool Protocol_Version::valid() const
59
21.2k
   {
60
21.2k
   const uint8_t maj = major_version();
61
21.2k
   const uint8_t min = minor_version();
62
63
21.2k
   if(maj == 3 && min <= 4)
64
     // 3.0: SSLv3
65
     // 3.1: TLS 1.0
66
     // 3.2: TLS 1.1
67
     // 3.3: TLS 1.2
68
     // 3.4: TLS 1.3
69
7
     return true;
70
71
21.2k
   if(maj == 254 && (min == 253 || min == 255))
72
      // 254.253: DTLS 1.2
73
      // 254.255: DTLS 1.0
74
9
      return true;
75
76
21.2k
   return false;
77
21.2k
   }
78
79
bool Protocol_Version::known_version() const
80
0
   {
81
0
   return (m_version == Protocol_Version::TLS_V12 ||
82
0
           m_version == Protocol_Version::DTLS_V12);
83
0
   }
84
85
}