Coverage Report

Created: 2025-01-10 06:32

/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
12
#include <botan/tls_exceptn.h>
13
14
namespace Botan::TLS {
15
16
138
std::string Protocol_Version::to_string() const {
17
138
   const uint8_t maj = major_version();
18
138
   const uint8_t min = minor_version();
19
20
138
   if(maj == 3 && min == 0) {
21
1
      return "SSL v3";
22
1
   }
23
24
137
   if(maj == 3 && min >= 1) {  // TLS v1.x
25
59
      return "TLS v1." + std::to_string(min - 1);
26
59
   }
27
28
78
   if(maj == 254) {  // DTLS 1.x
29
23
      return "DTLS v1." + std::to_string(255 - min);
30
23
   }
31
32
   // Some very new or very old protocol (or bogus data)
33
55
   return "Unknown " + std::to_string(maj) + "." + std::to_string(min);
34
78
}
35
36
534k
bool Protocol_Version::is_datagram_protocol() const {
37
534k
   return major_version() > 250;
38
534k
}
39
40
48.3k
bool Protocol_Version::is_pre_tls_13() const {
41
48.3k
   return (!is_datagram_protocol() && *this <= Protocol_Version::TLS_V12) ||
42
48.3k
          (is_datagram_protocol() && *this <= Protocol_Version::DTLS_V12);
43
48.3k
}
44
45
732
bool Protocol_Version::is_tls_13_or_later() const {
46
732
   return (!is_datagram_protocol() && *this >= Protocol_Version::TLS_V13) ||
47
732
          (is_datagram_protocol() && *this >= Protocol_Version::DTLS_V13);
48
732
}
49
50
41.1k
bool Protocol_Version::operator>(const Protocol_Version& other) const {
51
41.1k
   if(this->is_datagram_protocol() != other.is_datagram_protocol()) {
52
0
      throw TLS_Exception(Alert::ProtocolVersion, "Version comparing " + to_string() + " with " + other.to_string());
53
0
   }
54
55
41.1k
   if(this->is_datagram_protocol()) {
56
8.51k
      return m_version < other.m_version;  // goes backwards
57
8.51k
   }
58
59
32.6k
   return m_version > other.m_version;
60
41.1k
}
61
62
27.2k
bool Protocol_Version::valid() const {
63
27.2k
   const uint8_t maj = major_version();
64
27.2k
   const uint8_t min = minor_version();
65
66
27.2k
   if(maj == 3 && min <= 4) {
67
      // 3.0: SSLv3
68
      // 3.1: TLS 1.0
69
      // 3.2: TLS 1.1
70
      // 3.3: TLS 1.2
71
      // 3.4: TLS 1.3
72
23
      return true;
73
23
   }
74
75
27.1k
   if(maj == 254 && (min == 253 || min == 255)) {
76
      // 254.253: DTLS 1.2
77
      // 254.255: DTLS 1.0
78
11
      return true;
79
11
   }
80
81
27.1k
   return false;
82
27.1k
}
83
84
0
bool Protocol_Version::known_version() const {
85
0
   return (m_version == static_cast<uint16_t>(Protocol_Version::TLS_V12) ||
86
0
#if defined(BOTAN_HAS_TLS_13)
87
0
           m_version == static_cast<uint16_t>(Protocol_Version::TLS_V13) ||
88
0
#endif
89
0
           m_version == static_cast<uint16_t>(Protocol_Version::DTLS_V12));
90
0
}
91
92
}  // namespace Botan::TLS