222 lines
7 KiB
C++
222 lines
7 KiB
C++
/////////////////////////////////////////////////////////////
|
||
// Copyright(c) 2000, Microsoft Corporation
|
||
//
|
||
// guidgen.cpp
|
||
//
|
||
// Created on 3/1/00 by DKalin (Dennis Kalinichenko)
|
||
// Revisions:
|
||
//
|
||
// Implementation for the guid/name generation routines
|
||
//
|
||
/////////////////////////////////////////////////////////////
|
||
|
||
#include "ipseccmd.h"
|
||
|
||
/*********************************************************************
|
||
FUNCTION: GenerateGuidNamePair
|
||
PURPOSE: Generates GUID and name for the object using specified prefix
|
||
PARAMS:
|
||
pszPrefix - prefix to use, can be NULL (then default prefix will be used)
|
||
gID - reference to GUID
|
||
ppszName - address of name pointer, memory will be allocated inside this function
|
||
RETURNS: none, will assert if memory cannot be allocated
|
||
COMMENTS:
|
||
caller is responsible for freeing the memory allocated
|
||
(see also DeleteGuidsNames routine)
|
||
*********************************************************************/
|
||
void GenerateGuidNamePair (IN LPWSTR pszPrefix, OUT GUID& gID, OUT LPWSTR* ppszName)
|
||
{
|
||
WCHAR StringTxt[POTF_MAX_STRLEN];
|
||
RPC_STATUS RpcStat;
|
||
int iReturn;
|
||
|
||
// cleanup first
|
||
assert(ppszName != 0);
|
||
if (*ppszName != 0)
|
||
{
|
||
delete[] *ppszName;
|
||
}
|
||
|
||
// set the prefix
|
||
if (pszPrefix == 0 || pszPrefix[0] == 0)
|
||
{
|
||
wcscpy(StringTxt, L"text2pol ");
|
||
}
|
||
else
|
||
{
|
||
wcscpy(StringTxt, pszPrefix);
|
||
}
|
||
|
||
RpcStat = UuidCreate(&gID);
|
||
assert(RpcStat == RPC_S_OK || RpcStat == RPC_S_UUID_LOCAL_ONLY);
|
||
|
||
// set the name to be equal to the prefix + GUID
|
||
iReturn = StringFromGUID2(gID, StringTxt+wcslen(StringTxt), POTF_MAX_STRLEN-wcslen(StringTxt));
|
||
assert(iReturn != 0);
|
||
*ppszName = new WCHAR[wcslen(StringTxt)+1];
|
||
assert(*ppszName != NULL);
|
||
wcscpy(*ppszName, StringTxt);
|
||
} /* GenerateGuidNamePair */
|
||
|
||
/*********************************************************************
|
||
FUNCTION: GenerateGuidsNames
|
||
PURPOSE: Generates all necessary GUIDs and names for IPSEC_IKE_POLICY
|
||
PARAMS:
|
||
pszPrefix - prefix to use, can be NULL (then default prefix will be used)
|
||
IPSecIkePol - reference to IPSEC_IKE_POLICY structure
|
||
RETURNS: none, will assert if memory cannot be allocated
|
||
COMMENTS:
|
||
caller is responsible for freeing the memory allocated
|
||
(see also DeleteGuidsNames routine)
|
||
*********************************************************************/
|
||
void GenerateGuidsNames (IN LPWSTR pszPrefix, IN OUT IPSEC_IKE_POLICY& IPSecIkePol)
|
||
{
|
||
int i;
|
||
IPSEC_IKE_POLICY TmpPol; // for checks
|
||
RPC_STATUS RpcStat;
|
||
|
||
// set TmpPol to 0's
|
||
memset(&TmpPol, 0, sizeof(TmpPol));
|
||
|
||
// walk through all the substructures and call GenerateGuidNamePair
|
||
for (i = 0; i < (int) IPSecIkePol.dwNumMMFilters; i++)
|
||
{
|
||
GenerateGuidNamePair(pszPrefix, IPSecIkePol.pMMFilters[i].gFilterID, &IPSecIkePol.pMMFilters[i].pszFilterName);
|
||
}
|
||
for (i = 0; i < (int) IPSecIkePol.dwNumFilters; i++)
|
||
{
|
||
// printf("GenerateGuidsNames i is %d", i);
|
||
if (IPSecIkePol.QMFilterType == QM_TRANSPORT_FILTER)
|
||
{
|
||
GenerateGuidNamePair(pszPrefix, IPSecIkePol.pTransportFilters[i].gFilterID, &IPSecIkePol.pTransportFilters[i].pszFilterName);
|
||
}
|
||
else
|
||
{
|
||
// tunnel
|
||
GenerateGuidNamePair(pszPrefix, IPSecIkePol.pTunnelFilters[i].gFilterID, &IPSecIkePol.pTunnelFilters[i].pszFilterName);
|
||
}
|
||
}
|
||
|
||
if (memcmp(&IPSecIkePol.IkePol, &TmpPol.IkePol, sizeof(TmpPol.IkePol)) != 0)
|
||
{
|
||
// IkePol is not 0's
|
||
GenerateGuidNamePair(pszPrefix, IPSecIkePol.IkePol.gPolicyID, &IPSecIkePol.IkePol.pszPolicyName);
|
||
}
|
||
|
||
if (memcmp(&IPSecIkePol.IpsPol, &TmpPol.IpsPol, sizeof(TmpPol.IpsPol)) != 0)
|
||
{
|
||
// IkePol is not 0's
|
||
GenerateGuidNamePair(pszPrefix, IPSecIkePol.IpsPol.gPolicyID, &IPSecIkePol.IpsPol.pszPolicyName);
|
||
}
|
||
|
||
// go for auth methods
|
||
if (memcmp(&IPSecIkePol.AuthInfos, &TmpPol.AuthInfos, sizeof(TmpPol.AuthInfos)) != 0)
|
||
{
|
||
RpcStat = UuidCreate(&IPSecIkePol.AuthInfos.gMMAuthID);
|
||
assert(RpcStat == RPC_S_OK || RpcStat == RPC_S_UUID_LOCAL_ONLY);
|
||
}
|
||
|
||
/* now fixup guid links */
|
||
/* mainmode filters */
|
||
for (i = 0; i < (int) IPSecIkePol.dwNumMMFilters; i++)
|
||
{
|
||
if (UuidIsNil(&IPSecIkePol.pMMFilters[i].gPolicyID, &RpcStat))
|
||
{
|
||
IPSecIkePol.pMMFilters[i].gPolicyID = IPSecIkePol.IkePol.gPolicyID;
|
||
}
|
||
if (UuidIsNil(&IPSecIkePol.pMMFilters[i].gMMAuthID, &RpcStat))
|
||
{
|
||
IPSecIkePol.pMMFilters[i].gMMAuthID = IPSecIkePol.AuthInfos.gMMAuthID;
|
||
}
|
||
assert(RpcStat == RPC_S_OK || RpcStat == RPC_S_UUID_LOCAL_ONLY);
|
||
}
|
||
/* quickmode filters */
|
||
for (i = 0; i < (int) IPSecIkePol.dwNumFilters; i++)
|
||
{
|
||
if (IPSecIkePol.QMFilterType == QM_TRANSPORT_FILTER)
|
||
{
|
||
if (UuidIsNil(&IPSecIkePol.pTransportFilters[i].gPolicyID, &RpcStat))
|
||
{
|
||
IPSecIkePol.pTransportFilters[i].gPolicyID = IPSecIkePol.IpsPol.gPolicyID;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// tunnel
|
||
if (UuidIsNil(&IPSecIkePol.pTunnelFilters[i].gPolicyID, &RpcStat))
|
||
{
|
||
IPSecIkePol.pTunnelFilters[i].gPolicyID = IPSecIkePol.IpsPol.gPolicyID;
|
||
}
|
||
}
|
||
assert(RpcStat == RPC_S_OK || RpcStat == RPC_S_UUID_LOCAL_ONLY);
|
||
}
|
||
|
||
} /* GenerateGuidsNames */
|
||
|
||
/*********************************************************************
|
||
FUNCTION: DeleteGuidsNames
|
||
PURPOSE: Deletes all GUIDs and names from IPSEC_IKE_POLICY (used for cleanup)
|
||
PARAMS:
|
||
IPSecIkePol - reference to IPSEC_IKE_POLICY structure
|
||
RETURNS: none
|
||
COMMENTS:
|
||
*********************************************************************/
|
||
void DeleteGuidsNames (IN OUT IPSEC_IKE_POLICY& IPSecIkePol)
|
||
{
|
||
int i;
|
||
|
||
// walk through all the substructures and call GenerateGuidNamePair
|
||
for (i = 0; i < (int) IPSecIkePol.dwNumMMFilters; i++)
|
||
{
|
||
UuidCreateNil(&IPSecIkePol.pMMFilters[i].gFilterID);
|
||
UuidCreateNil(&IPSecIkePol.pMMFilters[i].gPolicyID);
|
||
UuidCreateNil(&IPSecIkePol.pMMFilters[i].gMMAuthID);
|
||
if (IPSecIkePol.pMMFilters[i].pszFilterName != 0)
|
||
{
|
||
delete[] IPSecIkePol.pMMFilters[i].pszFilterName;
|
||
IPSecIkePol.pMMFilters[i].pszFilterName = 0;
|
||
}
|
||
}
|
||
|
||
for (i = 0; i < (int) IPSecIkePol.dwNumFilters; i++)
|
||
{
|
||
if (IPSecIkePol.QMFilterType == QM_TRANSPORT_FILTER)
|
||
{
|
||
UuidCreateNil(&IPSecIkePol.pTransportFilters[i].gFilterID);
|
||
UuidCreateNil(&IPSecIkePol.pTransportFilters[i].gPolicyID);
|
||
if (IPSecIkePol.pTransportFilters[i].pszFilterName != 0)
|
||
{
|
||
delete[] IPSecIkePol.pTransportFilters[i].pszFilterName;
|
||
IPSecIkePol.pTransportFilters[i].pszFilterName = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// tunnel
|
||
UuidCreateNil(&IPSecIkePol.pTunnelFilters[i].gFilterID);
|
||
UuidCreateNil(&IPSecIkePol.pTunnelFilters[i].gPolicyID);
|
||
if (IPSecIkePol.pTunnelFilters[i].pszFilterName != 0)
|
||
{
|
||
delete[] IPSecIkePol.pTunnelFilters[i].pszFilterName;
|
||
IPSecIkePol.pTunnelFilters[i].pszFilterName = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
UuidCreateNil(&IPSecIkePol.IkePol.gPolicyID);
|
||
if (IPSecIkePol.IkePol.pszPolicyName != 0)
|
||
{
|
||
delete[] IPSecIkePol.IkePol.pszPolicyName;
|
||
IPSecIkePol.IkePol.pszPolicyName = 0;
|
||
}
|
||
|
||
UuidCreateNil(&IPSecIkePol.IpsPol.gPolicyID);
|
||
if (IPSecIkePol.IpsPol.pszPolicyName != 0)
|
||
{
|
||
delete[] IPSecIkePol.IpsPol.pszPolicyName;
|
||
IPSecIkePol.IpsPol.pszPolicyName = 0;
|
||
}
|
||
|
||
UuidCreateNil(&IPSecIkePol.AuthInfos.gMMAuthID);
|
||
} /* DeleteGuidsNames */
|
||
|