You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6340 lines
162 KiB
6340 lines
162 KiB
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Module : Dynamic/DyanamicShow.cpp
|
|
//
|
|
// Purpose : Dynamic Show commands Implementation.
|
|
//
|
|
//
|
|
// Developers Name : Bharat/Radhika
|
|
//
|
|
// History :
|
|
//
|
|
// Date Author Comments
|
|
// 9-23-2001 Bharat Initial Version. V1.0
|
|
// 11-21-2001 Bharat Version. V1.1
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "nshipsec.h"
|
|
#include "staticshowutils.h"
|
|
|
|
extern HINSTANCE g_hModule;
|
|
extern HKEY g_hGlobalRegistryKey;
|
|
extern _TCHAR* g_szDynamicMachine;
|
|
extern STORAGELOCATION g_StorageLocation;
|
|
|
|
UINT QMPFSDHGroup(DWORD dwPFSGroup);
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : ShowMMPolicy
|
|
//
|
|
// Date of Creation: 9-3-2001
|
|
//
|
|
// Parameters : IN LPTSTR pszShowPolicyName
|
|
//
|
|
// Return : DWORD
|
|
//
|
|
// Description : This function prepares data to display Mainmode Policies.
|
|
//
|
|
// History :
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
ShowMMPolicy(
|
|
IN LPTSTR pszShowPolicyName
|
|
)
|
|
{
|
|
DWORD dwCount = 0; // counting objects here
|
|
DWORD dwResumeHandle = 0; // handle for continuation calls
|
|
DWORD i=0, j=0;
|
|
DWORD dwReturn = ERROR_SUCCESS; // assume success
|
|
DWORD dwVersion = 0;
|
|
BOOL bNameFin = FALSE;
|
|
PIPSEC_MM_POLICY pIPSecMMP = NULL; // for MM policy calls
|
|
|
|
for(i = 0; ;i+=dwCount)
|
|
{
|
|
dwReturn = EnumMMPolicies(g_szDynamicMachine, dwVersion, NULL, 0, 0, &pIPSecMMP, &dwCount, &dwResumeHandle, NULL);
|
|
//If there is no data Bail out.
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
if (i == 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_MMP_6);
|
|
//This is to avoid one more error message show up!!
|
|
bNameFin = TRUE;
|
|
}
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pIPSecMMP && dwCount > 0))
|
|
{
|
|
// not required to continue.
|
|
BAIL_OUT;
|
|
}
|
|
// Show all the main mode policies
|
|
if(!pszShowPolicyName)
|
|
{
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
PrintMMPolicy(pIPSecMMP[j]);
|
|
|
|
}
|
|
}
|
|
// Show main mode policy for the given policy name.
|
|
else if(pszShowPolicyName)
|
|
{
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
if(_tcsicmp(pIPSecMMP[j].pszPolicyName,pszShowPolicyName) == 0)
|
|
{
|
|
PrintMMPolicy(pIPSecMMP[j]);
|
|
bNameFin = TRUE;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
}
|
|
|
|
SPDApiBufferFree(pIPSecMMP);
|
|
pIPSecMMP=NULL;
|
|
}
|
|
|
|
error:
|
|
if(pszShowPolicyName && !bNameFin)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_MMP_5);
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
|
|
if(pIPSecMMP)
|
|
{
|
|
//error path clean up
|
|
SPDApiBufferFree(pIPSecMMP);
|
|
pIPSecMMP=NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : PrintMMPolicy
|
|
//
|
|
// Date of Creation: 9-3-2001
|
|
//
|
|
// Parameters : IN IPSEC_MM_POLICY MMPolicy
|
|
//
|
|
// Return : DWORD
|
|
//
|
|
// Description : This function displays headings and policy name for Mainmode Policy.
|
|
//
|
|
// History :
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
PrintMMPolicy(
|
|
IN IPSEC_MM_POLICY MMPolicy
|
|
)
|
|
{
|
|
DWORD i = 0;
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_POLNAME, MMPolicy.pszPolicyName );
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_SOFTSA, MMPolicy.uSoftExpirationTime);
|
|
|
|
if(MMPolicy.dwOfferCount>0) //offers are greater than 0, print the header for it
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMP_COLUMN_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMP_COLUMN_HEADING_UNDERLINE);
|
|
}
|
|
for (i = 0; i < MMPolicy.dwOfferCount; i++)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMMOffer(MMPolicy.pOffers[i]);
|
|
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: PrintMMOffer
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: IN IPSEC_MM_OFFER MMOffer
|
|
//
|
|
//Return: VOID
|
|
//
|
|
//Description: This function displays offer details for each Mainmode Policy.
|
|
//
|
|
// History :
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
PrintMMOffer(
|
|
IN IPSEC_MM_OFFER MMOffer
|
|
)
|
|
{
|
|
//This is to display DH2048 as 3
|
|
if(MMOffer.dwDHGroup == DH_GROUP_2048)
|
|
{
|
|
MMOffer.dwDHGroup = 2048;
|
|
}
|
|
//Display of Encryption algorithm
|
|
switch(MMOffer.EncryptionAlgorithm.uAlgoIdentifier)
|
|
{
|
|
case 1:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMP_ESP_DES_ALGO);
|
|
break;
|
|
case 2:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMP_ESP_UNKNOWN_ALGO);
|
|
break;
|
|
case 3:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMP_ESP_3DES_ALGO);
|
|
break;
|
|
case 0:
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMP_ESP_NONE_ALGO);
|
|
break;
|
|
|
|
}
|
|
//Display of Hash algorithm
|
|
switch(MMOffer.HashingAlgorithm.uAlgoIdentifier)
|
|
{
|
|
|
|
case 1:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMP_AH_MD5_ALGO);
|
|
break;
|
|
case 2:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMP_AH_SHA1_ALGO);
|
|
break;
|
|
case 0:
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMP_AH_NONE_ALGO);
|
|
break;
|
|
|
|
}
|
|
//IF QMPERMM is 1 then 1 (MMPFS) is displayed.
|
|
if(MMOffer.dwQuickModeLimit != 1)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMP_DH_LIFE_QMLIMIT,MMOffer.dwDHGroup, MMOffer.Lifetime.uKeyExpirationKBytes, MMOffer.Lifetime.uKeyExpirationTime, MMOffer.dwQuickModeLimit );
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMP_DH_LIFE_QMLIMIT_MMPFS,MMOffer.dwDHGroup, MMOffer.Lifetime.uKeyExpirationKBytes, MMOffer.Lifetime.uKeyExpirationTime);
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: ShowQMPolicy
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: IN LPTSTR pszShowPolicyName
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function prepares data to display quickmode Policy.
|
|
//
|
|
// History :
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
ShowQMPolicy(
|
|
IN LPTSTR pszShowPolicyName
|
|
)
|
|
{
|
|
DWORD dwCount = 0; // counting objects here
|
|
DWORD dwResumeHandle = 0; // handle for continuation calls
|
|
DWORD i=0, j=0;
|
|
DWORD dwReturn = ERROR_SUCCESS; // assume success
|
|
DWORD dwVersion = 0;
|
|
BOOL bNameFin = FALSE;
|
|
PIPSEC_QM_POLICY pIPSecQMP = NULL; // for QM policy calls
|
|
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
dwReturn = EnumQMPolicies(g_szDynamicMachine, dwVersion, NULL, 0, 0, &pIPSecQMP, &dwCount, &dwResumeHandle, NULL);
|
|
//If there is no data Bail out.
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
if (i == 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_QMP_6);
|
|
//This is to avoid one more error message show up!!
|
|
bNameFin = TRUE;
|
|
}
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pIPSecQMP && dwCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
//Show all QMPolicies
|
|
if(!pszShowPolicyName)
|
|
{
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
PrintFilterAction(pIPSecQMP[j]);
|
|
}
|
|
}
|
|
//Show QMPolicy for the given name
|
|
else if(pszShowPolicyName)
|
|
{
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
if(_tcsicmp(pIPSecQMP[j].pszPolicyName,pszShowPolicyName) == 0)
|
|
{
|
|
PrintFilterAction(pIPSecQMP[j]);
|
|
bNameFin = TRUE;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
SPDApiBufferFree(pIPSecQMP);
|
|
pIPSecQMP=NULL;
|
|
}
|
|
|
|
error:
|
|
if(pszShowPolicyName && !bNameFin)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_QMP_5);
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
|
|
if(pIPSecQMP)
|
|
{
|
|
//error path cleanup
|
|
SPDApiBufferFree(pIPSecQMP);
|
|
pIPSecQMP=NULL;
|
|
}
|
|
return dwReturn;
|
|
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: PrintFilterAction
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: IN IPSEC_QM_POLICY QMPolicy
|
|
//
|
|
//Return: VOID
|
|
//
|
|
//Description: This function displays quickmode Policy name and headers.
|
|
//
|
|
// History :
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
PrintFilterAction(
|
|
IN IPSEC_QM_POLICY QMPolicy
|
|
)
|
|
{
|
|
DWORD i = 0;
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_NEGOTIATION_NAME, QMPolicy.pszPolicyName);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
|
|
if(QMPolicy.dwOfferCount>0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_COLUMN_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_COLUMN_HEADING_UNDERLINE);
|
|
}
|
|
|
|
for (i = 0; i < QMPolicy.dwOfferCount; i++)
|
|
{
|
|
PrintQMOffer(QMPolicy.pOffers[i]);
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: PrintQMOffer
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: IN IPSEC_QM_OFFER QMOffer
|
|
//
|
|
//Return: VOID
|
|
//
|
|
//Description: This function displays quickmode Policy offers.
|
|
//
|
|
// History :
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
PrintQMOffer(
|
|
IN IPSEC_QM_OFFER QMOffer
|
|
)
|
|
{
|
|
DWORD i=0;
|
|
DWORD dwFlag = 0;
|
|
if(QMOffer.dwNumAlgos > 0)
|
|
{
|
|
for (i = 0; i < QMOffer.dwNumAlgos; i++)
|
|
{
|
|
//If the number algos is exactly one (either Authentication or encryption)
|
|
//print the Pfs group and lifetime after the algo is printed
|
|
if(QMOffer.dwNumAlgos == 1)
|
|
dwFlag = 2;
|
|
// '+' is required to be printed if both encryption and
|
|
// authentication algo are present in an offer
|
|
if(dwFlag == 1 )
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_PLUS);
|
|
|
|
if(QMOffer.Algos[i].Operation == AUTHENTICATION)
|
|
{
|
|
|
|
switch(QMOffer.Algos[i].uAlgoIdentifier)
|
|
{
|
|
case 1:
|
|
if(QMOffer.dwNumAlgos == 1)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_AH_MD5_ALGO);
|
|
}
|
|
else if(QMOffer.dwNumAlgos == 2)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_AH_MD5);
|
|
//Increment the flag for printing lifetime and pfs group
|
|
dwFlag++;
|
|
}
|
|
break;
|
|
case 2:
|
|
if(QMOffer.dwNumAlgos == 1)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_AH_SHA1_ALGO);
|
|
}
|
|
else if(QMOffer.dwNumAlgos == 2)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_AH_SHA1);
|
|
dwFlag++;
|
|
}
|
|
break;
|
|
case 0:
|
|
if(QMOffer.dwNumAlgos == 1)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_AH_NONE_ALGO);
|
|
}
|
|
else if(QMOffer.dwNumAlgos == 2)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_AH_NONE);
|
|
dwFlag++;
|
|
}
|
|
break;
|
|
default:
|
|
if(QMOffer.dwNumAlgos == 1)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_AH_ERR_SPACE);
|
|
}
|
|
else if(QMOffer.dwNumAlgos == 2)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_AH_ERR);
|
|
dwFlag++;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
else if(QMOffer.Algos[i].Operation == ENCRYPTION)
|
|
{
|
|
switch(QMOffer.Algos[i].uAlgoIdentifier)
|
|
{
|
|
case 1:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_ESP_DES_ALGO);
|
|
break;
|
|
case 2:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_ESP_ERR_ALGO);
|
|
break;
|
|
case 3:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_ESP_3DES_ALGO);
|
|
break;
|
|
case 0:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_ESP_NONE_ALGO);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_ESP_ERR_ALGO);
|
|
break;
|
|
}
|
|
switch(QMOffer.Algos[i].uSecAlgoIdentifier)
|
|
{
|
|
case 1:
|
|
if(QMOffer.dwNumAlgos == 1)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_MD5_ALGO);
|
|
}
|
|
else if(QMOffer.dwNumAlgos == 2)
|
|
{
|
|
//Increment the flag for printing lifetime and pfs group
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_MD5);
|
|
dwFlag++;
|
|
}
|
|
break;
|
|
case 2:
|
|
if(QMOffer.dwNumAlgos == 1)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SHA1_ALGO);
|
|
}
|
|
else if(QMOffer.dwNumAlgos == 2)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SHA1);
|
|
dwFlag++;
|
|
}
|
|
break;
|
|
case 0:
|
|
if(QMOffer.dwNumAlgos == 1)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_NONE_ALGO);
|
|
}
|
|
else if(QMOffer.dwNumAlgos == 2)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_NONE);
|
|
dwFlag++;
|
|
}
|
|
break;
|
|
default:
|
|
if(QMOffer.dwNumAlgos == 1)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_ERR_SPACE);
|
|
}
|
|
else if(QMOffer.dwNumAlgos == 2)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_ERR);
|
|
dwFlag++;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_ERROR_ALGO);
|
|
}
|
|
//Print lifetime and pfsgroup only if all the 2 algos are printed with a plus sign
|
|
// or printed only if one algo is present in the qmoffer.
|
|
if(dwFlag == 2)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_LIFETIME, QMOffer.Lifetime.uKeyExpirationKBytes, QMOffer.Lifetime.uKeyExpirationTime);
|
|
if(QMOffer.bPFSRequired)
|
|
{
|
|
PrintMessageFromModule(g_hModule, QMPFSDHGroup(QMOffer.dwPFSGroup));
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_PFS_NONE);
|
|
}
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: ShowMMFilters
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: IN LPTSTR pszShowFilterName,
|
|
// IN LPTSTR pszShowPolicyName
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function displays both generic and specific mainmode filters.
|
|
//
|
|
// History :
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
ShowMMFilters(
|
|
IN LPTSTR pszShowFilterName,
|
|
IN BOOL bType,
|
|
IN ADDR SrcAddr,
|
|
IN ADDR DstAddr,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS,
|
|
IN BOOL bSrcMask,
|
|
IN BOOL bDstMask
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwResumeHandle = 0;
|
|
DWORD dwSpecificResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwCount = 0; // counting objects here
|
|
DWORD dwSpecificCount = 0; // counting objects here
|
|
DWORD dwVersion = 0;
|
|
GUID gDefaultGUID = {0}; // NULL GUID value
|
|
DWORD i=0, j=0, l=0;
|
|
DWORD dwTempCnt = 0;
|
|
BOOL bNameFin=FALSE;
|
|
BOOL bPrint = FALSE;
|
|
BOOL bPrintIN = FALSE;
|
|
PIPSEC_MM_POLICY pMMPolicy = NULL;
|
|
PMM_FILTER pMMFilter = NULL;
|
|
PMM_FILTER pSpecificMMFilter = NULL;
|
|
//Print generic filters
|
|
if(bType)
|
|
{
|
|
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
dwReturn = EnumMMFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_GENERIC_FILTERS, gDefaultGUID, 0, &pMMFilter, &dwCount, &dwResumeHandle, NULL);
|
|
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
break;
|
|
}
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pMMFilter && dwCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
//Get the corresponding MMPolicy associated with the filter.
|
|
dwReturn = GetMMPolicyByID(g_szDynamicMachine, dwVersion, pMMFilter[j].gPolicyID, &pMMPolicy, NULL);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
//Check for the user given parameters. If exists prints the corresponding record
|
|
//otherwise continues for next iteration
|
|
dwReturn = CheckMMFilter(pMMFilter[j], SrcAddr, DstAddr, bDstMask, bSrcMask, pszShowFilterName);
|
|
if(dwReturn == ERROR_SUCCESS)
|
|
{
|
|
if(!bPrint)
|
|
{
|
|
//If it is first time print the header.
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_SUB_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_GENERIC_HEADING);
|
|
bPrint = TRUE;
|
|
}
|
|
//Print the filter data.
|
|
dwReturn = PrintMainmodeFilter(pMMFilter[j], pMMPolicy[0], addressHash, bResolveDNS, bType);
|
|
dwTempCnt++;
|
|
bNameFin = TRUE;
|
|
}
|
|
|
|
SPDApiBufferFree(pMMPolicy);
|
|
pMMPolicy = NULL;
|
|
}
|
|
SPDApiBufferFree(pMMFilter);
|
|
pMMFilter = NULL;
|
|
|
|
}
|
|
|
|
if(dwTempCnt > 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NO_OF_GENERIC_FILTERS, dwTempCnt);
|
|
}
|
|
|
|
}
|
|
//Print specific filters
|
|
else if(!bType)
|
|
{
|
|
for (i = 0; ;i+=dwSpecificCount)
|
|
{
|
|
dwReturn = EnumMMFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_SPECIFIC_FILTERS, gDefaultGUID, 0, &pSpecificMMFilter, &dwSpecificCount, &dwSpecificResumeHandle, NULL);
|
|
if (dwReturn == ERROR_NO_DATA || dwSpecificCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
break;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pSpecificMMFilter && dwSpecificCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
for (l = 0; l < dwSpecificCount; l++)
|
|
{
|
|
//Get the corresponding MMPolicy associated with the filter.
|
|
dwReturn = GetMMPolicyByID(g_szDynamicMachine, dwVersion, pSpecificMMFilter[l].gPolicyID, &pMMPolicy, NULL);
|
|
if(dwReturn!=ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
//First print all specific outbound filters.
|
|
if(pSpecificMMFilter[l].dwDirection == FILTER_DIRECTION_OUTBOUND)
|
|
{
|
|
//Check for the user given parameters. If exists prints the corresponding record
|
|
//otherwise continues for next iteration
|
|
dwReturn = CheckMMFilter(pSpecificMMFilter[l], SrcAddr, DstAddr, bDstMask, bSrcMask, pszShowFilterName);
|
|
if(dwReturn == ERROR_SUCCESS)
|
|
{
|
|
if(!bPrint)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_SUB_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_SPECIFIC_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_OUTBOUND_HEADING);
|
|
bPrint = TRUE;
|
|
}
|
|
//Print the filter data.
|
|
dwReturn = PrintMainmodeFilter(pSpecificMMFilter[l], pMMPolicy[0], addressHash, bResolveDNS, bType);
|
|
dwTempCnt++;
|
|
bNameFin = TRUE;
|
|
}
|
|
|
|
SPDApiBufferFree(pMMPolicy);
|
|
pMMPolicy = NULL;
|
|
}
|
|
}
|
|
|
|
SPDApiBufferFree(pSpecificMMFilter);
|
|
pSpecificMMFilter = NULL;
|
|
|
|
}
|
|
if(dwTempCnt > 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NO_OF_SPECIFIC_OUTBOUND, dwTempCnt);
|
|
}
|
|
|
|
dwSpecificCount = 0;
|
|
dwSpecificResumeHandle = 0;
|
|
pSpecificMMFilter = NULL;
|
|
dwTempCnt = 0;
|
|
|
|
for (i = 0; ;i+=dwSpecificCount)
|
|
{
|
|
dwReturn = EnumMMFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_SPECIFIC_FILTERS, gDefaultGUID, 0, &pSpecificMMFilter, &dwSpecificCount, &dwSpecificResumeHandle, NULL);
|
|
if (dwReturn == ERROR_NO_DATA || dwSpecificCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
break;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pSpecificMMFilter && dwSpecificCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
for (l = 0; l < dwSpecificCount; l++)
|
|
{
|
|
//Get the corresponding MMPolicy associated with the filter.
|
|
dwReturn = GetMMPolicyByID(g_szDynamicMachine, dwVersion, pSpecificMMFilter[l].gPolicyID, &pMMPolicy, NULL);
|
|
if(dwReturn!=ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
//Then print all the specific inbound filters
|
|
if(pSpecificMMFilter[l].dwDirection == FILTER_DIRECTION_INBOUND)
|
|
{
|
|
//Check for the user given parameters. If exists prints the corresponding record
|
|
//otherwise continues for next iteration
|
|
dwReturn = CheckMMFilter(pSpecificMMFilter[l],SrcAddr, DstAddr, bDstMask, bSrcMask, pszShowFilterName);
|
|
|
|
if(dwReturn == ERROR_SUCCESS)
|
|
{
|
|
if(!bPrintIN)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_SUB_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_SPECIFIC_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_INBOUND_HEADING);
|
|
bPrintIN = TRUE;
|
|
|
|
}
|
|
//Print the filter data.
|
|
dwReturn = PrintMainmodeFilter(pSpecificMMFilter[l], pMMPolicy[0], addressHash, bResolveDNS, bType);
|
|
dwTempCnt++;
|
|
bNameFin = TRUE;
|
|
}
|
|
|
|
SPDApiBufferFree(pMMPolicy);
|
|
pMMPolicy = NULL;
|
|
}
|
|
}
|
|
SPDApiBufferFree(pSpecificMMFilter);
|
|
pSpecificMMFilter = NULL;
|
|
}
|
|
//print number of filters
|
|
if(dwTempCnt > 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NO_OF_SPECIFIC_INBOUND, dwTempCnt);
|
|
}
|
|
}
|
|
|
|
error:
|
|
if(!bNameFin)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
if(pszShowFilterName)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_MMF_8);
|
|
}
|
|
else
|
|
{
|
|
if(bType)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_MMF_6);
|
|
}
|
|
else
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_MMF_7);
|
|
}
|
|
}
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
// error path clean up
|
|
if(pMMPolicy)
|
|
{
|
|
SPDApiBufferFree(pMMPolicy);
|
|
pMMPolicy = NULL;
|
|
}
|
|
|
|
if(pMMFilter)
|
|
{
|
|
SPDApiBufferFree(pMMFilter);
|
|
pMMFilter = NULL;
|
|
}
|
|
|
|
if(pSpecificMMFilter)
|
|
{
|
|
SPDApiBufferFree(pSpecificMMFilter);
|
|
pSpecificMMFilter = NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: CheckMMFilter
|
|
//
|
|
//Date of Creation: 11-21-2001
|
|
//
|
|
//Parameters: IN MM_FILTER MMFltr,
|
|
// IN ADDR SrcAddr,
|
|
// IN ADDR DstAddr,
|
|
// IN BOOL bDstMask,
|
|
// IN BOOL bSrcMask,
|
|
// IN LPWSTR pszShowFilterName
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function prepares data for displaying mainmode filter
|
|
// and validates the input.
|
|
//
|
|
//
|
|
// History :
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
CheckMMFilter(
|
|
IN MM_FILTER MMFltr,
|
|
IN ADDR SrcAddr,
|
|
IN ADDR DstAddr,
|
|
IN BOOL bDstMask,
|
|
IN BOOL bSrcMask,
|
|
IN LPWSTR pszShowFilterName)
|
|
{
|
|
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
|
|
while(1)
|
|
{
|
|
//Validates user given input for Source address
|
|
switch(SrcAddr.AddrType)
|
|
{
|
|
case IP_ADDR_WINS_SERVER:
|
|
case IP_ADDR_DHCP_SERVER:
|
|
case IP_ADDR_DNS_SERVER:
|
|
case IP_ADDR_DEFAULT_GATEWAY:
|
|
if(MMFltr.SrcAddr.AddrType != SrcAddr.AddrType)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
break;
|
|
default:
|
|
if(SrcAddr.uIpAddr != 0xFFFFFFFF)
|
|
{
|
|
if(MMFltr.SrcAddr.uIpAddr != SrcAddr.uIpAddr)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
//Validates user given input for Destination address
|
|
switch(DstAddr.AddrType)
|
|
{
|
|
case IP_ADDR_WINS_SERVER:
|
|
case IP_ADDR_DHCP_SERVER:
|
|
case IP_ADDR_DNS_SERVER:
|
|
case IP_ADDR_DEFAULT_GATEWAY:
|
|
if(MMFltr.DesAddr.AddrType != DstAddr.AddrType)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
break;
|
|
default:
|
|
if(DstAddr.uIpAddr != 0xFFFFFFFF)
|
|
{
|
|
if(MMFltr.DesAddr.uIpAddr != DstAddr.uIpAddr)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
//Validates user given input for Destination mask
|
|
if(bDstMask)
|
|
{
|
|
if(MMFltr.DesAddr.uSubNetMask != DstAddr.uSubNetMask)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for Source mask
|
|
if(bSrcMask)
|
|
{
|
|
if(MMFltr.SrcAddr.uSubNetMask != SrcAddr.uSubNetMask)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for Filter name
|
|
if(pszShowFilterName!=NULL)
|
|
{
|
|
if(_tcsicmp(MMFltr.pszFilterName, pszShowFilterName) != 0)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
|
|
//everything fine... all matched
|
|
BAIL_OUT;
|
|
}
|
|
|
|
error:
|
|
return dwReturn;
|
|
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: PrintMainmodeFilter
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: IN MM_FILTER MMFltr
|
|
// IN NshHashTable& addressHash
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function displays quickmode Policy in verbose.
|
|
//
|
|
//
|
|
// History :
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
PrintMainmodeFilter(
|
|
IN MM_FILTER MMFltr,
|
|
IN IPSEC_MM_POLICY MMPol,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS,
|
|
IN BOOL bType
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD i = 0;
|
|
DWORD dwVersion = 0;
|
|
LPTSTR pszCertStr = NULL;
|
|
|
|
PINT_MM_AUTH_METHODS pIntMMAuth = NULL;
|
|
PMM_AUTH_METHODS pMMAM = NULL;
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_UNDERLINE);
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NAME, MMFltr.pszFilterName);
|
|
|
|
//Print Weight
|
|
if(!bType)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_FILTER_WEIGHT, MMFltr.dwWeight);
|
|
}
|
|
|
|
//Print Connection Type
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_HEADING);
|
|
switch(MMFltr.InterfaceType)
|
|
{
|
|
case INTERFACE_TYPE_ALL:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_ALL);
|
|
break;
|
|
case INTERFACE_TYPE_LAN:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_LAN);
|
|
break;
|
|
case INTERFACE_TYPE_DIALUP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_DIALUP);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_UNKNOWN);
|
|
break;
|
|
}
|
|
//Print Source Address
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_SRC_ADDR_HEADING);
|
|
PrintAddr(MMFltr.SrcAddr, addressHash, bResolveDNS);
|
|
if(!bResolveDNS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_LEFTBRACKET);
|
|
PrintMask(MMFltr.SrcAddr);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_RIGHTBRACKET);
|
|
}
|
|
|
|
//Print Destination Address
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DST_ADDR_HEADING);
|
|
PrintAddr(MMFltr.DesAddr, addressHash, bResolveDNS);
|
|
if(!bResolveDNS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_LEFTBRACKET);
|
|
PrintMask(MMFltr.DesAddr);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_RIGHTBRACKET);
|
|
}
|
|
//Print Authentication Methods.
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_AUTH_HEADING);
|
|
|
|
dwReturn = GetMMAuthMethods(g_szDynamicMachine, dwVersion, MMFltr.gMMAuthID, &pMMAM, NULL);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
//This is conversion from old structure to the new structure.
|
|
dwReturn = ConvertExtMMAuthToInt(pMMAM, &pIntMMAuth);
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
for (i = 0; i < pIntMMAuth[0].dwNumAuthInfos; i++)
|
|
{
|
|
switch(pIntMMAuth[0].pAuthenticationInfo[i].AuthMethod)
|
|
{
|
|
case IKE_PRESHARED_KEY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_PRE_KEY_HEADING);
|
|
break;
|
|
case IKE_DSS_SIGNATURE:
|
|
case IKE_RSA_SIGNATURE:
|
|
case IKE_RSA_ENCRYPTION:
|
|
dwReturn = DecodeCertificateName(pIntMMAuth[0].pAuthenticationInfo[i].pAuthInfo, pIntMMAuth[0].pAuthenticationInfo[i].dwAuthInfoSize, &pszCertStr);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_UNKNOWN_CERT);
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NEWLINE_TAB);
|
|
if (pszCertStr)
|
|
{
|
|
DisplayCertInfo(pszCertStr, pIntMMAuth->pAuthenticationInfo[i].dwAuthFlags);
|
|
delete [] pszCertStr;
|
|
pszCertStr = NULL;
|
|
}
|
|
}
|
|
|
|
break;
|
|
case IKE_SSPI:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_KERB);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
error:
|
|
//Print Security Methods
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_SEC_METHOD_HEADING);
|
|
// Count
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_OFFER_CNT,MMPol.dwOfferCount);
|
|
|
|
if(IsDefaultMMOffers(MMPol))
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_DEFAULT_OFFER);
|
|
}
|
|
|
|
for (i = 0; i < MMPol.dwOfferCount; i++)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMMFilterOffer(MMPol.pOffers[i]);
|
|
}
|
|
//error path clean up
|
|
if(pMMAM)
|
|
{
|
|
SPDApiBufferFree(pMMAM);
|
|
pMMAM = NULL;
|
|
}
|
|
|
|
if(pIntMMAuth)
|
|
{
|
|
SPDApiBufferFree(pIntMMAuth);
|
|
pIntMMAuth = NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: IsDefaultMMOffers
|
|
//
|
|
//Date of Creation: 11-21-2001
|
|
//
|
|
//Parameters: IN IPSEC_MM_POLICY MMPol
|
|
//
|
|
//Return: BOOL
|
|
//
|
|
//Description: This function checks for default MM offers
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
BOOL
|
|
IsDefaultMMOffers(
|
|
IN IPSEC_MM_POLICY MMPol
|
|
)
|
|
{
|
|
BOOL bDefaultOffer = FALSE;
|
|
|
|
if(MMPol.dwOfferCount == 3)
|
|
{
|
|
if((MMPol.pOffers[0].EncryptionAlgorithm.uAlgoIdentifier == CONF_ALGO_3_DES)
|
|
&&(MMPol.pOffers[0].HashingAlgorithm.uAlgoIdentifier == AUTH_ALGO_SHA1)
|
|
&&(MMPol.pOffers[0].dwDHGroup == POTF_OAKLEY_GROUP2)
|
|
&&(MMPol.pOffers[1].EncryptionAlgorithm.uAlgoIdentifier == CONF_ALGO_3_DES)
|
|
&&(MMPol.pOffers[1].HashingAlgorithm.uAlgoIdentifier == AUTH_ALGO_MD5)
|
|
&&(MMPol.pOffers[1].dwDHGroup == POTF_OAKLEY_GROUP2)
|
|
&&(MMPol.pOffers[2].EncryptionAlgorithm.uAlgoIdentifier == CONF_ALGO_3_DES)
|
|
&&(MMPol.pOffers[2].HashingAlgorithm.uAlgoIdentifier == AUTH_ALGO_SHA1)
|
|
&&(MMPol.pOffers[2].dwDHGroup == POTF_OAKLEY_GROUP2048))
|
|
{
|
|
bDefaultOffer=TRUE;
|
|
}
|
|
}
|
|
|
|
return bDefaultOffer;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: PrintMMFilterOffer
|
|
//
|
|
//Date of Creation: 11-21-2001
|
|
//
|
|
//Parameters: IN IPSEC_MM_OFFER MMOffer
|
|
//
|
|
//Return: VOID
|
|
//
|
|
//Description: This function prints MM offers
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
PrintMMFilterOffer(
|
|
IN IPSEC_MM_OFFER MMOffer
|
|
)
|
|
{
|
|
//This is to display DH2048 as 3
|
|
if(MMOffer.dwDHGroup == DH_GROUP_2048)
|
|
{
|
|
MMOffer.dwDHGroup = 3;
|
|
}
|
|
//Print Encryption algorithm
|
|
switch(MMOffer.EncryptionAlgorithm.uAlgoIdentifier)
|
|
{
|
|
case 1:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_OFFER_DES_ALGO);
|
|
break;
|
|
case 2:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_OFFER_UNKNOWN_ALGO);
|
|
break;
|
|
case 3:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_OFFER_3DES_ALGO);
|
|
break;
|
|
case 0:
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_OFFER_NONE_ALGO);
|
|
break;
|
|
}
|
|
//Print Hash algorithm
|
|
switch(MMOffer.HashingAlgorithm.uAlgoIdentifier)
|
|
{
|
|
|
|
case 1:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_OFFER_MD5_ALGO);
|
|
break;
|
|
case 2:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_OFFER_SHA1_ALGO);
|
|
break;
|
|
case 0:
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_OFFER_AH_NONE_ALGO);
|
|
break;
|
|
|
|
}
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_DH_QMLIMIT,MMOffer.dwDHGroup, MMOffer.Lifetime.uKeyExpirationTime, MMOffer.dwQuickModeLimit );
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: ShowQMFilters
|
|
//
|
|
//Date of Creation: 11-21-2001
|
|
//
|
|
//Parameters: IN LPTSTR pszShowFilterName,
|
|
// IN LPTSTR pszShowPolicyName
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function prepares data for displaying quick mode filters.
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
ShowQMFilters(
|
|
IN LPTSTR pszShowFilterName,
|
|
IN BOOL bType,
|
|
IN ADDR SrcAddr,
|
|
IN ADDR DstAddr,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS,
|
|
IN BOOL bSrcMask,
|
|
IN BOOL bDstMask,
|
|
IN QM_FILTER_VALUE_BOOL QMBoolValue
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwSpecificResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwCount = 0; // counting objects here
|
|
DWORD dwSpecificCount = 0;
|
|
DWORD dwActionFlag = 0;
|
|
GUID gDefaultGUID = {0}; // NULL GUID value
|
|
DWORD i=0, j=0, l=0;
|
|
DWORD dwVersion = 0;
|
|
BOOL bNameFin = FALSE;
|
|
DWORD dwTempCnt = 0;
|
|
LPWSTR pszQMName = NULL;
|
|
BOOL bPrint = FALSE;
|
|
BOOL bPrintIN = FALSE;
|
|
PIPSEC_QM_POLICY pQMPolicy = NULL;
|
|
PTRANSPORT_FILTER pTransF = NULL;
|
|
PTRANSPORT_FILTER pSpecificTransF = NULL;
|
|
//Print generic filters
|
|
if(bType)
|
|
{
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
dwReturn = EnumTransportFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_GENERIC_FILTERS,
|
|
gDefaultGUID, 0, &pTransF, &dwCount, &dwResumeHandle, NULL);
|
|
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
break;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pTransF && dwCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
//Get the corresponding QMPolicy for the Transport filter
|
|
dwReturn = GetQMPolicyByID(g_szDynamicMachine, dwVersion, pTransF[j].gPolicyID, 0, &pQMPolicy, NULL);
|
|
if(dwReturn == ERROR_SUCCESS)
|
|
{
|
|
pszQMName = pQMPolicy[0].pszPolicyName;
|
|
}
|
|
else
|
|
{
|
|
//If there is no corresponding filter NULL is passed to the function,
|
|
//so that it is not printed.
|
|
pszQMName = NULL;
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
//To print inbound and outbound action
|
|
dwActionFlag = 0;
|
|
|
|
//Check for the user given parameters. If exists prints the corresponding record
|
|
//otherwise continues for next iteration
|
|
dwReturn = CheckQMFilter(pTransF[j], SrcAddr, DstAddr,
|
|
bDstMask, bSrcMask, QMBoolValue,
|
|
pszShowFilterName);
|
|
if(dwReturn == ERROR_SUCCESS )
|
|
{
|
|
if(!bPrint)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TRANSPORT_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_GENERIC_HEADING);
|
|
bPrint = TRUE;
|
|
}
|
|
bNameFin = TRUE;
|
|
dwTempCnt++;
|
|
//Print the transport filter
|
|
dwReturn = PrintQuickmodeFilter(pTransF[j], pszQMName, addressHash, bResolveDNS, bType, dwActionFlag);
|
|
}
|
|
|
|
if(pQMPolicy)
|
|
{
|
|
SPDApiBufferFree(pQMPolicy);
|
|
pQMPolicy = NULL;
|
|
}
|
|
}
|
|
SPDApiBufferFree(pTransF);
|
|
pTransF = NULL;
|
|
}
|
|
if(dwTempCnt > 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NO_OF_GENERIC_FILTERS, dwTempCnt);
|
|
}
|
|
}
|
|
//Print specific filters
|
|
else if(!bType)
|
|
{
|
|
for (i = 0; ;i+=dwSpecificCount)
|
|
{
|
|
dwReturn = EnumTransportFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_SPECIFIC_FILTERS,
|
|
gDefaultGUID, 0, &pSpecificTransF, &dwSpecificCount, &dwSpecificResumeHandle, NULL);
|
|
if (dwReturn == ERROR_NO_DATA || dwSpecificCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
break;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pSpecificTransF && dwSpecificCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
for (l = 0; l < dwSpecificCount; l++)
|
|
{
|
|
//get the corresponding QMPolicy
|
|
dwReturn = GetQMPolicyByID(g_szDynamicMachine, dwVersion, pSpecificTransF[l].gPolicyID, 0, &pQMPolicy, NULL);
|
|
if(dwReturn==ERROR_SUCCESS)
|
|
{
|
|
pszQMName = pQMPolicy[0].pszPolicyName;
|
|
}
|
|
else
|
|
{
|
|
//If there is no corresponding policy pass NULL, so that it is not displayed.
|
|
pszQMName = NULL;
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
//print outbound filters
|
|
if(pSpecificTransF[l].dwDirection == FILTER_DIRECTION_OUTBOUND)
|
|
{
|
|
dwActionFlag = 1;
|
|
//validate user input parameters.
|
|
dwReturn = CheckQMFilter(pSpecificTransF[l], SrcAddr, DstAddr,
|
|
bDstMask, bSrcMask,QMBoolValue,
|
|
pszShowFilterName);
|
|
if(dwReturn==ERROR_SUCCESS)
|
|
{
|
|
if(!bPrint)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TRANSPORT_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_SPECIFIC_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_OUTBOUND_HEADING);
|
|
bPrint = TRUE;
|
|
}
|
|
dwTempCnt++;
|
|
bNameFin = TRUE;
|
|
//print specific filters
|
|
dwReturn = PrintQuickmodeFilter(pSpecificTransF[l], pszQMName, addressHash, bResolveDNS, bType, dwActionFlag);
|
|
}
|
|
if(pQMPolicy)
|
|
{
|
|
SPDApiBufferFree(pQMPolicy);
|
|
pQMPolicy = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
SPDApiBufferFree(pSpecificTransF);
|
|
pSpecificTransF = NULL;
|
|
}
|
|
//print number of filters
|
|
if(dwTempCnt > 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NO_OF_SPECIFIC_OUTBOUND, dwTempCnt);
|
|
}
|
|
|
|
dwTempCnt = 0;
|
|
dwSpecificCount = 0;
|
|
dwSpecificResumeHandle = 0;
|
|
pSpecificTransF = NULL;
|
|
|
|
for (i = 0; ;i+=dwSpecificCount)
|
|
{
|
|
dwReturn = EnumTransportFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_SPECIFIC_FILTERS, gDefaultGUID, 0, &pSpecificTransF, &dwSpecificCount, &dwSpecificResumeHandle, NULL);
|
|
if (dwReturn == ERROR_NO_DATA || dwSpecificCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
break;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pSpecificTransF && dwSpecificCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
|
|
for (l = 0; l < dwSpecificCount; l++)
|
|
{
|
|
//get the corresponding QMPolicy
|
|
dwReturn = GetQMPolicyByID(g_szDynamicMachine, dwVersion, pSpecificTransF[l].gPolicyID, 0, &pQMPolicy, NULL);
|
|
if(dwReturn==ERROR_SUCCESS)
|
|
{
|
|
pszQMName = pQMPolicy[0].pszPolicyName;
|
|
}
|
|
else
|
|
{
|
|
//if there is no corresponding policy pass NULL, so that it is not printed.
|
|
pszQMName = NULL;
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
//Print inbound filters
|
|
if(pSpecificTransF[l].dwDirection == FILTER_DIRECTION_INBOUND)
|
|
{
|
|
//To print inbound and outbound filteraction
|
|
dwActionFlag = 2;
|
|
|
|
//validate user input data
|
|
dwReturn = CheckQMFilter(pSpecificTransF[l], SrcAddr, DstAddr,
|
|
bDstMask, bSrcMask,QMBoolValue,
|
|
pszShowFilterName);
|
|
if(dwReturn==ERROR_SUCCESS)
|
|
{
|
|
if(!bPrintIN)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TRANSPORT_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_SPECIFIC_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_INBOUND_HEADING);
|
|
bPrintIN = TRUE;
|
|
}
|
|
dwTempCnt++;
|
|
bNameFin = TRUE;
|
|
//print specific filter data
|
|
dwReturn = PrintQuickmodeFilter(pSpecificTransF[l], pszQMName, addressHash, bResolveDNS, bType, dwActionFlag);
|
|
}
|
|
|
|
if(pQMPolicy)
|
|
{
|
|
SPDApiBufferFree(pQMPolicy);
|
|
pQMPolicy = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
SPDApiBufferFree(pSpecificTransF);
|
|
pSpecificTransF = NULL;
|
|
}
|
|
//print number of filters
|
|
if(dwTempCnt > 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NO_OF_SPECIFIC_INBOUND, dwTempCnt);
|
|
}
|
|
}
|
|
|
|
error:
|
|
//even if there is no transport filters, tunnel can be shown
|
|
|
|
dwReturn = ShowTunnelFilters(pszShowFilterName, bType, SrcAddr, DstAddr, addressHash,
|
|
bResolveDNS, bSrcMask, bDstMask, QMBoolValue, bNameFin);
|
|
|
|
if(!bNameFin)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
if(pszShowFilterName)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_QMF_8);
|
|
}
|
|
else
|
|
{
|
|
if(bType)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_QMF_6);
|
|
}
|
|
else
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_QMF_7);
|
|
}
|
|
}
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
//error path clean up
|
|
if(pQMPolicy)
|
|
{
|
|
SPDApiBufferFree(pQMPolicy);
|
|
pQMPolicy = NULL;
|
|
}
|
|
|
|
if(pTransF)
|
|
{
|
|
SPDApiBufferFree(pTransF);
|
|
pTransF = NULL;
|
|
}
|
|
|
|
if(pSpecificTransF)
|
|
{
|
|
SPDApiBufferFree(pSpecificTransF);
|
|
pSpecificTransF = NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: ShowTunnelFilters
|
|
//
|
|
//Date of Creation: 11-21-2001
|
|
//
|
|
//Parameters: IN LPTSTR pszShowFilterName,
|
|
// IN BOOL bType,
|
|
// IN ADDR SrcAddr,
|
|
// IN ADDR DstAddr,
|
|
// IN NshHashTable& addressHash,
|
|
// IN BOOL bResolveDNS,
|
|
// IN BOOL bSrcMask,
|
|
// IN BOOL bDstMask,
|
|
// IN QM_FILTER_VALUE_BOOL QMBoolValue,
|
|
// IN OUT BOOL& bNameFin
|
|
//
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function prepares data for displaying Tunnel filters.
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
ShowTunnelFilters(
|
|
IN LPTSTR pszShowFilterName,
|
|
IN BOOL bType,
|
|
IN ADDR SrcAddr,
|
|
IN ADDR DstAddr,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS,
|
|
IN BOOL bSrcMask,
|
|
IN BOOL bDstMask,
|
|
IN QM_FILTER_VALUE_BOOL QMBoolValue,
|
|
IN OUT BOOL& bNameFin
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwSpecificResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwCount = 0; // counting objects here
|
|
DWORD dwSpecificCount = 0;
|
|
GUID gDefaultGUID = {0}; // NULL GUID value
|
|
DWORD i=0, j=0, l=0;
|
|
DWORD dwVersion = 0;
|
|
DWORD dwTempCnt = 0;
|
|
LPWSTR pszQMName = NULL;
|
|
BOOL bPrint = FALSE;
|
|
BOOL bPrintIN = FALSE;
|
|
|
|
PIPSEC_QM_POLICY pQMPolicy = NULL;
|
|
PTUNNEL_FILTER pTunnelF = NULL;
|
|
PTUNNEL_FILTER pSpecificTunnelF = NULL;
|
|
|
|
DWORD dwActionFlag = 0;
|
|
//print generic filters
|
|
if(bType)
|
|
{
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
dwReturn = EnumTunnelFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_GENERIC_FILTERS, gDefaultGUID, 0, &pTunnelF, &dwCount, &dwResumeHandle, NULL);
|
|
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
break;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pTunnelF && dwCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
//get the corresponding QMPolicy
|
|
dwReturn = GetQMPolicyByID(g_szDynamicMachine, dwVersion, pTunnelF[j].gPolicyID, 0, &pQMPolicy, NULL);
|
|
if(dwReturn == ERROR_SUCCESS)
|
|
{
|
|
pszQMName = pQMPolicy[0].pszPolicyName;
|
|
}
|
|
else
|
|
{
|
|
//if there is no policy pass NULL, for not printing the policy
|
|
pszQMName = NULL;
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
dwActionFlag = 0;
|
|
//validate the user input data.
|
|
dwReturn = CheckQMFilter(pTunnelF[j], SrcAddr, DstAddr,
|
|
bDstMask, bSrcMask, QMBoolValue,
|
|
pszShowFilterName);
|
|
if(dwReturn == ERROR_SUCCESS )
|
|
{
|
|
if(!bPrint)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TUNNEL_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_GENERIC_HEADING);
|
|
bPrint = TRUE;
|
|
}
|
|
bNameFin = TRUE;
|
|
dwTempCnt++;
|
|
//print the filter data
|
|
dwReturn = PrintQuickmodeFilter(pTunnelF[j], pszQMName, addressHash, bResolveDNS, bType, dwActionFlag);
|
|
}
|
|
|
|
if(pQMPolicy)
|
|
{
|
|
SPDApiBufferFree(pQMPolicy);
|
|
pQMPolicy = NULL;
|
|
}
|
|
}
|
|
|
|
SPDApiBufferFree(pTunnelF);
|
|
pTunnelF = NULL;
|
|
}
|
|
//print the number of filters.
|
|
if(dwTempCnt > 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NO_OF_GENERIC_FILTERS, dwTempCnt);
|
|
}
|
|
}
|
|
//print for Specific filters
|
|
else if(!bType)
|
|
{
|
|
for (i = 0; ;i+=dwSpecificCount)
|
|
{
|
|
dwReturn = EnumTunnelFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_SPECIFIC_FILTERS, gDefaultGUID, 0, &pSpecificTunnelF, &dwSpecificCount, &dwSpecificResumeHandle, NULL);
|
|
if (dwReturn == ERROR_NO_DATA || dwSpecificCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
break; //Still more to show up, break from the loop...
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pSpecificTunnelF && dwSpecificCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
for (l = 0; l < dwSpecificCount; l++)
|
|
{
|
|
//get the corresponding QMPolicy
|
|
dwReturn = GetQMPolicyByID(g_szDynamicMachine, dwVersion, pSpecificTunnelF[l].gPolicyID, 0, &pQMPolicy, NULL);
|
|
if(dwReturn==ERROR_SUCCESS)
|
|
{
|
|
pszQMName = pQMPolicy[0].pszPolicyName;
|
|
}
|
|
else
|
|
{
|
|
//If there is no corresponding policy is not there,
|
|
//pass NULL so that policy is not printed.
|
|
pszQMName = NULL;
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
//First print outbound filters
|
|
if(pSpecificTunnelF[l].dwDirection == FILTER_DIRECTION_OUTBOUND)
|
|
{
|
|
dwActionFlag = 1;
|
|
//Validate user input data.
|
|
dwReturn = CheckQMFilter(pSpecificTunnelF[l], SrcAddr, DstAddr,
|
|
bDstMask, bSrcMask, QMBoolValue,
|
|
pszShowFilterName);
|
|
if(dwReturn==ERROR_SUCCESS)
|
|
{
|
|
if(!bPrint)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TUNNEL_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_SPECIFIC_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_OUTBOUND_HEADING);
|
|
bPrint = TRUE;
|
|
}
|
|
dwTempCnt++;
|
|
bNameFin = TRUE;
|
|
//print specific filter data.
|
|
dwReturn = PrintQuickmodeFilter(pSpecificTunnelF[l], pszQMName, addressHash, bResolveDNS, bType, dwActionFlag);
|
|
}
|
|
|
|
if(pQMPolicy == NULL)
|
|
{
|
|
SPDApiBufferFree(pQMPolicy);
|
|
pQMPolicy = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
SPDApiBufferFree(pSpecificTunnelF);
|
|
pSpecificTunnelF = NULL;
|
|
}
|
|
|
|
if(dwTempCnt > 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NO_OF_SPECIFIC_OUTBOUND, dwTempCnt);
|
|
}
|
|
|
|
dwTempCnt = 0;
|
|
dwSpecificCount = 0;
|
|
dwSpecificResumeHandle = 0;
|
|
pSpecificTunnelF = NULL;
|
|
|
|
for (i = 0; ;i+=dwSpecificCount)
|
|
{
|
|
dwReturn = EnumTunnelFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_SPECIFIC_FILTERS, gDefaultGUID, 0, &pSpecificTunnelF, &dwSpecificCount, &dwSpecificResumeHandle, NULL);
|
|
if (dwReturn == ERROR_NO_DATA || dwSpecificCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
break;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pSpecificTunnelF && dwSpecificCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
for (l = 0; l < dwSpecificCount; l++)
|
|
{
|
|
//get the corresponding QMPolicy for the filter
|
|
dwReturn = GetQMPolicyByID(g_szDynamicMachine, dwVersion, pSpecificTunnelF[l].gPolicyID, 0, &pQMPolicy, NULL);
|
|
if(dwReturn==ERROR_SUCCESS)
|
|
{
|
|
pszQMName = pQMPolicy[0].pszPolicyName;
|
|
}
|
|
else
|
|
{
|
|
//if the corresponding filter name is not present, pass NULL so that it is not printed.
|
|
pszQMName = NULL;
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
// then print all inbound filters
|
|
if(pSpecificTunnelF[l].dwDirection == FILTER_DIRECTION_INBOUND)
|
|
{
|
|
dwActionFlag = 2;
|
|
//validate user input
|
|
dwReturn = CheckQMFilter(pSpecificTunnelF[l], SrcAddr, DstAddr,
|
|
bDstMask, bSrcMask, QMBoolValue,
|
|
pszShowFilterName);
|
|
if(dwReturn==ERROR_SUCCESS)
|
|
{
|
|
if(!bPrintIN)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TUNNEL_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_SPECIFIC_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_INBOUND_HEADING);
|
|
bPrintIN = TRUE;
|
|
}
|
|
dwTempCnt++;
|
|
bNameFin = TRUE;
|
|
//print tunnel specific filter data
|
|
dwReturn = PrintQuickmodeFilter(pSpecificTunnelF[l], pszQMName, addressHash, bResolveDNS, bType, dwActionFlag);
|
|
}
|
|
|
|
if(pQMPolicy)
|
|
{
|
|
SPDApiBufferFree(pQMPolicy);
|
|
pQMPolicy = NULL;
|
|
}
|
|
}
|
|
}
|
|
SPDApiBufferFree(pSpecificTunnelF);
|
|
pSpecificTunnelF = NULL;
|
|
}
|
|
//print number of filters
|
|
if(dwTempCnt > 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NO_OF_SPECIFIC_INBOUND, dwTempCnt);
|
|
}
|
|
}
|
|
|
|
error:
|
|
if(pQMPolicy)
|
|
{
|
|
SPDApiBufferFree(pQMPolicy);
|
|
pQMPolicy = NULL;
|
|
}
|
|
//error path clean up
|
|
if(pTunnelF)
|
|
{
|
|
SPDApiBufferFree(pTunnelF);
|
|
pTunnelF = NULL;
|
|
}
|
|
|
|
if(pSpecificTunnelF)
|
|
{
|
|
SPDApiBufferFree(pSpecificTunnelF);
|
|
pSpecificTunnelF = NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: CheckQMFilter
|
|
//
|
|
//Date of Creation: 11-21-2001
|
|
//
|
|
//Parameters: IN TRANSPORT_FILTER TransF,
|
|
// IN ADDR SrcAddr,
|
|
// IN ADDR DstAddr,
|
|
// IN BOOL bDstMask,
|
|
// IN BOOL bSrcMask,
|
|
// IN QM_FILTER_VALUE_BOOL QMBoolValue,
|
|
// IN LPWSTR pszShowFilterName
|
|
//
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function prepares data for QM Transport Filter and validates the input
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
CheckQMFilter(
|
|
IN TRANSPORT_FILTER TransF,
|
|
IN ADDR SrcAddr,
|
|
IN ADDR DstAddr,
|
|
IN BOOL bDstMask,
|
|
IN BOOL bSrcMask,
|
|
IN QM_FILTER_VALUE_BOOL QMBoolValue,
|
|
IN LPWSTR pszShowFilterName
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
|
|
while(1)
|
|
{
|
|
//Validates user given input for Source address
|
|
switch(SrcAddr.AddrType)
|
|
{
|
|
case IP_ADDR_WINS_SERVER:
|
|
case IP_ADDR_DHCP_SERVER:
|
|
case IP_ADDR_DNS_SERVER:
|
|
case IP_ADDR_DEFAULT_GATEWAY:
|
|
if(TransF.SrcAddr.AddrType != SrcAddr.AddrType)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
break;
|
|
default:
|
|
if(SrcAddr.uIpAddr != 0xFFFFFFFF)
|
|
{
|
|
if(TransF.SrcAddr.uIpAddr != SrcAddr.uIpAddr)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
//Validates user given input for Destination address
|
|
switch(DstAddr.AddrType)
|
|
{
|
|
case IP_ADDR_WINS_SERVER:
|
|
case IP_ADDR_DHCP_SERVER:
|
|
case IP_ADDR_DNS_SERVER:
|
|
case IP_ADDR_DEFAULT_GATEWAY:
|
|
if(TransF.DesAddr.AddrType != DstAddr.AddrType)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
break;
|
|
default:
|
|
if(DstAddr.uIpAddr != 0xFFFFFFFF)
|
|
{
|
|
if(TransF.DesAddr.uIpAddr != DstAddr.uIpAddr)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
//Validates user given input for Source port
|
|
if(QMBoolValue.bSrcPort)
|
|
{
|
|
if(TransF.SrcPort.wPort != (WORD)QMBoolValue.dwSrcPort)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for Destination port
|
|
if(QMBoolValue.bDstPort)
|
|
{
|
|
if(TransF.DesPort.wPort != (WORD)QMBoolValue.dwDstPort)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for Protocol
|
|
if(QMBoolValue.bProtocol)
|
|
{
|
|
if(TransF.Protocol.dwProtocol != QMBoolValue.dwProtocol)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for Inbound action
|
|
if(QMBoolValue.bActionInbound)
|
|
{
|
|
if(TransF.InboundFilterAction != (FILTER_ACTION)QMBoolValue.dwActionInbound)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for Outbound action
|
|
if(QMBoolValue.bActionOutbound)
|
|
{
|
|
if(TransF.OutboundFilterAction != (FILTER_ACTION)QMBoolValue.dwActionOutbound)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for Source Mask
|
|
if(bSrcMask)
|
|
{
|
|
if(TransF.SrcAddr.uSubNetMask != SrcAddr.uSubNetMask)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for Destination address
|
|
if(bDstMask)
|
|
{
|
|
if(TransF.DesAddr.uSubNetMask != DstAddr.uSubNetMask)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for Filtername
|
|
if(pszShowFilterName!=NULL)
|
|
{
|
|
if(_tcsicmp(TransF.pszFilterName, pszShowFilterName) != 0)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
|
|
//Every thing fine... All matched
|
|
BAIL_OUT;
|
|
}
|
|
|
|
error:
|
|
return dwReturn;
|
|
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: CheckQMFilter
|
|
//
|
|
//Date of Creation: 11-21-2001
|
|
//
|
|
//Parameters: IN TUNNEL_FILTER TunnelF,
|
|
// IN ADDR SrcAddr,
|
|
// IN ADDR DstAddr,
|
|
// IN BOOL bDstMask,
|
|
// IN BOOL bSrcMask,
|
|
// IN QM_FILTER_VALUE_BOOL QMBoolValue,
|
|
// IN LPWSTR pszShowFilterName
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function prepares data for QM Tunnel Filter and validates the input
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
CheckQMFilter(
|
|
IN TUNNEL_FILTER TunnelF,
|
|
IN ADDR SrcAddr,
|
|
IN ADDR DstAddr,
|
|
IN BOOL bDstMask,
|
|
IN BOOL bSrcMask,
|
|
IN QM_FILTER_VALUE_BOOL QMBoolValue,
|
|
IN LPWSTR pszShowFilterName
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
|
|
while(1)
|
|
{
|
|
//Validates user given input for Source address
|
|
switch(SrcAddr.AddrType)
|
|
{
|
|
case IP_ADDR_WINS_SERVER:
|
|
case IP_ADDR_DHCP_SERVER:
|
|
case IP_ADDR_DNS_SERVER:
|
|
case IP_ADDR_DEFAULT_GATEWAY:
|
|
if(TunnelF.SrcAddr.AddrType != SrcAddr.AddrType)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
break;
|
|
default:
|
|
if(SrcAddr.uIpAddr != 0xFFFFFFFF)
|
|
{
|
|
if(TunnelF.SrcAddr.uIpAddr != SrcAddr.uIpAddr)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
//Validates user given input for Destination address
|
|
switch(DstAddr.AddrType)
|
|
{
|
|
case IP_ADDR_WINS_SERVER:
|
|
case IP_ADDR_DHCP_SERVER:
|
|
case IP_ADDR_DNS_SERVER:
|
|
case IP_ADDR_DEFAULT_GATEWAY:
|
|
if(TunnelF.DesAddr.AddrType != DstAddr.AddrType)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
break;
|
|
default:
|
|
if(DstAddr.uIpAddr != 0xFFFFFFFF)
|
|
{
|
|
if(TunnelF.DesAddr.uIpAddr != DstAddr.uIpAddr)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
//Validates user given input for Source port
|
|
if(QMBoolValue.bSrcPort)
|
|
{
|
|
if(TunnelF.SrcPort.wPort != (WORD)QMBoolValue.dwSrcPort)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for Destination port
|
|
if(QMBoolValue.bDstPort)
|
|
{
|
|
if(TunnelF.DesPort.wPort != (WORD)QMBoolValue.dwDstPort)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for protocol
|
|
if(QMBoolValue.bProtocol)
|
|
{
|
|
if(TunnelF.Protocol.dwProtocol != QMBoolValue.dwProtocol)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for Inbound action
|
|
if(QMBoolValue.bActionInbound)
|
|
{
|
|
if(TunnelF.InboundFilterAction != (FILTER_ACTION)QMBoolValue.dwActionInbound)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for outbound action
|
|
if(QMBoolValue.bActionOutbound)
|
|
{
|
|
if(TunnelF.OutboundFilterAction != (FILTER_ACTION)QMBoolValue.dwActionOutbound)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for Source Mask
|
|
if(bSrcMask)
|
|
{
|
|
if(TunnelF.SrcAddr.uSubNetMask != SrcAddr.uSubNetMask)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for Destination mask
|
|
if(bDstMask)
|
|
{
|
|
if(TunnelF.DesAddr.uSubNetMask != DstAddr.uSubNetMask)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
//Validates user given input for filter name
|
|
if(pszShowFilterName!=NULL)
|
|
{
|
|
if(_tcsicmp(TunnelF.pszFilterName, pszShowFilterName) != 0)
|
|
{
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
|
|
//Every thing fine... All matched
|
|
BAIL_OUT;
|
|
|
|
}
|
|
|
|
error:
|
|
return dwReturn;
|
|
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: PrintQuickmodeFilter
|
|
//
|
|
//Date of Creation: 11-21-2001
|
|
//
|
|
//Parameters:
|
|
// IN TRANSPORT_FILTER TransF,
|
|
// IN LPWSTR pszQMName,
|
|
// IN NshHashTable& addressHash
|
|
// IN BOOL bResolveDNS,
|
|
// IN BOOL bType,
|
|
// IN DWORD dwActionFlag
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function prints Transport filter details
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
PrintQuickmodeFilter(
|
|
IN TRANSPORT_FILTER TransF,
|
|
IN LPWSTR pszQMName,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS,
|
|
IN BOOL bType,
|
|
IN DWORD dwActionFlag
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_UNDERLINE);
|
|
|
|
//Print FilterName
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NAME, TransF.pszFilterName);
|
|
//Print Connection Type
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_HEADING);
|
|
switch(TransF.InterfaceType)
|
|
{
|
|
case INTERFACE_TYPE_ALL:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_ALL);
|
|
break;
|
|
case INTERFACE_TYPE_LAN:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_LAN);
|
|
break;
|
|
case INTERFACE_TYPE_DIALUP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_DIALUP);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_UNKNOWN);
|
|
break;
|
|
}
|
|
//Print Weight
|
|
if(!bType)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_FILTER_WEIGHT, TransF.dwWeight);
|
|
}
|
|
//Print Source Address
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_SRC_ADDR_HEADING);
|
|
PrintAddr(TransF.SrcAddr, addressHash, bResolveDNS);
|
|
if(!bResolveDNS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_LEFTBRACKET);
|
|
PrintMask(TransF.SrcAddr);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_RIGHTBRACKET);
|
|
}
|
|
//Print Destination Address
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DST_ADDR_HEADING);
|
|
PrintAddr(TransF.DesAddr, addressHash, bResolveDNS);
|
|
if(!bResolveDNS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_LEFTBRACKET);
|
|
PrintMask(TransF.DesAddr);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_RIGHTBRACKET);
|
|
}
|
|
//Print Protocol
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PROTO_HEADING);
|
|
switch(TransF.Protocol.dwProtocol)
|
|
{
|
|
case PROT_ID_ICMP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_ICMP);
|
|
break;
|
|
case PROT_ID_TCP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TCP);
|
|
break;
|
|
case PROT_ID_UDP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_UDP);
|
|
break;
|
|
case PROT_ID_RAW:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_RAW);
|
|
break;
|
|
case PROT_ID_ANY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_ANY);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DEFAULT_PROTOCOL, TransF.Protocol.dwProtocol);
|
|
break;
|
|
|
|
}
|
|
//Print Src, Des Port
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_SRC_DST_PORT,TransF.SrcPort.wPort,TransF.DesPort.wPort);
|
|
//Print Mirror
|
|
if(TransF.bCreateMirror)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MIRR_YES);
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MIRR_NO);
|
|
}
|
|
// Print Qm Policy Name
|
|
if(pszQMName != NULL)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_NAME,pszQMName);
|
|
}
|
|
//Print Action Flag
|
|
if(dwActionFlag == 0 || dwActionFlag == 2)
|
|
{
|
|
switch(TransF.InboundFilterAction)
|
|
{
|
|
case PASS_THRU:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_PASSTHRU);
|
|
break;
|
|
case NEGOTIATE_SECURITY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_NEGOTIATE);
|
|
break;
|
|
case BLOCKING:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_BLOCK);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_UNKNOWN);
|
|
break;
|
|
}
|
|
}
|
|
if(dwActionFlag == 0 || dwActionFlag == 1)
|
|
{
|
|
switch(TransF.OutboundFilterAction)
|
|
{
|
|
case PASS_THRU:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_PASSTHRU);
|
|
break;
|
|
case NEGOTIATE_SECURITY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_NEGOTIATE);
|
|
break;
|
|
case BLOCKING:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_BLOCK);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_UNKNOWN);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: PrintQuickmodeFilter
|
|
//
|
|
//Date of Creation: 11-21-2001
|
|
//
|
|
//Parameters:
|
|
// IN TUNNEL_FILTER TunnelF,
|
|
// IN LPWSTR pszQMName,
|
|
// IN NshHashTable& addressHash
|
|
// IN BOOL bResolveDNS,
|
|
// IN BOOL bType,
|
|
// IN DWORD dwActionFlag
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function prints Tunnel filter details
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
PrintQuickmodeFilter(
|
|
IN TUNNEL_FILTER TunnelF,
|
|
IN LPWSTR pszQMName,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS,
|
|
IN BOOL bType,
|
|
IN DWORD dwActionFlag
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_UNDERLINE);
|
|
|
|
//Print FilterName
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NAME, TunnelF.pszFilterName);
|
|
|
|
//Print Connection Type
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_HEADING);
|
|
|
|
switch(TunnelF.InterfaceType)
|
|
{
|
|
case INTERFACE_TYPE_ALL:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_ALL);
|
|
break;
|
|
case INTERFACE_TYPE_LAN:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_LAN);
|
|
break;
|
|
case INTERFACE_TYPE_DIALUP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_DIALUP);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_UNKNOWN);
|
|
break;
|
|
}
|
|
//Print Weight
|
|
if(!bType)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_FILTER_WEIGHT, TunnelF.dwWeight);
|
|
}
|
|
|
|
//Print Source Address
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_SRC_ADDR_HEADING);
|
|
PrintAddr(TunnelF.SrcAddr, addressHash, bResolveDNS);
|
|
if(!bResolveDNS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_LEFTBRACKET);
|
|
PrintMask(TunnelF.SrcAddr);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_RIGHTBRACKET);
|
|
}
|
|
//Print Destination Address
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DST_ADDR_HEADING);
|
|
PrintAddr(TunnelF.DesAddr, addressHash, bResolveDNS);
|
|
if(!bResolveDNS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_LEFTBRACKET);
|
|
PrintMask(TunnelF.DesAddr);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_RIGHTBRACKET);
|
|
}
|
|
//Print Tunnel Src
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TUNNEL_SRC);
|
|
PrintAddr(TunnelF.SrcTunnelAddr, addressHash, bResolveDNS);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TUNNEL_DST);
|
|
PrintAddr(TunnelF.DesTunnelAddr, addressHash, bResolveDNS);
|
|
|
|
//Print Protocol
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PROTO_HEADING);
|
|
switch(TunnelF.Protocol.dwProtocol)
|
|
{
|
|
case PROT_ID_ICMP: //1
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_ICMP);
|
|
break;
|
|
case PROT_ID_TCP: //6
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TCP);
|
|
break;
|
|
case PROT_ID_UDP: //17
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_UDP);
|
|
break;
|
|
case PROT_ID_RAW: //255
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_RAW);
|
|
break;
|
|
case PROT_ID_ANY: //0
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_ANY);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DEFAULT_PROTOCOL, TunnelF.Protocol.dwProtocol);
|
|
break;
|
|
|
|
}
|
|
//Print Src, Des Port
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_SRC_DST_PORT,TunnelF.SrcPort.wPort,TunnelF.DesPort.wPort);
|
|
//Print Mirror
|
|
if(TunnelF.bCreateMirror)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MIRR_YES);
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MIRR_NO);
|
|
}
|
|
// Print Qm Policy Name
|
|
if(pszQMName != NULL)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_NAME,pszQMName);
|
|
}
|
|
//Print Action Flag
|
|
if(dwActionFlag == 0 || dwActionFlag == 2)
|
|
{
|
|
switch(TunnelF.InboundFilterAction)
|
|
{
|
|
case PASS_THRU:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_PASSTHRU);
|
|
break;
|
|
case NEGOTIATE_SECURITY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_NEGOTIATE);
|
|
break;
|
|
case BLOCKING:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_BLOCK);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_UNKNOWN);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(dwActionFlag == 0 || dwActionFlag == 1)
|
|
{
|
|
switch(TunnelF.OutboundFilterAction)
|
|
{
|
|
case PASS_THRU:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_PASSTHRU);
|
|
break;
|
|
case NEGOTIATE_SECURITY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_NEGOTIATE);
|
|
break;
|
|
case BLOCKING:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_BLOCK);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_UNKNOWN);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: ShowRule
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters:
|
|
// IN DWORD dwType,
|
|
// IN ADDR SrcAddr,
|
|
// IN ADDR DstAddr,
|
|
// IN NshHashTable& addressHash,
|
|
// IN BOOL bResolveDNS,
|
|
// IN BOOL bSrcMask,
|
|
// IN BOOL bDstMask,
|
|
// IN QM_FILTER_VALUE_BOOL QMBoolValue
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function prepares data for displaying quick mode filters.
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
ShowRule(
|
|
IN DWORD dwType,
|
|
IN ADDR SrcAddr,
|
|
IN ADDR DstAddr,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS,
|
|
IN BOOL bSrcMask,
|
|
IN BOOL bDstMask,
|
|
IN QM_FILTER_VALUE_BOOL QMBoolValue
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwCount = 0; // counting objects here
|
|
DWORD dwQMResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwQMCount = 0; // counting objects here
|
|
GUID gDefaultGUID = {0}; // NULL GUID value
|
|
DWORD i=0, j=0, k=0, l=0;
|
|
DWORD dwVersion = 0;
|
|
DWORD dwTempCnt = 0;
|
|
DWORD dwActionFlag = 0;
|
|
LPWSTR pszQMName = NULL;
|
|
BOOL bPrint = FALSE;
|
|
BOOL bMMFound = FALSE;
|
|
BOOL bNameFin = FALSE;
|
|
|
|
PIPSEC_QM_POLICY pQMPolicy = NULL;
|
|
PTRANSPORT_FILTER pTransF = NULL;
|
|
PIPSEC_MM_POLICY pMMPolicy = NULL;
|
|
PMM_FILTER pMMFilter = NULL;
|
|
|
|
|
|
if(dwType == 1 || dwType == 0)//either transport or all
|
|
{
|
|
for (k = 0; ;k+=dwQMCount)
|
|
{
|
|
dwReturn = EnumTransportFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_GENERIC_FILTERS, gDefaultGUID, 0,
|
|
&pTransF, &dwQMCount, &dwQMResumeHandle, NULL);
|
|
|
|
if (dwReturn == ERROR_NO_DATA || dwQMCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pTransF && dwQMCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
for (l = 0; l < dwQMCount; l++)
|
|
{
|
|
dwResumeHandle = 0;
|
|
pMMFilter = 0;
|
|
dwCount = 0;
|
|
|
|
dwReturn = CheckQMFilter(pTransF[l], SrcAddr, DstAddr, bDstMask, bSrcMask,QMBoolValue, NULL);
|
|
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
//Though not matched check for other filters
|
|
dwReturn = ERROR_SUCCESS;
|
|
continue;
|
|
}
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
dwReturn = EnumMMFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_GENERIC_FILTERS, gDefaultGUID, 0,
|
|
&pMMFilter, &dwCount, &dwResumeHandle, NULL);
|
|
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
break;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if(!(pMMFilter && dwCount > 0))
|
|
{
|
|
break; // not required to continue.
|
|
}
|
|
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
//Match QMfilter data with MMFilter data to get the corresponding MMFilter details to print
|
|
if((pTransF[l].SrcAddr.AddrType == pMMFilter[j].SrcAddr.AddrType) &&
|
|
(pTransF[l].SrcAddr.uIpAddr == pMMFilter[j].SrcAddr.uIpAddr) &&
|
|
(pTransF[l].DesAddr.AddrType == pMMFilter[j].DesAddr.AddrType) &&
|
|
(pTransF[l].DesAddr.uIpAddr == pMMFilter[j].DesAddr.uIpAddr) &&
|
|
(pTransF[l].SrcAddr.uSubNetMask == pMMFilter[j].SrcAddr.uSubNetMask) &&
|
|
(pTransF[l].DesAddr.uSubNetMask == pMMFilter[j].DesAddr.uSubNetMask) &&
|
|
(pTransF[l].InterfaceType == pMMFilter[j].InterfaceType) &&
|
|
(pTransF[l].bCreateMirror == pMMFilter[j].bCreateMirror)
|
|
)
|
|
{
|
|
//Get the corresponding MMPolicy details
|
|
pMMPolicy = NULL;
|
|
dwReturn = GetMMPolicyByID(g_szDynamicMachine, dwVersion, pMMFilter[j].gPolicyID,
|
|
&pMMPolicy, NULL);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
//Get the corresponding QMPolicy details
|
|
dwReturn = GetQMPolicyByID(g_szDynamicMachine, dwVersion, pTransF[l].gPolicyID, 0, &pQMPolicy, NULL);
|
|
if(dwReturn == ERROR_SUCCESS)
|
|
{
|
|
pszQMName = pQMPolicy[0].pszPolicyName;
|
|
}
|
|
else
|
|
{
|
|
//If there is no corresponding policy pass NULL, so it is not printed
|
|
pszQMName = NULL;
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
dwActionFlag = 0;
|
|
if(!bPrint)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TRANSPORT_RULE_HEADING);
|
|
bPrint = TRUE;
|
|
}
|
|
dwTempCnt++;
|
|
//print Transport Rule details
|
|
dwReturn = PrintTransportRuleFilter(&pMMFilter[j], &pMMPolicy[0], pTransF[l], pszQMName, addressHash, bResolveDNS);
|
|
bNameFin = TRUE;
|
|
bMMFound = TRUE;
|
|
|
|
if(pQMPolicy)
|
|
{
|
|
SPDApiBufferFree(pQMPolicy);
|
|
pQMPolicy = NULL;
|
|
}
|
|
|
|
if(pMMPolicy)
|
|
{
|
|
SPDApiBufferFree(pMMPolicy);
|
|
pMMPolicy = NULL;
|
|
}
|
|
}
|
|
}
|
|
if(pMMFilter)
|
|
{
|
|
SPDApiBufferFree(pMMFilter);
|
|
pMMFilter = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
SPDApiBufferFree(pTransF);
|
|
pTransF = NULL;
|
|
}
|
|
}
|
|
|
|
error:
|
|
//print the number of transport rules
|
|
if(dwTempCnt > 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NO_OF_TRANSPORT_FILTERS, dwTempCnt);
|
|
}
|
|
//Then print tunnel filters
|
|
dwReturn = ShowTunnelRule(dwType, SrcAddr, DstAddr, addressHash, bResolveDNS, bSrcMask, bDstMask, QMBoolValue, bNameFin);
|
|
|
|
if(!bNameFin)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_QMF_17);
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
//error path clean up
|
|
if(pQMPolicy)
|
|
{
|
|
SPDApiBufferFree(pQMPolicy);
|
|
pQMPolicy = NULL;
|
|
}
|
|
|
|
if(pMMPolicy)
|
|
{
|
|
SPDApiBufferFree(pMMPolicy);
|
|
pMMPolicy = NULL;
|
|
}
|
|
|
|
if(pMMFilter)
|
|
{
|
|
SPDApiBufferFree(pMMFilter);
|
|
pMMFilter = NULL;
|
|
}
|
|
|
|
if(pTransF)
|
|
{
|
|
SPDApiBufferFree(pTransF);
|
|
pTransF = NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : ShowTunnelRule
|
|
//
|
|
// Date of Creation: 9-3-2001
|
|
//
|
|
// Parameters :
|
|
// IN DWORD dwType,
|
|
// IN ADDR SrcAddr,
|
|
// IN ADDR DstAddr,
|
|
// IN NshHashTable& addressHash,
|
|
// IN BOOL bResolveDNS,
|
|
// IN BOOL bSrcMask,
|
|
// IN BOOL bDstMask,
|
|
// IN QM_FILTER_VALUE_BOOL QMBoolValue
|
|
// IN OUT BOOL& bNameFin
|
|
//
|
|
// Return : DWORD
|
|
//
|
|
// Description : This function prepares data for displaying quick mode filters.
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
ShowTunnelRule(
|
|
IN DWORD dwType,
|
|
IN ADDR SrcAddr,
|
|
IN ADDR DstAddr,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS,
|
|
IN BOOL bSrcMask,
|
|
IN BOOL bDstMask,
|
|
IN QM_FILTER_VALUE_BOOL QMBoolValue,
|
|
IN OUT BOOL& bNameFin
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwCount = 0; // counting objects here
|
|
DWORD dwQMResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwQMCount = 0; // counting objects here
|
|
GUID gDefaultGUID = {0}; // NULL GUID value
|
|
DWORD i=0, j=0, k=0, l=0;
|
|
DWORD dwVersion = 0;
|
|
DWORD dwTempCnt = 0;
|
|
DWORD dwActionFlag = 0;
|
|
LPWSTR pszQMName = NULL;
|
|
BOOL bPrint = FALSE;
|
|
BOOL bMMFound = FALSE;
|
|
PIPSEC_QM_POLICY pQMPolicy = NULL;
|
|
PTUNNEL_FILTER pTunnelF = NULL;
|
|
PIPSEC_MM_POLICY pMMPolicy = NULL;
|
|
PMM_FILTER pMMFilter = NULL;
|
|
|
|
if(dwType == 2 || dwType == 0)//either tunnel or all
|
|
{
|
|
for (k = 0; ;k+=dwQMCount)
|
|
{
|
|
dwReturn = EnumTunnelFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_GENERIC_FILTERS, gDefaultGUID, 0, &pTunnelF, &dwQMCount, &dwQMResumeHandle, NULL);
|
|
if (dwReturn == ERROR_NO_DATA || dwQMCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pTunnelF && dwQMCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
for (l = 0; l < dwQMCount; l++)
|
|
{
|
|
dwResumeHandle = 0;
|
|
pMMFilter = 0;
|
|
dwCount = 0;
|
|
//Validate user input data.
|
|
dwReturn = CheckQMFilter(pTunnelF[l], SrcAddr, DstAddr, bDstMask, bSrcMask,QMBoolValue, NULL);
|
|
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
//Though not matched continue for other filters
|
|
dwReturn = ERROR_SUCCESS;
|
|
continue;
|
|
}
|
|
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
dwReturn = EnumMMFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_GENERIC_FILTERS, gDefaultGUID, 0, &pMMFilter, &dwCount, &dwResumeHandle, NULL);
|
|
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
break;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if(!(pMMFilter && dwCount > 0))
|
|
{
|
|
break; // not required to continue.
|
|
}
|
|
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
//Match QMfilter data with MMFilter data to get the corresponding MMFilter details to print
|
|
if((pTunnelF[l].DesTunnelAddr.AddrType == pMMFilter[j].DesAddr.AddrType) &&
|
|
(pTunnelF[l].DesTunnelAddr.uIpAddr == pMMFilter[j].DesAddr.uIpAddr) &&
|
|
(pTunnelF[l].InterfaceType == pMMFilter[j].InterfaceType)
|
|
)
|
|
{
|
|
//get the corresponding MMpolicy
|
|
pMMPolicy = NULL;
|
|
dwReturn = GetMMPolicyByID(g_szDynamicMachine, dwVersion, pMMFilter[j].gPolicyID, &pMMPolicy, NULL);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
//get the corresponding QMpolicy
|
|
dwReturn = GetQMPolicyByID(g_szDynamicMachine, dwVersion, pTunnelF[l].gPolicyID, 0, &pQMPolicy, NULL);
|
|
if(dwReturn == ERROR_SUCCESS)
|
|
{
|
|
pszQMName = pQMPolicy[0].pszPolicyName;
|
|
}
|
|
else
|
|
{
|
|
//If the corresponding policy is not found, pass NULL so that it is not printed.
|
|
pszQMName = NULL;
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
dwActionFlag = 0;
|
|
|
|
if(!bPrint)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TUNNEL_RULE_HEADING);
|
|
bPrint = TRUE;
|
|
}
|
|
dwTempCnt++;
|
|
|
|
//print tunnel rule details
|
|
dwReturn = PrintTunnelRuleFilter(&pMMFilter[j], &pMMPolicy[0], pTunnelF[l], pszQMName, addressHash, bResolveDNS);
|
|
bNameFin = TRUE;
|
|
bMMFound = TRUE;
|
|
if(pQMPolicy == NULL)
|
|
{
|
|
SPDApiBufferFree(pQMPolicy);
|
|
pQMPolicy = NULL;
|
|
}
|
|
|
|
if(pMMPolicy)
|
|
{
|
|
SPDApiBufferFree(pMMPolicy);
|
|
pMMPolicy = NULL;
|
|
}
|
|
}
|
|
}
|
|
if(pMMFilter)
|
|
{
|
|
SPDApiBufferFree(pMMFilter);
|
|
pMMFilter = NULL;
|
|
}
|
|
|
|
}
|
|
}
|
|
SPDApiBufferFree(pTunnelF);
|
|
pTunnelF = NULL;
|
|
}
|
|
}
|
|
|
|
error:
|
|
if(dwTempCnt > 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NO_OF_TUNNEL_FILTERS, dwTempCnt);
|
|
}
|
|
// error path clean up
|
|
if(pTunnelF)
|
|
{
|
|
SPDApiBufferFree(pTunnelF);
|
|
pTunnelF = NULL;
|
|
}
|
|
if(pQMPolicy == NULL)
|
|
{
|
|
SPDApiBufferFree(pQMPolicy);
|
|
pQMPolicy = NULL;
|
|
}
|
|
|
|
if(pMMFilter)
|
|
{
|
|
SPDApiBufferFree(pMMFilter);
|
|
pMMFilter = NULL;
|
|
}
|
|
|
|
if(pMMPolicy)
|
|
{
|
|
SPDApiBufferFree(pMMPolicy);
|
|
pMMPolicy = NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : PrintTunnelRuleFilter
|
|
//
|
|
// Date of Creation: 11-21-2001
|
|
//
|
|
// Parameters :
|
|
// IN PMM_FILTER pMMFltr,
|
|
// IN PIPSEC_MM_POLICY pMMPol,
|
|
// IN TUNNEL_FILTER TunnelF,
|
|
// IN LPWSTR pszQMName,
|
|
// IN NshHashTable& addressHash
|
|
// IN BOOL bResolveDNS
|
|
//
|
|
// Return : DWORD
|
|
//
|
|
// Description : This function prints Tunnel filter details
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
PrintTunnelRuleFilter(
|
|
IN PMM_FILTER pMMFltr,
|
|
IN PIPSEC_MM_POLICY pMMPol,
|
|
IN TUNNEL_FILTER TunnelF,
|
|
IN LPWSTR pszQMName,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD i = 0;
|
|
DWORD dwVersion = 0;
|
|
LPTSTR pszCertStr = NULL;
|
|
PINT_MM_AUTH_METHODS pIntMMAuth = NULL;
|
|
PMM_AUTH_METHODS pMMAM = NULL;
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_UNDERLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
|
|
//Print MMMFilter name
|
|
if(pMMFltr)
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMFILTER_NAME, pMMFltr->pszFilterName);
|
|
|
|
//Print Tunnel FilterName
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMF_NAME, TunnelF.pszFilterName);
|
|
|
|
//Print Connection Type
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_HEADING);
|
|
switch(TunnelF.InterfaceType)
|
|
{
|
|
case INTERFACE_TYPE_ALL:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_ALL);
|
|
break;
|
|
case INTERFACE_TYPE_LAN:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_LAN);
|
|
break;
|
|
case INTERFACE_TYPE_DIALUP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_DIALUP);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_UNKNOWN);
|
|
break;
|
|
}
|
|
|
|
//Print Source Address
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_SRC_ADDR_HEADING);
|
|
PrintAddr(TunnelF.SrcAddr, addressHash, bResolveDNS);
|
|
if(!bResolveDNS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_LEFTBRACKET);
|
|
PrintMask(TunnelF.SrcAddr);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_RIGHTBRACKET);
|
|
}
|
|
|
|
//Print Destination Address
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DST_ADDR_HEADING);
|
|
PrintAddr(TunnelF.DesAddr, addressHash, bResolveDNS);
|
|
if(!bResolveDNS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_LEFTBRACKET);
|
|
PrintMask(TunnelF.DesAddr);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_RIGHTBRACKET);
|
|
}
|
|
|
|
//Print Tunnel Src
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TUNNEL_SRC);
|
|
PrintAddr(TunnelF.SrcTunnelAddr, addressHash, bResolveDNS);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TUNNEL_DST);
|
|
PrintAddr(TunnelF.DesTunnelAddr, addressHash, bResolveDNS);
|
|
|
|
//Print Protocol
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PROTO_HEADING);
|
|
switch(TunnelF.Protocol.dwProtocol)
|
|
{
|
|
case PROT_ID_ICMP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_ICMP);
|
|
break;
|
|
case PROT_ID_TCP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TCP);
|
|
break;
|
|
case PROT_ID_UDP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_UDP);
|
|
break;
|
|
case PROT_ID_RAW:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_RAW);
|
|
break;
|
|
case PROT_ID_ANY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_ANY);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DEFAULT_PROTOCOL, TunnelF.Protocol.dwProtocol);
|
|
break;
|
|
|
|
}
|
|
|
|
//Print Src, Des Port
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_SRC_DST_PORT,TunnelF.SrcPort.wPort,TunnelF.DesPort.wPort);
|
|
|
|
//Print Mirror
|
|
if(TunnelF.bCreateMirror)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MIRR_YES);
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MIRR_NO);
|
|
}
|
|
|
|
if(pMMPol)
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMP_NAME,pMMPol->pszPolicyName);
|
|
|
|
//Print Authentication Methods.
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_AUTH_HEADING);
|
|
|
|
if(pMMFltr)
|
|
{
|
|
dwReturn = GetMMAuthMethods(g_szDynamicMachine, dwVersion, pMMFltr->gMMAuthID, &pMMAM, NULL);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturn = ConvertExtMMAuthToInt(pMMAM, &pIntMMAuth);
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
for (i = 0; i < pIntMMAuth[0].dwNumAuthInfos; i++)
|
|
{
|
|
switch(pIntMMAuth[0].pAuthenticationInfo[i].AuthMethod)
|
|
{
|
|
case IKE_PRESHARED_KEY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_PRE_KEY_HEADING);
|
|
break;
|
|
case IKE_DSS_SIGNATURE:
|
|
case IKE_RSA_SIGNATURE:
|
|
case IKE_RSA_ENCRYPTION:
|
|
dwReturn = DecodeCertificateName(pIntMMAuth[0].pAuthenticationInfo[i].pAuthInfo, pIntMMAuth[0].pAuthenticationInfo[i].dwAuthInfoSize, &pszCertStr);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_UNKNOWN_CERT);
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NEWLINE_TAB);
|
|
if (pszCertStr)
|
|
{
|
|
DisplayCertInfo(pszCertStr, pIntMMAuth->pAuthenticationInfo[i].dwAuthFlags);
|
|
delete [] pszCertStr;
|
|
pszCertStr = NULL;
|
|
}
|
|
}
|
|
|
|
break;
|
|
case IKE_SSPI:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_KERB);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
error:
|
|
|
|
//Print Security Methods
|
|
if(pMMPol)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_SEC_METHOD_HEADING);
|
|
// Count
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_OFFER_CNT,pMMPol->dwOfferCount);
|
|
|
|
if(IsDefaultMMOffers(*pMMPol))
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_DEFAULT_OFFER);
|
|
}
|
|
for (i = 0; i < pMMPol->dwOfferCount; i++)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMMFilterOffer(pMMPol->pOffers[i]);
|
|
}
|
|
}
|
|
|
|
// Print Qm Policy Name
|
|
if(pszQMName != NULL)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_NAME,pszQMName);
|
|
}
|
|
|
|
//Print Action Flag
|
|
switch(TunnelF.InboundFilterAction)
|
|
{
|
|
case PASS_THRU:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_PASSTHRU);
|
|
break;
|
|
case NEGOTIATE_SECURITY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_NEGOTIATE);
|
|
break;
|
|
case BLOCKING:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_BLOCK);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_UNKNOWN);
|
|
break;
|
|
}
|
|
|
|
switch(TunnelF.OutboundFilterAction)
|
|
{
|
|
case PASS_THRU:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_PASSTHRU);
|
|
break;
|
|
case NEGOTIATE_SECURITY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_NEGOTIATE);
|
|
break;
|
|
case BLOCKING:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_BLOCK);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_UNKNOWN);
|
|
break;
|
|
}
|
|
|
|
if(pIntMMAuth)
|
|
{
|
|
FreeIntMMAuthMethods(pIntMMAuth);
|
|
pIntMMAuth = NULL;
|
|
}
|
|
|
|
if(pMMAM)
|
|
{
|
|
SPDApiBufferFree(pMMAM);
|
|
pMMAM = NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : PrintTransportRuleFilter
|
|
//
|
|
// Date of Creation: 11-21-2001
|
|
//
|
|
// Parameters :
|
|
// IN PMM_FILTER pMMFltr,
|
|
// IN PIPSEC_MM_POLICY pMMPol,
|
|
// IN TRANSPORT_FILTER TransF,
|
|
// IN LPWSTR pszQMName,
|
|
// IN NshHashTable& addressHash
|
|
// IN BOOL bResolveDNS
|
|
//
|
|
// Return : DWORD
|
|
//
|
|
// Description : This function prints Transport filter details
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
PrintTransportRuleFilter(
|
|
IN PMM_FILTER pMMFltr,
|
|
IN PIPSEC_MM_POLICY pMMPol,
|
|
IN TRANSPORT_FILTER TransF,
|
|
IN LPWSTR pszQMName,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD i = 0;
|
|
DWORD dwVersion = 0;
|
|
LPTSTR pszCertStr = NULL;
|
|
PINT_MM_AUTH_METHODS pIntMMAuth = NULL;
|
|
PMM_AUTH_METHODS pMMAM = NULL;
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_UNDERLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
|
|
//Print Mmfilter name
|
|
if(pMMFltr)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMFILTER_NAME, pMMFltr->pszFilterName);
|
|
}
|
|
|
|
//Print Tunnel FilterName
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMF_NAME, TransF.pszFilterName);
|
|
|
|
//Print Connection Type
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_HEADING);
|
|
switch(TransF.InterfaceType)
|
|
{
|
|
case INTERFACE_TYPE_ALL:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_ALL);
|
|
break;
|
|
case INTERFACE_TYPE_LAN:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_LAN);
|
|
break;
|
|
case INTERFACE_TYPE_DIALUP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_DIALUP);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_CONN_UNKNOWN);
|
|
break;
|
|
}
|
|
|
|
//Print Source Address
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_SRC_ADDR_HEADING);
|
|
PrintAddr(TransF.SrcAddr, addressHash, bResolveDNS);
|
|
if(!bResolveDNS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_LEFTBRACKET);
|
|
PrintMask(TransF.SrcAddr);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_RIGHTBRACKET);
|
|
}
|
|
|
|
//Print Destination Address
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DST_ADDR_HEADING);
|
|
PrintAddr(TransF.DesAddr, addressHash, bResolveDNS);
|
|
if(!bResolveDNS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_LEFTBRACKET);
|
|
PrintMask(TransF.DesAddr);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_RIGHTBRACKET);
|
|
}
|
|
|
|
//Print Protocol
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PROTO_HEADING);
|
|
switch(TransF.Protocol.dwProtocol)
|
|
{
|
|
case PROT_ID_ICMP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_ICMP);
|
|
break;
|
|
case PROT_ID_TCP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TCP);
|
|
break;
|
|
case PROT_ID_UDP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_UDP);
|
|
break;
|
|
case PROT_ID_RAW:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_RAW);
|
|
break;
|
|
case PROT_ID_ANY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_ANY);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DEFAULT_PROTOCOL, TransF.Protocol.dwProtocol);
|
|
break;
|
|
}
|
|
//Print Src, Des Port
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_SRC_DST_PORT,TransF.SrcPort.wPort,TransF.DesPort.wPort);
|
|
//Print Mirror
|
|
if(TransF.bCreateMirror)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MIRR_YES);
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MIRR_NO);
|
|
}
|
|
|
|
if(pMMPol)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMP_NAME,pMMPol->pszPolicyName);
|
|
}
|
|
//Print Authentication Methods.
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_AUTH_HEADING);
|
|
|
|
if(pMMFltr)
|
|
{
|
|
dwReturn = GetMMAuthMethods(g_szDynamicMachine, dwVersion, pMMFltr->gMMAuthID, &pMMAM, NULL);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturn = ConvertExtMMAuthToInt(pMMAM, &pIntMMAuth);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
for (i = 0; i < pIntMMAuth[0].dwNumAuthInfos; i++)
|
|
{
|
|
switch(pIntMMAuth[0].pAuthenticationInfo[i].AuthMethod)
|
|
{
|
|
case IKE_PRESHARED_KEY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_PRE_KEY_HEADING);
|
|
break;
|
|
case IKE_DSS_SIGNATURE:
|
|
case IKE_RSA_SIGNATURE:
|
|
case IKE_RSA_ENCRYPTION:
|
|
dwReturn = DecodeCertificateName(pIntMMAuth[0].pAuthenticationInfo[i].pAuthInfo, pIntMMAuth[0].pAuthenticationInfo[i].dwAuthInfoSize, &pszCertStr);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_UNKNOWN_CERT);
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_NEWLINE_TAB);
|
|
if (pszCertStr)
|
|
{
|
|
DisplayCertInfo(pszCertStr, pIntMMAuth->pAuthenticationInfo[i].dwAuthFlags);
|
|
delete [] pszCertStr;
|
|
pszCertStr = NULL;
|
|
}
|
|
}
|
|
break;
|
|
case IKE_SSPI:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_KERB);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
error:
|
|
// Print Security Methods
|
|
// Count
|
|
if(pMMPol)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_SEC_METHOD_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_OFFER_CNT,pMMPol->dwOfferCount);
|
|
if(IsDefaultMMOffers(*pMMPol))
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_DEFAULT_OFFER);
|
|
}
|
|
for (i = 0; i < pMMPol->dwOfferCount; i++)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMMFilterOffer(pMMPol->pOffers[i]);
|
|
}
|
|
}
|
|
// Print Qm Policy Name
|
|
if(pszQMName != NULL)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_NAME,pszQMName);
|
|
}
|
|
//Print Action Flag
|
|
switch(TransF.InboundFilterAction)
|
|
{
|
|
case PASS_THRU:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_PASSTHRU);
|
|
break;
|
|
case NEGOTIATE_SECURITY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_NEGOTIATE);
|
|
break;
|
|
case BLOCKING:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_BLOCK);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_INBOUND_UNKNOWN);
|
|
break;
|
|
}
|
|
|
|
switch(TransF.OutboundFilterAction)
|
|
{
|
|
case PASS_THRU:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_PASSTHRU);
|
|
break;
|
|
case NEGOTIATE_SECURITY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_NEGOTIATE);
|
|
break;
|
|
case BLOCKING:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_BLOCK);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OUTBOUND_UNKNOWN);
|
|
break;
|
|
}
|
|
|
|
if(pIntMMAuth)
|
|
{
|
|
FreeIntMMAuthMethods(pIntMMAuth);
|
|
pIntMMAuth = NULL;
|
|
}
|
|
|
|
if(pMMAM)
|
|
{
|
|
SPDApiBufferFree(pMMAM);
|
|
pMMAM = NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : ShowStats
|
|
//
|
|
// Date of Creation: 9-3-2001
|
|
//
|
|
// Parameters : IN DWORD dwShow
|
|
//
|
|
// Return : DWORD
|
|
//
|
|
// Description : This function calls appropriate IKE and IPSEC statistics display.
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
ShowStats(
|
|
IN DWORD dwShow
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS; // assume success
|
|
|
|
if(dwShow != STATS_IPSEC) //is the show is for IKE or all
|
|
{
|
|
dwReturn = PrintIkeStats();
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
|
|
if(dwShow != STATS_IKE) //is the show is for IPSEC or all
|
|
{
|
|
dwReturn = PrintIpsecStats();
|
|
}
|
|
|
|
error:
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: PrintIkeStats
|
|
//
|
|
//Date of Creation: 28-1-2002
|
|
//
|
|
//Parameters:
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function Prints IkeStatistics
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
PrintIkeStats(
|
|
VOID
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS; // assume success
|
|
DWORD dwVersion = 0;
|
|
LPSTR pszLLString = NULL;
|
|
IKE_STATISTICS IKEStats;
|
|
|
|
//Query IKE Statistics
|
|
dwReturn = QueryIKEStatistics(g_szDynamicMachine,dwVersion, &IKEStats, NULL);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_NOT_FOUND_MSG);
|
|
BAIL_OUT;
|
|
}
|
|
|
|
//Heading
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_IKE_HEADING_UNDERLINE);
|
|
//Print IKE statistics
|
|
pszLLString = LongLongToString(0, IKEStats.dwOakleyMainModes, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_MAIN_MODE, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwOakleyQuickModes, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_QUICK_MODE, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwSoftAssociations, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_SOFT_SA, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwAuthenticationFailures, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_AUTH_FAIL, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwActiveAcquire, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_ACTIVE_ACQUIRE, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwActiveReceive, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_ACTIVE_RECEIVE, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwAcquireFail, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_ACQUIRE_FAIL, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwReceiveFail, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_RECEIVE_FAIL, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwSendFail, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_SEND_FAIL, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwAcquireHeapSize, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_ACQ_HEAP_SIZE, pszLLString);
|
|
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwReceiveHeapSize, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_RECEIVE_HEAP_SIZE, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwNegotiationFailures, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_NEG_FAIL, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwInvalidCookiesReceived, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_INVALID_COOKIE, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwTotalAcquire, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_TOTAL_ACQUIRE, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwTotalGetSpi, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_TOT_GET_SPI, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwTotalKeyAdd, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_TOT_KEY_ADD, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwTotalKeyUpdate, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_TOT_KEY_UPDATE, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwGetSpiFail, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_GET_SPI_FAIL, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwKeyAddFail, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_KEY_ADD_FAIL, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwKeyUpdateFail, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_KEY_UPDATE_FAIL, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwIsadbListSize, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_DB_LIST, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwConnListSize, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_CONN_LIST_SIZE, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, IKEStats.dwInvalidPacketsReceived, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_INVLD_PKTS, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
error:
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: PrintIpsecStats
|
|
//
|
|
//Date of Creation: 28-1-2002
|
|
//
|
|
//Parameters:
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function Prints IpsecStatistics
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
PrintIpsecStats(
|
|
VOID
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS; // assume success
|
|
DWORD dwVersion = 0;
|
|
LPSTR pszLLString = NULL;
|
|
PIPSEC_STATISTICS pIPSecStats = NULL;
|
|
|
|
dwReturn = QueryIPSecStatistics(g_szDynamicMachine, dwVersion, &pIPSecStats, NULL);
|
|
//Query IPSec Statistics
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_IPSEC_NOT_FOUND);
|
|
BAIL_OUT;
|
|
}
|
|
|
|
//Heading
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_IPSEC_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_IPSEC_HEADING_UNDERLINE);
|
|
//Print IPSec statistics.
|
|
pszLLString = LongLongToString(0, pIPSecStats->dwNumActiveAssociations, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_ACTIVE_ASSOC, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, pIPSecStats->dwNumOffloadedSAs, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_OFFLOAD_SAS, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, pIPSecStats->dwNumPendingKeyOps, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_PEND_KEY, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, pIPSecStats->dwNumKeyAdditions, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_KEY_ADDS, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, pIPSecStats->dwNumKeyDeletions, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_KEY_DELETES, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, pIPSecStats->dwNumReKeys, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_REKEYS, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, pIPSecStats->dwNumActiveTunnels, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_ACT_TUNNEL, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, pIPSecStats->dwNumBadSPIPackets, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_BAD_SPI, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, pIPSecStats->dwNumPacketsNotDecrypted, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_NOT_DECRYPT, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, pIPSecStats->dwNumPacketsNotAuthenticated, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_NOT_AUTH, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(0, pIPSecStats->dwNumPacketsWithReplayDetection, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_REPLAY, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(pIPSecStats->uConfidentialBytesSent.HighPart,pIPSecStats->uConfidentialBytesSent.LowPart, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_CONF_BYTES_SENT, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(pIPSecStats->uConfidentialBytesReceived.HighPart,pIPSecStats->uConfidentialBytesReceived.LowPart, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_CONF_BYTES_RECV, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(pIPSecStats->uAuthenticatedBytesSent.HighPart,pIPSecStats->uAuthenticatedBytesSent.LowPart, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_AUTH_BYTES_SENT, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(pIPSecStats->uAuthenticatedBytesReceived.HighPart,pIPSecStats->uAuthenticatedBytesReceived.LowPart, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_AUTH_BYTE_RECV, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(pIPSecStats->uTransportBytesSent.HighPart,pIPSecStats->uTransportBytesSent.LowPart, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_TRANSPORT_BYTES_SENT, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(pIPSecStats->uTransportBytesReceived.HighPart,pIPSecStats->uTransportBytesReceived.LowPart, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_TRANSPORT_BYTES_RCVD, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(pIPSecStats->uBytesSentInTunnels.HighPart,pIPSecStats->uBytesSentInTunnels.LowPart, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_BYTES_SENT_TUNNEL, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(pIPSecStats->uBytesReceivedInTunnels.HighPart,pIPSecStats->uBytesReceivedInTunnels.LowPart, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_BYTES_RECV_TUNNEL, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(pIPSecStats->uOffloadedBytesSent.HighPart,pIPSecStats->uOffloadedBytesSent.LowPart, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_OFFLOAD_BYTES_SENT, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
pszLLString = LongLongToString(pIPSecStats->uOffloadedBytesReceived.HighPart,pIPSecStats->uOffloadedBytesReceived.LowPart, 1);
|
|
if(pszLLString)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_STATS_OFFLOAD_BYTES_RECV, pszLLString);
|
|
free(pszLLString);
|
|
pszLLString = NULL;
|
|
}
|
|
else
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
error:
|
|
|
|
if(pIPSecStats)
|
|
{
|
|
SPDApiBufferFree(pIPSecStats);
|
|
pIPSecStats = NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: ShowMMSas
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters:
|
|
// IN ADDR Source,
|
|
// IN ADDR Destination,
|
|
// IN BOOL bFormat
|
|
// IN NshHashTable& addressHash,
|
|
// IN BOOL bResolveDNS
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function prepares data for MMsas
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
ShowMMSas(
|
|
IN ADDR Source,
|
|
IN ADDR Destination,
|
|
IN BOOL bFormat,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS; // success by default
|
|
int i=0, j=0;
|
|
DWORD dwResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwCount = 2; // counting objects here min 2 required
|
|
|
|
// for MM SA calls
|
|
DWORD dwReserved = 0; // reserved container
|
|
DWORD dwVersion = 0;
|
|
BOOL bHeader = FALSE;
|
|
BOOL bFound = FALSE;
|
|
_TCHAR szTime[BUFFER_SIZE] = {0};
|
|
|
|
PIPSEC_MM_SA pIPSecMMSA=NULL;
|
|
IPSEC_MM_SA mmsaTemplate;
|
|
memset(&mmsaTemplate, 0, sizeof(IPSEC_MM_SA));
|
|
|
|
// Display main mode SAs
|
|
time_t Time;
|
|
|
|
time(&Time);
|
|
FormatTime(Time,szTime);
|
|
|
|
// make the call(s)
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
dwReturn = EnumMMSAs(g_szDynamicMachine, dwVersion, &mmsaTemplate, 0, 0, &pIPSecMMSA, &dwCount, &dwReserved, &dwResumeHandle, NULL);
|
|
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
if (i == 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_MMSAS_3);
|
|
bHeader = TRUE; //To Block other error message
|
|
}
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
for (j = 0; j < (int) dwCount; j++)
|
|
{
|
|
bHeader = FALSE;
|
|
//Enumerate all MMSAs
|
|
if((Source.AddrType == IP_ADDR_UNIQUE) && (Destination.AddrType == IP_ADDR_UNIQUE) &&
|
|
(Source.uIpAddr == 0xFFFFFFFF ) && (Destination.uIpAddr == 0xFFFFFFFF))
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
//Enumerate me/any as source
|
|
else if((Source.AddrType != IP_ADDR_UNIQUE) && (Destination.AddrType == IP_ADDR_UNIQUE) &&
|
|
(Source.uIpAddr != 0xFFFFFFFF ) && (Destination.uIpAddr == 0xFFFFFFFF))
|
|
{
|
|
if((pIPSecMMSA[j].Me.AddrType == Source.AddrType) &&
|
|
(pIPSecMMSA[j].Me.uIpAddr == Source.uIpAddr) && (pIPSecMMSA[j].Me.uSubNetMask == Source.uSubNetMask))
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
|
|
}
|
|
//Enumerate me/any as dst
|
|
else if((Source.AddrType == IP_ADDR_UNIQUE) && (Destination.AddrType != IP_ADDR_UNIQUE) &&
|
|
(Source.uIpAddr == 0xFFFFFFFF ) && (Destination.uIpAddr != 0xFFFFFFFF))
|
|
{
|
|
if( (pIPSecMMSA[j].Peer.AddrType == Destination.AddrType)
|
|
&& (pIPSecMMSA[j].Peer.uIpAddr == Destination.uIpAddr)
|
|
&& (pIPSecMMSA[j].Peer.uSubNetMask == Destination.uSubNetMask))
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
}
|
|
//Enumerate me/any as source/dst
|
|
else if((Source.AddrType != IP_ADDR_UNIQUE) && (Destination.AddrType != IP_ADDR_UNIQUE) &&
|
|
(Source.uIpAddr != 0xFFFFFFFF ) && (Destination.uIpAddr != 0xFFFFFFFF))
|
|
{
|
|
if((pIPSecMMSA[j].Me.AddrType == Source.AddrType)
|
|
&& (pIPSecMMSA[j].Me.uIpAddr == Source.uIpAddr)
|
|
&& (pIPSecMMSA[j].Me.uSubNetMask == Source.uSubNetMask)
|
|
&& (pIPSecMMSA[j].Peer.AddrType == Destination.AddrType)
|
|
&& (pIPSecMMSA[j].Peer.uIpAddr == Destination.uIpAddr)
|
|
&& (pIPSecMMSA[j].Peer.uSubNetMask == Destination.uSubNetMask))
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
|
|
}
|
|
//Enumerate Only given source SPL_SRVR MMSAs
|
|
else if((Source.AddrType != IP_ADDR_UNIQUE) && (Destination.AddrType == IP_ADDR_UNIQUE) &&
|
|
(Source.uIpAddr == 0xFFFFFFFF ) && (Destination.uIpAddr == 0xFFFFFFFF))
|
|
{
|
|
if(pIPSecMMSA[j].Me.AddrType == Source.AddrType)
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
|
|
}
|
|
//Enumerate Only given dst SPL_SRVR MMSAs
|
|
else if((Source.AddrType == IP_ADDR_UNIQUE) && (Destination.AddrType != IP_ADDR_UNIQUE) &&
|
|
(Source.uIpAddr == 0xFFFFFFFF ) && (Destination.uIpAddr == 0xFFFFFFFF))
|
|
{
|
|
if(pIPSecMMSA[j].Peer.AddrType == Destination.AddrType)
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
}
|
|
//Enumerate Only given src&dst MMSAs
|
|
else if((Source.uIpAddr != 0xFFFFFFFF) && (Destination.uIpAddr != 0xFFFFFFFF))
|
|
{
|
|
if((pIPSecMMSA[j].Me.uIpAddr == Source.uIpAddr) && (pIPSecMMSA[j].Peer.uIpAddr == Destination.uIpAddr))
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
}
|
|
//Enumerate Only given source MMSAs
|
|
else if((Source.uIpAddr != 0xFFFFFFFF) && (Destination.uIpAddr == 0xFFFFFFFF))
|
|
{
|
|
if(pIPSecMMSA[j].Me.uIpAddr == Source.uIpAddr)
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
}
|
|
//Enumerate Only given dst MMSAs
|
|
else if((Source.uIpAddr == 0xFFFFFFFF) && (Destination.uIpAddr != 0xFFFFFFFF))
|
|
{
|
|
if(pIPSecMMSA[j].Peer.uIpAddr == Destination.uIpAddr)
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
}
|
|
|
|
//Finally print it is found...
|
|
if(bFound)
|
|
{
|
|
if(!bHeader)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_IKE_SA_HEADING,szTime);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMF_UNDERLINE);
|
|
if(bFormat)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_DST_SEC_HEADING);
|
|
//This is place holder for date and time created...
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_UNDERLINE);
|
|
}
|
|
bHeader = TRUE;
|
|
}
|
|
PrintMMSas(pIPSecMMSA[j], bFormat, addressHash, bResolveDNS);
|
|
}
|
|
|
|
}
|
|
|
|
SPDApiBufferFree(pIPSecMMSA);
|
|
pIPSecMMSA=NULL;
|
|
|
|
if(dwReserved == 0) //this is API requirement
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
|
|
error:
|
|
if(pIPSecMMSA)
|
|
{
|
|
SPDApiBufferFree(pIPSecMMSA);
|
|
pIPSecMMSA=NULL;
|
|
}
|
|
if(bHeader == FALSE)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_MMSAS_6);
|
|
}
|
|
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: PrintMMSas
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters:
|
|
//
|
|
// IN IPSEC_MM_SA MMsas,
|
|
// IN BOOL bFormat
|
|
// IN NshHashTable& addressHash
|
|
// IN BOOL bResolveDNS
|
|
//
|
|
//Return: VOID
|
|
//
|
|
//Description: This function prints data for MMsas
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
PrintMMSas(
|
|
IN IPSEC_MM_SA MMsas,
|
|
IN BOOL bFormat,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS
|
|
)
|
|
{
|
|
DWORD i = 0;
|
|
BYTE* pbData = NULL;
|
|
DWORD dwLenth = 0;
|
|
|
|
if(!bFormat)//List
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_COOKIE_PAIR);
|
|
pbData = (BYTE*)&(MMsas.MMSpi.Initiator);
|
|
dwLenth = sizeof(IKE_COOKIE);
|
|
for(i=0; i<dwLenth; i++)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_COOKIE,pbData[i]);
|
|
}
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_COLON);
|
|
|
|
pbData = (BYTE*)&(MMsas.MMSpi.Responder);
|
|
for(i=0; i<dwLenth; i++)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_COOKIE,pbData[i]);
|
|
}
|
|
|
|
//Created time required clarification
|
|
//Security Methods
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SEC_METHOD_HEADING);
|
|
|
|
switch(MMsas.SelectedMMOffer.EncryptionAlgorithm.uAlgoIdentifier)
|
|
{
|
|
case CONF_ALGO_NONE:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_NONE_ALGO);
|
|
break;
|
|
case CONF_ALGO_DES:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_DES_ALGO);
|
|
break;
|
|
case CONF_ALGO_3_DES:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_NO_SA_FOUND_MSGDES_ALGO);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_UNKNOWN_ALGO);
|
|
break;
|
|
}
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SLASH);
|
|
|
|
switch(MMsas.SelectedMMOffer.HashingAlgorithm.uAlgoIdentifier)
|
|
{
|
|
case AUTH_ALGO_NONE:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_NONE_ALGO);
|
|
break;
|
|
case AUTH_ALGO_MD5:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_MD5_ALGO);
|
|
break;
|
|
case AUTH_ALGO_SHA1:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SHA1_ALGO);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_UNKNOWN_ALGO);
|
|
break;
|
|
}
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_DH_LIFETIME,MMsas.SelectedMMOffer.dwDHGroup, MMsas.SelectedMMOffer.Lifetime.uKeyExpirationTime);
|
|
|
|
//Authentication Mode
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_AUTH_MODE_HEADING);
|
|
switch(MMsas.MMAuthEnum)
|
|
{
|
|
case IKE_PRESHARED_KEY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_PRE_KEY);
|
|
break;
|
|
case IKE_DSS_SIGNATURE:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_DSS_SIGN);
|
|
break;
|
|
case IKE_RSA_SIGNATURE:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_RSA_SIGN);
|
|
break;
|
|
case IKE_RSA_ENCRYPTION:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_RSA_ENCRYPT);
|
|
break;
|
|
case IKE_SSPI:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_KERBEROS);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_UNKNOWN_ALGO);
|
|
break;
|
|
}
|
|
|
|
//Source address:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SRC_HEADING);
|
|
PrintAddr(MMsas.Me, addressHash, false);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_PORT,MMsas.UdpEncapContext.wSrcEncapPort);
|
|
if(bResolveDNS)
|
|
{
|
|
PrintAddrStr(&(MMsas.Me), addressHash);
|
|
}
|
|
switch(MMsas.MMAuthEnum)
|
|
{
|
|
case IKE_PRESHARED_KEY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_ID_HEADING);
|
|
PrintAddr(MMsas.Me, addressHash, bResolveDNS);
|
|
break;
|
|
case IKE_DSS_SIGNATURE:
|
|
case IKE_RSA_SIGNATURE:
|
|
case IKE_RSA_ENCRYPTION:
|
|
if(MMsas.MyCertificateChain.pBlob) {
|
|
PrintSACertInfo(MMsas);
|
|
}
|
|
else if(MMsas.MyId.pBlob){
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_ID_VALUE,(LPTSTR)(MMsas.MyId.pBlob));
|
|
}
|
|
break;
|
|
case IKE_SSPI:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_ID_VALUE,(LPTSTR)(MMsas.MyId.pBlob));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
//Destination address:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_DST_HEADING);
|
|
PrintAddr(MMsas.Peer, addressHash, false);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_PORT,MMsas.UdpEncapContext.wDesEncapPort);
|
|
if(bResolveDNS)
|
|
{
|
|
PrintAddrStr(&(MMsas.Peer), addressHash);
|
|
}
|
|
switch(MMsas.MMAuthEnum)
|
|
{
|
|
case IKE_PRESHARED_KEY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_ID_HEADING);
|
|
PrintAddr(MMsas.Peer, addressHash, bResolveDNS);
|
|
break;
|
|
case IKE_DSS_SIGNATURE:
|
|
case IKE_RSA_SIGNATURE:
|
|
case IKE_RSA_ENCRYPTION:
|
|
if(MMsas.PeerCertificateChain.pBlob) {
|
|
PrintSACertInfo(MMsas);
|
|
}
|
|
else if(MMsas.PeerId.pBlob){
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_ID_VALUE,(LPTSTR)(MMsas.PeerId.pBlob));
|
|
}
|
|
break;
|
|
case IKE_SSPI:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_ID_VALUE,(LPTSTR)(MMsas.PeerId.pBlob));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
}
|
|
else // Table output
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
|
|
PrintAddr(MMsas.Me, addressHash, bResolveDNS);
|
|
switch(MMsas.MMAuthEnum)
|
|
{
|
|
case IKE_PRESHARED_KEY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SPACE_ADJ);
|
|
break;
|
|
case IKE_DSS_SIGNATURE:
|
|
case IKE_RSA_SIGNATURE:
|
|
case IKE_RSA_ENCRYPTION:
|
|
//This is a place holder for id
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SPACE_ADJ);
|
|
break;
|
|
case IKE_SSPI:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_KERB_ID, (LPTSTR)(MMsas.MyId.pBlob));
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SPACE_ADJ);
|
|
break;
|
|
}
|
|
|
|
//Security Methods
|
|
switch(MMsas.SelectedMMOffer.EncryptionAlgorithm.uAlgoIdentifier)
|
|
{
|
|
case CONF_ALGO_NONE:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_NONE_ALGO);
|
|
break;
|
|
case CONF_ALGO_DES:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_DES_ALGO);
|
|
break;
|
|
case CONF_ALGO_3_DES:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_NO_SA_FOUND_MSGDES_ALGO);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_UNKNOWN_ALGO);
|
|
break;
|
|
}
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SLASH);
|
|
|
|
switch(MMsas.SelectedMMOffer.HashingAlgorithm.uAlgoIdentifier)
|
|
{
|
|
case AUTH_ALGO_NONE:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_NONE_ALGO);
|
|
break;
|
|
case AUTH_ALGO_MD5:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_MD5_ALGO);
|
|
break;
|
|
case AUTH_ALGO_SHA1:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SHA1_ALGO);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_UNKNOWN_ALGO);
|
|
break;
|
|
}
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_DH_LIFETIME,MMsas.SelectedMMOffer.dwDHGroup, MMsas.SelectedMMOffer.Lifetime.uKeyExpirationTime);
|
|
|
|
if(bResolveDNS)
|
|
{
|
|
PrintAddrStr(&(MMsas.Me), addressHash, DYNAMIC_SHOW_MMSAS_DNS);
|
|
}
|
|
|
|
|
|
//One set over next set starts
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
|
|
PrintAddr(MMsas.Peer, addressHash, bResolveDNS);
|
|
switch(MMsas.MMAuthEnum)
|
|
{
|
|
case IKE_PRESHARED_KEY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SPACE_ADJ);
|
|
//" "
|
|
break;
|
|
case IKE_DSS_SIGNATURE:
|
|
case IKE_RSA_SIGNATURE:
|
|
case IKE_RSA_ENCRYPTION:
|
|
//This is a place holder for id
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SPACE_ADJ);
|
|
break;
|
|
case IKE_SSPI:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_KERB_PEER_ID, (LPTSTR)(MMsas.PeerId.pBlob));
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SPACE_ADJ);
|
|
break;
|
|
}
|
|
|
|
//Sec Methods
|
|
switch(MMsas.SelectedMMOffer.EncryptionAlgorithm.uAlgoIdentifier)
|
|
{
|
|
case CONF_ALGO_NONE:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_NONE_ALGO);
|
|
break;
|
|
case CONF_ALGO_DES:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_DES_ALGO);
|
|
break;
|
|
case CONF_ALGO_3_DES:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_NO_SA_FOUND_MSGDES_ALGO);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_UNKNOWN_ALGO);
|
|
break;
|
|
}
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SLASH);
|
|
|
|
switch(MMsas.SelectedMMOffer.HashingAlgorithm.uAlgoIdentifier)
|
|
{
|
|
case AUTH_ALGO_NONE:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_NONE_ALGO);
|
|
break;
|
|
case AUTH_ALGO_MD5:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_MD5_ALGO);
|
|
break;
|
|
case AUTH_ALGO_SHA1:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SHA1_ALGO);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_UNKNOWN_ALGO);
|
|
break;
|
|
}
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_DH_LIFETIME,MMsas.SelectedMMOffer.dwDHGroup, MMsas.SelectedMMOffer.Lifetime.uKeyExpirationTime);
|
|
|
|
if(bResolveDNS)
|
|
{
|
|
PrintAddrStr(&(MMsas.Peer), addressHash, DYNAMIC_SHOW_MMSAS_DNS);
|
|
}
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: PrintSACertInfo
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: IN IPSEC_MM_SA& MMsas
|
|
//
|
|
//Return: VOID
|
|
//
|
|
//Description:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
VOID
|
|
PrintSACertInfo(
|
|
IN IPSEC_MM_SA& MMsas
|
|
)
|
|
{
|
|
CRYPT_DATA_BLOB pkcsMsg;
|
|
HANDLE hCertStore = NULL;
|
|
PCCERT_CONTEXT pPrevCertContext = NULL;
|
|
PCCERT_CONTEXT pCertContext = NULL;
|
|
_TCHAR pszSubjectName[MAX_STR_LEN] = {0};
|
|
char szThumbPrint[MAX_STR_LEN] = {0};
|
|
BOOL bPrintID = FALSE;
|
|
BOOL bLastCert = FALSE;
|
|
BOOL pCertPrinted = TRUE;
|
|
|
|
|
|
pkcsMsg.pbData=MMsas.MyCertificateChain.pBlob;
|
|
pkcsMsg.cbData=MMsas.MyCertificateChain.dwSize;
|
|
|
|
hCertStore = CertOpenStore( CERT_STORE_PROV_PKCS7,
|
|
MY_ENCODING_TYPE | PKCS_7_ASN_ENCODING,
|
|
NULL,
|
|
CERT_STORE_READONLY_FLAG,
|
|
&pkcsMsg);
|
|
|
|
if ( NULL == hCertStore )
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
while(TRUE)
|
|
{
|
|
|
|
pCertContext = CertEnumCertificatesInStore( hCertStore,
|
|
pPrevCertContext);
|
|
if ( NULL == pCertContext )
|
|
{
|
|
bLastCert = TRUE;
|
|
}
|
|
|
|
if ( !pCertPrinted )
|
|
{
|
|
//print the certificate
|
|
if ( !bPrintID )
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_ID_VALUE,(LPTSTR)(pszSubjectName));
|
|
bPrintID = TRUE;
|
|
}
|
|
|
|
if ( !bLastCert )
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_ISSUE_CA, (LPTSTR) pszSubjectName );
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_ROOTCA , (LPTSTR) pszSubjectName );
|
|
}
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_THUMB_PRINT);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_THUMBPRINT , szThumbPrint);
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_HASH_OPEN_BRACKET );
|
|
switch(MMsas.SelectedMMOffer.HashingAlgorithm.uAlgoIdentifier)
|
|
{
|
|
case AUTH_ALGO_NONE:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_NONE_ALGO);
|
|
break;
|
|
case AUTH_ALGO_MD5:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_MD5_ALGO);
|
|
break;
|
|
case AUTH_ALGO_SHA1:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_SHA1_ALGO);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_UNKNOWN_ALGO);
|
|
break;
|
|
}
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_MMSAS_HASH_CLOSE_BRACKET);
|
|
|
|
pCertPrinted = TRUE;
|
|
}
|
|
|
|
if ( bLastCert )
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
GetSubjectAndThumbprint(pCertContext, pszSubjectName, szThumbPrint);
|
|
pPrevCertContext = pCertContext;
|
|
pCertPrinted = FALSE;
|
|
|
|
}
|
|
|
|
error:
|
|
if ( hCertStore )
|
|
{
|
|
CertCloseStore(hCertStore, 0 );
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: GetNameAudit
|
|
//
|
|
//Date of Creation: 1-3-2002
|
|
//
|
|
//Parameters:
|
|
//
|
|
// IN CRYPT_DATA_BLOB *NameBlob,
|
|
// IN OUT LPTSTR Name,
|
|
// IN DWORD NameBufferSize
|
|
//
|
|
//Return: VOID
|
|
//
|
|
//Description: Translates encoded Name into Unicode string.
|
|
// Buffer already allocated.
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
GetNameAudit(
|
|
IN CRYPT_DATA_BLOB *NameBlob,
|
|
IN OUT LPTSTR Name,
|
|
IN DWORD NameBufferSize
|
|
)
|
|
{
|
|
DWORD dwCount=0;
|
|
DWORD dwSize = 0;
|
|
|
|
dwSize = CertNameToStr(
|
|
MY_ENCODING_TYPE, // Encoding type
|
|
NameBlob, // CRYPT_DATA_BLOB
|
|
CERT_X500_NAME_STR, // Type
|
|
Name, // Place to return string
|
|
NameBufferSize); // Size of string (chars)
|
|
if(dwSize <= 1)
|
|
{
|
|
dwCount = _tcslen(_TEXT(""))+1;
|
|
_tcsncpy(Name, _TEXT(""), dwCount);
|
|
}
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : CertGetSHAHash
|
|
//
|
|
// Date of Creation: 1-3-2002
|
|
//
|
|
// Parameters :
|
|
//
|
|
// IN PCCERT_CONTEXT pCertContext,
|
|
// IN OUT BYTE* OutHash
|
|
//
|
|
// Return : DWORD
|
|
//
|
|
// Description : Gets certificate context property
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
CertGetSHAHash(
|
|
IN PCCERT_CONTEXT pCertContext,
|
|
IN OUT BYTE* OutHash
|
|
)
|
|
{
|
|
DWORD HashSize = SHA_LENGTH - 1;//one less for null termination
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
|
|
if (!CertGetCertificateContextProperty(pCertContext,
|
|
CERT_SHA1_HASH_PROP_ID,
|
|
(VOID*)OutHash,
|
|
&HashSize))
|
|
{
|
|
dwReturn = GetLastError();
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : print_vpi
|
|
//
|
|
// Date of Creation: 1-3-2002
|
|
//
|
|
// Parameters :
|
|
// IN unsigned char *vpi,
|
|
// IN int vpi_len,
|
|
// IN OUT char *msg
|
|
//
|
|
// Return : VOID
|
|
//
|
|
// Description : Prepare string for Cookie
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
VOID
|
|
print_vpi(
|
|
IN unsigned char *vpi,
|
|
IN int vpi_len,
|
|
IN OUT char *msg
|
|
)
|
|
{
|
|
int i;
|
|
char *p = msg;
|
|
|
|
if ((vpi != NULL) && (p != NULL))
|
|
{
|
|
for (i=0; i<vpi_len; i++)
|
|
{
|
|
p += _snprintf(p,1,"%x",vpi[i]);
|
|
}
|
|
|
|
*p = 0;
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : GetSubjectAndThumbprint
|
|
//
|
|
// Date of Creation: 1-3-2002
|
|
//
|
|
// Parameters :
|
|
// IN PCCERT_CONTEXT pCertContext,
|
|
// IN LPTSTR pszSubjectName,
|
|
// IN LPSTR pszThumbPrint
|
|
//
|
|
// Return : VOID
|
|
//
|
|
// Description : Drills CA and prints thumbprint and Issuing CAs.
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
GetSubjectAndThumbprint(
|
|
IN PCCERT_CONTEXT pCertContext,
|
|
IN LPTSTR pszSubjectName,
|
|
IN LPSTR pszThumbPrint
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
CRYPT_DATA_BLOB NameBlob;
|
|
BYTE CertHash[SHA_LENGTH] = {0};
|
|
|
|
NameBlob = pCertContext->pCertInfo->Subject;
|
|
|
|
dwReturn = GetNameAudit(&NameBlob,pszSubjectName,MAX_STR_LEN);
|
|
|
|
if(dwReturn == ERROR_SUCCESS)
|
|
{
|
|
dwReturn = CertGetSHAHash(pCertContext,CertHash);
|
|
}
|
|
|
|
if(dwReturn == ERROR_SUCCESS)
|
|
{
|
|
print_vpi(CertHash, SHA_LENGTH, pszThumbPrint);
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : ShowQMSas
|
|
//
|
|
// Date of Creation: 9-3-2001
|
|
//
|
|
// Parameters : IN IPAddr source,
|
|
// IN IPAddr destination,
|
|
// IN DWORD dwProtocol
|
|
// IN NshHashTable& addressHash
|
|
// IN BOOL bResolveDNS
|
|
//
|
|
// Return : DWORD
|
|
//
|
|
// Description : This function prepares data for QMsas
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
ShowQMSas(
|
|
IN ADDR Source,
|
|
IN ADDR Destination,
|
|
IN DWORD dwProtocol,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS; // success by default
|
|
DWORD i=0, j=0;
|
|
DWORD dwResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwCount =2; // counting objects here min 2 required
|
|
PIPSEC_QM_SA pIPSecQMSA = NULL; // for QM SA calls
|
|
DWORD dwReserved =0; // reserved container
|
|
DWORD dwVersion = 0;
|
|
BOOL bFound = FALSE;
|
|
BOOL bHeader = FALSE;
|
|
BOOL bContinue = TRUE;
|
|
|
|
// make the call(s)
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
dwReturn = EnumQMSAs(g_szDynamicMachine, dwVersion , NULL, 0, 0, &pIPSecQMSA, &dwCount, &dwReserved, &dwResumeHandle, NULL);
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
if (i == 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_QMSAS_3);
|
|
bHeader = TRUE; //To Block other error message
|
|
}
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
bFound = FALSE;
|
|
bContinue = TRUE;
|
|
//Source is a SPL_SERVER
|
|
if((Source.AddrType != IP_ADDR_UNIQUE) && bContinue)
|
|
{
|
|
if(pIPSecQMSA[j].IpsecQMFilter.SrcAddr.AddrType == Source.AddrType)
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFound = FALSE;
|
|
bContinue= FALSE;
|
|
}
|
|
}
|
|
//Destination is a SPL_SERVER
|
|
if((Destination.AddrType != IP_ADDR_UNIQUE)&& bContinue)
|
|
{
|
|
if(pIPSecQMSA[j].IpsecQMFilter.DesAddr.AddrType == Destination.AddrType)
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFound = FALSE;
|
|
bContinue= FALSE;
|
|
}
|
|
}
|
|
//Source Addr specie
|
|
if((Source.uIpAddr != 0xFFFFFFFF)&& bContinue)
|
|
{
|
|
if(pIPSecQMSA[j].IpsecQMFilter.SrcAddr.uIpAddr == Source.uIpAddr)
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFound = FALSE;
|
|
bContinue= FALSE;
|
|
}
|
|
}
|
|
// Check for me/any
|
|
// 0x55555555 is an invalid mask. In parent function mask is initialized with this value.
|
|
// If user gives the input then this will be overwritten.
|
|
if((Source.uSubNetMask != 0x55555555)&& bContinue)
|
|
{
|
|
if(pIPSecQMSA[j].IpsecQMFilter.SrcAddr.uSubNetMask == Source.uSubNetMask)
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFound = FALSE;
|
|
bContinue= FALSE;
|
|
}
|
|
}
|
|
//Dst Addr
|
|
if((Destination.uIpAddr != 0xFFFFFFFF)&& bContinue)
|
|
{
|
|
if(pIPSecQMSA[j].IpsecQMFilter.DesAddr.uIpAddr == Destination.uIpAddr)
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFound = FALSE;
|
|
bContinue= FALSE;
|
|
}
|
|
}
|
|
//
|
|
// Check for me/any
|
|
// 0x55555555 is an invalid mask. In parent function mask is initialized with this value.
|
|
// If user gives the input then this will be overwritten.
|
|
//
|
|
if((Destination.uSubNetMask != 0x55555555)&& bContinue)
|
|
{
|
|
if(pIPSecQMSA[j].IpsecQMFilter.DesAddr.uSubNetMask == Destination.uSubNetMask)
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFound = FALSE;
|
|
bContinue= FALSE;
|
|
}
|
|
}
|
|
//Protocol specified
|
|
if((dwProtocol != 0xFFFFFFFF)&& bContinue)
|
|
{
|
|
if(pIPSecQMSA[j].IpsecQMFilter.Protocol.dwProtocol == dwProtocol)
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFound = FALSE;
|
|
bContinue= FALSE;
|
|
}
|
|
}
|
|
//
|
|
// AllQmsas
|
|
//
|
|
if((Source.uIpAddr == 0xFFFFFFFF ) && (Destination.uIpAddr == 0xFFFFFFFF) &&
|
|
(Source.AddrType == IP_ADDR_UNIQUE) && (Destination.AddrType == IP_ADDR_UNIQUE) &&
|
|
(dwProtocol == 0xFFFFFFFF))
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
|
|
if(bFound)
|
|
{
|
|
if(!bHeader)
|
|
{
|
|
//
|
|
// Display main mode SAs
|
|
//
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_UNDERLINE);
|
|
bHeader = TRUE;
|
|
}
|
|
PrintQMSAFilter(pIPSecQMSA[j], addressHash, bResolveDNS);
|
|
}
|
|
}
|
|
|
|
if(dwReserved == 0)
|
|
{
|
|
//
|
|
// This API requirement
|
|
//
|
|
BAIL_OUT;
|
|
}
|
|
|
|
SPDApiBufferFree(pIPSecQMSA);
|
|
pIPSecQMSA=NULL;
|
|
}
|
|
|
|
error:
|
|
//error path clean up
|
|
if(pIPSecQMSA)
|
|
{
|
|
SPDApiBufferFree(pIPSecQMSA);
|
|
}
|
|
if(bHeader == FALSE)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHOW_QMSAS_4);
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : PrintQMSas
|
|
//
|
|
// Date of Creation: 9-3-2001
|
|
//
|
|
// Parameters : IN IPSEC_MM_SA QMOffer
|
|
//
|
|
// Return : VOID
|
|
//
|
|
// Description : This function displays quickmode offer details for security associations.
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
PrintQMSas(
|
|
IN IPSEC_QM_OFFER QMOffer
|
|
)
|
|
{
|
|
DWORD i = 0;
|
|
|
|
if(QMOffer.dwNumAlgos >0)
|
|
{
|
|
for (i = 0; i < QMOffer.dwNumAlgos; i++)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
|
|
//print Authentication algorithms
|
|
if(QMOffer.Algos[i].Operation == AUTHENTICATION)
|
|
{
|
|
switch(QMOffer.Algos[i].uAlgoIdentifier)
|
|
{
|
|
case 1:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SAS_MD5_NONE_NONE_ALGO, QMOffer.Algos[i].uAlgoKeyLen, QMOffer.Algos[i].uAlgoRounds);
|
|
break;
|
|
case 2:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SAS_SHA1_NONE_NONE_ALGO, QMOffer.Algos[i].uAlgoKeyLen, QMOffer.Algos[i].uAlgoRounds);
|
|
break;
|
|
case 0:
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SAS_NONE_NONE_NONE_ALGO);
|
|
break;
|
|
}
|
|
}
|
|
else if(QMOffer.Algos[i].Operation == ENCRYPTION)
|
|
{
|
|
//print Hash algorithms
|
|
switch(QMOffer.Algos[i].uAlgoIdentifier)
|
|
{
|
|
case 1:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SAS_NONE_DES_ALGO, QMOffer.Algos[i].uAlgoKeyLen, QMOffer.Algos[i].uAlgoRounds);
|
|
break;
|
|
case 2:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SAS_NONE_UNKNOWN_ALGO);
|
|
break;
|
|
case 3:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SAS_NONE_3DES_ALGO, QMOffer.Algos[i].uAlgoKeyLen, QMOffer.Algos[i].uAlgoRounds);
|
|
break;
|
|
case 0:
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SAS_NONE_NONE_ALGO);
|
|
break;
|
|
}
|
|
|
|
if (QMOffer.Algos[i].uSecAlgoIdentifier != HMAC_AUTH_ALGO_NONE)
|
|
switch(QMOffer.Algos[i].uSecAlgoIdentifier)
|
|
{
|
|
case 1:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SAS_MD5_ALGO);
|
|
break;
|
|
case 2:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SAS_SHA1_ALGO);
|
|
break;
|
|
case 0:
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SAS_NONE_ALGO);
|
|
break;
|
|
}
|
|
else
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SAS_NONE_SPACE_ALGO);
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMP_SAS_NONE_NONE_NONE_ALGO);
|
|
}
|
|
|
|
PrintMessageFromModule(g_hModule, QMPFSDHGroup(QMOffer.dwPFSGroup));
|
|
}
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : PrintQMSAFilter
|
|
//
|
|
// Date of Creation: 9-3-2001
|
|
//
|
|
// Parameters : IN IPSEC_QM_SA QMsa
|
|
// IN NshHashTable& addressHash
|
|
// IN BOOL bResolveDNS
|
|
//
|
|
// Return : DWORD
|
|
//
|
|
// Description : This function displays quickmode filter details for Security associations.
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
PrintQMSAFilter(
|
|
IN IPSEC_QM_SA QMsa,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS
|
|
)
|
|
{
|
|
DWORD dwReturn = 0;
|
|
DWORD dwVersion = 0;
|
|
PIPSEC_QM_POLICY pIPSecQMP = NULL;
|
|
|
|
//Print Tunnel or Transport type
|
|
switch(QMsa.IpsecQMFilter.QMFilterType)
|
|
{
|
|
case QM_TRANSPORT_FILTER:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TRANSPORT_FILTER_HEADING);
|
|
break;
|
|
case QM_TUNNEL_FILTER:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TUNNEL_FILTER_HEADING);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_UNKNOWN);
|
|
break;
|
|
}
|
|
|
|
//print qmpolicy name
|
|
dwReturn = GetQMPolicyByID(g_szDynamicMachine, dwVersion, QMsa.gQMPolicyID, 0, &pIPSecQMP, NULL);
|
|
if(dwReturn == ERROR_SUCCESS)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_POL_NAME_HEADING, pIPSecQMP[0].pszPolicyName);
|
|
}
|
|
|
|
//Print source and destination point.
|
|
if (QMsa.IpsecQMFilter.QMFilterType == QM_TUNNEL_FILTER)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TUNNEL_SRC);
|
|
PrintAddr(QMsa.IpsecQMFilter.MyTunnelEndpt, addressHash, bResolveDNS);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_TUNNEL_DST);
|
|
PrintAddr(QMsa.IpsecQMFilter.PeerTunnelEndpt, addressHash, bResolveDNS);
|
|
}
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_SRC_ADDR_HEADING);
|
|
PrintAddr(QMsa.IpsecQMFilter.SrcAddr, addressHash, bResolveDNS);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DST_ADDR_HEADING);
|
|
PrintAddr(QMsa.IpsecQMFilter.DesAddr, addressHash, bResolveDNS);
|
|
|
|
//Print protocol
|
|
switch(QMsa.IpsecQMFilter.Protocol.dwProtocol)
|
|
{
|
|
case PROT_ID_ICMP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PROTO_ICMP);
|
|
break;
|
|
case PROT_ID_TCP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PROTO_TCP);
|
|
break;
|
|
case PROT_ID_UDP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PROTO_UDP);
|
|
break;
|
|
case PROT_ID_RAW:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PROTO_RAW);
|
|
break;
|
|
case PROT_ID_ANY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PROTO_ANY);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PROTO_HEADING, QMsa.IpsecQMFilter.Protocol.dwProtocol);
|
|
break;
|
|
}
|
|
|
|
//print source and destination port
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_SRC_PORT, QMsa.IpsecQMFilter.SrcPort.wPort);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DST_PORT, QMsa.IpsecQMFilter.DesPort.wPort);
|
|
|
|
//print Inbound and outbound filteractions
|
|
switch(QMsa.IpsecQMFilter.dwFlags)
|
|
{
|
|
case FILTER_DIRECTION_INBOUND:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DIRECTION_INBOUND);
|
|
break;
|
|
case FILTER_DIRECTION_OUTBOUND:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DIRECTION_OUTBOUND);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DIRECTION_ERR);
|
|
break;
|
|
}
|
|
|
|
//print encapsulation details
|
|
if (QMsa.EncapInfo.SAEncapType != SA_UDP_ENCAP_TYPE_NONE)
|
|
{
|
|
if(QMsa.EncapInfo.SAEncapType == SA_UDP_ENCAP_TYPE_IKE)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_ENCAP_IKE);
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_ENCAP_OTHER);
|
|
}
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_SRC_UDP_PORT, QMsa.EncapInfo.UdpEncapContext.wSrcEncapPort);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_DST_UDP_PORT, QMsa.EncapInfo.UdpEncapContext.wDesEncapPort);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_PEER_ADDR);
|
|
PrintAddr(QMsa.EncapInfo.PeerPrivateAddr, addressHash, bResolveDNS);
|
|
}
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_OFFER);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_COLUMN_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_QMSAS_COLUMN_UNDERLINE);
|
|
PrintQMSas(QMsa.SelectedQMOffer);
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : ShowRegKeys
|
|
//
|
|
// Date of Creation: 9-3-2001
|
|
//
|
|
// Parameters : VOID
|
|
//
|
|
// Return : DWORD
|
|
//
|
|
// Description : This function displays ipsec configuration keys.
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
ShowRegKeys(
|
|
VOID
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwKeyDataSize = sizeof(DWORD);
|
|
DWORD dwKeyDataType = REG_DWORD;
|
|
DWORD dwKeyData = 0;
|
|
IKE_CONFIG IKEConfig;
|
|
HKEY hRegistryKey = NULL;
|
|
LPTSTR lpBootMode;
|
|
PIPSEC_EXEMPT_ENTRY pAllEntries = NULL;
|
|
|
|
ZeroMemory( &IKEConfig, sizeof(IKE_CONFIG) );
|
|
|
|
dwReturn = RegOpenKeyEx(g_hGlobalRegistryKey, REGKEY_GLOBAL, 0, KEY_QUERY_VALUE, &hRegistryKey);
|
|
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturn = GetConfigurationVariables(g_szDynamicMachine, &IKEConfig);
|
|
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
//Print default values
|
|
IKEConfig.dwEnableLogging = IKE_LOG_DEFAULT;
|
|
IKEConfig.dwStrongCRLCheck = STRONG_CRL_DEFAULT;
|
|
dwReturn = ERROR_SUCCESS;
|
|
|
|
}
|
|
//print registry key headings
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_HEADING);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_HEADING_UNDERLINE);
|
|
|
|
dwKeyData = IPSEC_DIAG_DEFAULT;
|
|
dwReturn = RegQueryValueEx(hRegistryKey, ENABLE_DIAG, 0, &dwKeyDataType, (BYTE*)&dwKeyData, &dwKeyDataSize);
|
|
if ((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_FILE_NOT_FOUND))
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_IPSEC_DIAG, dwKeyData);
|
|
|
|
//Print GetConfig values
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_IKE_LOG, IKEConfig.dwEnableLogging);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_STRONG_CRL, IKEConfig.dwStrongCRLCheck);
|
|
|
|
dwKeyData = 0;
|
|
dwKeyData = ENABLE_LOGINT_DEFAULT;
|
|
dwReturn = RegQueryValueEx(hRegistryKey, ENABLE_LOGINT, 0, &dwKeyDataType, (BYTE*)&dwKeyData, &dwKeyDataSize);
|
|
if ((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_FILE_NOT_FOUND))
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_IPSEC_LOG, dwKeyData);
|
|
|
|
dwKeyData = 0;
|
|
dwKeyData = ENABLE_EXEMPT_DEFAULT;
|
|
dwReturn = RegQueryValueEx(hRegistryKey, ENABLE_EXEMPT, 0, &dwKeyDataType, (BYTE*)&dwKeyData, &dwKeyDataSize);
|
|
if ((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_FILE_NOT_FOUND))
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_IPSEC_EXEMPT, dwKeyData);
|
|
|
|
dwKeyData = BOOTMODE_DEFAULT;
|
|
dwReturn = RegQueryValueEx(hRegistryKey, BOOTMODEKEY, 0, &dwKeyDataType, (BYTE*)&dwKeyData, &dwKeyDataSize);
|
|
if ((dwReturn != ERROR_SUCCESS) && (dwReturn != ERROR_FILE_NOT_FOUND))
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_IPSEC_BOOTMODE);
|
|
switch (dwKeyData)
|
|
{
|
|
case VALUE_STATEFUL:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_IPSEC_BOOTMODE_STATEFUL);
|
|
break;
|
|
case VALUE_BLOCK:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_IPSEC_BOOTMODE_BLOCK);
|
|
break;
|
|
case VALUE_PERMIT:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_IPSEC_BOOTMODE_PERMIT);
|
|
break;
|
|
default:
|
|
dwReturn = ERROR_INVALID_DATA;
|
|
break;
|
|
}
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_BOOTMODE_EXEMPTIONS_HEADER_1);
|
|
|
|
dwKeyDataSize = 0;
|
|
dwReturn = RegQueryValueEx(hRegistryKey, BOOTEXEMPTKEY, 0, 0, NULL, &dwKeyDataSize);
|
|
if (dwReturn == ERROR_FILE_NOT_FOUND)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
else if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if (dwKeyDataSize == 0)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_BOOTMODE_EXEMPTIONS_NO_EXEMPTIONS);
|
|
}
|
|
else if ((dwKeyDataSize % sizeof(IPSEC_EXEMPT_ENTRY)) != 0)
|
|
{
|
|
dwReturn = ERROR_INVALID_DATA;
|
|
BAIL_OUT;
|
|
}
|
|
else
|
|
{
|
|
size_t uiNumEntries = dwKeyDataSize / sizeof(IPSEC_EXEMPT_ENTRY);
|
|
pAllEntries = new IPSEC_EXEMPT_ENTRY[uiNumEntries];
|
|
if (pAllEntries == NULL)
|
|
{
|
|
dwReturn = ERROR_NOT_ENOUGH_MEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturn = RegQueryValueEx(hRegistryKey, BOOTEXEMPTKEY, 0, 0, (BYTE*)pAllEntries, &dwKeyDataSize);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_BOOTMODE_EXEMPTIONS_HEADER_2);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_BOOTMODE_EXEMPTIONS_HEADER_3);
|
|
|
|
for (size_t i = 0; i < uiNumEntries; ++i)
|
|
{
|
|
PIPSEC_EXEMPT_ENTRY pEntry = pAllEntries + i;
|
|
|
|
switch (pEntry->Protocol)
|
|
{
|
|
case PROT_ID_TCP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_IPSEC_BOOTMODE_TCP);
|
|
break;
|
|
case PROT_ID_UDP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_IPSEC_BOOTMODE_UDP);
|
|
break;
|
|
case PROT_ID_ICMP:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_IPSEC_BOOTMODE_ICMP);
|
|
break;
|
|
case PROT_ID_RAW:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_IPSEC_BOOTMODE_RAW);
|
|
break;
|
|
case PROT_ID_ANY:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_REG_IPSEC_BOOTMODE_ANY);
|
|
break;
|
|
default:
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_BOOTMODE_EXEMPT_INTEGER, (int)pEntry->Protocol);
|
|
break;
|
|
}
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_BOOTMODE_EXEMPT_PORT, (int)pEntry->SrcPort);
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_BOOTMODE_EXEMPT_PORT, (int)pEntry->DestPort);
|
|
|
|
switch (pEntry->Direction)
|
|
{
|
|
case (EXEMPT_DIRECTION_INBOUND):
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_BOOTMODE_EXEMPT_DIRECTION_IN);
|
|
break;
|
|
case (EXEMPT_DIRECTION_OUTBOUND):
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_BOOTMODE_EXEMPT_DIRECTION_OUT);
|
|
break;
|
|
default:
|
|
dwReturn = ERROR_INVALID_DATA;
|
|
BAIL_OUT;
|
|
}
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
|
|
}
|
|
}
|
|
|
|
error:
|
|
if (pAllEntries)
|
|
{
|
|
delete [] pAllEntries;
|
|
}
|
|
if (hRegistryKey)
|
|
{
|
|
RegCloseKey(hRegistryKey);
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : PrintAddr
|
|
//
|
|
// Date of Creation: 9-3-2001
|
|
//
|
|
// Parameters : IN ADDR addr
|
|
// IN NshHashTable& addressHash
|
|
// IN BOOL bResolveDNS
|
|
//
|
|
// Return : VOID
|
|
//
|
|
// Description : This function displays ip address in xxx.xxx.xxx.xxx format.
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
PrintAddr(
|
|
IN ADDR addr,
|
|
IN NshHashTable& addressHash,
|
|
IN BOOL bResolveDNS
|
|
)
|
|
{
|
|
struct in_addr inAddr;
|
|
|
|
LPSTR pszAddr = NULL;
|
|
LPTSTR pszWPAddr = NULL;
|
|
|
|
pszWPAddr = new _TCHAR[STR_ADDRLEN];
|
|
|
|
if(pszWPAddr == NULL)
|
|
{
|
|
PrintErrorMessage(WIN32_ERR, ERROR_OUTOFMEMORY, NULL);
|
|
BAIL_OUT;
|
|
}
|
|
|
|
ZeroMemory(pszWPAddr, STR_ADDRLEN * sizeof(_TCHAR));
|
|
|
|
if(addr.AddrType == IP_ADDR_WINS_SERVER)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_WINS);
|
|
}
|
|
else if(addr.AddrType == IP_ADDR_DHCP_SERVER)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DHCP);
|
|
}
|
|
else if(addr.AddrType == IP_ADDR_DNS_SERVER)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_DNS);
|
|
}
|
|
else if(addr.AddrType == IP_ADDR_DEFAULT_GATEWAY)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_GATEWAY);
|
|
}
|
|
else if (addr.AddrType == IP_ADDR_UNIQUE && addr.uIpAddr == IP_ADDRESS_ME && addr.uSubNetMask == IP_ADDRESS_MASK_NONE)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PMYADD);
|
|
}
|
|
else if (addr.AddrType == IP_ADDR_SUBNET && addr.uIpAddr == SUBNET_ADDRESS_ANY && addr.uSubNetMask == SUBNET_MASK_ANY)
|
|
{
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PANYADD);
|
|
}
|
|
else
|
|
{
|
|
inAddr.s_addr = addr.uIpAddr;
|
|
pszAddr = inet_ntoa(inAddr);
|
|
if(pszAddr == NULL)
|
|
{
|
|
_tcsncpy(pszWPAddr, _TEXT(" "), _tcslen(_TEXT(" "))+1);//if inet_ntoa fails 16 spaces
|
|
}
|
|
else
|
|
{
|
|
_sntprintf(pszWPAddr, STR_ADDRLEN-1, _TEXT("%-16S"), pszAddr);
|
|
}
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PADD, pszWPAddr);
|
|
}
|
|
|
|
if (bResolveDNS)
|
|
{
|
|
PrintAddrStr(&addr, addressHash);
|
|
}
|
|
|
|
if (pszWPAddr)
|
|
{
|
|
delete [] pszWPAddr;
|
|
}
|
|
error:
|
|
return;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function : PrintMask
|
|
//
|
|
//Date of Creation : 9-3-2001
|
|
//
|
|
//Parameters : IN ADDR addr
|
|
//
|
|
//Return : VOID
|
|
//
|
|
//Description : This function displays ip address in xxx.xxx.xxx.xxx format.
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
PrintMask(
|
|
IN ADDR addr
|
|
)
|
|
{
|
|
struct in_addr inAddr;
|
|
LPSTR pszAddr = NULL;
|
|
LPTSTR pszWPAddr = NULL;
|
|
|
|
pszWPAddr = new _TCHAR[STR_ADDRLEN];
|
|
|
|
if(pszWPAddr == NULL)
|
|
{
|
|
PrintErrorMessage(WIN32_ERR, ERROR_OUTOFMEMORY, NULL);
|
|
BAIL_OUT;
|
|
}
|
|
|
|
ZeroMemory(pszWPAddr, STR_ADDRLEN * sizeof(_TCHAR));
|
|
|
|
inAddr.s_addr = addr.uSubNetMask;
|
|
pszAddr = inet_ntoa(inAddr);
|
|
|
|
if(pszAddr == NULL)
|
|
{
|
|
_tcsncpy(pszWPAddr, _TEXT(" "), _tcslen(_TEXT(" "))+1);//if inet_ntoa fails 15 spaces
|
|
}
|
|
else
|
|
{
|
|
_sntprintf(pszWPAddr, STR_ADDRLEN-1, _TEXT("%-15S"), pszAddr);
|
|
}
|
|
|
|
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PADD, pszWPAddr);
|
|
if (pszWPAddr)
|
|
{
|
|
delete [] pszWPAddr;
|
|
}
|
|
error:
|
|
return;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : LongLongToString
|
|
//
|
|
// Date of Creation: 9-3-2001
|
|
//
|
|
// Parameters :
|
|
// IN DWORD dwHigh,
|
|
// IN DWORD dwLow,
|
|
// IN int iPrintCommas
|
|
//
|
|
// Return : LPTSTR
|
|
//
|
|
// Description: This routine will make a pretty string to match an input long-long,
|
|
// and return it. If iPrintCommas is set, it will put in commas.
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
LPSTR
|
|
LongLongToString(
|
|
IN DWORD dwHigh,
|
|
IN DWORD dwLow,
|
|
IN int iPrintCommas
|
|
)
|
|
{
|
|
char cFourGig[]="4294967296"; // "four gigabytes"
|
|
char cBuf[POTF_MAX_STRLEN]={0};
|
|
char cRes[POTF_MAX_STRLEN]={0}, cFullRes[POTF_MAX_STRLEN]={0}, *cRet = NULL;
|
|
DWORD dwPos= 0, dwPosRes =0, dwThreeCount =0;
|
|
|
|
// First, multiply the high dword by decimal 2^32 to
|
|
// get the right decimal value for it.
|
|
_snprintf(cBuf,POTF_MAX_STRLEN, "%u",dwHigh);
|
|
cBuf[POTF_MAX_STRLEN -1] = 0;
|
|
AscMultUint(cRes,cBuf,cFourGig);
|
|
|
|
// next, add in the low DWORD (fine as it is)
|
|
// to the previous product
|
|
_snprintf(cBuf,POTF_MAX_STRLEN, "%u",dwLow);
|
|
cBuf[POTF_MAX_STRLEN -1] = 0;
|
|
AscAddUint(cFullRes, cRes, cBuf);
|
|
|
|
// Finally, copy the buffer with commas.
|
|
|
|
dwPos = 0;
|
|
dwPosRes = 0;
|
|
dwThreeCount = strlen(cFullRes)%3;
|
|
while(cFullRes[dwPosRes] != '\0')
|
|
{
|
|
cBuf[dwPos++] = cFullRes[dwPosRes++];
|
|
|
|
dwThreeCount +=2; // Same as subtracting one for modulo math
|
|
|
|
if ((!(dwThreeCount%3))&&(cFullRes[dwPosRes] != '\0')&&(iPrintCommas))
|
|
{
|
|
cBuf[dwPos++]=',';
|
|
}
|
|
|
|
if(dwPos == 254)
|
|
break;
|
|
}
|
|
|
|
cBuf[dwPos] = '\0';
|
|
|
|
cRet = (LPSTR)malloc(255);
|
|
if(cRet) //Allocation failure is checked in parent function
|
|
{
|
|
memset(cRet, 0, 255);
|
|
strncpy(cRet, cBuf, 255);
|
|
cRet[254] = 0;
|
|
}
|
|
return(cRet);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : AscMultUint
|
|
//
|
|
// Date of Creation: 9-3-2001
|
|
//
|
|
// Parameters : IN LPSTR cProduct,
|
|
// IN LPSTR cA,
|
|
// IN LPSTR cB
|
|
//
|
|
// Return : DWORD (0 on success, else failure code.)
|
|
//
|
|
// Description : This routine will add two arbitrarily long ascii strings. It makes several
|
|
// assumptions about them.
|
|
// 1) the string is null terminated.
|
|
// 2) The LSB is the last char of the string. "1000000" is a million
|
|
// 3) There are no signs or decimal points.
|
|
// 4) The cProduct buffer is large enough to store the result
|
|
// 5) The product will require 254 bytes or less.
|
|
//
|
|
//Revision History :
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
AscMultUint(
|
|
IN LPSTR cProduct,
|
|
IN LPSTR cA,
|
|
IN LPSTR cB
|
|
)
|
|
{
|
|
int iALen =0, iBLen =0;
|
|
int i=0,j=0,k=0, iCarry=0;
|
|
char cTmp[POTF_MAX_STRLEN]={0};
|
|
|
|
// Verify parameters
|
|
|
|
if ((cA == NULL) || (cB == NULL) || (cProduct == NULL))
|
|
{
|
|
return((DWORD)-1);
|
|
}
|
|
|
|
iALen = strlen(cA);
|
|
iBLen = strlen(cB);
|
|
|
|
// We will multiply the traditional longhand way: for each digit in
|
|
// cA, we will multiply it against cB and add the incremental result
|
|
// into our temporary product.
|
|
|
|
// for each digit of the first multiplicand
|
|
|
|
for (i=0; i < iALen; i++)
|
|
{
|
|
iCarry = 0;
|
|
|
|
// for each digit of the second multiplicand
|
|
|
|
for(j=0; j < iBLen; j++)
|
|
{
|
|
// calculate this digit's value
|
|
|
|
k = ((int) cA[iALen-i-1]-'0') * ((int) cB[iBLen-j-1]-'0');
|
|
k += iCarry;
|
|
|
|
// Add it in to the appropriate place in the result
|
|
|
|
if (cTmp[i+j] != '\0')
|
|
{
|
|
k += (int) cTmp[i+j] - '0';
|
|
}
|
|
cTmp[i+j] = '0' + (char)(k % 10);
|
|
iCarry = k/10;
|
|
}
|
|
|
|
// Take care of the straggler carry. If the higher
|
|
// digits happen to be '9999' then this can require
|
|
// a loop.
|
|
|
|
while (iCarry)
|
|
{
|
|
if (cTmp[i+j] != '\0')
|
|
{
|
|
iCarry += cTmp[i+j] - '0';
|
|
}
|
|
cTmp[i+j] = '0' + (char)(iCarry%10);
|
|
iCarry /= 10;
|
|
j++;
|
|
}
|
|
}
|
|
|
|
// Now that we've got the entire number, reverse it and put it back in the dest.
|
|
|
|
// Skip leading 0's.
|
|
|
|
i = strlen(cTmp) - 1;
|
|
|
|
while ((i > 0)&&(cTmp[i] == '0'))
|
|
{
|
|
i--;
|
|
}
|
|
|
|
// Copy the product.
|
|
|
|
j = 0;
|
|
while (i >= 0)
|
|
{
|
|
cProduct[j++] = cTmp[i--];
|
|
}
|
|
|
|
cProduct[j] = '\0';
|
|
|
|
// We're done. Return 0 for success!
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : AscAddUint
|
|
//
|
|
// Date of Creation: 9-3-2001
|
|
//
|
|
// Parameters : IN LPSTR cSum,
|
|
// IN LPSTR cA,
|
|
// IN LPSTR cB
|
|
//
|
|
// Return : DWORD(0 on success, else failure code.)
|
|
//
|
|
// Description : This routine will add two arbitrarily long ascii strings. It makes several
|
|
// assumptions about them.
|
|
//
|
|
// 1) the string is null terminated.
|
|
// 2) The LSB is the last char of the string. "1000000" is a million
|
|
// 3) There are no signs or decimal points.
|
|
// 4) The cSum buffer is large enough to store the result
|
|
// 5) The sum will require 254 bytes or less.
|
|
//
|
|
// Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
AscAddUint(
|
|
IN LPSTR cSum,
|
|
IN LPSTR cA,
|
|
IN LPSTR cB
|
|
)
|
|
{
|
|
int iALen=0, iBLen=0, iBiggerLen=0;
|
|
int i=0,j=0,k=0, iCarry=0;
|
|
char cTmp[POTF_MAX_STRLEN]={0}, *cBigger=NULL;
|
|
|
|
// Verify parameters
|
|
if ((cA == NULL) || (cB == NULL) || (cSum == NULL))
|
|
{
|
|
return((DWORD)-1);
|
|
}
|
|
|
|
iALen = strlen(cA);
|
|
iBLen = strlen(cB);
|
|
iCarry = 0;
|
|
|
|
// Loop through, adding the values. Our result string will be
|
|
// backwards, we'll straighten it out when we copy it to the
|
|
// cSum buffer.
|
|
for (i=0; (i < iALen) && (i < iBLen); i++)
|
|
{
|
|
// Figure out the actual decimal value of the add.
|
|
k = (int) (cA[iALen-i-1] + cB[iBLen-i-1] + iCarry);
|
|
k -= 2 * '0';
|
|
|
|
// Set the carry as appropriate
|
|
iCarry = k/10;
|
|
|
|
// Set the current digit's value.
|
|
cTmp[i] = '0' + (char)(k%10);
|
|
}
|
|
|
|
// At this point, all digits present in both strings have been added.
|
|
// In other words, "12345" + "678901", "12345" has been added to "78901"
|
|
// The next step is to account for the high-order digits of the larger number.
|
|
|
|
if (iALen > iBLen)
|
|
{
|
|
cBigger = cA;
|
|
iBiggerLen = iALen;
|
|
}
|
|
else
|
|
{
|
|
cBigger = cB;
|
|
iBiggerLen = iBLen;
|
|
}
|
|
|
|
while (i < iBiggerLen)
|
|
{
|
|
k = cBigger[iBiggerLen - i - 1] + iCarry - '0';
|
|
|
|
// Set the carry as appropriate
|
|
iCarry = k/10;
|
|
|
|
// Set the current digit's value.
|
|
cTmp[i] = '0' + (char)(k%10);
|
|
i++;
|
|
}
|
|
|
|
// Finally, we might still have a set carry to put in the next
|
|
// digit.
|
|
|
|
if (iCarry)
|
|
{
|
|
cTmp[i++] = '0' + (char)iCarry;
|
|
}
|
|
|
|
// Now that we've got the entire number, reverse it and put it back in the dest.
|
|
// Skip leading 0's.
|
|
i = strlen(cTmp) - 1;
|
|
|
|
while ((i > 0)&&(cTmp[i] == '0'))
|
|
{
|
|
i--;
|
|
}
|
|
|
|
// and copy the number.
|
|
j = 0;
|
|
while (i >= 0)
|
|
{
|
|
cSum[j++] = cTmp[i--];
|
|
}
|
|
|
|
cSum[j] = '\0';
|
|
|
|
// We're done. Return 0 for success!
|
|
return(0);
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function : PrintAddrStr
|
|
//
|
|
// Date of Creation: 9-3-2001
|
|
//
|
|
// Parameters : IN PADDR ResolveAddress
|
|
// IN NshHashTable& addressHash
|
|
//
|
|
// Return : VOID
|
|
//
|
|
// Description : Resolves IP address number to char string.
|
|
//
|
|
// Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
PrintAddrStr(
|
|
IN PADDR pResolveAddress,
|
|
IN NshHashTable& addressHash,
|
|
IN UINT uiFormat
|
|
)
|
|
{
|
|
switch(pResolveAddress->AddrType)
|
|
{
|
|
case IP_ADDR_WINS_SERVER:
|
|
case IP_ADDR_DHCP_SERVER:
|
|
case IP_ADDR_DNS_SERVER:
|
|
case IP_ADDR_DEFAULT_GATEWAY:
|
|
case IP_ADDR_SUBNET:
|
|
//no resolve required for them... They are self explanatory...
|
|
break;
|
|
default:
|
|
ULONG uIpAddr = pResolveAddress->uIpAddr;
|
|
const char* name = addressHash.Find(uIpAddr);
|
|
if (name == 0)
|
|
{
|
|
HOSTENT* pHostEnt = gethostbyaddr((char *)&uIpAddr, 4, pResolveAddress->AddrType);
|
|
if (pHostEnt)
|
|
{
|
|
name = pHostEnt->h_name;
|
|
}
|
|
else
|
|
{
|
|
name = " ";
|
|
}
|
|
addressHash.Insert(uIpAddr, name);
|
|
}
|
|
PrintMessageFromModule(g_hModule, uiFormat, name);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
UINT QMPFSDHGroup(DWORD dwPFSGroup)
|
|
{
|
|
UINT PFSGroup;
|
|
switch (dwPFSGroup)
|
|
{
|
|
case PFS_GROUP_MM:
|
|
PFSGroup = DYNAMIC_SHOW_QMP_MM_DH_GROUP;
|
|
break;
|
|
case PFS_GROUP_1:
|
|
PFSGroup = DYNAMIC_SHOW_QMP_DH_GROUP_LOW;
|
|
break;
|
|
case PFS_GROUP_2:
|
|
PFSGroup = DYNAMIC_SHOW_QMP_DH_GROUP_MEDIUM;
|
|
break;
|
|
case PFS_GROUP_2048:
|
|
PFSGroup = DYNAMIC_SHOW_QMP_DH_GROUP_HIGH;
|
|
break;
|
|
default:
|
|
PFSGroup = DYNAMIC_SHOW_QMP_PFS_NONE;
|
|
break;
|
|
}
|
|
return PFSGroup;
|
|
}
|
|
|
|
|
|
// NshHashTable implementation
|
|
|
|
|
|
NshHashTable::NshHashTable() throw ()
|
|
{
|
|
for(size_t i = 0; i < NSHHASHTABLESIZE; ++i)
|
|
{
|
|
NsuListInitialize(&table[i]);;
|
|
}
|
|
}
|
|
|
|
|
|
NshHashTable::~NshHashTable() throw ()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
|
|
DWORD NshHashTable::Insert(UINT uiNewKey, const char* szNewData) throw ()
|
|
{
|
|
size_t hash = Hash(uiNewKey);
|
|
if (Find(uiNewKey, hash) != 0)
|
|
{
|
|
return ERROR_DUPLICATE_TAG;
|
|
}
|
|
|
|
HashEntry* entry = new HashEntry(&table[hash], uiNewKey, szNewData);
|
|
if (entry == 0)
|
|
{
|
|
delete entry;
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
|
|
|
|
void NshHashTable::Clear() throw ()
|
|
{
|
|
for (size_t i = 0; i < NSHHASHTABLESIZE; ++i)
|
|
{
|
|
PNSU_LIST_ENTRY pListEntry = NsuListRemoveFront(&table[i]);
|
|
while (pListEntry)
|
|
{
|
|
NsuListEntryRemove(pListEntry);
|
|
const HashEntry* pEntry = HashEntry::Get(pListEntry);
|
|
delete(pEntry);
|
|
pListEntry = NsuListRemoveFront(&table[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
const char* NshHashTable::Find(UINT uiKey) const throw ()
|
|
{
|
|
return Find(uiKey, Hash(uiKey));
|
|
}
|
|
|
|
|
|
const char* NshHashTable::Find(UINT uiKey, size_t hash) const throw ()
|
|
{
|
|
const HashEntry* entry = FindEntry(uiKey, hash);
|
|
return (entry == 0) ? NULL : entry->Data();
|
|
}
|
|
|
|
|
|
size_t NshHashTable::Hash(UINT uiKey) const throw ()
|
|
{
|
|
return uiKey % NSHHASHTABLESIZE;
|
|
}
|
|
|
|
|
|
const NshHashTable::HashEntry* NshHashTable::FindEntry(
|
|
UINT uiKey,
|
|
size_t hash
|
|
) const throw ()
|
|
{
|
|
NSU_LIST_ITERATOR iterator;
|
|
NsuListIteratorInitialize(&iterator, (PNSU_LIST)&table[hash], 0);
|
|
while (!NsuListIteratorAtEnd(&iterator))
|
|
{
|
|
PNSU_LIST_ENTRY pListEntry = NsuListIteratorCurrent(&iterator);
|
|
const HashEntry* pEntry = HashEntry::Get(pListEntry);
|
|
if (pEntry->Key() == uiKey)
|
|
{
|
|
return pEntry;
|
|
}
|
|
NsuListIteratorNext(&iterator);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
NshHashTable::HashEntry::HashEntry(
|
|
PNSU_LIST pList,
|
|
UINT uiNewKey,
|
|
const char* szNewData
|
|
) throw ()
|
|
: listEntry(),
|
|
key(uiNewKey)
|
|
{
|
|
NsuListInsertFront(pList, &listEntry);
|
|
char* szTempData;
|
|
NsuStringDupA(&szTempData, 1024, szNewData);
|
|
data = szTempData;
|
|
}
|
|
|
|
|
|
NshHashTable::HashEntry::~HashEntry() throw ()
|
|
{
|
|
NsuFree(reinterpret_cast<void**>(const_cast<char**>(&data)));
|
|
}
|
|
|
|
|
|
const NshHashTable::HashEntry* NshHashTable::HashEntry::Get(PNSU_LIST_ENTRY pEntry) throw ()
|
|
{
|
|
return NsuListEntryGetData(pEntry, HashEntry, HashEntry::listEntry);
|
|
}
|
|
|
|
|
|
UINT NshHashTable::HashEntry::Key() const throw ()
|
|
{
|
|
return key;
|
|
}
|
|
|
|
|
|
const char* NshHashTable::HashEntry::Data() const throw ()
|
|
{
|
|
return data;
|
|
}
|