/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 |