111 lines
2.5 KiB
C
111 lines
2.5 KiB
C
|
|
|
|
#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;
|
|
|