PcapPlusPlus  Next
SSHLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Layer.h"
4 
63 
66 namespace pcpp
67 {
73  class SSHLayer : public Layer
74  {
75  public:
85  static SSHLayer* createSSHMessage(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
86 
92  static bool isSSHPort(uint16_t portSrc, uint16_t portDst)
93  {
94  return portSrc == 22 || portDst == 22;
95  }
96 
97  // implement abstract methods
98 
101  void parseNextLayer() override;
102 
104  void computeCalculateFields() override
105  {}
106 
108  {
110  }
111 
112  protected:
113  // protected c'tor, this class cannot be instantiated
114  SSHLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
115  : Layer(data, dataLen, prevLayer, packet, SSH)
116  {}
117 
118  private:
119  // this layer supports only parsing
120  SSHLayer();
121  };
122 
130  {
131  public:
134 
143  static SSHIdentificationMessage* tryParse(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
144 
145  // implement abstract methods
146 
148  size_t getHeaderLen() const override
149  {
150  return m_DataLen;
151  }
152 
153  std::string toString() const override;
154 
155  private:
156  // this layer supports only parsing
158 
159  // private c'tor, this class cannot be instantiated
160  SSHIdentificationMessage(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
161  : SSHLayer(data, dataLen, prevLayer, packet)
162  {}
163  };
164 
186  {
187  public:
190  {
206  SSH_MSG_UNKNOWN = 999
207  };
208 
211 
213  std::string getMessageTypeStr() const;
214 
216  uint8_t* getSSHHandshakeMessage() const;
217 
222 
224  size_t getPaddingLength() const;
225 
235  static SSHHandshakeMessage* tryParse(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
236 
237  // implement abstract methods
238 
240  size_t getHeaderLen() const override;
241 
242  std::string toString() const override;
243 
244  protected:
245 #pragma pack(push, 1)
248  {
249  uint32_t packetLength;
250  uint8_t paddingLength;
251  uint8_t messageCode;
252  };
253 #pragma pack(pop)
254  static_assert(sizeof(ssh_message_base) == 6, "ssh_message_base size is not 6 bytes");
255 
256  // this layer supports only parsing
258 
259  // private c'tor, this class cannot be instantiated
260  SSHHandshakeMessage(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
261  : SSHLayer(data, dataLen, prevLayer, packet)
262  {}
263 
264  ssh_message_base* getMsgBaseHeader() const
265  {
266  return reinterpret_cast<ssh_message_base*>(m_Data);
267  }
268  };
269 
275  {
276  public:
283  SSHKeyExchangeInitMessage(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
284 
289  uint8_t* getCookie();
290 
295  std::string getCookieAsHexStream();
296 
300  {
301  return getFieldValue(0);
302  }
303 
307  {
308  return getFieldValue(1);
309  }
310 
314  {
315  return getFieldValue(2);
316  }
317 
321  {
322  return getFieldValue(3);
323  }
324 
328  {
329  return getFieldValue(4);
330  }
331 
335  {
336  return getFieldValue(5);
337  }
338 
342  {
343  return getFieldValue(6);
344  }
345 
349  {
350  return getFieldValue(7);
351  }
352 
356  {
357  return getFieldValue(8);
358  }
359 
362 
364  {
365  return getFieldValue(9);
366  }
367 
372 
373  private:
374  size_t m_FieldOffsets[11];
375  bool m_OffsetsInitialized;
376 
377  void parseMessageAndInitOffsets();
378 
379  std::string getFieldValue(int fieldOffsetIndex);
380  };
381 
390  {
391  public:
394  SSHEncryptedMessage(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
395  : SSHLayer(data, dataLen, prevLayer, packet)
396  {}
397 
398  // implement abstract methods
399 
401  size_t getHeaderLen() const override
402  {
403  return m_DataLen;
404  }
405 
406  std::string toString() const override;
407  };
408 
409 } // namespace pcpp
Definition: Layer.h:60
Definition: Packet.h:22
Definition: SSHLayer.h:390
size_t getHeaderLen() const override
Definition: SSHLayer.h:401
SSHEncryptedMessage(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: SSHLayer.h:394
std::string toString() const override
Definition: SSHLayer.h:186
size_t getHeaderLen() const override
std::string toString() const override
size_t getPaddingLength() const
std::string getMessageTypeStr() const
SSHHandshakeMessageType
An enum that represents SSH non-encrypted message types.
Definition: SSHLayer.h:190
@ SSH_MSG_KEX_DH_INIT
Diffie-Hellman Key Exchange Init message.
Definition: SSHLayer.h:196
@ SSH_MSG_UNKNOWN
Unknown message.
Definition: SSHLayer.h:206
@ SSH_MSG_KEX_DH_GEX_REPLY
"Diffie-Hellman Group Exchange Reply message
Definition: SSHLayer.h:202
@ SSH_MSG_KEX_DH_GEX_REQUEST
Diffie-Hellman Group Exchange Request message.
Definition: SSHLayer.h:204
@ SSH_MSG_NEW_KEYS
New Keys message.
Definition: SSHLayer.h:194
@ SSH_MSG_KEX_INIT
Key Exchange Init message.
Definition: SSHLayer.h:192
@ SSH_MSG_KEX_DH_REPLY
message
Definition: SSHLayer.h:198
@ SSH_MSG_KEX_DH_GEX_INIT
Diffie-Hellman Group Exchange Init message.
Definition: SSHLayer.h:200
uint8_t * getSSHHandshakeMessage() const
SSHHandshakeMessageType getMessageType() const
static SSHHandshakeMessage * tryParse(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
size_t getSSHHandshakeMessageLength() const
Definition: SSHLayer.h:130
size_t getHeaderLen() const override
Definition: SSHLayer.h:148
std::string getIdentificationMessage()
std::string toString() const override
static SSHIdentificationMessage * tryParse(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: SSHLayer.h:275
std::string getCompressionAlgorithmsClientToServer()
Definition: SSHLayer.h:341
std::string getKeyExchangeAlgorithms()
Definition: SSHLayer.h:299
std::string getEncryptionAlgorithmsClientToServer()
Definition: SSHLayer.h:313
std::string getServerHostKeyAlgorithms()
Definition: SSHLayer.h:306
std::string getLanguagesClientToServer()
Definition: SSHLayer.h:355
std::string getCompressionAlgorithmsServerToClient()
Definition: SSHLayer.h:348
std::string getMacAlgorithmsClientToServer()
Definition: SSHLayer.h:327
std::string getMacAlgorithmsServerToClient()
Definition: SSHLayer.h:334
std::string getLanguagesServerToClient()
Definition: SSHLayer.h:363
std::string getEncryptionAlgorithmsServerToClient()
Definition: SSHLayer.h:320
SSHKeyExchangeInitMessage(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: SSHLayer.h:74
void computeCalculateFields() override
Does nothing for this layer.
Definition: SSHLayer.h:104
static SSHLayer * createSSHMessage(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
OsiModelLayer getOsiModelLayer() const override
Definition: SSHLayer.h:107
void parseNextLayer() override
static bool isSSHPort(uint16_t portSrc, uint16_t portDst)
Definition: SSHLayer.h:92
The main namespace for the PcapPlusPlus lib.
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:225
@ OsiModelApplicationLayer
Application layer (layer 7)
Definition: ProtocolType.h:239
const ProtocolType SSH
SSH version 2 protocol.
Definition: ProtocolType.h:146
An internal struct representing the SSH handshake message header.
Definition: SSHLayer.h:248