text: //
  // ssl/context_base.hpp
  // ~~~~~~~~~~~~~~~~~~~~
  //
  // Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  //
  // Distributed under the Boost Software License, Version 1.0. (See accompanying
  // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  //
  
  #ifndef ASIO_SSL_CONTEXT_BASE_HPP
  #define ASIO_SSL_CONTEXT_BASE_HPP
  
  #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  # pragma once
  #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  
  #include "asio/detail/config.hpp"
  #include "asio/ssl/detail/openssl_types.hpp"
  
  #include "asio/detail/push_options.hpp"
  
  namespace asio {
  namespace ssl {
  
  /// The context_base class is used as a base for the basic_context class
  /// template so that we have a common place to define various enums.
  class context_base
  {
  public:
    /// Different methods supported by a context.
    enum method
    {
      /// Generic SSL version 2.
      sslv2,
  
      /// SSL version 2 client.
      sslv2_client,
  
      /// SSL version 2 server.
      sslv2_server,
  
      /// Generic SSL version 3.
      sslv3,
  
      /// SSL version 3 client.
      sslv3_client,
  
      /// SSL version 3 server.
      sslv3_server,
  
      /// Generic TLS version 1.
      tlsv1,
  
      /// TLS version 1 client.
      tlsv1_client,
  
      /// TLS version 1 server.
      tlsv1_server,
  
      /// Generic SSL/TLS.
      sslv23,
  
      /// SSL/TLS client.
      sslv23_client,
  
      /// SSL/TLS server.
      sslv23_server,
  
      /// Generic TLS version 1.1.
      tlsv11,
  
      /// TLS version 1.1 client.
      tlsv11_client,
  
      /// TLS version 1.1 server.
      tlsv11_server,
  
      /// Generic TLS version 1.2.
      tlsv12,
  
      /// TLS version 1.2 client.
      tlsv12_client,
  
      /// TLS version 1.2 server.
      tlsv12_server,
  
      /// Generic TLS version 1.3.
      tlsv13,
  
      /// TLS version 1.3 client.
      tlsv13_client,
  
      /// TLS version 1.3 server.
      tlsv13_server,
  
      /// Generic TLS.
      tls,
  
      /// TLS client.
      tls_client,
  
      /// TLS server.
      tls_server
    };
  
    /// Bitmask type for SSL options.
    typedef long options;
  
  #if defined(GENERATING_DOCUMENTATION)
    /// Implement various bug workarounds.
    static const long default_workarounds = implementation_defined;
  
    /// Always create a new key when using tmp_dh parameters.
    static const long single_dh_use = implementation_defined;
  
    /// Disable SSL v2.
    static const long no_sslv2 = implementation_defined;
  
    /// Disable SSL v3.
    static const long no_sslv3 = implementation_defined;
  
    /// Disable TLS v1.
    static const long no_tlsv1 = implementation_defined;
  
    /// Disable TLS v1.1.
    static const long no_tlsv1_1 = implementation_defined;
  
    /// Disable TLS v1.2.
    static const long no_tlsv1_2 = implementation_defined;
  
    /// Disable TLS v1.3.
    static const long no_tlsv1_3 = implementation_defined;
  
    /// Disable compression. Compression is disabled by default.
    static const long no_compression = implementation_defined;
  #else
    ASIO_STATIC_CONSTANT(long, default_workarounds = SSL_OP_ALL);
    ASIO_STATIC_CONSTANT(long, single_dh_use = SSL_OP_SINGLE_DH_USE);
    ASIO_STATIC_CONSTANT(long, no_sslv2 = SSL_OP_NO_SSLv2);
    ASIO_STATIC_CONSTANT(long, no_sslv3 = SSL_OP_NO_SSLv3);
    ASIO_STATIC_CONSTANT(long, no_tlsv1 = SSL_OP_NO_TLSv1);
  # if defined(SSL_OP_NO_TLSv1_1)
    ASIO_STATIC_CONSTANT(long, no_tlsv1_1 = SSL_OP_NO_TLSv1_1);
  # else // defined(SSL_OP_NO_TLSv1_1)
    ASIO_STATIC_CONSTANT(long, no_tlsv1_1 = 0x10000000L);
  # endif // defined(SSL_OP_NO_TLSv1_1)
  # if defined(SSL_OP_NO_TLSv1_2)
    ASIO_STATIC_CONSTANT(long, no_tlsv1_2 = SSL_OP_NO_TLSv1_2);
  # else // defined(SSL_OP_NO_TLSv1_2)
    ASIO_STATIC_CONSTANT(long, no_tlsv1_2 = 0x08000000L);
  # endif // defined(SSL_OP_NO_TLSv1_2)
  # if defined(SSL_OP_NO_TLSv1_3)
    ASIO_STATIC_CONSTANT(long, no_tlsv1_3 = SSL_OP_NO_TLSv1_3);
  # else // defined(SSL_OP_NO_TLSv1_3)
    ASIO_STATIC_CONSTANT(long, no_tlsv1_3 = 0x20000000L);
  # endif // defined(SSL_OP_NO_TLSv1_3)
  # if defined(SSL_OP_NO_COMPRESSION)
    ASIO_STATIC_CONSTANT(long, no_compression = SSL_OP_NO_COMPRESSION);
  # else // defined(SSL_OP_NO_COMPRESSION)
    ASIO_STATIC_CONSTANT(long, no_compression = 0x20000L);
  # endif // defined(SSL_OP_NO_COMPRESSION)
  #endif
  
    /// File format types.
    enum file_format
    {
      /// ASN.1 file.
      asn1,
  
      /// PEM file.
      pem
    };
  
  #if !defined(GENERATING_DOCUMENTATION)
    // The following types and constants are preserved for backward compatibility.
    // New programs should use the equivalents of the same names that are defined
    // in the asio::ssl namespace.
    typedef int verify_mode;
    ASIO_STATIC_CONSTANT(int, verify_none = SSL_VERIFY_NONE);
    ASIO_STATIC_CONSTANT(int, verify_peer = SSL_VERIFY_PEER);
    ASIO_STATIC_CONSTANT(int,
        verify_fail_if_no_peer_cert = SSL_VERIFY_FAIL_IF_NO_PEER_CERT);
    ASIO_STATIC_CONSTANT(int, verify_client_once = SSL_VERIFY_CLIENT_ONCE);
  #endif
  
    /// Purpose of PEM password.
    enum password_purpose
    {
      /// The password is needed for reading/decryption.
      for_reading,
  
      /// The password is needed for writing/encryption.
      for_writing
    };
  
  protected:
    /// Protected destructor to prevent deletion through this type.
    ~context_base()
    {
    }
  };
  
  } // namespace ssl
  } // namespace asio
  
  #include "asio/detail/pop_options.hpp"
  
  #endif // ASIO_SSL_CONTEXT_BASE_HPP
  