PcapPlusPlus  Next
WireGuardLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Layer.h"
4 #include "IpAddress.h"
5 #include "MacAddress.h"
6 
8 
11 namespace pcpp
12 {
15  class WireGuardLayer : public Layer
16  {
17  protected:
18 #pragma pack(push, 1)
22  {
24  uint8_t messageType;
26  uint8_t reserved[3];
27  };
28 #pragma pack(pop)
29  static_assert(sizeof(wg_common_header) == 4, "wg_common_header size is not 4 bytes");
30 
31  wg_common_header* getBasicHeader() const
32  {
33  return reinterpret_cast<wg_common_header*>(m_Data);
34  }
35 
36  WireGuardLayer() = default;
37 
38  public:
41  {
43  Unknown = 0,
49  CookieReply = 3,
51  TransportData = 4
52  };
53 
59  WireGuardLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
60  : Layer(data, dataLen, prevLayer, packet, WireGuard)
61  {}
62 
67  static bool isWireGuardPorts(uint16_t portSrc, uint16_t portDst)
68  {
69  return (portSrc == 51820 || portDst == 51820);
70  }
71 
76  static bool isDataValid(const uint8_t* data, size_t dataLen);
77 
84  static WireGuardLayer* parseWireGuardLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
85 
87  std::string getMessageTypeAsString() const;
88 
90  uint8_t getMessageType() const;
91 
93  uint32_t getReserved() const;
94 
96  void setReserved(const std::array<uint8_t, 3>& reserved);
97 
99  void parseNextLayer() override
100  {}
101 
103  size_t getHeaderLen() const override;
104 
106  void computeCalculateFields() override
107  {}
108 
111  std::string toString() const override;
112 
115  {
116  return OsiModelNetworkLayer;
117  }
118 
121  {
123  }
124  };
125 
129  {
130  private:
131 #pragma pack(push, 1)
134  typedef struct wg_handshake_initiation : wg_common_header
135  {
137  uint32_t senderIndex;
139  uint8_t initiatorEphemeral[32];
141  uint8_t encryptedInitiatorStatic[48];
143  uint8_t encryptedTimestamp[28];
145  uint8_t mac1[16];
147  uint8_t mac2[16];
148  } wg_handshake_initiation;
149 #pragma pack(pop)
150  wg_handshake_initiation* getHandshakeInitiationHeader() const
151  {
152  return reinterpret_cast<wg_handshake_initiation*>(getBasicHeader());
153  }
154 
155  public:
161  WireGuardHandshakeInitiationLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
162  : WireGuardLayer(data, dataLen, prevLayer, packet)
163  {}
164 
170  static bool isDataValid(const uint8_t* data, size_t dataLen)
171  {
172  return data != nullptr && dataLen >= sizeof(wg_handshake_initiation);
173  }
174 
182  WireGuardHandshakeInitiationLayer(uint32_t senderIndex, const uint8_t initiatorEphemeral[32],
183  const uint8_t encryptedInitiatorStatic[48],
184  const uint8_t encryptedTimestamp[28], const uint8_t mac1[16],
185  const uint8_t mac2[16]);
186 
188  uint32_t getSenderIndex() const;
189 
191  std::array<uint8_t, 32> getInitiatorEphemeral() const;
192 
194  std::array<uint8_t, 48> getEncryptedInitiatorStatic() const;
195 
197  std::array<uint8_t, 28> getEncryptedTimestamp() const;
198 
200  std::array<uint8_t, 16> getMac1() const;
201 
203  std::array<uint8_t, 16> getMac2() const;
204 
206  void setSenderIndex(uint32_t senderIndex);
207 
209  void setInitiatorEphemeral(const std::array<uint8_t, 32>& initiatorEphemeral);
210 
212  void setEncryptedInitiatorStatic(const std::array<uint8_t, 48>& encryptedInitiatorStatic);
213 
215  void setEncryptedTimestamp(const std::array<uint8_t, 28>& encryptedTimestamp);
216 
218  void setMac1(const std::array<uint8_t, 16>& mac1);
219 
221  void setMac2(const std::array<uint8_t, 16>& mac2);
222 
223  // implement abstract methods
224 
227  {
229  }
230  };
231 
235  {
236  private:
237 #pragma pack(push, 1)
240  typedef struct wg_handshake_response : wg_common_header
241  {
243  uint32_t senderIndex;
245  uint32_t receiverIndex;
247  uint8_t responderEphemeral[32];
249  uint8_t encryptedEmpty[16];
251  uint8_t mac1[16];
253  uint8_t mac2[16];
254  } wg_handshake_response;
255 #pragma pack(pop)
256 
257  wg_handshake_response* getHandshakeResponseHeader() const
258  {
259  return reinterpret_cast<wg_handshake_response*>(getBasicHeader());
260  }
261 
262  public:
268  WireGuardHandshakeResponseLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
269  : WireGuardLayer(data, dataLen, prevLayer, packet)
270  {}
271 
277  static bool isDataValid(const uint8_t* data, size_t dataLen)
278  {
279  return data != nullptr && dataLen >= sizeof(wg_handshake_response);
280  }
281 
289  WireGuardHandshakeResponseLayer(uint32_t senderIndex, uint32_t receiverIndex,
290  const uint8_t responderEphemeral[32], const uint8_t encryptedEmpty[16],
291  const uint8_t mac1[16], const uint8_t mac2[16]);
292 
294  uint32_t getSenderIndex() const;
295 
297  uint32_t getReceiverIndex() const;
298 
300  std::array<uint8_t, 32> getResponderEphemeral() const;
301 
303  std::array<uint8_t, 16> getEncryptedEmpty() const;
304 
306  std::array<uint8_t, 16> getMac1() const;
307 
309  std::array<uint8_t, 16> getMac2() const;
310 
312  void setSenderIndex(uint32_t senderIndex);
313 
315  void setReceiverIndex(uint32_t receiverIndex);
316 
318  void setResponderEphemeral(const std::array<uint8_t, 32>& responderEphemeral);
319 
321  void setEncryptedEmpty(const std::array<uint8_t, 16>& encryptedEmpty);
322 
324  void setMac1(const std::array<uint8_t, 16>& mac1);
325 
327  void setMac2(const std::array<uint8_t, 16>& mac2);
328 
329  // implement abstract methods
330 
333  {
335  }
336  };
337 
341  {
342  private:
343 #pragma pack(push, 1)
346  typedef struct wg_cookie_reply : wg_common_header
347  {
349  uint32_t receiverIndex;
351  uint8_t nonce[24];
353  uint8_t encryptedCookie[32];
354  } wg_cookie_reply;
355 #pragma pack(pop)
356 
357  wg_cookie_reply* getCookieReplyHeader() const
358  {
359  return reinterpret_cast<wg_cookie_reply*>(getBasicHeader());
360  }
361 
362  public:
368  WireGuardCookieReplyLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
369  : WireGuardLayer(data, dataLen, prevLayer, packet)
370  {}
371 
376  static bool isDataValid(const uint8_t* data, size_t dataLen)
377  {
378  return data != nullptr && dataLen >= sizeof(wg_cookie_reply);
379  }
380 
385  WireGuardCookieReplyLayer(uint32_t receiverIndex, const uint8_t nonce[24], const uint8_t encryptedCookie[32]);
386 
388  uint32_t getReceiverIndex() const;
389 
391  std::array<uint8_t, 24> getNonce() const;
392 
394  std::array<uint8_t, 32> getEncryptedCookie() const;
395 
397  void setReceiverIndex(uint32_t receiverIndex);
398 
400  void setNonce(const std::array<uint8_t, 24>& nonce);
401 
403  void setEncryptedCookie(const std::array<uint8_t, 32>& encryptedCookie);
404 
405  // implement abstract methods
406 
409  {
411  }
412  };
413 
417  {
418  private:
419 #pragma pack(push, 1)
422  typedef struct wg_transport_data : wg_common_header
423  {
425  uint32_t receiverIndex;
427  uint64_t counter;
429  uint8_t encryptedData[0];
430  } wg_transport_data;
431 #pragma pack(pop)
432 
433  wg_transport_data* getTransportHeader() const
434  {
435  return reinterpret_cast<wg_transport_data*>(getBasicHeader());
436  }
437 
438  public:
444  WireGuardTransportDataLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
445  : WireGuardLayer(data, dataLen, prevLayer, packet)
446  {}
447 
452  static bool isDataValid(const uint8_t* data, size_t dataLen)
453  {
454  return data != nullptr && dataLen >= sizeof(wg_transport_data);
455  }
456 
462  WireGuardTransportDataLayer(uint32_t receiverIndex, uint64_t counter, const uint8_t* encryptedData,
463  size_t encryptedDataLen);
464 
466  uint32_t getReceiverIndex() const;
467 
469  uint64_t getCounter() const;
470 
472  const uint8_t* getEncryptedData() const;
473 
475  void setReceiverIndex(uint32_t receiverIndex);
476 
478  void setCounter(uint64_t counter);
479 
483  void setEncryptedData(const uint8_t* encryptedData, size_t encryptedDataLen);
484 
485  // implement abstract methods
486 
489  {
491  }
492  };
493 } // namespace pcpp
Definition: Layer.h:117
Definition: Packet.h:49
Definition: WireGuardLayer.h:129
void setMac2(const std::array< uint8_t, 16 > &mac2)
WireGuardMessageType getWireGuardMessageType() const override
Definition: WireGuardLayer.h:226
void setMac1(const std::array< uint8_t, 16 > &mac1)
std::array< uint8_t, 48 > getEncryptedInitiatorStatic() const
std::array< uint8_t, 16 > getMac1() const
WireGuardHandshakeInitiationLayer(uint32_t senderIndex, const uint8_t initiatorEphemeral[32], const uint8_t encryptedInitiatorStatic[48], const uint8_t encryptedTimestamp[28], const uint8_t mac1[16], const uint8_t mac2[16])
std::array< uint8_t, 16 > getMac2() const
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: WireGuardLayer.h:170
std::array< uint8_t, 28 > getEncryptedTimestamp() const
void setEncryptedInitiatorStatic(const std::array< uint8_t, 48 > &encryptedInitiatorStatic)
WireGuardHandshakeInitiationLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: WireGuardLayer.h:161
void setEncryptedTimestamp(const std::array< uint8_t, 28 > &encryptedTimestamp)
std::array< uint8_t, 32 > getInitiatorEphemeral() const
void setInitiatorEphemeral(const std::array< uint8_t, 32 > &initiatorEphemeral)
void setSenderIndex(uint32_t senderIndex)
Definition: WireGuardLayer.h:235
std::array< uint8_t, 16 > getMac1() const
WireGuardHandshakeResponseLayer(uint32_t senderIndex, uint32_t receiverIndex, const uint8_t responderEphemeral[32], const uint8_t encryptedEmpty[16], const uint8_t mac1[16], const uint8_t mac2[16])
void setResponderEphemeral(const std::array< uint8_t, 32 > &responderEphemeral)
void setMac2(const std::array< uint8_t, 16 > &mac2)
void setReceiverIndex(uint32_t receiverIndex)
WireGuardMessageType getWireGuardMessageType() const override
Definition: WireGuardLayer.h:332
void setEncryptedEmpty(const std::array< uint8_t, 16 > &encryptedEmpty)
WireGuardHandshakeResponseLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: WireGuardLayer.h:268
void setMac1(const std::array< uint8_t, 16 > &mac1)
std::array< uint8_t, 16 > getMac2() const
void setSenderIndex(uint32_t senderIndex)
std::array< uint8_t, 32 > getResponderEphemeral() const
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: WireGuardLayer.h:277
std::array< uint8_t, 16 > getEncryptedEmpty() const
Definition: WireGuardLayer.h:16
void setReserved(const std::array< uint8_t, 3 > &reserved)
OsiModelLayer getOsiModelLayer() const override
Definition: WireGuardLayer.h:114
size_t getHeaderLen() const override
static bool isWireGuardPorts(uint16_t portSrc, uint16_t portDst)
Definition: WireGuardLayer.h:67
virtual WireGuardMessageType getWireGuardMessageType() const
Definition: WireGuardLayer.h:120
WireGuardMessageType
WireGuard message types.
Definition: WireGuardLayer.h:41
@ HandshakeInitiation
Handshake Initiation message.
@ HandshakeResponse
Handshake Response message.
@ TransportData
Transport Data message.
@ Unknown
Unknown Initiation message.
static bool isDataValid(const uint8_t *data, size_t dataLen)
std::string toString() const override
uint32_t getReserved() const
std::string getMessageTypeAsString() const
static WireGuardLayer * parseWireGuardLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
void parseNextLayer() override
Does nothing for this layer (WireGuard layer is always last)
Definition: WireGuardLayer.h:99
void computeCalculateFields() override
No fields to compute or update, so this method is left empty.
Definition: WireGuardLayer.h:106
WireGuardLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: WireGuardLayer.h:59
uint8_t getMessageType() const
Definition: WireGuardLayer.h:417
void setEncryptedData(const uint8_t *encryptedData, size_t encryptedDataLen)
void setCounter(uint64_t counter)
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: WireGuardLayer.h:452
WireGuardTransportDataLayer(uint32_t receiverIndex, uint64_t counter, const uint8_t *encryptedData, size_t encryptedDataLen)
WireGuardTransportDataLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: WireGuardLayer.h:444
const uint8_t * getEncryptedData() const
void setReceiverIndex(uint32_t receiverIndex)
WireGuardMessageType getWireGuardMessageType() const override
Definition: WireGuardLayer.h:488
const ProtocolType WireGuard
WireGuard protocol.
Definition: ProtocolType.h:240
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:420
@ OsiModelNetworkLayer
Network layer (layer 3)
Definition: ProtocolType.h:426
Definition: WireGuardLayer.h:22
uint8_t reserved[3]
Reserved field (3 bytes)
Definition: WireGuardLayer.h:26
uint8_t messageType
Message type field.
Definition: WireGuardLayer.h:24