Coverage Report

Created: 2025-08-29 07:34

/src/PcapPlusPlus/Packet++/src/IPSecLayer.cpp
Line
Count
Source (jump to first uncovered line)
1
#define LOG_MODULE PacketLogModuleIPSecLayer
2
3
#include "EndianPortable.h"
4
#include "GeneralUtils.h"
5
#include "IPSecLayer.h"
6
#include "IPv4Layer.h"
7
#include "IPv6Layer.h"
8
#include "UdpLayer.h"
9
#include "TcpLayer.h"
10
#include "PayloadLayer.h"
11
#include <sstream>
12
13
namespace pcpp
14
{
15
16
  // ---------------------------------
17
  // AuthenticationHeaderLayer methods
18
  // ---------------------------------
19
20
  uint32_t AuthenticationHeaderLayer::getSPI() const
21
0
  {
22
0
    return be32toh(getAHHeader()->spi);
23
0
  }
24
25
  uint32_t AuthenticationHeaderLayer::getSequenceNumber() const
26
0
  {
27
0
    return be32toh(getAHHeader()->sequenceNumber);
28
0
  }
29
30
  size_t AuthenticationHeaderLayer::getICVLength() const
31
0
  {
32
    // payloadLen = 3 (fixed ipsec_authentication_header size 32-bit words) + ICV - 2
33
    // ICV = (payloadLen + 2 - 3) in 32-bit words
34
0
    return (getAHHeader()->payloadLen - 1) * 4;
35
0
  }
36
37
  uint8_t* AuthenticationHeaderLayer::getICVBytes() const
38
0
  {
39
0
    size_t icvLength = getICVLength();
40
0
    if (icvLength > 0)
41
0
      return m_Data + sizeof(ipsec_authentication_header);
42
0
    return nullptr;
43
0
  }
44
45
  std::string AuthenticationHeaderLayer::getICVHexStream() const
46
0
  {
47
0
    uint8_t* bytes = getICVBytes();
48
0
    if (bytes == nullptr)
49
0
      return "";
50
51
0
    return byteArrayToHexString(bytes, getICVLength());
52
0
  }
53
54
  void AuthenticationHeaderLayer::parseNextLayer()
55
0
  {
56
0
    size_t headerLen = getHeaderLen();
57
0
    if (m_DataLen <= headerLen)
58
0
      return;
59
60
0
    uint8_t* payload = m_Data + headerLen;
61
0
    size_t payloadLen = m_DataLen - headerLen;
62
63
0
    switch (getAHHeader()->nextHeader)
64
0
    {
65
0
    case PACKETPP_IPPROTO_UDP:
66
0
      m_NextLayer = UdpLayer::isDataValid(payload, payloadLen)
67
0
                        ? static_cast<Layer*>(new UdpLayer(payload, payloadLen, this, m_Packet))
68
0
                        : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet));
69
0
      break;
70
0
    case PACKETPP_IPPROTO_TCP:
71
0
      m_NextLayer = TcpLayer::isDataValid(payload, payloadLen)
72
0
                        ? static_cast<Layer*>(new TcpLayer(payload, payloadLen, this, m_Packet))
73
0
                        : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet));
74
0
      break;
75
0
    case PACKETPP_IPPROTO_IPIP:
76
0
    {
77
0
      uint8_t ipVersion = *payload >> 4;
78
0
      if (ipVersion == 4 && IPv4Layer::isDataValid(payload, payloadLen))
79
0
        m_NextLayer = new IPv4Layer(payload, payloadLen, this, m_Packet);
80
0
      else if (ipVersion == 6 && IPv6Layer::isDataValid(payload, payloadLen))
81
0
        m_NextLayer = new IPv6Layer(payload, payloadLen, this, m_Packet);
82
0
      else
83
0
        m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet);
84
0
      break;
85
0
    }
86
0
    case PACKETPP_IPPROTO_ESP:
87
0
      m_NextLayer = ESPLayer::isDataValid(payload, payloadLen)
88
0
                        ? static_cast<Layer*>(new ESPLayer(payload, payloadLen, this, m_Packet))
89
0
                        : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet));
90
0
      break;
91
0
    default:
92
0
      m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet);
93
0
    }
94
0
  }
95
96
  std::string AuthenticationHeaderLayer::toString() const
97
0
  {
98
0
    return "Authentication Header Layer";
99
0
  }
100
101
  // ----------------
102
  // ESPLayer methods
103
  // ----------------
104
105
  uint32_t ESPLayer::getSPI() const
106
0
  {
107
0
    return be32toh(getESPHeader()->spi);
108
0
  }
109
110
  uint32_t ESPLayer::getSequenceNumber() const
111
0
  {
112
0
    return be32toh(getESPHeader()->sequenceNumber);
113
0
  }
114
115
  void ESPLayer::parseNextLayer()
116
0
  {
117
0
    size_t headerLen = getHeaderLen();
118
0
    if (m_DataLen <= headerLen)
119
0
      return;
120
121
0
    m_NextLayer = new PayloadLayer(m_Data + headerLen, m_DataLen - headerLen, this, m_Packet);
122
0
  }
123
124
  std::string ESPLayer::toString() const
125
0
  {
126
0
    std::ostringstream stream;
127
0
    stream << "ESP Layer, SPI: 0x" << std::hex << getSPI();
128
0
    return stream.str();
129
0
  }
130
131
}  // namespace pcpp