1// Copyright (c) 2006-2009 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_CLIENT_SOCKET_H_
6#define NET_SOCKET_SSL_CLIENT_SOCKET_H_
7#pragma once
8
9#include <string>
10
11#include "net/base/completion_callback.h"
12#include "net/base/load_flags.h"
13#include "net/base/net_errors.h"
14#include "net/socket/client_socket.h"
15
16namespace net {
17
18class SSLCertRequestInfo;
19class SSLHostInfo;
20class SSLInfo;
21struct RRResponse;
22
23// DNSSECProvider is an interface to an object that can return DNSSEC data.
24class DNSSECProvider {
25 public:
26  // GetDNSSECRecords will either:
27  //   1) set |*out| to NULL and return OK.
28  //   2) set |*out| to a pointer, which is owned by this object, and return OK.
29  //   3) return IO_PENDING and call |callback| on the current MessageLoop at
30  //      some point in the future. Once the callback has been made, this
31  //      function will return OK if called again.
32  virtual int GetDNSSECRecords(RRResponse** out,
33                               CompletionCallback* callback) = 0;
34
35 private:
36  ~DNSSECProvider() {}
37};
38
39// A client socket that uses SSL as the transport layer.
40//
41// NOTE: The SSL handshake occurs within the Connect method after a TCP
42// connection is established.  If a SSL error occurs during the handshake,
43// Connect will fail.
44//
45class SSLClientSocket : public ClientSocket {
46 public:
47  SSLClientSocket();
48
49  // Next Protocol Negotiation (NPN) allows a TLS client and server to come to
50  // an agreement about the application level protocol to speak over a
51  // connection.
52  enum NextProtoStatus {
53    // WARNING: These values are serialised to disk. Don't change them.
54
55    kNextProtoUnsupported = 0,  // The server doesn't support NPN.
56    kNextProtoNegotiated = 1,   // We agreed on a protocol.
57    kNextProtoNoOverlap = 2,    // No protocols in common. We requested
58                                // the first protocol in our list.
59  };
60
61  // Next Protocol Negotiation (NPN), if successful, results in agreement on an
62  // application-level string that specifies the application level protocol to
63  // use over the TLS connection. NextProto enumerates the application level
64  // protocols that we recognise.
65  enum NextProto {
66    kProtoUnknown = 0,
67    kProtoHTTP11 = 1,
68    kProtoSPDY1 = 2,
69    kProtoSPDY2 = 3,
70  };
71
72  // Gets the SSL connection information of the socket.
73  virtual void GetSSLInfo(SSLInfo* ssl_info) = 0;
74
75  // Gets the SSL CertificateRequest info of the socket after Connect failed
76  // with ERR_SSL_CLIENT_AUTH_CERT_NEEDED.
77  virtual void GetSSLCertRequestInfo(
78      SSLCertRequestInfo* cert_request_info) = 0;
79
80  // Get the application level protocol that we negotiated with the server.
81  // *proto is set to the resulting protocol (n.b. that the string may have
82  // embedded NULs).
83  //   kNextProtoUnsupported: *proto is cleared.
84  //   kNextProtoNegotiated:  *proto is set to the negotiated protocol.
85  //   kNextProtoNoOverlap:   *proto is set to the first protocol in the
86  //                          supported list.
87  virtual NextProtoStatus GetNextProto(std::string* proto) = 0;
88
89  static NextProto NextProtoFromString(const std::string& proto_string);
90
91  static bool IgnoreCertError(int error, int load_flags);
92
93  virtual bool was_npn_negotiated() const;
94
95  virtual bool set_was_npn_negotiated(bool negotiated);
96
97  virtual void UseDNSSEC(DNSSECProvider*) { }
98
99  virtual bool was_spdy_negotiated() const;
100
101  virtual bool set_was_spdy_negotiated(bool negotiated);
102
103 private:
104  // True if NPN was responded to, independent of selecting SPDY or HTTP.
105  bool was_npn_negotiated_;
106  // True if NPN successfully negotiated SPDY.
107  bool was_spdy_negotiated_;
108};
109
110}  // namespace net
111
112#endif  // NET_SOCKET_SSL_CLIENT_SOCKET_H_
113