PageRenderTime 35ms CodeModel.GetById 2ms app.highlight 27ms RepoModel.GetById 1ms app.codeStats 0ms

/Src/Dependencies/Boost/boost/asio/ssl/detail/engine.hpp

http://hadesmem.googlecode.com/
C++ Header | 162 lines | 77 code | 38 blank | 47 comment | 1 complexity | 24047027e245b1681e7651b805b2c971 MD5 | raw file
  1//
  2// ssl/detail/engine.hpp
  3// ~~~~~~~~~~~~~~~~~~~~~
  4//
  5// Copyright (c) 2003-2011 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  6//
  7// Distributed under the Boost Software License, Version 1.0. (See accompanying
  8// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9//
 10
 11#ifndef BOOST_ASIO_SSL_DETAIL_ENGINE_HPP
 12#define BOOST_ASIO_SSL_DETAIL_ENGINE_HPP
 13
 14#if defined(_MSC_VER) && (_MSC_VER >= 1200)
 15# pragma once
 16#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 17
 18#include <boost/asio/detail/config.hpp>
 19
 20#if !defined(BOOST_ASIO_ENABLE_OLD_SSL)
 21# include <boost/asio/buffer.hpp>
 22# include <boost/asio/detail/static_mutex.hpp>
 23# include <boost/asio/ssl/detail/openssl_types.hpp>
 24# include <boost/asio/ssl/detail/verify_callback.hpp>
 25# include <boost/asio/ssl/stream_base.hpp>
 26# include <boost/asio/ssl/verify_mode.hpp>
 27#endif // !defined(BOOST_ASIO_ENABLE_OLD_SSL)
 28
 29#include <boost/asio/detail/push_options.hpp>
 30
 31namespace boost {
 32namespace asio {
 33namespace ssl {
 34namespace detail {
 35
 36#if !defined(BOOST_ASIO_ENABLE_OLD_SSL)
 37
 38class engine
 39{
 40public:
 41  enum want
 42  {
 43    // Returned by functions to indicate that the engine wants input. The input
 44    // buffer should be updated to point to the data. The engine then needs to
 45    // be called again to retry the operation.
 46    want_input_and_retry = -2,
 47
 48    // Returned by functions to indicate that the engine wants to write output.
 49    // The output buffer points to the data to be written. The engine then
 50    // needs to be called again to retry the operation.
 51    want_output_and_retry = -1,
 52
 53    // Returned by functions to indicate that the engine doesn't need input or
 54    // output.
 55    want_nothing = 0,
 56
 57    // Returned by functions to indicate that the engine wants to write output.
 58    // The output buffer points to the data to be written. After that the
 59    // operation is complete, and the engine does not need to be called again.
 60    want_output = 1
 61  };
 62
 63  // Construct a new engine for the specified context.
 64  BOOST_ASIO_DECL explicit engine(SSL_CTX* context);
 65
 66  // Destructor.
 67  BOOST_ASIO_DECL ~engine();
 68
 69  // Get the underlying implementation in the native type.
 70  BOOST_ASIO_DECL SSL* native_handle();
 71
 72  // Set the peer verification mode.
 73  BOOST_ASIO_DECL boost::system::error_code set_verify_mode(
 74      verify_mode v, boost::system::error_code& ec);
 75
 76  // Set a peer certificate verification callback.
 77  BOOST_ASIO_DECL boost::system::error_code set_verify_callback(
 78      verify_callback_base* callback, boost::system::error_code& ec);
 79
 80  // Perform an SSL handshake using either SSL_connect (client-side) or
 81  // SSL_accept (server-side).
 82  BOOST_ASIO_DECL want handshake(
 83      stream_base::handshake_type type, boost::system::error_code& ec);
 84
 85  // Perform a graceful shutdown of the SSL session.
 86  BOOST_ASIO_DECL want shutdown(boost::system::error_code& ec);
 87
 88  // Write bytes to the SSL session.
 89  BOOST_ASIO_DECL want write(const boost::asio::const_buffer& data,
 90      boost::system::error_code& ec, std::size_t& bytes_transferred);
 91
 92  // Read bytes from the SSL session.
 93  BOOST_ASIO_DECL want read(const boost::asio::mutable_buffer& data,
 94      boost::system::error_code& ec, std::size_t& bytes_transferred);
 95
 96  // Get output data to be written to the transport.
 97  BOOST_ASIO_DECL boost::asio::mutable_buffers_1 get_output(
 98      const boost::asio::mutable_buffer& data);
 99
100  // Put input data that was read from the transport.
101  BOOST_ASIO_DECL boost::asio::const_buffer put_input(
102      const boost::asio::const_buffer& data);
103
104  // Map an error::eof code returned by the underlying transport according to
105  // the type and state of the SSL session. Returns a const reference to the
106  // error code object, suitable for passing to a completion handler.
107  BOOST_ASIO_DECL const boost::system::error_code& map_error_code(
108      boost::system::error_code& ec) const;
109
110private:
111  // Disallow copying and assignment.
112  engine(const engine&);
113  engine& operator=(const engine&);
114
115  // Callback used when the SSL implementation wants to verify a certificate.
116  BOOST_ASIO_DECL static int verify_callback_function(
117      int preverified, X509_STORE_CTX* ctx);
118
119  // The SSL_accept function may not be thread safe. This mutex is used to
120  // protect all calls to the SSL_accept function.
121  BOOST_ASIO_DECL static boost::asio::detail::static_mutex& accept_mutex();
122
123  // Perform one operation. Returns >= 0 on success or error, want_read if the
124  // operation needs more input, or want_write if it needs to write some output
125  // before the operation can complete.
126  BOOST_ASIO_DECL want perform(int (engine::* op)(void*, std::size_t),
127      void* data, std::size_t length, boost::system::error_code& ec,
128      std::size_t* bytes_transferred);
129
130  // Adapt the SSL_accept function to the signature needed for perform().
131  BOOST_ASIO_DECL int do_accept(void*, std::size_t);
132
133  // Adapt the SSL_connect function to the signature needed for perform().
134  BOOST_ASIO_DECL int do_connect(void*, std::size_t);
135
136  // Adapt the SSL_shutdown function to the signature needed for perform().
137  BOOST_ASIO_DECL int do_shutdown(void*, std::size_t);
138
139  // Adapt the SSL_read function to the signature needed for perform().
140  BOOST_ASIO_DECL int do_read(void* data, std::size_t length);
141
142  // Adapt the SSL_write function to the signature needed for perform().
143  BOOST_ASIO_DECL int do_write(void* data, std::size_t length);
144
145  SSL* ssl_;
146  BIO* ext_bio_;
147};
148
149#endif // !defined(BOOST_ASIO_ENABLE_OLD_SSL)
150
151} // namespace detail
152} // namespace ssl
153} // namespace asio
154} // namespace boost
155
156#include <boost/asio/detail/pop_options.hpp>
157
158#if defined(BOOST_ASIO_HEADER_ONLY)
159# include <boost/asio/ssl/detail/impl/engine.ipp>
160#endif // defined(BOOST_ASIO_HEADER_ONLY)
161
162#endif // BOOST_ASIO_SSL_DETAIL_ENGINE_HPP