| /* | 
 |  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #ifndef WEBRTC_BASE_SSLSTREAMADAPTERHELPER_H_ | 
 | #define WEBRTC_BASE_SSLSTREAMADAPTERHELPER_H_ | 
 |  | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include "webrtc/base/buffer.h" | 
 | #include "webrtc/base/stream.h" | 
 | #include "webrtc/base/sslidentity.h" | 
 | #include "webrtc/base/sslstreamadapter.h" | 
 |  | 
 | namespace rtc { | 
 |  | 
 | // SSLStreamAdapterHelper : A stream adapter which implements much | 
 | // of the logic that is common between the known implementations | 
 | // (NSS and OpenSSL) | 
 | class SSLStreamAdapterHelper : public SSLStreamAdapter { | 
 |  public: | 
 |   explicit SSLStreamAdapterHelper(StreamInterface* stream) | 
 |       : SSLStreamAdapter(stream), | 
 |         state_(SSL_NONE), | 
 |         role_(SSL_CLIENT), | 
 |         ssl_error_code_(0),  // Not meaningful yet | 
 |         ssl_mode_(SSL_MODE_TLS) {} | 
 |  | 
 |  | 
 |   // Overrides of SSLStreamAdapter | 
 |   virtual void SetIdentity(SSLIdentity* identity); | 
 |   virtual void SetServerRole(SSLRole role = SSL_SERVER); | 
 |   virtual void SetMode(SSLMode mode); | 
 |  | 
 |   virtual int StartSSLWithServer(const char* server_name); | 
 |   virtual int StartSSLWithPeer(); | 
 |  | 
 |   virtual bool SetPeerCertificateDigest(const std::string& digest_alg, | 
 |                                         const unsigned char* digest_val, | 
 |                                         size_t digest_len); | 
 |   virtual bool GetPeerCertificate(SSLCertificate** cert) const; | 
 |   virtual StreamState GetState() const; | 
 |   virtual void Close(); | 
 |  | 
 |  protected: | 
 |   // Internal helper methods | 
 |   // The following method returns 0 on success and a negative | 
 |   // error code on failure. The error code may be either -1 or | 
 |   // from the impl on some other error cases, so it can't really be | 
 |   // interpreted unfortunately. | 
 |  | 
 |   // Perform SSL negotiation steps. | 
 |   int ContinueSSL(); | 
 |  | 
 |   // Error handler helper. signal is given as true for errors in | 
 |   // asynchronous contexts (when an error code was not returned | 
 |   // through some other method), and in that case an SE_CLOSE event is | 
 |   // raised on the stream with the specified error. | 
 |   // A 0 error means a graceful close, otherwise there is not really enough | 
 |   // context to interpret the error code. | 
 |   virtual void Error(const char* context, int err, bool signal); | 
 |  | 
 |   // Must be implemented by descendents | 
 |   virtual int BeginSSL() = 0; | 
 |   virtual void Cleanup() = 0; | 
 |   virtual bool GetDigestLength(const std::string& algorithm, | 
 |                                size_t* length) = 0; | 
 |  | 
 |   enum SSLState { | 
 |     // Before calling one of the StartSSL methods, data flows | 
 |     // in clear text. | 
 |     SSL_NONE, | 
 |     SSL_WAIT,  // waiting for the stream to open to start SSL negotiation | 
 |     SSL_CONNECTING,  // SSL negotiation in progress | 
 |     SSL_CONNECTED,  // SSL stream successfully established | 
 |     SSL_ERROR,  // some SSL error occurred, stream is closed | 
 |     SSL_CLOSED  // Clean close | 
 |   }; | 
 |  | 
 |   // MSG_MAX is the maximum generic stream message number. | 
 |   enum { MSG_DTLS_TIMEOUT = MSG_MAX + 1 }; | 
 |  | 
 |   SSLState state_; | 
 |   SSLRole role_; | 
 |   int ssl_error_code_;  // valid when state_ == SSL_ERROR | 
 |  | 
 |   // Our key and certificate, mostly useful in peer-to-peer mode. | 
 |   scoped_ptr<SSLIdentity> identity_; | 
 |   // in traditional mode, the server name that the server's certificate | 
 |   // must specify. Empty in peer-to-peer mode. | 
 |   std::string ssl_server_name_; | 
 |   // The peer's certificate. Only used for GetPeerCertificate. | 
 |   scoped_ptr<SSLCertificate> peer_certificate_; | 
 |  | 
 |   // The digest of the certificate that the peer must present. | 
 |   Buffer peer_certificate_digest_value_; | 
 |   std::string peer_certificate_digest_algorithm_; | 
 |  | 
 |   // Do DTLS or not | 
 |   SSLMode ssl_mode_; | 
 |  | 
 |  private: | 
 |   // Go from state SSL_NONE to either SSL_CONNECTING or SSL_WAIT, | 
 |   // depending on whether the underlying stream is already open or | 
 |   // not. Returns 0 on success and a negative value on error. | 
 |   int StartSSL(); | 
 | }; | 
 |  | 
 | }  // namespace rtc | 
 |  | 
 | #endif  // WEBRTC_BASE_SSLSTREAMADAPTERHELPER_H_ |