2019-10-23 15:57:44 +02:00
|
|
|
#include "test_common.h"
|
2015-06-18 09:20:53 +02:00
|
|
|
|
2024-08-16 11:52:42 +02:00
|
|
|
#include <openvpn/crypto/packet_id_control.hpp>
|
2015-06-18 09:20:53 +02:00
|
|
|
|
|
|
|
using namespace openvpn;
|
|
|
|
|
2024-08-16 11:52:42 +02:00
|
|
|
struct PacketIDControlConstruct : public PacketIDControl
|
|
|
|
{
|
|
|
|
PacketIDControlConstruct(const PacketIDControl::time_t v_time = PacketIDControl::time_t(0), const PacketIDControl::id_t v_id = PacketIDControl::id_t(0))
|
|
|
|
{
|
|
|
|
id = v_id;
|
|
|
|
time = v_time;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2019-10-23 15:57:44 +02:00
|
|
|
template <typename PIDRecv>
|
2015-06-18 09:20:53 +02:00
|
|
|
void testcase(PIDRecv &pr,
|
2024-08-16 11:52:42 +02:00
|
|
|
const PacketIDControl::time_t t,
|
|
|
|
const PacketIDControl::time_t pkt_time,
|
|
|
|
const PacketIDControl::id_t pkt_id,
|
2015-06-18 09:20:53 +02:00
|
|
|
const Error::Type expected_status)
|
|
|
|
{
|
2024-08-16 11:52:42 +02:00
|
|
|
const PacketIDControlConstruct pid(pkt_time, pkt_id);
|
2015-06-18 09:20:53 +02:00
|
|
|
const Error::Type status = pr.do_test_add(pid, t, true);
|
2019-10-23 15:57:44 +02:00
|
|
|
// OPENVPN_LOG("[" << t << "] id=" << pkt_id << " time=" << pkt_time << ' ' << Error::name(status));
|
|
|
|
ASSERT_EQ(status, expected_status);
|
2015-06-18 09:20:53 +02:00
|
|
|
}
|
|
|
|
|
2024-08-16 11:52:42 +02:00
|
|
|
TEST(misc, pktid_test_control)
|
2015-06-18 09:20:53 +02:00
|
|
|
{
|
2024-08-16 11:52:42 +02:00
|
|
|
typedef PacketIDControlReceiveType<3, 5> PIDRecv;
|
2015-06-18 09:20:53 +02:00
|
|
|
SessionStats::Ptr stats(new SessionStats());
|
|
|
|
PIDRecv pr;
|
2024-08-16 11:52:42 +02:00
|
|
|
pr.init("test", 0, stats);
|
2023-01-11 20:43:22 +01:00
|
|
|
|
2015-06-18 09:20:53 +02:00
|
|
|
testcase(pr, 0, 0, 0, Error::PKTID_INVALID);
|
|
|
|
testcase(pr, 1, 0, 1, Error::SUCCESS);
|
|
|
|
testcase(pr, 1, 0, 1, Error::PKTID_REPLAY); /* replay */
|
|
|
|
testcase(pr, 2, 0, 2, Error::SUCCESS);
|
|
|
|
testcase(pr, 3, 0, 4, Error::SUCCESS);
|
|
|
|
testcase(pr, 4, 0, 1, Error::PKTID_REPLAY); /* replay */
|
|
|
|
testcase(pr, 5, 0, 3, Error::SUCCESS);
|
2023-01-11 20:43:22 +01:00
|
|
|
|
2015-06-18 09:20:53 +02:00
|
|
|
testcase(pr, 6, 0, 8, Error::SUCCESS);
|
|
|
|
testcase(pr, 10, 0, 5, Error::SUCCESS);
|
|
|
|
testcase(pr, 15, 0, 7, Error::PKTID_EXPIRE); /* expire backtrack */
|
2023-01-11 20:43:22 +01:00
|
|
|
|
2015-06-18 09:20:53 +02:00
|
|
|
testcase(pr, 20, 0, 127, Error::SUCCESS);
|
|
|
|
testcase(pr, 20, 0, 127, Error::PKTID_REPLAY);
|
|
|
|
testcase(pr, 21, 0, 128, Error::SUCCESS);
|
|
|
|
testcase(pr, 22, 0, 64, Error::PKTID_BACKTRACK); /* large backtrack */
|
|
|
|
testcase(pr, 23, 0, 65, Error::SUCCESS);
|
|
|
|
testcase(pr, 24, 0, 66, Error::SUCCESS);
|
2023-01-11 20:43:22 +01:00
|
|
|
|
2015-06-18 09:20:53 +02:00
|
|
|
testcase(pr, 30, 10, 0, Error::PKTID_INVALID);
|
|
|
|
testcase(pr, 31, 10, 2, Error::SUCCESS);
|
|
|
|
testcase(pr, 32, 10, 1, Error::SUCCESS);
|
|
|
|
testcase(pr, 33, 9, 3, Error::PKTID_TIME_BACKTRACK); /* time backtrack */
|
|
|
|
testcase(pr, 33, 0, 3, Error::PKTID_TIME_BACKTRACK); /* time backtrack */
|
2023-01-11 20:43:22 +01:00
|
|
|
|
2015-06-18 09:20:53 +02:00
|
|
|
testcase(pr, 40, 10, 0xfffffffe, Error::SUCCESS);
|
|
|
|
testcase(pr, 41, 10, 0xffffffff, Error::SUCCESS);
|
|
|
|
testcase(pr, 42, 10, 0, Error::PKTID_INVALID); /* wrap */
|
2023-01-11 20:43:22 +01:00
|
|
|
|
2015-06-18 09:20:53 +02:00
|
|
|
testcase(pr, 50, 11, 1, Error::SUCCESS);
|
|
|
|
testcase(pr, 51, 11, 2, Error::SUCCESS);
|
|
|
|
testcase(pr, 52, 11, 3, Error::SUCCESS);
|
|
|
|
testcase(pr, 53, 11, 3, Error::PKTID_REPLAY); /* replay */
|
|
|
|
testcase(pr, 54, 11, 10, Error::SUCCESS);
|
|
|
|
testcase(pr, 55, 11, 9, Error::SUCCESS);
|
|
|
|
testcase(pr, 56, 11, 1, Error::PKTID_REPLAY); /* replay */
|
|
|
|
testcase(pr, 57, 11, 8, Error::SUCCESS);
|
|
|
|
testcase(pr, 58, 11, 4, Error::SUCCESS);
|
|
|
|
testcase(pr, 63, 11, 5, Error::PKTID_EXPIRE); /* expire backtrack */
|
2023-01-11 20:43:22 +01:00
|
|
|
|
2015-06-18 09:20:53 +02:00
|
|
|
testcase(pr, 70, 15, 1, Error::SUCCESS);
|
|
|
|
testcase(pr, 70, 15, 3, Error::SUCCESS);
|
|
|
|
testcase(pr, 70, 15, 2, Error::SUCCESS);
|
2023-01-11 20:43:22 +01:00
|
|
|
|
2015-06-18 09:20:53 +02:00
|
|
|
testcase(pr, 80, 15, 50, Error::SUCCESS);
|
|
|
|
testcase(pr, 80, 15, 80, Error::SUCCESS);
|
|
|
|
testcase(pr, 81, 15, 127, Error::SUCCESS);
|
|
|
|
testcase(pr, 82, 15, 128, Error::SUCCESS);
|
|
|
|
testcase(pr, 83, 15, 64, Error::PKTID_BACKTRACK); /* large backtrack */
|
|
|
|
testcase(pr, 84, 15, 65, Error::SUCCESS);
|
|
|
|
testcase(pr, 85, 15, 66, Error::SUCCESS);
|
|
|
|
}
|
|
|
|
|
2019-10-23 15:57:44 +02:00
|
|
|
template <unsigned int ORDER, unsigned int EXPIRE>
|
2015-06-18 09:20:53 +02:00
|
|
|
void perfiter(const long n,
|
|
|
|
const long range,
|
|
|
|
const long step,
|
|
|
|
const long iter_per_step_pre,
|
|
|
|
long &count)
|
|
|
|
{
|
2024-08-16 11:52:42 +02:00
|
|
|
typedef PacketIDControlReceiveType<ORDER, EXPIRE> PIDRecv;
|
2015-06-18 09:20:53 +02:00
|
|
|
|
|
|
|
const long iter_per_step = iter_per_step_pre * step;
|
2019-10-23 15:57:44 +02:00
|
|
|
// OPENVPN_LOG("ITER order=" << ORDER << " n=" << n << " range=" << range << " step=" << step << " iter_per_step="
|
|
|
|
// << iter_per_step);
|
2015-06-18 09:20:53 +02:00
|
|
|
|
2024-08-16 11:52:42 +02:00
|
|
|
constexpr PacketIDControl::time_t pkt_time = 1234;
|
2015-06-18 09:20:53 +02:00
|
|
|
|
2019-10-23 15:57:44 +02:00
|
|
|
MTRand urand;
|
2015-06-18 09:20:53 +02:00
|
|
|
std::vector<bool> bv(n);
|
|
|
|
long high = 0;
|
|
|
|
SessionStats::Ptr stats(new SessionStats());
|
|
|
|
PIDRecv pr;
|
2024-08-16 11:52:42 +02:00
|
|
|
pr.init("test", 0, stats);
|
2015-06-18 09:20:53 +02:00
|
|
|
|
|
|
|
for (long i = 1; i < n; i += step)
|
|
|
|
{
|
|
|
|
for (long j = 0; j < iter_per_step; ++j)
|
|
|
|
{
|
2023-08-21 15:51:50 +02:00
|
|
|
const long delta = long(urand.randrange32(static_cast<uint32_t>(range))) - range / 2;
|
2015-06-18 09:20:53 +02:00
|
|
|
const long id = i + delta;
|
|
|
|
if (id >= 0 && id < n)
|
|
|
|
{
|
|
|
|
if (id > high)
|
|
|
|
high = id;
|
|
|
|
Error::Type expected = Error::SUCCESS;
|
|
|
|
if (!id)
|
|
|
|
expected = Error::PKTID_INVALID;
|
2022-07-06 11:19:28 +02:00
|
|
|
else if (high - id >= (const long)PIDRecv::REPLAY_WINDOW_SIZE)
|
2015-06-18 09:20:53 +02:00
|
|
|
expected = Error::PKTID_BACKTRACK;
|
|
|
|
else if (bv[id])
|
|
|
|
expected = Error::PKTID_REPLAY;
|
2024-08-16 11:52:42 +02:00
|
|
|
const PacketIDControlConstruct pid(0, static_cast<unsigned>(id));
|
2015-06-18 09:20:53 +02:00
|
|
|
const Error::Type result = pr.do_test_add(pid, pkt_time, true);
|
|
|
|
++count;
|
|
|
|
#define INFO "i=" << i << " id=" << id << " high=" << high << " result=" << Error::name(result) << " expected=" << Error::name(expected)
|
|
|
|
// OPENVPN_LOG(INFO);
|
2019-10-23 15:57:44 +02:00
|
|
|
ASSERT_EQ(result, expected) << INFO;
|
2015-06-18 09:20:53 +02:00
|
|
|
if (expected == Error::SUCCESS)
|
|
|
|
bv[id] = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-10-23 15:57:44 +02:00
|
|
|
template <unsigned int ORDER, unsigned int EXPIRE>
|
2015-06-18 09:20:53 +02:00
|
|
|
void perf(long &count)
|
|
|
|
{
|
2024-08-16 11:52:42 +02:00
|
|
|
typedef PacketIDControlReceiveType<ORDER, EXPIRE> PIDRecv;
|
2023-01-11 20:43:22 +01:00
|
|
|
|
2019-10-23 15:57:44 +02:00
|
|
|
perfiter<ORDER, EXPIRE>(20000, PIDRecv::REPLAY_WINDOW_SIZE * 3, 1, 10, count);
|
|
|
|
perfiter<ORDER, EXPIRE>(20000, PIDRecv::REPLAY_WINDOW_SIZE * 3, PIDRecv::REPLAY_WINDOW_SIZE / 2, 10, count);
|
|
|
|
perfiter<ORDER, EXPIRE>(20000, PIDRecv::REPLAY_WINDOW_SIZE * 2, 1, 10, count);
|
|
|
|
perfiter<ORDER, EXPIRE>(20000, PIDRecv::REPLAY_WINDOW_SIZE * 2, PIDRecv::REPLAY_WINDOW_SIZE / 2, 10, count);
|
2019-09-20 01:40:30 +02:00
|
|
|
perfiter<ORDER, EXPIRE>(20000, 16, 1, 10, count);
|
2019-10-23 15:57:44 +02:00
|
|
|
perfiter<ORDER, EXPIRE>(20000, 16, PIDRecv::REPLAY_WINDOW_SIZE / 2, 10, count);
|
2019-09-20 01:40:30 +02:00
|
|
|
perfiter<ORDER, EXPIRE>(20000, 4, 1, 10, count);
|
2019-10-23 15:57:44 +02:00
|
|
|
perfiter<ORDER, EXPIRE>(20000, 4, PIDRecv::REPLAY_WINDOW_SIZE / 2, 10, count);
|
2015-06-18 09:20:53 +02:00
|
|
|
}
|
|
|
|
|
2024-08-16 11:52:42 +02:00
|
|
|
TEST(misc, pktid_control_perf)
|
2015-06-18 09:20:53 +02:00
|
|
|
{
|
2024-08-16 11:52:42 +02:00
|
|
|
long count = 0;
|
|
|
|
perf<3, 5>(count);
|
|
|
|
perf<6, 5>(count);
|
|
|
|
perf<8, 5>(count);
|
|
|
|
// ASSERT_EQ(4746439, count);
|
2015-06-18 09:20:53 +02:00
|
|
|
}
|