PcapPlusPlus  Next
SSLHandshake.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <utility>
4 #include "SSLCommon.h"
5 #include "PointerVector.h"
6 #include "Asn1Codec.h"
7 #include "X509Decoder.h"
8 
11 
14 namespace pcpp
15 {
24  {
25  public:
34  SSLSymetricEncryptionAlgorithm symKeyAlg, SSLHashingAlgorithm MACAlg, const char* name)
35  : m_Id(id), m_KeyExAlg(keyExAlg), m_AuthAlg(authAlg), m_SymKeyAlg(symKeyAlg), m_MACAlg(MACAlg), m_Name(name)
36  {}
37 
39  uint16_t getID() const
40  {
41  return m_Id;
42  }
43 
45  std::string asString() const
46  {
47  return m_Name;
48  }
49 
52  {
53  return m_KeyExAlg;
54  }
55 
58  {
59  return m_AuthAlg;
60  }
61 
64  {
65  return m_SymKeyAlg;
66  }
67 
70  {
71  return m_MACAlg;
72  }
73 
77  static SSLCipherSuite* getCipherSuiteByID(uint16_t id);
78 
82  static SSLCipherSuite* getCipherSuiteByName(std::string name);
83 
84  private:
85  uint16_t m_Id;
86  SSLKeyExchangeAlgorithm m_KeyExAlg;
89  SSLHashingAlgorithm m_MACAlg;
90  std::string m_Name;
91  };
92 
98  {
99  public:
102  explicit SSLExtension(uint8_t* data);
103 
104  virtual ~SSLExtension() = default;
105 
108 
110  uint16_t getTypeAsInt() const;
111 
113  uint16_t getLength() const;
114 
116  uint16_t getTotalLength() const;
117 
119  uint8_t* getData() const;
120 
121  protected:
125  {
127  uint16_t extensionType;
131  uint8_t extensionData[];
132  };
133 
134  uint8_t* m_RawData;
135 
136  SSLExtensionStruct* getExtensionStruct() const
137  {
138  return reinterpret_cast<SSLExtensionStruct*>(m_RawData);
139  }
140  };
141 
146  {
147  public:
150  explicit SSLServerNameIndicationExtension(uint8_t* data) : SSLExtension(data)
151  {}
152 
154  std::string getHostName() const;
155  };
156 
161  {
162  public:
165  explicit SSLSupportedVersionsExtension(uint8_t* data) : SSLExtension(data)
166  {}
167 
169  std::vector<SSLVersion> getSupportedVersions() const;
170  };
171 
176  {
177  public:
180  explicit TLSSupportedGroupsExtension(uint8_t* data) : SSLExtension(data)
181  {}
182 
184  std::vector<uint16_t> getSupportedGroups() const;
185  };
186 
191  {
192  public:
195  explicit TLSECPointFormatExtension(uint8_t* data) : SSLExtension(data)
196  {}
197 
199  std::vector<uint8_t> getECPointFormatList() const;
200  };
201 
208  {
209  public:
216  SSLx509Certificate(uint8_t* data, size_t dataLen, bool allDataExists)
217  : m_Data(data), m_DataLen(dataLen), m_AllDataExists(allDataExists)
218  {}
219 
221  uint8_t* getData() const
222  {
223  return m_Data;
224  }
225 
227  size_t getDataLength() const
228  {
229  return m_DataLen;
230  }
231 
236 
240  std::unique_ptr<X509Certificate> getX509Certificate();
241 
245  bool allDataExists() const
246  {
247  return m_AllDataExists;
248  }
249 
250  private:
251  std::unique_ptr<Asn1Record> m_Asn1Record;
252  uint8_t* m_Data;
253  size_t m_DataLen;
254  bool m_AllDataExists;
255  };
256 
257  class SSLHandshakeLayer;
258 
266  {
267  public:
268  virtual ~SSLHandshakeMessage() = default;
269 
275  static SSLHandshakeMessage* createHandshakeMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container);
276 
279 
283  virtual size_t getMessageLength() const;
284 
289  virtual bool isMessageComplete() const;
290 
293  {
294  return m_Container;
295  }
296 
298  virtual std::string toString() const = 0;
299 
300  protected:
301  SSLHandshakeMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container);
302 
303  uint8_t* m_Data;
304  size_t m_DataLen;
305  SSLHandshakeLayer* m_Container;
306  };
307 
312  {
313  public:
321  {
323  uint16_t tlsVersion;
325  std::vector<uint16_t> cipherSuites;
327  std::vector<uint16_t> extensions;
329  std::vector<uint16_t> supportedGroups;
331  std::vector<uint8_t> ecPointFormats;
332 
342  std::string toString();
343 
345  std::string toMD5();
346 
349  std::pair<std::string, std::string> toStringAndMD5();
350  };
351 
357  SSLClientHelloMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container);
358 
359  ~SSLClientHelloMessage() override = default;
360 
364  {
365  return reinterpret_cast<ssl_tls_client_server_hello*>(m_Data);
366  }
367 
372 
374  uint8_t getSessionIDLength() const;
375 
378  uint8_t* getSessionID() const;
379 
381  int getCipherSuiteCount() const;
382 
389  SSLCipherSuite* getCipherSuite(int index) const;
390 
399  uint16_t getCipherSuiteID(int index, bool& isValid) const;
400 
402  uint8_t getCompressionMethodsValue() const;
403 
405  int getExtensionCount() const;
406 
409  uint16_t getExtensionsLength() const;
410 
416  SSLExtension* getExtension(int index) const;
417 
423  SSLExtension* getExtensionOfType(uint16_t type) const;
424 
429 
433  template <class TExtension> TExtension* getExtensionOfType() const;
434 
444 
445  // implement abstract methods
446 
447  std::string toString() const override;
448 
449  private:
450  PointerVector<SSLExtension> m_ExtensionList;
451  };
452 
457  {
458  public:
465  {
467  uint16_t tlsVersion;
469  uint16_t cipherSuite;
471  std::vector<uint16_t> extensions;
472 
478  std::string toString();
479 
481  std::string toMD5();
482 
485  std::pair<std::string, std::string> toStringAndMD5();
486  };
487 
493  SSLServerHelloMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container);
494 
495  ~SSLServerHelloMessage() override = default;
496 
500  {
501  return reinterpret_cast<ssl_tls_client_server_hello*>(m_Data);
502  }
503 
512 
514  uint8_t getSessionIDLength() const;
515 
518  uint8_t* getSessionID() const;
519 
525 
532  uint16_t getCipherSuiteID(bool& isValid) const;
533 
535  uint8_t getCompressionMethodsValue() const;
536 
538  int getExtensionCount() const;
539 
542  uint16_t getExtensionsLength() const;
543 
549  SSLExtension* getExtension(int index) const;
550 
556  SSLExtension* getExtensionOfType(uint16_t type) const;
557 
562 
566  template <class TExtension> TExtension* getExtensionOfType() const;
567 
578 
579  // implement abstract methods
580 
581  std::string toString() const override;
582 
583  private:
584  PointerVector<SSLExtension> m_ExtensionList;
585  };
586 
594  {
595  public:
601  SSLCertificateMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container);
602 
603  ~SSLCertificateMessage() override = default;
604 
610  int getNumOfCertificates() const;
611 
617 
618  // implement abstract methods
619 
620  std::string toString() const override;
621 
622  private:
623  PointerVector<SSLx509Certificate> m_CertificateList;
624  };
625 
630  {
631  public:
637  SSLHelloRequestMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
638  : SSLHandshakeMessage(data, dataLen, container)
639  {}
640 
641  ~SSLHelloRequestMessage() override = default;
642 
643  // implement abstract methods
644 
645  std::string toString() const override;
646  };
647 
653  {
654  public:
660  SSLServerKeyExchangeMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
661  : SSLHandshakeMessage(data, dataLen, container)
662  {}
663 
664  ~SSLServerKeyExchangeMessage() override = default;
665 
669  uint8_t* getServerKeyExchangeParams() const;
670 
676 
677  // implement abstract methods
678 
679  std::string toString() const override;
680  };
681 
687  {
688  public:
694  SSLClientKeyExchangeMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
695  : SSLHandshakeMessage(data, dataLen, container)
696  {}
697 
698  ~SSLClientKeyExchangeMessage() override = default;
699 
703  uint8_t* getClientKeyExchangeParams() const;
704 
710 
711  // implement abstract methods
712 
713  std::string toString() const override;
714  };
715 
720  {
721  public:
727  SSLCertificateRequestMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container);
728 
729  ~SSLCertificateRequestMessage() override = default;
730 
732  std::vector<SSLClientCertificateType>& getCertificateTypes();
733 
737  uint8_t* getCertificateAuthorityData() const;
738 
744 
745  // implement abstract methods
746 
747  std::string toString() const override;
748 
749  private:
750  std::vector<SSLClientCertificateType> m_ClientCertificateTypes;
751  };
752 
757  {
758  public:
764  SSLServerHelloDoneMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
765  : SSLHandshakeMessage(data, dataLen, container)
766  {}
767 
768  ~SSLServerHelloDoneMessage() override = default;
769 
770  // implement abstract methods
771 
772  std::string toString() const override;
773  };
774 
780  {
781  public:
787  SSLCertificateVerifyMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
788  : SSLHandshakeMessage(data, dataLen, container)
789  {}
790 
791  ~SSLCertificateVerifyMessage() override = default;
792 
796  uint8_t* getSignedHash() const;
797 
802  size_t getSignedHashLength() const;
803 
804  // implement abstract methods
805 
806  std::string toString() const override;
807  };
808 
814  {
815  public:
821  SSLFinishedMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
822  : SSLHandshakeMessage(data, dataLen, container)
823  {}
824 
825  ~SSLFinishedMessage() override = default;
826 
830  uint8_t* getSignedHash() const;
831 
836  size_t getSignedHashLength() const;
837 
838  // implement abstract methods
839 
840  std::string toString() const override;
841  };
842 
847  {
848  public:
854  SSLNewSessionTicketMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
855  : SSLHandshakeMessage(data, dataLen, container)
856  {}
857 
858  ~SSLNewSessionTicketMessage() override = default;
859 
863  uint8_t* getSessionTicketData() const;
864 
870 
871  // implement abstract methods
872 
873  std::string toString() const override;
874  };
875 
881  {
882  public:
888  SSLUnknownMessage(uint8_t* data, size_t dataLen, SSLHandshakeLayer* container)
889  : SSLHandshakeMessage(data, dataLen, container)
890  {}
891 
892  ~SSLUnknownMessage() override = default;
893 
894  // implement virtual and abstract methods
895 
898 
902  size_t getMessageLength() const override;
903 
904  std::string toString() const override;
905  };
906 
907  template <class TExtension> TExtension* SSLClientHelloMessage::getExtensionOfType() const
908  {
909  size_t vecSize = m_ExtensionList.size();
910  for (size_t i = 0; i < vecSize; i++)
911  {
912  SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
913  if (dynamic_cast<TExtension*>(curElem) != nullptr)
914  return static_cast<TExtension*>(curElem);
915  }
916 
917  return nullptr;
918  }
919 
920  template <class TExtension> TExtension* SSLServerHelloMessage::getExtensionOfType() const
921  {
922  size_t vecSize = m_ExtensionList.size();
923  for (size_t i = 0; i < vecSize; i++)
924  {
925  SSLExtension* curElem = const_cast<SSLExtension*>(m_ExtensionList.at(i));
926  if (dynamic_cast<TExtension*>(curElem) != nullptr)
927  return static_cast<TExtension*>(curElem);
928  }
929 
930  return nullptr;
931  }
932 } // namespace pcpp
Definition: Asn1Codec.h:355
Definition: PointerVector.h:50
Definition: SSLHandshake.h:594
std::string toString() const override
SSLCertificateMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
SSLx509Certificate * getCertificate(int index) const
Definition: SSLHandshake.h:720
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:780
SSLCertificateVerifyMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:787
std::string toString() const override
Definition: SSLHandshake.h:24
SSLAuthenticationAlgorithm getAuthAlg() const
Definition: SSLHandshake.h:57
SSLHashingAlgorithm getMACAlg() const
Definition: SSLHandshake.h:69
uint16_t getID() const
Definition: SSLHandshake.h:39
SSLCipherSuite(uint16_t id, SSLKeyExchangeAlgorithm keyExAlg, SSLAuthenticationAlgorithm authAlg, SSLSymetricEncryptionAlgorithm symKeyAlg, SSLHashingAlgorithm MACAlg, const char *name)
Definition: SSLHandshake.h:33
SSLSymetricEncryptionAlgorithm getSymKeyAlg() const
Definition: SSLHandshake.h:63
SSLKeyExchangeAlgorithm getKeyExchangeAlg() const
Definition: SSLHandshake.h:51
static SSLCipherSuite * getCipherSuiteByName(std::string name)
std::string asString() const
Definition: SSLHandshake.h:45
static SSLCipherSuite * getCipherSuiteByID(uint16_t id)
Definition: SSLHandshake.h:312
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:907
uint8_t getSessionIDLength() const
SSLCipherSuite * getCipherSuite(int index) const
ssl_tls_client_server_hello * getClientHelloHeader() const
Definition: SSLHandshake.h:363
uint8_t * getSessionID() const
uint8_t getCompressionMethodsValue() const
SSLExtension * getExtension(int index) const
ClientHelloTLSFingerprint generateTLSFingerprint() const
SSLVersion getHandshakeVersion() const
Definition: SSLHandshake.h:687
SSLClientKeyExchangeMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:694
std::string toString() const override
uint8_t * getClientKeyExchangeParams() const
size_t getClientKeyExchangeParamsLength() const
Definition: SSLHandshake.h:98
uint16_t getLength() const
SSLExtension(uint8_t *data)
uint16_t getTotalLength() const
uint16_t getTypeAsInt() const
SSLExtensionType getType() const
uint8_t * getData() const
Definition: SSLHandshake.h:814
uint8_t * getSignedHash() const
std::string toString() const override
SSLFinishedMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:821
size_t getSignedHashLength() const
Definition: SSLLayer.h:303
Definition: SSLHandshake.h:266
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:292
virtual bool isMessageComplete() const
Definition: SSLHandshake.h:630
SSLHelloRequestMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:637
std::string toString() const override
Definition: SSLHandshake.h:847
size_t getSessionTicketDataLength() const
SSLNewSessionTicketMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:854
std::string toString() const override
uint8_t * getSessionTicketData() const
Definition: SSLHandshake.h:757
std::string toString() const override
SSLServerHelloDoneMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:764
Definition: SSLHandshake.h:457
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:499
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:920
ServerHelloTLSFingerprint generateTLSFingerprint() const
uint8_t * getSessionID() const
Definition: SSLHandshake.h:653
SSLServerKeyExchangeMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:660
std::string toString() const override
uint8_t * getServerKeyExchangeParams() const
size_t getServerKeyExchangeParamsLength() const
Definition: SSLHandshake.h:146
SSLServerNameIndicationExtension(uint8_t *data)
Definition: SSLHandshake.h:150
Definition: SSLHandshake.h:161
std::vector< SSLVersion > getSupportedVersions() const
SSLSupportedVersionsExtension(uint8_t *data)
Definition: SSLHandshake.h:165
Definition: SSLHandshake.h:881
SSLHandshakeType getHandshakeType() const override
std::string toString() const override
SSLUnknownMessage(uint8_t *data, size_t dataLen, SSLHandshakeLayer *container)
Definition: SSLHandshake.h:888
size_t getMessageLength() const override
Definition: SSLCommon.h:98
Definition: SSLHandshake.h:208
SSLx509Certificate(uint8_t *data, size_t dataLen, bool allDataExists)
Definition: SSLHandshake.h:216
Asn1SequenceRecord * getRootAsn1Record()
size_t getDataLength() const
Definition: SSLHandshake.h:227
bool allDataExists() const
Definition: SSLHandshake.h:245
std::unique_ptr< X509Certificate > getX509Certificate()
uint8_t * getData() const
Definition: SSLHandshake.h:221
Definition: SSLHandshake.h:191
TLSECPointFormatExtension(uint8_t *data)
Definition: SSLHandshake.h:195
std::vector< uint8_t > getECPointFormatList() const
Definition: SSLHandshake.h:176
std::vector< uint16_t > getSupportedGroups() const
TLSSupportedGroupsExtension(uint8_t *data)
Definition: SSLHandshake.h:180
The main namespace for the PcapPlusPlus lib.
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:331
std::pair< std::string, std::string > toStringAndMD5()
std::vector< uint16_t > extensions
A list of extension IDs.
Definition: SSLHandshake.h:327
std::vector< uint16_t > cipherSuites
A list of Cipher Suite IDs.
Definition: SSLHandshake.h:325
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:329
uint16_t tlsVersion
TLS version.
Definition: SSLHandshake.h:323
Definition: SSLHandshake.h:125
uint8_t extensionData[]
Extension data as raw (byte array)
Definition: SSLHandshake.h:131
uint16_t extensionType
Extension type.
Definition: SSLHandshake.h:127
uint16_t extensionDataLength
Extension length.
Definition: SSLHandshake.h:129
uint16_t tlsVersion
TLS version.
Definition: SSLHandshake.h:467
uint16_t cipherSuite
Cipher Suite ID.
Definition: SSLHandshake.h:469
std::vector< uint16_t > extensions
A list of extension IDs.
Definition: SSLHandshake.h:471
std::pair< std::string, std::string > toStringAndMD5()
Definition: SSLCommon.h:47