tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

TLSServerSocket.h (2633B)


      1 /* vim:set ts=2 sw=2 et cindent: */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 #ifndef mozilla_net_TLSServerSocket_h
      7 #define mozilla_net_TLSServerSocket_h
      8 
      9 #include "nsIInterfaceRequestor.h"
     10 #include "nsITLSServerSocket.h"
     11 #include "nsServerSocket.h"
     12 #include "nsString.h"
     13 #include "mozilla/Mutex.h"
     14 #include "seccomon.h"
     15 
     16 namespace mozilla {
     17 namespace net {
     18 
     19 class TLSServerSocket final : public nsServerSocket, public nsITLSServerSocket {
     20 public:
     21  NS_DECL_ISUPPORTS_INHERITED
     22  NS_FORWARD_NSISERVERSOCKET(nsServerSocket::)
     23  NS_DECL_NSITLSSERVERSOCKET
     24 
     25  // Override methods from nsServerSocket
     26  virtual void CreateClientTransport(PRFileDesc* clientFD,
     27                                     const NetAddr& clientAddr) override;
     28  virtual nsresult SetSocketDefaults() override;
     29  virtual nsresult OnSocketListen() override;
     30 
     31  TLSServerSocket() = default;
     32 
     33 private:
     34  virtual ~TLSServerSocket() = default;
     35 
     36  static SECStatus AuthCertificateHook(void* arg, PRFileDesc* fd,
     37                                       PRBool checksig, PRBool isServer);
     38 
     39  nsCOMPtr<nsIX509Cert> mServerCert;
     40 };
     41 
     42 class TLSServerConnectionInfo : public nsITLSServerConnectionInfo,
     43                                public nsITLSClientStatus,
     44                                public nsIInterfaceRequestor {
     45  friend class TLSServerSocket;
     46 
     47 public:
     48  NS_DECL_THREADSAFE_ISUPPORTS
     49  NS_DECL_NSITLSSERVERCONNECTIONINFO
     50  NS_DECL_NSITLSCLIENTSTATUS
     51  NS_DECL_NSIINTERFACEREQUESTOR
     52 
     53  TLSServerConnectionInfo() = default;
     54 
     55 private:
     56  virtual ~TLSServerConnectionInfo();
     57 
     58  static void HandshakeCallback(PRFileDesc* aFD, void* aArg);
     59  nsresult HandshakeCallback(PRFileDesc* aFD);
     60 
     61  RefPtr<TLSServerSocket> mServerSocket;
     62  // Weak ref to the transport, to avoid cycles since the transport holds a
     63  // reference to the TLSServerConnectionInfo object.  This is not handed out to
     64  // anyone, and is only used in HandshakeCallback to close the transport in
     65  // case of an error.  After this, it's set to nullptr.
     66  nsISocketTransport* mTransport{nullptr};
     67  nsCOMPtr<nsIX509Cert> mPeerCert;
     68  int16_t mTlsVersionUsed{TLS_VERSION_UNKNOWN};
     69  nsCString mCipherName;
     70  uint32_t mKeyLength{0};
     71  uint32_t mMacLength{0};
     72  // lock protects access to mSecurityObserver
     73  mozilla::Mutex mLock{"TLSServerConnectionInfo.mLock"};
     74  nsCOMPtr<nsITLSServerSecurityObserver> mSecurityObserver
     75      MOZ_GUARDED_BY(mLock);
     76 };
     77 
     78 }  // namespace net
     79 }  // namespace mozilla
     80 
     81 #endif  // mozilla_net_TLSServerSocket_h