source: filezilla/trunk/fuentes/src/engine/tlssocket.h @ 3185

Last change on this file since 3185 was 3185, checked in by jrpelegrina, 3 years ago

Update new version: 3.15.02

File size: 3.6 KB
Line 
1#ifndef __TLSSOCKET_H__
2#define __TLSSOCKET_H__
3
4#include <gnutls/gnutls.h>
5#include "backend.h"
6#include "socket.h"
7
8class CControlSocket;
9class CTlsSocket final : protected fz::event_handler, public CBackend
10{
11public:
12        enum class TlsState
13        {
14                noconn,
15                handshake,
16                verifycert,
17                conn,
18                closing,
19                closed
20        };
21
22        CTlsSocket(fz::event_handler* pEvtHandler, CSocket& pSocket, CControlSocket* pOwner);
23        virtual ~CTlsSocket();
24
25        bool Init();
26        void Uninit();
27
28        int Handshake(const CTlsSocket* pPrimarySocket = 0, bool try_resume = 0);
29
30        virtual int Read(void *buffer, unsigned int size, int& error);
31        virtual int Peek(void *buffer, unsigned int size, int& error);
32        virtual int Write(const void *buffer, unsigned int size, int& error);
33
34        int Shutdown();
35
36        void TrustCurrentCert(bool trusted);
37
38        TlsState GetState() const { return m_tlsState; }
39
40        wxString GetProtocolName();
41        wxString GetKeyExchange();
42        wxString GetCipherName();
43        wxString GetMacName();
44        int GetAlgorithmWarnings();
45
46        bool ResumedSession() const;
47
48        static wxString ListTlsCiphers(wxString priority);
49
50        bool SetClientCertificate(fz::native_string const& keyfile, fz::native_string const& certs, fz::native_string const& password);
51protected:
52
53        bool InitSession();
54        void UninitSession();
55        bool CopySessionData(const CTlsSocket* pPrimarySocket);
56
57        virtual void OnRateAvailable(CRateLimiter::rate_direction direction);
58
59        int ContinueHandshake();
60        void ContinueShutdown();
61
62        int VerifyCertificate();
63        bool CertificateIsBlacklisted(std::vector<CCertificate> const& certificates);
64
65        TlsState m_tlsState{TlsState::noconn};
66
67        CControlSocket* m_pOwner{};
68
69        bool m_initialized{};
70        gnutls_session_t m_session{};
71
72        gnutls_certificate_credentials_t m_certCredentials{};
73
74        void LogError(int code, const wxString& function, MessageType logLegel = MessageType::Error);
75        void PrintAlert(MessageType logLevel);
76
77        // Failure logs the error, uninits the session and sends a close event
78        void Failure(int code, bool send_close, const wxString& function = wxString());
79
80        static ssize_t PushFunction(gnutls_transport_ptr_t ptr, const void* data, size_t len);
81        static ssize_t PullFunction(gnutls_transport_ptr_t ptr, void* data, size_t len);
82        ssize_t PushFunction(const void* data, size_t len);
83        ssize_t PullFunction(void* data, size_t len);
84
85        int DoCallGnutlsRecordRecv(void* data, size_t len);
86
87        void TriggerEvents();
88
89        virtual void operator()(fz::event_base const& ev);
90        void OnSocketEvent(CSocketEventSource* source, SocketEventType t, int error);
91
92        void OnRead();
93        void OnSend();
94
95        bool ExtractCert(gnutls_datum_t const* datum, CCertificate& out);
96        std::vector<wxString> GetCertSubjectAltNames(gnutls_x509_crt_t cert);
97
98        bool m_canReadFromSocket{true};
99        bool m_canWriteToSocket{true};
100        bool m_canCheckCloseSocket{false};
101
102        bool m_canTriggerRead{false};
103        bool m_canTriggerWrite{true};
104
105        bool m_socketClosed{};
106
107        CSocketBackend* m_pSocketBackend{};
108        CSocket& m_socket;
109
110        bool m_shutdown_requested{};
111
112        // Due to the strange gnutls_record_send semantics, call it again
113        // with 0 data and 0 length after GNUTLS_E_AGAIN and store the number
114        // of bytes written. These bytes get skipped on next write from the
115        // application.
116        // This avoids the rule to call it again with the -same- data after
117        // GNUTLS_E_AGAIN.
118        void CheckResumeFailedReadWrite();
119        bool m_lastReadFailed{true};
120        bool m_lastWriteFailed{false};
121        unsigned int m_writeSkip{};
122
123        // Peek data
124        char* m_peekData{};
125        unsigned int m_peekDataLen{};
126
127        gnutls_datum_t m_implicitTrustedCert;
128
129        bool m_socket_eof{};
130        int m_socket_error{ECONNABORTED}; // Set in the push and pull functions if reading/writing fails fatally
131};
132
133#endif //__TLSSOCKET_H__
Note: See TracBrowser for help on using the repository browser.