PcapPlusPlus  Next
SSLHandshake.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <utility>
4 #include <type_traits>
5 #include "SSLCommon.h"
6 #include "PointerVector.h"
7 #include "Asn1Codec.h"
8 #include "X509Decoder.h"
9 
12 
15 namespace pcpp
16 {
25  {
26  public:
35  SSLSymetricEncryptionAlgorithm symKeyAlg, SSLHashingAlgorithm MACAlg, const char* name)
36  : m_Id(id), m_KeyExAlg(keyExAlg), m_AuthAlg(authAlg), m_SymKeyAlg(symKeyAlg), m_MACAlg(MACAlg), m_Name(name)
37  {}
38 
40  uint16_t getID() const
41  {
42  return m_Id;
43  }
44 
46  std::string asString() const
47  {
48  return m_Name;
49  }
50 
53  {
54  return m_KeyExAlg;
55  }
56 
59  {
60  return m_AuthAlg;
61  }
62 
65  {
66  return m_SymKeyAlg;
67  }
68 
71  {
72  return m_MACAlg;
73  }
74 
78  static SSLCipherSuite* getCipherSuiteByID(uint16_t id);
79 
83  static SSLCipherSuite* getCipherSuiteByName(std::string name);
84 
85  private:
86  uint16_t m_Id;
87  SSLKeyExchangeAlgorithm m_KeyExAlg;
90  SSLHashingAlgorithm m_MACAlg;
91  std::string m_Name;
92  };
93 
99  {
100  public:
105  PCPP_DEPRECATED("Unbound memory span. Use the constructor with bounded span.")
106  explicit SSLExtension(uint8_t* data);
107 
121  SSLExtension(uint8_t* data, size_t dataLen);
122 
123  virtual ~SSLExtension() = default;
124 
127 
129  uint16_t getTypeAsInt() const;
130 
132  uint16_t getLength() const;
133 
135  uint16_t getTotalLength() const;
136 
138  uint8_t* getData() const;
139 
150  template <typename T, typename std::enable_if_t<std::is_base_of<SSLExtension, T>::value, bool> = true>
151  static std::unique_ptr<T> tryCreateExtension(uint8_t* data, size_t dataLen)
152  {
153  if (data == nullptr || dataLen < sizeof(SSLExtensionStruct))
154  {
155  return nullptr;
156  }
157 
158  auto* extStruct = reinterpret_cast<SSLExtensionStruct*>(data);
159  if (dataLen < sizeof(SSLExtensionStruct) + extStruct->getDataLength())
160  {
161  return nullptr;
162  }
163 
164  return std::make_unique<T>(data, dataLen);
165  }
166 
167  protected:
171  {
173  uint16_t extensionType;
177  uint8_t extensionData[];
178 
180  uint16_t getDataLength() const;
181  };
182 
183  uint8_t* m_RawData;
184  size_t m_RawDataLen;
185 
186  SSLExtensionStruct* getExtensionStruct() const
187  {
188  return reinterpret_cast<SSLExtensionStruct*>(m_RawData);
189  }
190  };
191 
196  {
197  public:
199 
201  std::string getHostName() const;
202  };
203 
208  {
209  public:
211 
213  std::vector<SSLVersion> getSupportedVersions() const;
214  };
215 
220  {
221  public:
223 
225  std::vector<uint16_t> getSupportedGroups() const;
226  };
227 
232  {
233  public:
235 
237  std::vector<uint8_t> getECPointFormatList() const;
238  };
239 
246  {
247  public:
254  SSLx509Certificate(uint8_t* data, size_t dataLen, bool allDataExists)
255  : m_Data(data), m_DataLen(dataLen), m_AllDataExists(allDataExists)
256  {}
257 
259  uint8_t* getData() const
260  {
261  return m_Data;
262  }
263 
265  size_t getDataLength() const
266  {
267  return m_DataLen;
268  }
269 
274 
278  std::unique_ptr<X509Certificate> getX509Certificate();
279 
283  bool allDataExists() const
284  {
285  return m_AllDataExists;
286  }
287 
288  private:
289  std::unique_ptr<Asn1Record> m_Asn1Record;
290  uint8_t* m_Data;
291  size_t m_DataLen;
292  bool m_AllDataExists;
293  };
294 
295  class SSLHandshakeLayer;
296 
304  {
305  public:
306  virtual ~SSLHandshakeMessage() = default;
307 
313  static SSLHandshakeMessage* createHandshakeMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container);
314 
317 
321  virtual size_t getMessageLength() const;
322 
327  virtual bool isMessageComplete() const;
328 
331  {
332  return m_Container;
333  }
334 
336  virtual std::string toString() const = 0;
337 
338  protected:
339  SSLHandshakeMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container);
340 
341  uint8_t* m_Data;
342  size_t m_DataLen;
343  SSLHandshakeLayer* m_Container;
344  };
345 
350  {
351  public:
359  {
361  uint16_t tlsVersion;
363  std::vector<uint16_t> cipherSuites;
365  std::vector<uint16_t> extensions;
367  std::vector<uint16_t> supportedGroups;
369  std::vector<uint8_t> ecPointFormats;
370 
380  std::string toString();
381 
383  std::string toMD5();
384 
387  std::pair<std::string, std::string> toStringAndMD5();
388  };
389 
395  SSLClientHelloMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container);
396 
397  ~SSLClientHelloMessage() override = default;
398 
402  {
403  return reinterpret_cast<ssl_tls_client_server_hello*>(m_Data);
404  }
405 
410 
412  uint8_t getSessionIDLength() const;
413 
416  uint8_t* getSessionID() const;
417 
419  int getCipherSuiteCount() const;
420 
427  SSLCipherSuite* getCipherSuite(int index) const;
428 
437  uint16_t getCipherSuiteID(int index, bool& isValid) const;
438 
440  uint8_t getCompressionMethodsValue() const;
441 
443  int getExtensionCount() const;
444 
447  uint16_t getExtensionsLength() const;
448 
454  SSLExtension* getExtension(int index) const;
455 
461  SSLExtension* getExtensionOfType(uint16_t type) const;
462 
467 
471  template <class TExtension> TExtension* getExtensionOfType() const;
472 
482 
483  // implement abstract methods
484 
485  std::string toString() const override;
486 
487  private:
488  PointerVector<SSLExtension> m_ExtensionList;
489  };
490 
495  {
496  public:
503  {
505  uint16_t tlsVersion;
507  uint16_t cipherSuite;
509  std::vector<uint16_t> extensions;
510 
516  std::string toString();
517 
519  std::string toMD5();
520 
523  std::pair<std::string, std::string> toStringAndMD5();
524  };
525 
531  SSLServerHelloMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container);
532 
533  ~SSLServerHelloMessage() override = default;
534 
538  {
539  return reinterpret_cast<ssl_tls_client_server_hello*>(m_Data);
540  }
541 
550 
552  uint8_t getSessionIDLength() const;
553 
556  uint8_t* getSessionID() const;
557 
563 
570  uint16_t getCipherSuiteID(bool& isValid) const;
571 
573  uint8_t getCompressionMethodsValue() const;
574 
576  int getExtensionCount() const;
577 
580  uint16_t getExtensionsLength() const;
581 
587  SSLExtension* getExtension(int index) const;
588 
594  SSLExtension* getExtensionOfType(uint16_t type) const;
595 
600 
604  template <class TExtension> TExtension* getExtensionOfType() const;
605 
616 
617  // implement abstract methods
618 
619  std::string toString() const override;
620 
621  private:
622  PointerVector<SSLExtension> m_ExtensionList;
623  };
624 
632  {
633  public:
639  SSLCertificateMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container);
640 
641  ~SSLCertificateMessage() override = default;
642 
648  int getNumOfCertificates() const;
649 
655 
656  // implement abstract methods
657 
658  std::string toString() const override;
659 
660  private:
661  PointerVector<SSLx509Certificate> m_CertificateList;
662  };
663 
668  {
669  public:
675  SSLHelloRequestMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
676  : SSLHandshakeMessage(data, dataLen, container)
677  {}
678 
679  ~SSLHelloRequestMessage() override = default;
680 
681  // implement abstract methods
682 
683  std::string toString() const override;
684  };
685 
691  {
692  public:
698  SSLServerKeyExchangeMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
699  : SSLHandshakeMessage(data, dataLen, container)
700  {}
701 
702  ~SSLServerKeyExchangeMessage() override = default;
703 
707  uint8_t* getServerKeyExchangeParams() const;
708 
714 
715  // implement abstract methods
716 
717  std::string toString() const override;
718  };
719 
725  {
726  public:
732  SSLClientKeyExchangeMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
733  : SSLHandshakeMessage(data, dataLen, container)
734  {}
735 
736  ~SSLClientKeyExchangeMessage() override = default;
737 
741  uint8_t* getClientKeyExchangeParams() const;
742 
748 
749  // implement abstract methods
750 
751  std::string toString() const override;
752  };
753 
758  {
759  public:
765  SSLCertificateRequestMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container);
766 
767  ~SSLCertificateRequestMessage() override = default;
768 
770  std::vector<SSLClientCertificateType>& getCertificateTypes();
771 
775  uint8_t* getCertificateAuthorityData() const;
776 
782 
783  // implement abstract methods
784 
785  std::string toString() const override;
786 
787  private:
788  std::vector<SSLClientCertificateType> m_ClientCertificateTypes;
789  };
790 
795  {
796  public:
802  SSLServerHelloDoneMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
803  : SSLHandshakeMessage(data, dataLen, container)
804  {}
805 
806  ~SSLServerHelloDoneMessage() override = default;
807 
808  // implement abstract methods
809 
810  std::string toString() const override;
811  };
812 
818  {
819  public:
825  SSLCertificateVerifyMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
826  : SSLHandshakeMessage(data, dataLen, container)
827  {}
828 
829  ~SSLCertificateVerifyMessage() override = default;
830 
834  uint8_t* getSignedHash() const;
835 
840  size_t getSignedHashLength() const;
841 
842  // implement abstract methods
843 
844  std::string toString() const override;
845  };
846 
852  {
853  public:
859  SSLFinishedMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
860  : SSLHandshakeMessage(data, dataLen, container)
861  {}
862 
863  ~SSLFinishedMessage() override = default;
864 
868  uint8_t* getSignedHash() const;
869 
874  size_t getSignedHashLength() const;
875 
876  // implement abstract methods
877 
878  std::string toString() const override;
879  };
880 
885  {
886  public:
892  SSLNewSessionTicketMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
893  : SSLHandshakeMessage(data, dataLen, container)
894  {}
895 
896  ~SSLNewSessionTicketMessage() override = default;
897 
901  uint8_t* getSessionTicketData() const;
902 
908 
909  // implement abstract methods
910 
911  std::string toString() const override;
912  };
913 
919  {
920  public:
926  SSLUnknownMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
927  : SSLHandshakeMessage(data, dataLen, container)
928  {}
929 
930  ~SSLUnknownMessage() override = default;
931 
932  // implement virtual and abstract methods
933 
936 
940  size_t getMessageLength() const override;
941 
942  std::string toString() const override;
943  };
944 
945  template <class TExtension> TExtension* SSLClientHelloMessage::getExtensionOfType() const
946  {
947  size_t vecSize = m_ExtensionList.size();
948  for (size_t i = 0; i < vecSize; i++)
949  {
950  SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
951  if (dynamic_cast<TExtension*>(curElem) != nullptr)
952  return static_cast<TExtension*>(curElem);
953  }
954 
955  return nullptr;
956  }
957 
958  template <class TExtension> TExtension* SSLServerHelloMessage::getExtensionOfType() const
959  {
960  size_t vecSize = m_ExtensionList.size();
961  for (size_t i = 0; i < vecSize; i++)
962  {
963  SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
964  if (dynamic_cast<TExtension*>(curElem) != nullptr)
965  return static_cast<TExtension*>(curElem);
966  }
967 
968  return nullptr;
969  }
970 } // namespace pcpp
Definition: Asn1Codec.h:355
Definition: PointerVector.h:50
Definition: SSLHandshake.h:632
std::string toString() const override
SSLCertificateMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
SSLx509Certificate * getCertificate(int index) const
Definition: SSLHandshake.h:758
size_t getCertificateAuthorityLength() const
std::vector< SSLClientCertificateType > & getCertificateTypes()
uint8_t * getCertificateAuthorityData() const
std::string toString() const override
SSLCertificateRequestMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:818
SSLCertificateVerifyMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:825
std::string toString() const override
Definition: SSLHandshake.h:25
SSLAuthenticationAlgorithm getAuthAlg() const
Definition: SSLHandshake.h:58
SSLHashingAlgorithm getMACAlg() const
Definition: SSLHandshake.h:70
uint16_t getID() const
Definition: SSLHandshake.h:40
SSLCipherSuite(uint16_t id, SSLKeyExchangeAlgorithm keyExAlg, SSLAuthenticationAlgorithm authAlg, SSLSymetricEncryptionAlgorithm symKeyAlg, SSLHashingAlgorithm MACAlg, const char *name)
Definition: SSLHandshake.h:34
SSLSymetricEncryptionAlgorithm getSymKeyAlg() const
Definition: SSLHandshake.h:64
SSLKeyExchangeAlgorithm getKeyExchangeAlg() const
Definition: SSLHandshake.h:52
static SSLCipherSuite * getCipherSuiteByName(std::string name)
std::string asString() const
Definition: SSLHandshake.h:46
static SSLCipherSuite * getCipherSuiteByID(uint16_t id)
Definition: SSLHandshake.h:350
uint16_t getCipherSuiteID(int index, bool &isValid) const
uint16_t getExtensionsLength() const
SSLExtension * getExtensionOfType(uint16_t type) const
SSLExtension * getExtensionOfType(SSLExtensionType type) const
SSLClientHelloMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
std::string toString() const override
TExtension * getExtensionOfType() const
Definition: SSLHandshake.h:945
uint8_t getSessionIDLength() const
SSLCipherSuite * getCipherSuite(int index) const
ssl_tls_client_server_hello * getClientHelloHeader() const
Definition: SSLHandshake.h:401
uint8_t * getSessionID() const
uint8_t getCompressionMethodsValue() const
SSLExtension * getExtension(int index) const
ClientHelloTLSFingerprint generateTLSFingerprint() const
SSLVersion getHandshakeVersion() const
Definition: SSLHandshake.h:725
SSLClientKeyExchangeMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:732
std::string toString() const override
uint8_t * getClientKeyExchangeParams() const
size_t getClientKeyExchangeParamsLength() const
Definition: SSLHandshake.h:99
uint16_t getLength() const
SSLExtension(uint8_t *data)
uint16_t getTotalLength() const
static std::unique_ptr< T > tryCreateExtension(uint8_t *data, size_t dataLen)
A static method that tries to create an instance of a specific extension type.
Definition: SSLHandshake.h:151
uint16_t getTypeAsInt() const
SSLExtensionType getType() const
uint8_t * getData() const
Definition: SSLHandshake.h:852
uint8_t * getSignedHash() const
std::string toString() const override
SSLFinishedMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:859
size_t getSignedHashLength() const
Definition: SSLLayer.h:303
Definition: SSLHandshake.h:304
static SSLHandshakeMessage * createHandshakeMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
virtual size_t getMessageLength() const
virtual SSLHandshakeType getHandshakeType() const
virtual std::string toString() const =0
SSLHandshakeLayer * getContainingLayer() const
Definition: SSLHandshake.h:330
virtual bool isMessageComplete() const
Definition: SSLHandshake.h:668
SSLHelloRequestMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:675
std::string toString() const override
Definition: SSLHandshake.h:885
size_t getSessionTicketDataLength() const
SSLNewSessionTicketMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:892
std::string toString() const override
uint8_t * getSessionTicketData() const
Definition: SSLHandshake.h:795
std::string toString() const override
SSLServerHelloDoneMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:802
Definition: SSLHandshake.h:495
uint8_t getSessionIDLength() const
SSLExtension * getExtensionOfType(uint16_t type) const
uint16_t getExtensionsLength() const
SSLServerHelloMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
SSLExtension * getExtensionOfType(SSLExtensionType type) const
std::string toString() const override
ssl_tls_client_server_hello * getServerHelloHeader() const
Definition: SSLHandshake.h:537
SSLVersion getHandshakeVersion() const
uint16_t getCipherSuiteID(bool &isValid) const
uint8_t getCompressionMethodsValue() const
SSLExtension * getExtension(int index) const
SSLCipherSuite * getCipherSuite() const
TExtension * getExtensionOfType() const
Definition: SSLHandshake.h:958
ServerHelloTLSFingerprint generateTLSFingerprint() const
uint8_t * getSessionID() const
Definition: SSLHandshake.h:691
SSLServerKeyExchangeMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:698
std::string toString() const override
uint8_t * getServerKeyExchangeParams() const
size_t getServerKeyExchangeParamsLength() const
Definition: SSLHandshake.h:196
Definition: SSLHandshake.h:208
std::vector< SSLVersion > getSupportedVersions() const
Definition: SSLHandshake.h:919
SSLHandshakeType getHandshakeType() const override
std::string toString() const override
SSLUnknownMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:926
size_t getMessageLength() const override
Definition: SSLCommon.h:98
Definition: SSLHandshake.h:246
SSLx509Certificate(uint8_t *data, size_t dataLen, bool allDataExists)
Definition: SSLHandshake.h:254
Asn1SequenceRecord * getRootAsn1Record()
size_t getDataLength() const
Definition: SSLHandshake.h:265
bool allDataExists() const
Definition: SSLHandshake.h:283
std::unique_ptr< X509Certificate > getX509Certificate()
uint8_t * getData() const
Definition: SSLHandshake.h:259
Definition: SSLHandshake.h:232
std::vector< uint8_t > getECPointFormatList() const
Definition: SSLHandshake.h:220
std::vector< uint16_t > getSupportedGroups() const
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
SSLKeyExchangeAlgorithm
SSL/TLS key exchange algorithms.
Definition: SSLCommon.h:291
SSLExtensionType
SSL/TLS extension types.
Definition: SSLCommon.h:459
SSLSymetricEncryptionAlgorithm
SSL/TLS symmetric encryption algorithms.
Definition: SSLCommon.h:353
SSLAuthenticationAlgorithm
SSL/TLS authentication algorithms.
Definition: SSLCommon.h:322
SSLHandshakeType
SSL/TLS handshake message types.
Definition: SSLCommon.h:188
SSLHashingAlgorithm
SSL/TLS hashing algorithms.
Definition: SSLCommon.h:434
std::vector< uint8_t > ecPointFormats
A list of EC point formats taken from the "EC point formats" TLS extension (if exist in the message)
Definition: SSLHandshake.h:369
std::pair< std::string, std::string > toStringAndMD5()
std::vector< uint16_t > extensions
A list of extension IDs.
Definition: SSLHandshake.h:365
std::vector< uint16_t > cipherSuites
A list of Cipher Suite IDs.
Definition: SSLHandshake.h:363
std::vector< uint16_t > supportedGroups
A list of Suppotred Groups taken from the "supported groups" TLS extension (if exist in the message)
Definition: SSLHandshake.h:367
uint16_t tlsVersion
TLS version.
Definition: SSLHandshake.h:361
Definition: SSLHandshake.h:171
uint8_t extensionData[]
Extension data as raw (byte array)
Definition: SSLHandshake.h:177
uint16_t extensionType
Extension type.
Definition: SSLHandshake.h:173
uint16_t getDataLength() const
Gets the extension length in host byte order.
uint16_t extensionDataLength
Extension length.
Definition: SSLHandshake.h:175
uint16_t tlsVersion
TLS version.
Definition: SSLHandshake.h:505
uint16_t cipherSuite
Cipher Suite ID.
Definition: SSLHandshake.h:507
std::vector< uint16_t > extensions
A list of extension IDs.
Definition: SSLHandshake.h:509
std::pair< std::string, std::string > toStringAndMD5()
Definition: SSLCommon.h:47