Coverage Report

Created: 2026-03-31 07:53

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.19k
  {
56
5.19k
    size_t headerLen = getHeaderLen();
57
5.19k
    if (m_DataLen <= headerLen)
58
4
      return;
59
60
5.18k
    uint8_t* payload = m_Data + headerLen;
61
5.18k
    size_t payloadLen = m_DataLen - headerLen;
62
63
5.18k
    switch (getAHHeader()->nextHeader)
64
5.18k
    {
65
0
    case PACKETPP_IPPROTO_UDP:
66
0
    {
67
0
      tryConstructNextLayerWithFallback<UdpLayer, PayloadLayer>(payload, payloadLen);
68
0
      break;
69
0
    }
70
90
    case PACKETPP_IPPROTO_TCP:
71
90
    {
72
90
      tryConstructNextLayerWithFallback<TcpLayer, PayloadLayer>(payload, payloadLen);
73
90
      break;
74
0
    }
75
17
    case PACKETPP_IPPROTO_IPIP:
76
17
    {
77
17
      uint8_t ipVersion = *payload >> 4;
78
17
      switch (ipVersion)
79
17
      {
80
5
      case 4:
81
5
      {
82
5
        tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
83
5
        break;
84
0
      }
85
7
      case 6:
86
7
      {
87
7
        tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
88
7
        break;
89
0
      }
90
5
      default:
91
5
      {
92
5
        constructNextLayer<PayloadLayer>(payload, payloadLen);
93
5
        break;
94
0
      }
95
17
      }
96
17
      break;
97
17
    }
98
3.16k
    case PACKETPP_IPPROTO_ESP:
99
3.16k
    {
100
3.16k
      tryConstructNextLayerWithFallback<ESPLayer, PayloadLayer>(payload, payloadLen);
101
3.16k
      break;
102
17
    }
103
1.91k
    default:
104
1.91k
      constructNextLayer<PayloadLayer>(payload, payloadLen);
105
5.18k
    }
106
5.18k
  }
107
108
  std::string AuthenticationHeaderLayer::toString() const
109
1.71k
  {
110
1.71k
    return "Authentication Header Layer";
111
1.71k
  }
112
113
  // ----------------
114
  // ESPLayer methods
115
  // ----------------
116
117
  uint32_t ESPLayer::getSPI() const
118
2.31k
  {
119
2.31k
    return be32toh(getESPHeader()->spi);
120
2.31k
  }
121
122
  uint32_t ESPLayer::getSequenceNumber() const
123
0
  {
124
0
    return be32toh(getESPHeader()->sequenceNumber);
125
0
  }
126
127
  void ESPLayer::parseNextLayer()
128
6.70k
  {
129
6.70k
    size_t headerLen = getHeaderLen();
130
6.70k
    if (m_DataLen <= headerLen)
131
1.79k
      return;
132
133
4.91k
    constructNextLayer<PayloadLayer>(m_Data + headerLen, m_DataLen - headerLen);
134
4.91k
  }
135
136
  std::string ESPLayer::toString() const
137
2.31k
  {
138
2.31k
    std::ostringstream stream;
139
2.31k
    stream << "ESP Layer, SPI: 0x" << std::hex << getSPI();
140
2.31k
    return stream.str();
141
2.31k
  }
142
143
}  // namespace pcpp