

#include "precomp.h"


ULONG IPSecNumResets = 0;

#if DBG
ULONG NumAddSA = 0;
ULONG NumAddSU = 0;
ULONG NumAddFA = 0;
ULONG NumDelSA = 0;
ULONG NumDelSU = 0;
ULONG NumDelFA = 0;
ULONG NumReset = 0;
#endif


//
// Max timeout value (in seconds) for each class.
//
ULONG   IPSecMaxTimerValue[IPSEC_CLASS_MAX] = {
            IPSEC_MAX_TIMER_SHORT_DURATION,
            IPSEC_MAX_TIMER_LONG_DURATION,
            IPSEC_MAX_TIMER_SUPER_LONG_DURATION
        };

//
// Size of each timer wheel.
//
ULONG   IPSecTimerListSize[IPSEC_CLASS_MAX] = {
            SECONDS_TO_SHORT_TICKS(IPSEC_MAX_TIMER_SHORT_DURATION),
            SECONDS_TO_LONG_TICKS(IPSEC_MAX_TIMER_LONG_DURATION),
            SECONDS_TO_SUPER_LONG_TICKS(IPSEC_MAX_TIMER_SUPER_LONG_DURATION)
        };

//
// Interval between ticks, in seconds, for each class.
//
ULONG   IPSecTimerPeriod[IPSEC_CLASS_MAX] = {
            IPSEC_SHORT_DURATION_TIMER_PERIOD,
            IPSEC_LONG_DURATION_TIMER_PERIOD,
            IPSEC_SUPER_LONG_DURATION_TIMER_PERIOD
        };

#if GPC
ULONG DebugGPC = 0;
#endif

#if DBG
ULONG IPSecDebug = 0;
#endif

UCHAR DefaultPad[MAX_PAD_LEN] = {1, 2, 3, 4, 5, 6, 7, 8, 9};


#if DBG
IPAddr DebugSrc = 0;
IPAddr DebugDst = 0;
UCHAR DebugPro = 0;
ULONG DebugPkt = 0;
ULONG DebugOff = 0;
ULONG DebugQry = 1;
#endif


RC4_KEYSTRUCT IPSecRngKey;

WORK_QUEUE_ITEM IPSecRngQueueItem;

ULONG IPSecRngBytes = 0;

#if DBG
ULONG IPSecRngInRekey = 0;
#endif

unsigned char weak_keys[][DES_BLOCKLEN] = {
		/* the weak keys */
	{ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
	{ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe },
	{ 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f },
	{ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0 },
		/* the semi-weak keys */
	{ 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe },
	{ 0x1f, 0xe0, 0x1f, 0xe0, 0x1f, 0xe0, 0x1f, 0xe0 },
	{ 0x01, 0xe0, 0x01, 0xe0, 0x01, 0xe0, 0x01, 0xe0 },
	{ 0x1f, 0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x1f, 0xfe },
	{ 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x1f },
	{ 0xe0, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe },
	{ 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x01 },
	{ 0xe0, 0x1f, 0xe0, 0x1f, 0xe0, 0x1f, 0xe0, 0x1f },
	{ 0xe0, 0x01, 0xe0, 0x01, 0xe0, 0x01, 0xe0, 0x01 },
	{ 0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x1f, 0xfe, 0x1f },
	{ 0x1f, 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x1f, 0x01 },
	{ 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xe0 }
};


PDEVICE_OBJECT IPSecDevice = NULL;

ULONG IPSecInitFlag = 0;

IPSEC_GLOBAL g_ipsec;

LARGE_INTEGER IPSecDelayInterval;

DWORD gdwInitEsp = 0;

DWORD gdwInitAh = 0;

