aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/tls/tls_version.cpp
diff options
context:
space:
mode:
authorlloyd <[email protected]>2014-01-10 03:41:59 +0000
committerlloyd <[email protected]>2014-01-10 03:41:59 +0000
commit6894dca64c04936d07048c0e8cbf7e25858548c3 (patch)
tree5d572bfde9fe667dab14e3f04b5285a85d8acd95 /src/lib/tls/tls_version.cpp
parent9efa3be92442afb3d0b69890a36c7f122df18eda (diff)
Move lib into src
Diffstat (limited to 'src/lib/tls/tls_version.cpp')
-rw-r--r--src/lib/tls/tls_version.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/lib/tls/tls_version.cpp b/src/lib/tls/tls_version.cpp
new file mode 100644
index 000000000..7b880d98c
--- /dev/null
+++ b/src/lib/tls/tls_version.cpp
@@ -0,0 +1,101 @@
+/*
+* TLS Protocol Version Management
+* (C) 2012 Jack Lloyd
+*
+* Released under the terms of the Botan license
+*/
+
+#include <botan/tls_version.h>
+#include <botan/tls_exceptn.h>
+#include <botan/parsing.h>
+
+namespace Botan {
+
+namespace TLS {
+
+std::string Protocol_Version::to_string() const
+ {
+ const byte maj = major_version();
+ const byte min = minor_version();
+
+ if(maj == 3 && min == 0)
+ return "SSL v3";
+
+ if(maj == 3 && min >= 1) // TLS v1.x
+ return "TLS v1." + std::to_string(min-1);
+
+ if(maj == 254) // DTLS 1.x
+ return "DTLS v1." + std::to_string(255 - min);
+
+ // Some very new or very old protocol (or bogus data)
+ return "Unknown " + std::to_string(maj) + "." + std::to_string(min);
+ }
+
+bool Protocol_Version::is_datagram_protocol() const
+ {
+ return major_version() == 254;
+ }
+
+bool Protocol_Version::operator>(const Protocol_Version& other) const
+ {
+ if(this->is_datagram_protocol() != other.is_datagram_protocol())
+ throw TLS_Exception(Alert::PROTOCOL_VERSION,
+ "Version comparing " + to_string() +
+ " with " + other.to_string());
+
+ if(this->is_datagram_protocol())
+ return m_version < other.m_version; // goes backwards
+
+ return m_version > other.m_version;
+ }
+
+Protocol_Version Protocol_Version::best_known_match() const
+ {
+ if(known_version())
+ return *this; // known version is its own best match
+
+ if(is_datagram_protocol())
+ return Protocol_Version::DTLS_V12;
+ else
+ return Protocol_Version::TLS_V12;
+ }
+
+bool Protocol_Version::known_version() const
+ {
+ return (m_version == Protocol_Version::SSL_V3 ||
+ m_version == Protocol_Version::TLS_V10 ||
+ m_version == Protocol_Version::TLS_V11 ||
+ m_version == Protocol_Version::TLS_V12 ||
+ m_version == Protocol_Version::DTLS_V10 ||
+ m_version == Protocol_Version::DTLS_V12);
+ }
+
+bool Protocol_Version::supports_negotiable_signature_algorithms() const
+ {
+ return (m_version == Protocol_Version::TLS_V12 ||
+ m_version == Protocol_Version::DTLS_V12);
+ }
+
+bool Protocol_Version::supports_explicit_cbc_ivs() const
+ {
+ return (m_version == Protocol_Version::TLS_V11 ||
+ m_version == Protocol_Version::TLS_V12 ||
+ m_version == Protocol_Version::DTLS_V10 ||
+ m_version == Protocol_Version::DTLS_V12);
+ }
+
+bool Protocol_Version::supports_ciphersuite_specific_prf() const
+ {
+ return (m_version == Protocol_Version::TLS_V12 ||
+ m_version == Protocol_Version::DTLS_V12);
+ }
+
+bool Protocol_Version::supports_aead_modes() const
+ {
+ return (m_version == Protocol_Version::TLS_V12 ||
+ m_version == Protocol_Version::DTLS_V12);
+ }
+
+}
+
+}