Coverage Report

Created: 2025-09-27 08:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/PcapPlusPlus/Packet++/src/IPSecLayer.cpp
Line
Count
Source
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
5.14k
  {
56
5.14k
    size_t headerLen = getHeaderLen();
57
5.14k
    if (m_DataLen <= headerLen)
58
4
      return;
59
60
5.13k
    uint8_t* payload = m_Data + headerLen;
61
5.13k
    size_t payloadLen = m_DataLen - headerLen;
62
63
5.13k
    switch (getAHHeader()->nextHeader)
64
5.13k
    {
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
83
    case PACKETPP_IPPROTO_TCP:
71
83
      m_NextLayer = TcpLayer::isDataValid(payload, payloadLen)
72
83
                        ? static_cast<Layer*>(new TcpLayer(payload, payloadLen, this, m_Packet))
73
83
                        : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet));
74
83
      break;
75
28
    case PACKETPP_IPPROTO_IPIP:
76
28
    {
77
28
      uint8_t ipVersion = *payload >> 4;
78
28
      if (ipVersion == 4 && IPv4Layer::isDataValid(payload, payloadLen))
79
6
        m_NextLayer = new IPv4Layer(payload, payloadLen, this, m_Packet);
80
22
      else if (ipVersion == 6 && IPv6Layer::isDataValid(payload, payloadLen))
81
7
        m_NextLayer = new IPv6Layer(payload, payloadLen, this, m_Packet);
82
15
      else
83
15
        m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet);
84
28
      break;
85
0
    }
86
2.81k
    case PACKETPP_IPPROTO_ESP:
87
2.81k
      m_NextLayer = ESPLayer::isDataValid(payload, payloadLen)
88
2.81k
                        ? static_cast<Layer*>(new ESPLayer(payload, payloadLen, this, m_Packet))
89
2.81k
                        : static_cast<Layer*>(new PayloadLayer(payload, payloadLen, this, m_Packet));
90
2.81k
      break;
91
2.21k
    default:
92
2.21k
      m_NextLayer = new PayloadLayer(payload, payloadLen, this, m_Packet);
93
5.13k
    }
94
5.13k
  }
95
96
  std::string AuthenticationHeaderLayer::toString() const
97
1.67k
  {
98
1.67k
    return "Authentication Header Layer";
99
1.67k
  }
100
101
  // ----------------
102
  // ESPLayer methods
103
  // ----------------
104
105
  uint32_t ESPLayer::getSPI() const
106
1.59k
  {
107
1.59k
    return be32toh(getESPHeader()->spi);
108
1.59k
  }
109
110
  uint32_t ESPLayer::getSequenceNumber() const
111
0
  {
112
0
    return be32toh(getESPHeader()->sequenceNumber);
113
0
  }
114
115
  void ESPLayer::parseNextLayer()
116
4.36k
  {
117
4.36k
    size_t headerLen = getHeaderLen();
118
4.36k
    if (m_DataLen <= headerLen)
119
1.59k
      return;
120
121
2.76k
    m_NextLayer = new PayloadLayer(m_Data + headerLen, m_DataLen - headerLen, this, m_Packet);
122
2.76k
  }
123
124
  std::string ESPLayer::toString() const
125
1.59k
  {
126
1.59k
    std::ostringstream stream;
127
1.59k
    stream << "ESP Layer, SPI: 0x" << std::hex << getSPI();
128
1.59k
    return stream.str();
129
1.59k
  }
130
131
}  // namespace pcpp