1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef NET_SOCKET_SSL_SERVER_SOCKET_H_
6#define NET_SOCKET_SSL_SERVER_SOCKET_H_
7
8#include "base/basictypes.h"
9#include "base/memory/scoped_ptr.h"
10#include "net/base/completion_callback.h"
11#include "net/base/net_export.h"
12#include "net/socket/ssl_socket.h"
13#include "net/socket/stream_socket.h"
14
15namespace crypto {
16class RSAPrivateKey;
17}  // namespace crypto
18
19namespace net {
20
21struct SSLConfig;
22class X509Certificate;
23
24class SSLServerSocket : public SSLSocket {
25 public:
26  virtual ~SSLServerSocket() {}
27
28  // Perform the SSL server handshake, and notify the supplied callback
29  // if the process completes asynchronously.  If Disconnect is called before
30  // completion then the callback will be silently, as for other StreamSocket
31  // calls.
32  virtual int Handshake(const CompletionCallback& callback) = 0;
33};
34
35// Configures the underlying SSL library for the use of SSL server sockets.
36//
37// Due to the requirements of the underlying libraries, this should be called
38// early in process initialization, before any SSL socket, client or server,
39// has been used.
40//
41// Note: If a process does not use SSL server sockets, this call may be
42// omitted.
43NET_EXPORT void EnableSSLServerSockets();
44
45// Creates an SSL server socket over an already-connected transport socket.
46// The caller must provide the server certificate and private key to use.
47//
48// The returned SSLServerSocket takes ownership of |socket|.  Stubbed versions
49// of CreateSSLServerSocket will delete |socket| and return NULL.
50// It takes a reference to |certificate|.
51// The |key| and |ssl_config| parameters are copied.  |key| cannot be const
52// because the methods used to copy its contents are non-const.
53//
54// The caller starts the SSL server handshake by calling Handshake on the
55// returned socket.
56NET_EXPORT scoped_ptr<SSLServerSocket> CreateSSLServerSocket(
57    scoped_ptr<StreamSocket> socket,
58    X509Certificate* certificate,
59    crypto::RSAPrivateKey* key,
60    const SSLConfig& ssl_config);
61
62}  // namespace net
63
64#endif  // NET_SOCKET_SSL_SERVER_SOCKET_H_
65