Botan  1.11.15
src/lib/tls/tls_version.cpp
Go to the documentation of this file.
00001 /*
00002 * TLS Protocol Version Management
00003 * (C) 2012 Jack Lloyd
00004 *
00005 * Botan is released under the Simplified BSD License (see license.txt)
00006 */
00007 
00008 #include <botan/tls_version.h>
00009 #include <botan/tls_exceptn.h>
00010 #include <botan/parsing.h>
00011 
00012 namespace Botan {
00013 
00014 namespace TLS {
00015 
00016 std::string Protocol_Version::to_string() const
00017    {
00018    const byte maj = major_version();
00019    const byte min = minor_version();
00020 
00021    if(maj == 3 && min == 0)
00022       return "SSL v3";
00023 
00024    if(maj == 3 && min >= 1) // TLS v1.x
00025       return "TLS v1." + std::to_string(min-1);
00026 
00027    if(maj == 254) // DTLS 1.x
00028       return "DTLS v1." + std::to_string(255 - min);
00029 
00030    // Some very new or very old protocol (or bogus data)
00031    return "Unknown " + std::to_string(maj) + "." + std::to_string(min);
00032    }
00033 
00034 bool Protocol_Version::is_datagram_protocol() const
00035    {
00036    return major_version() == 254;
00037    }
00038 
00039 bool Protocol_Version::operator>(const Protocol_Version& other) const
00040    {
00041    if(this->is_datagram_protocol() != other.is_datagram_protocol())
00042       throw TLS_Exception(Alert::PROTOCOL_VERSION,
00043                           "Version comparing " + to_string() +
00044                           " with " + other.to_string());
00045 
00046    if(this->is_datagram_protocol())
00047       return m_version < other.m_version; // goes backwards
00048 
00049    return m_version > other.m_version;
00050    }
00051 
00052 bool Protocol_Version::known_version() const
00053    {
00054    return (m_version == Protocol_Version::TLS_V10 ||
00055            m_version == Protocol_Version::TLS_V11 ||
00056            m_version == Protocol_Version::TLS_V12 ||
00057            m_version == Protocol_Version::DTLS_V10 ||
00058            m_version == Protocol_Version::DTLS_V12);
00059    }
00060 
00061 bool Protocol_Version::supports_negotiable_signature_algorithms() const
00062    {
00063    return (m_version == Protocol_Version::TLS_V12 ||
00064            m_version == Protocol_Version::DTLS_V12);
00065    }
00066 
00067 bool Protocol_Version::supports_explicit_cbc_ivs() const
00068    {
00069    return (m_version == Protocol_Version::TLS_V11 ||
00070            m_version == Protocol_Version::TLS_V12 ||
00071            m_version == Protocol_Version::DTLS_V10 ||
00072            m_version == Protocol_Version::DTLS_V12);
00073    }
00074 
00075 bool Protocol_Version::supports_ciphersuite_specific_prf() const
00076    {
00077    return (m_version == Protocol_Version::TLS_V12 ||
00078            m_version == Protocol_Version::DTLS_V12);
00079    }
00080 
00081 bool Protocol_Version::supports_aead_modes() const
00082    {
00083    return (m_version == Protocol_Version::TLS_V12 ||
00084            m_version == Protocol_Version::DTLS_V12);
00085    }
00086 
00087 }
00088 
00089 }