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 "nsAutoPtr.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
20                             , public nsITLSServerSocket
21 {
22 public:
23   NS_DECL_ISUPPORTS_INHERITED
24   NS_FORWARD_NSISERVERSOCKET(nsServerSocket::)
25   NS_DECL_NSITLSSERVERSOCKET
26 
27   // Override methods from nsServerSocket
28   virtual void CreateClientTransport(PRFileDesc* clientFD,
29                                      const NetAddr& clientAddr) override;
30   virtual nsresult SetSocketDefaults() override;
31   virtual nsresult OnSocketListen() override;
32 
33   TLSServerSocket();
34 
35 private:
36   virtual ~TLSServerSocket();
37 
38   static SECStatus AuthCertificateHook(void* arg, PRFileDesc* fd,
39                                        PRBool checksig, PRBool isServer);
40 
41   nsCOMPtr<nsIX509Cert>                  mServerCert;
42 };
43 
44 class TLSServerConnectionInfo : public nsITLSServerConnectionInfo
45                               , public nsITLSClientStatus
46 {
47   friend class TLSServerSocket;
48 
49 public:
50   NS_DECL_THREADSAFE_ISUPPORTS
51   NS_DECL_NSITLSSERVERCONNECTIONINFO
52   NS_DECL_NSITLSCLIENTSTATUS
53 
54   TLSServerConnectionInfo();
55 
56 private:
57   virtual ~TLSServerConnectionInfo();
58 
59   static void HandshakeCallback(PRFileDesc* aFD, void* aArg);
60   nsresult HandshakeCallback(PRFileDesc* aFD);
61 
62   RefPtr<TLSServerSocket>              mServerSocket;
63   // Weak ref to the transport, to avoid cycles since the transport holds a
64   // reference to the TLSServerConnectionInfo object.  This is not handed out to
65   // anyone, and is only used in HandshakeCallback to close the transport in
66   // case of an error.  After this, it's set to nullptr.
67   nsISocketTransport*                    mTransport;
68   nsCOMPtr<nsIX509Cert>                  mPeerCert;
69   int16_t                                mTlsVersionUsed;
70   nsCString                              mCipherName;
71   uint32_t                               mKeyLength;
72   uint32_t                               mMacLength;
73   // lock protects access to mSecurityObserver
74   mozilla::Mutex                         mLock;
75   nsCOMPtr<nsITLSServerSecurityObserver> mSecurityObserver;
76 };
77 
78 } // namespace net
79 } // namespace mozilla
80 
81 #endif // mozilla_net_TLSServerSocket_h
82