1 #ifndef SRC_NODE_CRYPTO_CLIENTHELLO_H_
2 #define SRC_NODE_CRYPTO_CLIENTHELLO_H_
6 #include <stddef.h> // size_t
7 #include <stdlib.h> // nullptr
11 class ClientHelloParser {
13 ClientHelloParser() : state_(kEnded),
23 tls_ticket_(nullptr) {
29 inline uint8_t session_size() const { return session_size_; }
30 inline const uint8_t* session_id() const { return session_id_; }
31 inline bool has_ticket() const { return has_ticket_; }
32 inline uint8_t servername_size() const { return servername_size_; }
33 inline const uint8_t* servername() const { return servername_; }
34 inline int ocsp_request() const { return ocsp_request_; }
37 uint8_t session_size_;
38 const uint8_t* session_id_;
40 uint8_t servername_size_;
41 const uint8_t* servername_;
44 friend class ClientHelloParser;
47 typedef void (*OnHelloCb)(void* arg, const ClientHello& hello);
48 typedef void (*OnEndCb)(void* arg);
50 void Parse(const uint8_t* data, size_t avail);
53 inline void Start(OnHelloCb onhello_cb, OnEndCb onend_cb, void* onend_arg);
55 inline bool IsPaused() const;
56 inline bool IsEnded() const;
59 static const size_t kMaxTLSFrameLen = 16 * 1024 + 5;
60 static const size_t kMaxSSLExFrameLen = 32 * 1024;
61 static const uint8_t kServernameHostname = 0;
62 static const uint8_t kStatusRequestOCSP = 1;
63 static const size_t kMinStatusRequestSize = 5;
73 kChangeCipherSpec = 20,
76 kApplicationData = 23,
87 kTLSSessionTicket = 35
90 bool ParseRecordHeader(const uint8_t* data, size_t avail);
91 void ParseHeader(const uint8_t* data, size_t avail);
92 void ParseExtension(ExtensionType type,
95 bool ParseTLSClientHello(const uint8_t* data, size_t avail);
98 OnHelloCb onhello_cb_;
103 size_t extension_offset_;
104 uint8_t session_size_;
105 const uint8_t* session_id_;
106 uint16_t servername_size_;
107 const uint8_t* servername_;
108 uint8_t ocsp_request_;
109 uint16_t tls_ticket_size_;
110 const uint8_t* tls_ticket_;
115 #endif // SRC_NODE_CRYPTO_CLIENTHELLO_H_