|
|
/////////////////////////////////////////////////////////////
// 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 */
|