PcapPlusPlus  Next
SSLLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "PointerVector.h"
4 #include "Layer.h"
5 #include "SSLCommon.h"
6 #include "SSLHandshake.h"
7 
8 #ifdef __GNUC__
9 # pragma GCC diagnostic push
10 # pragma GCC diagnostic ignored "-Wcomment"
11 #endif
163 #ifdef __GNUC__
164 # pragma GCC diagnostic pop
165 #endif
166 
169 namespace pcpp
170 {
171 
177  class SSLLayer : public Layer
178  {
179  public:
182  static inline bool isSSLPort(uint16_t port);
183 
209  static bool IsSSLMessage(uint16_t srcPort, uint16_t dstPort, uint8_t* data, size_t dataLen,
210  bool ignorePorts = false);
211 
221  static SSLLayer* createSSLMessage(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
222 
227  {
228  return reinterpret_cast<ssl_tls_record_layer*>(m_Data);
229  }
230 
233 
236 
237  // implement abstract methods
238 
240  size_t getHeaderLen() const override;
241 
244  void parseNextLayer() override;
245 
247  {
249  }
250 
251  protected:
252  SSLLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
253  : Layer(data, dataLen, prevLayer, packet, SSL)
254  {}
255 
256  }; // class SSLLayer
257 
258  // The graph below will break the code formatting, so it's disabled.
259  // clang-format off
301  // clang-format on
303  {
304  public:
310  SSLHandshakeLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
311 
314  {
315  return m_MessageList.size();
316  }
317 
324 
328  template <class THandshakeMessage> THandshakeMessage* getHandshakeMessageOfType() const;
329 
337  template <class THandshakeMessage>
338  THandshakeMessage* getNextHandshakeMessageOfType(const SSLHandshakeMessage* after) const;
339 
340  // implement abstract methods
341 
342  std::string toString() const override;
343 
345  void computeCalculateFields() override
346  {}
347 
348  private:
350  }; // class SSLHandshakeLayer
351 
356  {
357  public:
363  SSLChangeCipherSpecLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
364  : SSLLayer(data, dataLen, prevLayer, packet)
365  {}
366 
367  ~SSLChangeCipherSpecLayer() override = default;
368 
369  // implement abstract methods
370 
371  std::string toString() const override;
372 
374  void computeCalculateFields() override
375  {}
376  }; // class SSLChangeCipherSpecLayer
377 
381  class SSLAlertLayer : public SSLLayer
382  {
383  public:
389  SSLAlertLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
390  : SSLLayer(data, dataLen, prevLayer, packet)
391  {}
392 
393  ~SSLAlertLayer() override = default;
394 
398 
402 
403  // implement abstract methods
404 
405  std::string toString() const override;
406 
408  void computeCalculateFields() override
409  {}
410  }; // class SSLAlertLayer
411 
416  {
417  public:
423  SSLApplicationDataLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
424  : SSLLayer(data, dataLen, prevLayer, packet)
425  {}
426 
427  ~SSLApplicationDataLayer() override = default;
428 
431  uint8_t* getEncryptedData() const;
432 
434  size_t getEncryptedDataLen() const;
435 
436  // implement abstract methods
437 
438  std::string toString() const override;
439 
441  void computeCalculateFields() override
442  {}
443  }; // class SSLApplicationDataLayer
444 
445  template <class THandshakeMessage> THandshakeMessage* SSLHandshakeLayer::getHandshakeMessageOfType() const
446  {
447  size_t vecSize = m_MessageList.size();
448  for (size_t i = 0; i < vecSize; i++)
449  {
450  SSLHandshakeMessage* curElem = const_cast<SSLHandshakeMessage*>(m_MessageList.at(i));
451  if (dynamic_cast<THandshakeMessage*>(curElem) != nullptr)
452  return (THandshakeMessage*)curElem;
453  }
454 
455  // element not found
456  return nullptr;
457  } // getHandshakeMessageOfType
458 
459  template <class THandshakeMessage>
461  {
462  size_t vecSize = m_MessageList.size();
463  size_t afterIndex;
464 
465  // find the index of "after"
466  for (afterIndex = 0; afterIndex < vecSize; afterIndex++)
467  {
468  SSLHandshakeMessage* curElem = const_cast<SSLHandshakeMessage*>(m_MessageList.at(afterIndex));
469  if (curElem == after)
470  break;
471  }
472 
473  // "after" not found
474  if (afterIndex == vecSize)
475  return nullptr;
476 
477  for (size_t i = afterIndex + 1; i < vecSize; i++)
478  {
479  SSLHandshakeMessage* curElem = const_cast<SSLHandshakeMessage*>(m_MessageList.at(i));
480  if (dynamic_cast<THandshakeMessage*>(curElem) != nullptr)
481  return (THandshakeMessage*)curElem;
482  }
483 
484  // element not found
485  return nullptr;
486  } // getNextHandshakeMessageOfType
487 
488  // implementation of inline methods
489 
490  bool SSLLayer::isSSLPort(uint16_t port)
491  {
492  if (port == 443) // HTTPS, this is likely case
493  return true;
494 
495  switch (port)
496  {
497  case 261: // NSIIOPS
498  case 448: // DDM-SSL
499  case 465: // SMTPS
500  case 563: // NNTPS
501  case 614: // SSHELL
502  case 636: // LDAPS
503  case 989: // FTPS - data
504  case 990: // FTPS - control
505  case 992: // Telnet over TLS/SSL
506  case 993: // IMAPS
507  case 994: // IRCS
508  case 995: // POP3S
509  return true;
510  default:
511  return false;
512  }
513  } // isSSLPort
514 } // namespace pcpp
Definition: Layer.h:117
Definition: Packet.h:49
Definition: PointerVector.h:50
Definition: SSLLayer.h:382
void computeCalculateFields() override
There are no calculated fields for this layer.
Definition: SSLLayer.h:408
SSLAlertLevel getAlertLevel() const
std::string toString() const override
SSLAlertDescription getAlertDescription()
SSLAlertLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: SSLLayer.h:389
Definition: SSLLayer.h:416
uint8_t * getEncryptedData() const
std::string toString() const override
void computeCalculateFields() override
There are no calculated fields for this layer.
Definition: SSLLayer.h:441
size_t getEncryptedDataLen() const
SSLApplicationDataLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: SSLLayer.h:423
Definition: SSLLayer.h:356
SSLChangeCipherSpecLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: SSLLayer.h:363
std::string toString() const override
void computeCalculateFields() override
There are no calculated fields for this layer.
Definition: SSLLayer.h:374
Definition: SSLLayer.h:303
SSLHandshakeLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
std::string toString() const override
size_t getHandshakeMessagesCount() const
Definition: SSLLayer.h:313
THandshakeMessage * getHandshakeMessageOfType() const
Definition: SSLLayer.h:445
void computeCalculateFields() override
There are no calculated fields for this layer.
Definition: SSLLayer.h:345
THandshakeMessage * getNextHandshakeMessageOfType(const SSLHandshakeMessage *after) const
Definition: SSLLayer.h:460
SSLHandshakeMessage * getHandshakeMessageAt(int index) const
Definition: SSLHandshake.h:304
Definition: SSLLayer.h:178
SSLVersion getRecordVersion() const
size_t getHeaderLen() const override
void parseNextLayer() override
OsiModelLayer getOsiModelLayer() const override
Definition: SSLLayer.h:246
static bool isSSLPort(uint16_t port)
Definition: SSLLayer.h:490
static bool IsSSLMessage(uint16_t srcPort, uint16_t dstPort, uint8_t *data, size_t dataLen, bool ignorePorts=false)
static SSLLayer * createSSLMessage(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
ssl_tls_record_layer * getRecordLayer() const
Definition: SSLLayer.h:226
SSLRecordType getRecordType() const
Definition: SSLCommon.h:100
const ProtocolType SSL
SSL/TLS protocol.
Definition: ProtocolType.h:111
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
SSLAlertDescription
SSL/TLS alert description types.
Definition: SSLCommon.h:236
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:420
@ OsiModelPresentationLayer
Presentation layer (layer 6)
Definition: ProtocolType.h:434
SSLRecordType
SSL/TLS message types.
Definition: SSLCommon.h:84
SSLAlertLevel
SSL/TLS alert levels.
Definition: SSLCommon.h:225
Definition: SSLCommon.h:19