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 
113  {
115  static std::vector<FieldDescriptor> all()
116  {
117  auto result = Layer::SerializedFields::all();
118  std::initializer_list<FieldDescriptor> extra{ SPI, SequenceNumber, ICV };
119  std::copy(extra.begin(), extra.end(), std::back_inserter(result));
120  return result;
121  }
122 
124  static const FieldDescriptor SPI;
125 
128 
130  static const FieldDescriptor ICV;
131  };
132 
133  protected:
134  void serializeLayer(ObjectScope& serializer) const override;
135 
136  private:
137  // this layer supports parsing only
139  {}
140  };
141 
144  class ESPLayer : public Layer
145  {
146  public:
152  ESPLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
153  : Layer(data, dataLen, prevLayer, packet, ESP)
154  {}
155 
156  ipsec_esp* getESPHeader() const
157  {
158  return reinterpret_cast<ipsec_esp*>(m_Data);
159  }
160 
162  uint32_t getSPI() const;
163 
165  uint32_t getSequenceNumber() const;
166 
171  static inline bool isDataValid(const uint8_t* data, size_t dataLen);
172 
173  // implement abstract methods
174 
176  size_t getHeaderLen() const override
177  {
178  return sizeof(ipsec_esp);
179  }
180 
182  void parseNextLayer() override;
183 
185  void computeCalculateFields() override
186  {}
187 
188  std::string toString() const override;
189 
191  {
192  return OsiModelTransportLayer;
193  }
194 
199  {
201  static std::vector<FieldDescriptor> all()
202  {
203  auto result = Layer::SerializedFields::all();
204  std::initializer_list<FieldDescriptor> extra{ SPI, SequenceNumber };
205  std::copy(extra.begin(), extra.end(), std::back_inserter(result));
206  return result;
207  }
208 
210  static const FieldDescriptor SPI;
211 
214  };
215 
216  protected:
217  void serializeLayer(ObjectScope& serializer) const override;
218 
219  private:
220  // this layer supports parsing only
221  ESPLayer()
222  {}
223  };
224 
225  // implementation of inline methods
226 
227  bool AuthenticationHeaderLayer::isDataValid(const uint8_t* data, size_t dataLen)
228  {
229  if (dataLen < sizeof(ipsec_authentication_header))
230  return false;
231 
232  size_t payloadLen = 4 * (data[1] + 2);
233  if (payloadLen < sizeof(ipsec_authentication_header) || payloadLen > dataLen)
234  return false;
235 
236  return true;
237  }
238 
239  bool ESPLayer::isDataValid(const uint8_t* data, size_t dataLen)
240  {
241  return data && dataLen >= sizeof(ipsec_esp);
242  }
243 } // namespace pcpp
Definition: IPSecLayer.h:46
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: IPSecLayer.h:227
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
void serializeLayer(ObjectScope &serializer) const override
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:145
std::string toString() const override
ESPLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: IPSecLayer.h:152
uint32_t getSPI() const
OsiModelLayer getOsiModelLayer() const override
Definition: IPSecLayer.h:190
uint32_t getSequenceNumber() const
size_t getHeaderLen() const override
Definition: IPSecLayer.h:176
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: IPSecLayer.h:239
void parseNextLayer() override
The payload of an ESP layer is encrypted, hence the next layer is always a generic payload (PayloadLa...
void serializeLayer(ObjectScope &serializer) const override
void computeCalculateFields() override
Does nothing for this layer.
Definition: IPSecLayer.h:185
Definition: Layer.h:117
Definition: Serializers.h:230
Definition: Packet.h:49
const ProtocolType ESP
IPSec Encapsulating Security Payload (ESP) protocol.
Definition: ProtocolType.h:177
const ProtocolType AuthenticationHeader
IPSec Authentication Header (AH) protocol.
Definition: ProtocolType.h:174
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:425
@ OsiModelTransportLayer
Transport layer (layer 4)
Definition: ProtocolType.h:433
@ OsiModelNetworkLayer
Network layer (layer 3)
Definition: ProtocolType.h:431
static const FieldDescriptor SPI
Field descriptor for the Security Parameters Index (SPI), written as a hex value.
Definition: IPSecLayer.h:124
static const FieldDescriptor ICV
Field descriptor for the Integrity Check Value (ICV), written as a hex string.
Definition: IPSecLayer.h:130
static const FieldDescriptor SequenceNumber
Field descriptor for the sequence number, written as a number.
Definition: IPSecLayer.h:127
static std::vector< FieldDescriptor > all()
Definition: IPSecLayer.h:115
Definition: IPSecLayer.h:199
static const FieldDescriptor SPI
Field descriptor for the Security Parameters Index (SPI), written as a hex value.
Definition: IPSecLayer.h:210
static std::vector< FieldDescriptor > all()
Definition: IPSecLayer.h:201
static const FieldDescriptor SequenceNumber
Field descriptor for the sequence number, written as a number.
Definition: IPSecLayer.h:213
Definition: Serializers.h:18
Definition: Layer.h:212
static std::vector< FieldDescriptor > all()
Definition: Layer.h:214
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