Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cSSLCommon.h
Go to the documentation of this file.
1 //
4 //
5 #ifndef _INC_cSSLCommon_H
6 #define _INC_cSSLCommon_H
7 #ifndef NO_PRAGMA_ONCE
8 #pragma once
9 #endif
10 #include "cSSLConfig.h"
11 #include "cSSLHandshake.h"
12 #include "cSSLTransform.h"
13 #include "cSSLDebug.h"
14 
16 #include "GrayLib/include/Cipher/cCipherAES.h" // for session tickets
18 #if defined(USE_Key_EC)
20 #endif
22 #include "GrayCore/include/cMem.h"
23 
24 // aggregate config for convenience
25 #if defined(USE_SSL_KeyExchange_PSK) || \
26  defined(USE_SSL_KeyExchange_RSA_PSK) || \
27  defined(USE_SSL_KeyExchange_DHE_PSK) || \
28  defined(USE_SSL_KeyExchange_ECDHE_PSK)
29 #define USE_SSL_KeyExchange_PSK_SOME
30 #endif
31 
32 #if defined(USE_SSL_KeyExchange_ECDHE_RSA) || \
33  defined(USE_SSL_KeyExchange_ECDHE_ECDSA) || \
34  defined(USE_SSL_KeyExchange_ECDHE_PSK)
35 #define USE_SSL_KeyExchange_ECDHE_SOME
36 #endif
37 
38 #if defined(USE_SSL_KeyExchange_RSA) || \
39  defined(USE_SSL_KeyExchange_DHE_RSA) || \
40  defined(USE_SSL_KeyExchange_ECDHE_RSA) || \
41  defined(USE_SSL_KeyExchange_ECDHE_ECDSA) || \
42  defined(USE_SSL_KeyExchange_RSA_PSK) || \
43  defined(USE_SSL_KeyExchange_ECDHE_PSK) || \
44  defined(USE_SSL_KeyExchange_ECDH_RSA) || \
45  defined(USE_SSL_KeyExchange_ECDH_ECDSA)
46 #define USE_SSL_KeyExchange_Cert_SOME // NOT SSL_KeyExchange_PSK or SSL_KeyExchange_DHE_PSK
47 #endif
48 
49 namespace GraySSL
50 {
52  {
55  SSL_INITIAL_HANDSHAKE = 0, // Normal first handshake.
56  SSL_RENEGOTIATION = 1, // In progress
58  SSL_RENEGOTIATION_PENDING = 3, // Requested (server only)
59  };
60 
61  class GRAYSSL_LINK cSSLCommon : public cStream, public cSSL
62  {
65 
66  public:
68  const bool m_bThisIsServer;
69  const cSSLConfig& m_Cfg;
70 
71  private:
72  SSL_STATE_TYPE m_eState;
73 
74  public:
76 
79 
81 #if defined(USE_SSL_RENEGOTIATION)
82  SSL_RENEGOTIATION_TYPE m_eRenegotiation;
83  int m_nRenegoRecordsSeen;
84 #endif
85 
87 
88  // Session layer
93 
94  // Record layer transformations
99 
100  // Record layer (incoming data)
101  cSSLMsgBuilder m_in; // (in_iv+ivlen)
102  size_t m_nInReadPos;
103 
104  // Record layer (outgoing data)
106 
108 
109  // User settings
112 
114  const char* m_pszAlpnChosen;
115 
116 #if defined(USE_SSL_KeyExchange_PSK_SOME)
117  // PSK values
118  cHeapBlock m_PSK; // k_PSK_Size_Max
120 #endif
121 
122 #if defined(USE_SSL_VER_SSL_3)
123  static const int k_VERIFY_DATA_MAX_LEN = 36;
124 #else
125  static const int k_VERIFY_DATA_MAX_LEN = 12;
126 #endif
127 
128 #if defined(USE_SSL_RENEGOTIATION)
129  BYTE m_VerifyDataOwn[k_VERIFY_DATA_MAX_LEN];
130 #endif
131 
133  BYTE m_VerifyDataPeer[k_VERIFY_DATA_MAX_LEN];
134 
135 #if defined(USE_SSL_CBC_RECORD_SPLITTING)
137 #endif
138 
139 #if defined(USE_SSL_X509_CRT_PARSE)
141  const char* m_pszPeerCN;
142 #endif // USE_SSL_X509_CRT_PARSE
143 
144  protected:
145  cSSLCommon(bool bEndpointIsServer, const cSSLConfig& rOpts) noexcept;
146  virtual ~cSSLCommon();
147 
148  HRESULT ReturnError(HRESULT hRes, const char* pszMsg) const;
149 
150  SSL_STATE_TYPE get_State() const noexcept
151  {
152  return m_eState;
153  }
154  void put_State(SSL_STATE_TYPE e) noexcept
155  {
156  m_eState = e;;
157  }
159  {
160  m_eState = (SSL_STATE_TYPE)(m_eState + 1);
161  ASSERT(m_eState == e);
162  }
163 
164  public:
165  HRESULT InitSSL();
166  void state_SSL_HANDSHAKE_WRAPUP();
167 
168  void AttachStreams(cStreamInput* pReader, cStreamOutput* pWriter) noexcept
169  {
173  this->m_pReader = pReader;
174  this->m_pWriter = pWriter;
175  }
176 
177  virtual void SetSessionClear();
178 
179  HRESULT write_SSL_MSG_ALERT(SSL_ALERT_LEVEL_TYPE level, SSL_ALERT_TYPE message);
180 
181  const char* get_AlpnChosen() const noexcept
182  {
186  return this->m_pszAlpnChosen;
187  }
188 
189  bool isStateHandshake() const noexcept
190  {
192  return m_eState < SSL_HANDSHAKE_COMPLETE;
193  }
194 
195  HRESULT Handshake(bool bWait = false);
196 
199 
200  virtual HRESULT ProcessStreamPacket() = 0; // virtual entry point.
201 
202  HRESULT WriteMsgApp(const BYTE* buf, size_t len);
203 
204  protected:
205  HRESULT WriteFlush(bool bWait = false);
206  HRESULT WriteMsg(SSL_MSG_TYPE eMsg, size_t nContLength);
207 
208  HRESULT ReadFill(size_t nSizeExpect);
209  HRESULT ReadCheckHandshake();
210  HRESULT ReadMessage();
211  HRESULT ReadProcessCompleteMsg();
212 
213  HRESULT PrepareKeys();
214 
215  public:
216 #if defined(USE_SSL_CBC_RECORD_SPLITTING)
221 #endif // USE_SSL_CBC_RECORD_SPLITTING
222 
223  X509_Verify_t get_VerifyResults() const;
224 
225  const char* get_CipherSuiteStr() const;
226 
227  const char* get_VersionStr() const;
228 
229 #if defined(USE_SSL_X509_CRT_PARSE)
231 #endif // USE_SSL_X509_CRT_PARSE
232 
233  bool isRenegotiation() const noexcept
234  {
235 #if defined(USE_SSL_RENEGOTIATION)
236  return m_eRenegotiation != SSL_INITIAL_HANDSHAKE;
237 #else
238  return false;
239 #endif
240  }
241 
242 #if defined(USE_SSL_RENEGOTIATION)
243  HRESULT RenegotiationHandshake();
244 
250  //
251  HRESULT RenegotiationStart();
252  HRESULT RenegotiationTest();
253 
254 #endif // USE_SSL_RENEGOTIATION
255 
258  //
259  virtual STREAM_POS_t GetLength() const override;
260 
265  //
266  virtual HRESULT ReadX(OUT void* pData, size_t nDataSize) override;
267 
268  virtual size_t SetSeekSizeMin(size_t nSizeMin = k_FILE_BLOCK_SIZE) override;
269  virtual STREAM_SEEKRET_t Seek(STREAM_OFFSET_t iOffset, SEEK_ORIGIN_TYPE eSeekOrigin = SEEK_Set) override;
270 
271  //
276  //
280  //
284  //
285  virtual HRESULT WriteX(const void* pData, size_t nDataSize) override;
286 
288  HRESULT write_SSL_ALERT_SSL3_CLOSE_NOTIFY();
289 
290  HRESULT write_SSL_ALERT_SSL3_HANDSHAKE_FAILURE();
291 
292  size_t build_TLS_EXT_MaxFragmentLength(cSSLMsgHandExt* pExt, SSL_MAX_FRAG_TYPE eMaxFrag);
293 
294  HRESULT state_SSL_XXX_CERTIFICATE_r();
295  HRESULT state_SSL_XXX_CERTIFICATE_w();
296 
297  HRESULT state_SSL_XXX_CHANGE_CIPHER_SPEC_r();
298  HRESULT state_SSL_XXX_CHANGE_CIPHER_SPEC_w();
299 
300  HRESULT state_SSL_XXX_FINISHED_r();
301  HRESULT state_SSL_XXX_FINISHED_w();
302 
303  HRESULT InitHandshakeParams();
304 
305 #if defined(USE_SSL_KeyExchange_PSK_SOME)
307 #endif
308 
309 #if defined(USE_SSL_X509_CRT_PARSE)
310  inline cKeyWrap* get_OwnKeyPriv() const noexcept
311  {
312  return this->m_pHandshake->m_pKeyCrtHand == nullptr ? nullptr : &(this->m_pHandshake->m_pKeyCrtHand->m_KeyPriv) ;
313  }
314  inline cX509Crt* get_OwnCert() const noexcept
315  {
316  return this->m_pHandshake->m_pKeyCrtHand == nullptr ? nullptr : this->m_pHandshake->m_pKeyCrtHand->m_pCert ;
317  }
318 #endif
319 
320 #if defined(USE_SSL_RENEGOTIATION) && defined(USE_SSL_SERVER)
321  HRESULT write_SSL_HS_HELLO_REQUEST();
322 #endif
323 
324  };
325 }
326 #endif // _INC_SSL_H
#define GRAYSSL_LINK
Definition: GraySSLInt.h:25
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
Definition: cKeyWrap.h:25
Definition: cSSLMsg.h:471
Definition: cSSLMsg.h:139
Definition: cSSLSession.h:175
Definition: cX509Crt.h:20
Definition: cX509KeyCrtPair.h:16
cRefPtr< cX509Crt > m_pCert
public key cert
Definition: cX509KeyCrtPair.h:22
cKeyWrap m_KeyPriv
private key for m_pCert
Definition: cX509KeyCrtPair.h:23
Definition: cSSLCommon.h:62
bool m_bRenegotiationSupported
does peer support legacy or secure renegotiation TLS_EXT_renegotiation_info
Definition: cSSLCommon.h:80
bool m_bClientAuth
flag for client auth. client optionally supplies a cert if servers asks.
Definition: cSSLCommon.h:110
bool isStateHandshake() const noexcept
Definition: cSSLCommon.h:189
cSSLHandshake * m_pHandshake
params required only during the handshake SSL_STATE_TYPE(s)
Definition: cSSLCommon.h:86
cKeyWrap * get_OwnKeyPriv() const noexcept
Definition: cSSLCommon.h:310
cSSLSession * m_pSessionIn
current session data (in) from m_pSessionNegotiate
Definition: cSSLCommon.h:91
virtual HRESULT ProcessStreamPacket()=0
cHeapBlock m_PSKIdentity
Definition: cSSLCommon.h:119
cRefPtr< cX509Crt > get_PeerCert() const
cX509Crt * get_OwnCert() const noexcept
Definition: cSSLCommon.h:314
const cSSLConfig & m_Cfg
Behavior controls.
Definition: cSSLCommon.h:69
const char * get_AlpnChosen() const noexcept
Definition: cSSLCommon.h:181
const char * m_pszAlpnChosen
extension RFC 7301 Application Layer Protocol Negotiation.
Definition: cSSLCommon.h:114
cX509KeyCrtPair * m_pKeyCrtPair
my own certificate(s)/key(s) pair. Not freed. (server only)
Definition: cSSLCommon.h:140
cStreamOutput * m_pWriter
writing operations raw stream
Definition: cSSLCommon.h:78
cSSLSession * m_pSessionOut
current session data (out)
Definition: cSSLCommon.h:92
SSL_VERSION_TYPE m_nVer
Version selected. either 0 (SSL3) or 1 (TLS1.0)
Definition: cSSLCommon.h:75
void put_State(SSL_STATE_TYPE e) noexcept
Definition: cSSLCommon.h:154
bool isRenegotiation() const noexcept
Definition: cSSLCommon.h:233
cSSLSession * m_pSessionCur
negotiated session data. swapped from m_pSessionNegotiate
Definition: cSSLCommon.h:90
cSSLTransform * m_pTransformCur
negotiated transform params. swapped from m_pTransformNegotiate
Definition: cSSLCommon.h:96
cSSLMsgBuilder m_out
message contents (out_iv+ivlen)
Definition: cSSLCommon.h:105
cHeapBlock m_PSK
Definition: cSSLCommon.h:118
const cObjectSignature m_SigCommon
All DLL consumers must agree this is the same. sizeof(*this)
Definition: cSSLCommon.h:67
const bool m_bThisIsServer
true = cSSLServer else cSSLClient
Definition: cSSLCommon.h:68
X509_Verify_t m_eVerifyResults
verification result for cert.
Definition: cSSLCommon.h:111
size_t m_nInReadPos
caller ReadX() offset in application data m_in.m_pMsg
Definition: cSSLCommon.h:102
cSSLTransform * m_pTransformOut
current transform params (in)
Definition: cSSLCommon.h:98
size_t m_nVerifyDataSize
length of verify data stored. <= k_VERIFY_DATA_MAX_LEN
Definition: cSSLCommon.h:132
BITOP_TYPE m_nCBCRecordSplitOp
flag for record splitting: BITOP_TOGGLE=disabled, BITOP_CLR=todo, BITOP_SET= done
Definition: cSSLCommon.h:136
SSL_STATE_TYPE get_State() const noexcept
Definition: cSSLCommon.h:150
cSSLMsgBuilder m_in
Definition: cSSLCommon.h:101
cSSLTransform * m_pTransformNegotiate
transform params in negotiation. Move to m_pHandshake ?
Definition: cSSLCommon.h:95
cStreamInput * m_pReader
reading operations raw stream
Definition: cSSLCommon.h:77
void IncState1(SSL_STATE_TYPE e)
Definition: cSSLCommon.h:158
cSSLSession * m_pSessionNegotiate
session data in negotiation. Move to m_pHandshake ?
Definition: cSSLCommon.h:89
cSSLTransform * m_pTransformIn
current transform params (in) from m_pTransformNegotiate
Definition: cSSLCommon.h:97
HRESULT BuildKeyExPremasterPSK(SSL_KeyExchange_TYPE key_ex)
void AttachStreams(cStreamInput *pReader, cStreamOutput *pWriter) noexcept
Definition: cSSLCommon.h:168
const char * m_pszPeerCN
expected peer CN in case we check this against cert.
Definition: cSSLCommon.h:141
int m_nEmptyMessages
count # of 0-length encrypted messages. Watch for DoS.
Definition: cSSLCommon.h:107
void put_CBCRecordSplitOp(BITOP_TYPE split)
Definition: cSSLConfig.h:46
Definition: cSSLHandshake.h:78
cX509KeyCrtPair * m_pKeyCrtHand
Definition: cSSLHandshake.h:105
Definition: cSSLTransform.h:44
Definition: cHeap.h:156
Definition: cObject.h:22
Definition: cRefPtr.h:225
Definition: cStream.h:306
Definition: cStream.h:126
Definition: cStream.h:456
X509_Verify_t
Definition: cX509.h:41
SSL_MAX_FRAG_TYPE
Definition: SSLTypes.h:170
SSL_MSG_TYPE
Definition: SSLTypes.h:45
SSL_ALERT_TYPE
Definition: SSLTypes.h:235
SSL_KeyExchange_TYPE
Definition: SSLTypes.h:113
SSL_VERSION_TYPE
Definition: SSLTypes.h:66
SSL_STATE_TYPE
Definition: SSLTypes.h:20
@ SSL_HANDSHAKE_COMPLETE
Definition: SSLTypes.h:40
SSL_ALERT_LEVEL_TYPE
Definition: SSLTypes.h:227
Definition: GraySSL.cpp:11
SSL_RENEGOTIATION_TYPE
Definition: cSSLCommon.h:52
@ SSL_RENEGOTIATION
Definition: cSSLCommon.h:56
@ SSL_RENEGOTIATION_DONE
Definition: cSSLCommon.h:57
@ SSL_RENEGOTIATION_PENDING
Definition: cSSLCommon.h:58
@ SSL_INITIAL_HANDSHAKE
Definition: cSSLCommon.h:55
LONG_PTR STREAM_OFFSET_t
Might be 64 or 32 bit. TODO SET USE_FILE_POS64.
Definition: cOSHandle.h:52
BITOP_TYPE
Definition: cBits.h:22
LONG_PTR STREAM_SEEKRET_t
return from Seek()
Definition: cOSHandle.h:53
ULONG_PTR STREAM_POS_t
NOT same as FILE_SIZE_t in 32 bit. Why not ?
Definition: cOSHandle.h:54
SEEK_ORIGIN_TYPE
Definition: cOSHandle.h:34
@ SEEK_Set
SEEK_SET = FILE_BEGIN = STREAM_SEEK_SET = 0 = relative to the start of the file.
Definition: cOSHandle.h:39
Definition: SSLTypes.h:270