Botan
1.11.15
|
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 }