PcapPlusPlus  Next
IPSecLayer.h
Go to the documentation of this file.
1 #pragma once
2 
4 
5 #include "Layer.h"
6 
9 namespace pcpp
10 {
13 #pragma pack(push, 1)
15  {
17  uint8_t nextHeader;
19  uint8_t payloadLen;
21  uint16_t reserved;
23  uint32_t spi;
25  uint32_t sequenceNumber;
26  };
27 #pragma pack(pop)
28  static_assert(sizeof(ipsec_authentication_header) == 12, "ipsec_authentication_header size is not 12 bytes");
29 
32 #pragma pack(push, 1)
33  struct ipsec_esp
34  {
36  uint32_t spi;
38  uint32_t sequenceNumber;
39  };
40 #pragma pack(pop)
41  static_assert(sizeof(ipsec_esp) == 8, "ipsec_esp size is not 8 bytes");
42 
46  {
47  public:
53  AuthenticationHeaderLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
54  : Layer(data, dataLen, prevLayer, packet, AuthenticationHeader)
55  {}
56 
61  {
62  return reinterpret_cast<ipsec_authentication_header*>(m_Data);
63  }
64 
66  uint32_t getSPI() const;
67 
69  uint32_t getSequenceNumber() const;
70 
72  size_t getICVLength() const;
73 
75  uint8_t* getICVBytes() const;
76 
78  std::string getICVHexStream() const;
79 
84  static inline bool isDataValid(const uint8_t* data, size_t dataLen);
85 
86  // implement abstract methods
87 
89  size_t getHeaderLen() const override
90  {
91  return static_cast<size_t>(4) * (getAHHeader()->payloadLen + 2);
92  }
93 
96  void parseNextLayer() override;
97 
99  void computeCalculateFields() override
100  {}
101 
102  std::string toString() const override;
103 
105  {
106  return OsiModelNetworkLayer;
107  }
108 
109  private:
110  // this layer supports parsing only
112  {}
113  };
114 
117  class ESPLayer : public Layer
118  {
119  public:
125  ESPLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
126  : Layer(data, dataLen, prevLayer, packet, ESP)
127  {}
128 
129  ipsec_esp* getESPHeader() const
130  {
131  return reinterpret_cast<ipsec_esp*>(m_Data);
132  }
133 
135  uint32_t getSPI() const;
136 
138  uint32_t getSequenceNumber() const;
139 
144  static inline bool isDataValid(const uint8_t* data, size_t dataLen);
145 
146  // implement abstract methods
147 
149  size_t getHeaderLen() const override
150  {
151  return sizeof(ipsec_esp);
152  }
153 
155  void parseNextLayer() override;
156 
158  void computeCalculateFields() override
159  {}
160 
161  std::string toString() const override;
162 
164  {
165  return OsiModelTransportLayer;
166  }
167 
168  private:
169  // this layer supports parsing only
170  ESPLayer()
171  {}
172  };
173 
174  // implementation of inline methods
175 
176  bool AuthenticationHeaderLayer::isDataValid(const uint8_t* data, size_t dataLen)
177  {
178  if (dataLen < sizeof(ipsec_authentication_header))
179  return false;
180 
181  size_t payloadLen = 4 * (data[1] + 2);
182  if (payloadLen < sizeof(ipsec_authentication_header) || payloadLen > dataLen)
183  return false;
184 
185  return true;
186  }
187 
188  bool ESPLayer::isDataValid(const uint8_t* data, size_t dataLen)
189  {
190  return data && dataLen >= sizeof(ipsec_esp);
191  }
192 } // namespace pcpp
Definition: IPSecLayer.h:46
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: IPSecLayer.h:176
size_t getHeaderLen() const override
Definition: IPSecLayer.h:89
std::string toString() const override
void computeCalculateFields() override
Does nothing for this layer.
Definition: IPSecLayer.h:99
ipsec_authentication_header * getAHHeader() const
Definition: IPSecLayer.h:60
OsiModelLayer getOsiModelLayer() const override
Definition: IPSecLayer.h:104
uint32_t getSequenceNumber() const
std::string getICVHexStream() const
AuthenticationHeaderLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: IPSecLayer.h:53
Definition: IPSecLayer.h:118
std::string toString() const override
ESPLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: IPSecLayer.h:125
uint32_t getSPI() const
OsiModelLayer getOsiModelLayer() const override
Definition: IPSecLayer.h:163
uint32_t getSequenceNumber() const
size_t getHeaderLen() const override
Definition: IPSecLayer.h:149
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: IPSecLayer.h:188
void parseNextLayer() override
The payload of an ESP layer is encrypted, hence the next layer is always a generic payload (PayloadLa...
void computeCalculateFields() override
Does nothing for this layer.
Definition: IPSecLayer.h:158
Definition: Layer.h:60
Definition: Packet.h:22
The main namespace for the PcapPlusPlus lib.
const ProtocolType ESP
IPSec Encapsulating Security Payload (ESP) protocol.
Definition: ProtocolType.h:152
const ProtocolType AuthenticationHeader
IPSec Authentication Header (AH) protocol.
Definition: ProtocolType.h:149
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:225
@ OsiModelTransportLayer
Transport layer (layer 4)
Definition: ProtocolType.h:233
@ OsiModelNetworkLayer
Network layer (layer 3)
Definition: ProtocolType.h:231
Definition: IPSecLayer.h:15
uint32_t sequenceNumber
Sequence Number.
Definition: IPSecLayer.h:25
uint16_t reserved
Reserved.
Definition: IPSecLayer.h:21
uint8_t nextHeader
Type of the next header.
Definition: IPSecLayer.h:17
uint8_t payloadLen
The length of the Authentication Header in 4-octet units, minus 2.
Definition: IPSecLayer.h:19
uint32_t spi
Security Parameters Index.
Definition: IPSecLayer.h:23
Definition: IPSecLayer.h:34
uint32_t sequenceNumber
Sequence Number.
Definition: IPSecLayer.h:38
uint32_t spi
Security Parameters Index.
Definition: IPSecLayer.h:36