|
|
/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
mmauth.c
Abstract:
Author:
abhishev 06-January-2000
Environment: User Mode
Revision History:
--*/
#include "precomp.h"
DWORD WINAPI AddMMAuthMethods( LPWSTR pServerName, DWORD dwFlags, PMM_AUTH_METHODS pMMAuthMethods ) /*++
Routine Description:
This function adds main mode auths to the SPD.
Arguments:
pServerName - Server on which the main mode auths are to be added.
pMMAuthMethods - Main mode auths to be added.
Return Value:
ERROR_SUCCESS - Success.
Win32 Error - Failure.
--*/ { DWORD dwError = 0; PINIMMAUTHMETHODS pIniMMAuthMethods = NULL; BOOL bPersist = FALSE;
bPersist = (BOOL) (dwFlags & PERSIST_SPD_OBJECT);
//
// Validate the main mode auth methods.
//
dwError = ValidateMMAuthMethods( pMMAuthMethods ); BAIL_ON_WIN32_ERROR(dwError);
ENTER_SPD_SECTION();
dwError = ValidateSecurity( SPD_OBJECT_SERVER, SERVER_ACCESS_ADMINISTER, NULL, NULL ); BAIL_ON_LOCK_ERROR(dwError);
pIniMMAuthMethods = FindMMAuthMethods( gpIniMMAuthMethods, pMMAuthMethods->gMMAuthID ); if (pIniMMAuthMethods) { dwError = ERROR_IPSEC_MM_AUTH_EXISTS; BAIL_ON_LOCK_ERROR(dwError); }
if (bPersist && !gbLoadingPersistence) { dwError = PersistMMAuthMethods( pMMAuthMethods ); BAIL_ON_LOCK_ERROR(dwError); }
dwError = CreateIniMMAuthMethods( pMMAuthMethods, &pIniMMAuthMethods ); BAIL_ON_LOCK_ERROR(dwError);
pIniMMAuthMethods->bIsPersisted = bPersist;
pIniMMAuthMethods->pNext = gpIniMMAuthMethods; gpIniMMAuthMethods = pIniMMAuthMethods;
if ((pIniMMAuthMethods->dwFlags) & IPSEC_MM_AUTH_DEFAULT_AUTH) { gpIniDefaultMMAuthMethods = pIniMMAuthMethods; }
LEAVE_SPD_SECTION();
return (dwError);
lock:
LEAVE_SPD_SECTION();
error:
if (pMMAuthMethods && bPersist && !gbLoadingPersistence) { (VOID) SPDPurgeMMAuthMethods( pMMAuthMethods->gMMAuthID ); }
return (dwError); }
DWORD ValidateMMAuthMethods( PMM_AUTH_METHODS pMMAuthMethods ) { DWORD dwError = 0; DWORD i = 0; PIPSEC_MM_AUTH_INFO pTemp = NULL; DWORD dwNumAuthInfos = 0; PIPSEC_MM_AUTH_INFO pAuthenticationInfo = NULL; BOOL bSSPI = FALSE; BOOL bPresharedKey = FALSE;
if (!pMMAuthMethods) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); }
dwNumAuthInfos = pMMAuthMethods->dwNumAuthInfos; pAuthenticationInfo = pMMAuthMethods->pAuthenticationInfo;
if (!dwNumAuthInfos || !pAuthenticationInfo) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); }
//
// Need to catch the exception when the number of auth infos
// specified is more than the actual number of auth infos.
//
pTemp = pAuthenticationInfo;
for (i = 0; i < dwNumAuthInfos; i++) {
if ((pTemp->AuthMethod != IKE_PRESHARED_KEY) && (pTemp->AuthMethod != IKE_RSA_SIGNATURE) && (pTemp->AuthMethod != IKE_SSPI)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); }
if (pTemp->AuthMethod != IKE_SSPI) { if (!(pTemp->dwAuthInfoSize) || !(pTemp->pAuthInfo)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } }
if (pTemp->AuthMethod == IKE_SSPI) { if (bSSPI) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } bSSPI = TRUE; }
if (pTemp->AuthMethod == IKE_PRESHARED_KEY) { if (bPresharedKey) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } bPresharedKey = TRUE; }
pTemp++;
}
error:
return (dwError); }
PINIMMAUTHMETHODS FindMMAuthMethods( PINIMMAUTHMETHODS pIniMMAuthMethods, GUID gMMAuthID ) { DWORD dwError = 0; PINIMMAUTHMETHODS pTemp = NULL;
pTemp = pIniMMAuthMethods;
while (pTemp) {
if (!memcmp(&(pTemp->gMMAuthID), &gMMAuthID, sizeof(GUID))) { return (pTemp); } pTemp = pTemp->pNext;
}
return (NULL); }
DWORD CreateIniMMAuthMethods( PMM_AUTH_METHODS pMMAuthMethods, PINIMMAUTHMETHODS * ppIniMMAuthMethods ) { DWORD dwError = 0; PINIMMAUTHMETHODS pIniMMAuthMethods = NULL;
dwError = AllocateSPDMemory( sizeof(INIMMAUTHMETHODS), &pIniMMAuthMethods ); BAIL_ON_WIN32_ERROR(dwError);
memcpy( &(pIniMMAuthMethods->gMMAuthID), &(pMMAuthMethods->gMMAuthID), sizeof(GUID) );
pIniMMAuthMethods->dwFlags = pMMAuthMethods->dwFlags; pIniMMAuthMethods->cRef = 0; pIniMMAuthMethods->bIsPersisted = FALSE; pIniMMAuthMethods->pNext = NULL;
dwError = CreateIniMMAuthInfos( pMMAuthMethods->dwNumAuthInfos, pMMAuthMethods->pAuthenticationInfo, &(pIniMMAuthMethods->dwNumAuthInfos), &(pIniMMAuthMethods->pAuthenticationInfo) ); BAIL_ON_WIN32_ERROR(dwError);
*ppIniMMAuthMethods = pIniMMAuthMethods; return (dwError);
error:
if (pIniMMAuthMethods) { FreeIniMMAuthMethods( pIniMMAuthMethods ); }
*ppIniMMAuthMethods = NULL; return (dwError); }
DWORD CreateIniMMAuthInfos( DWORD dwInNumAuthInfos, PIPSEC_MM_AUTH_INFO pInAuthenticationInfo, PDWORD pdwNumAuthInfos, PIPSEC_MM_AUTH_INFO * ppAuthenticationInfo ) { DWORD dwError = 0; PIPSEC_MM_AUTH_INFO pAuthenticationInfo = NULL; PIPSEC_MM_AUTH_INFO pTemp = NULL; PIPSEC_MM_AUTH_INFO pInTemp = NULL; DWORD i = 0;
//
// Number of auth infos and the auth infos themselves
// have already been validated.
//
dwError = AllocateSPDMemory( sizeof(IPSEC_MM_AUTH_INFO) * dwInNumAuthInfos, &(pAuthenticationInfo) ); BAIL_ON_WIN32_ERROR(dwError);
pTemp = pAuthenticationInfo; pInTemp = pInAuthenticationInfo;
for (i = 0; i < dwInNumAuthInfos; i++) {
pTemp->AuthMethod = pInTemp->AuthMethod;
if (pInTemp->AuthMethod == IKE_SSPI) {
pTemp->dwAuthInfoSize = 0; pTemp->pAuthInfo = NULL;
} else {
if (!(pInTemp->dwAuthInfoSize) || !(pInTemp->pAuthInfo)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); }
dwError = AllocateSPDMemory( pInTemp->dwAuthInfoSize, &(pTemp->pAuthInfo) ); BAIL_ON_WIN32_ERROR(dwError);
pTemp->dwAuthInfoSize = pInTemp->dwAuthInfoSize;
//
// Need to catch the exception when the size of auth info
// specified is more than the actual size. This can
// not be checked earlier in the validation routine.
//
//
memcpy( pTemp->pAuthInfo, pInTemp->pAuthInfo, pInTemp->dwAuthInfoSize );
}
pInTemp++; pTemp++;
}
*pdwNumAuthInfos = dwInNumAuthInfos; *ppAuthenticationInfo = pAuthenticationInfo; return (dwError);
error:
if (pAuthenticationInfo) { FreeIniMMAuthInfos( i, pAuthenticationInfo ); }
*pdwNumAuthInfos = 0; *ppAuthenticationInfo = NULL; return (dwError); }
VOID FreeIniMMAuthMethods( PINIMMAUTHMETHODS pIniMMAuthMethods ) { if (pIniMMAuthMethods) {
FreeIniMMAuthInfos( pIniMMAuthMethods->dwNumAuthInfos, pIniMMAuthMethods->pAuthenticationInfo );
FreeSPDMemory(pIniMMAuthMethods);
} }
VOID FreeIniMMAuthInfos( DWORD dwNumAuthInfos, PIPSEC_MM_AUTH_INFO pAuthenticationInfo ) { DWORD i = 0; PIPSEC_MM_AUTH_INFO pTemp = NULL;
if (pAuthenticationInfo) {
pTemp = pAuthenticationInfo;
for (i = 0; i < dwNumAuthInfos; i++) { if (pTemp->pAuthInfo) { FreeSPDMemory(pTemp->pAuthInfo); } pTemp++; }
FreeSPDMemory(pAuthenticationInfo);
} }
DWORD WINAPI DeleteMMAuthMethods( LPWSTR pServerName, GUID gMMAuthID ) /*++
Routine Description:
This function deletes main mode auth methods from the SPD.
Arguments:
pServerName - Server on which the main mode auth methods are to be deleted.
gMMAuthID - Main mode methods to be deleted.
Return Value:
ERROR_SUCCESS - Success.
Win32 Error - Failure.
--*/ { DWORD dwError = 0; PINIMMAUTHMETHODS pIniMMAuthMethods = NULL;
ENTER_SPD_SECTION();
dwError = ValidateSecurity( SPD_OBJECT_SERVER, SERVER_ACCESS_ADMINISTER, NULL, NULL ); BAIL_ON_LOCK_ERROR(dwError);
pIniMMAuthMethods = FindMMAuthMethods( gpIniMMAuthMethods, gMMAuthID ); if (!pIniMMAuthMethods) { dwError = ERROR_IPSEC_MM_AUTH_NOT_FOUND; BAIL_ON_LOCK_ERROR(dwError); }
if (pIniMMAuthMethods->cRef) { dwError = ERROR_IPSEC_MM_AUTH_IN_USE; BAIL_ON_LOCK_ERROR(dwError); }
if (pIniMMAuthMethods->bIsPersisted) { dwError = SPDPurgeMMAuthMethods( gMMAuthID ); BAIL_ON_LOCK_ERROR(dwError); }
dwError = DeleteIniMMAuthMethods( pIniMMAuthMethods ); BAIL_ON_LOCK_ERROR(dwError);
LEAVE_SPD_SECTION();
if (gbIKENotify) { (VOID) IKENotifyPolicyChange( &(gMMAuthID), POLICY_GUID_AUTH ); }
return (dwError);
lock:
LEAVE_SPD_SECTION();
if ((dwError == ERROR_IPSEC_MM_AUTH_IN_USE) && gbIKENotify) { (VOID) IKENotifyPolicyChange( &(gMMAuthID), POLICY_GUID_AUTH ); }
return (dwError); }
DWORD DeleteIniMMAuthMethods( PINIMMAUTHMETHODS pIniMMAuthMethods ) { DWORD dwError = 0; PINIMMAUTHMETHODS * ppTemp = NULL;
ppTemp = &gpIniMMAuthMethods;
while (*ppTemp) {
if (*ppTemp == pIniMMAuthMethods) { break; } ppTemp = &((*ppTemp)->pNext);
}
if (*ppTemp) { *ppTemp = pIniMMAuthMethods->pNext; }
if ((pIniMMAuthMethods->dwFlags) & IPSEC_MM_AUTH_DEFAULT_AUTH) { gpIniDefaultMMAuthMethods = NULL; }
FreeIniMMAuthMethods(pIniMMAuthMethods);
return (dwError); }
DWORD WINAPI EnumMMAuthMethods( LPWSTR pServerName, PMM_AUTH_METHODS * ppMMAuthMethods, DWORD dwPreferredNumEntries, LPDWORD pdwNumAuthMethods, LPDWORD pdwResumeHandle ) /*++
Routine Description:
This function enumerates main mode auth methods from the SPD.
Arguments:
pServerName - Server on which the main mode auth methods are to be enumerated.
ppMMAuthMethods - Enumerated main mode auth methods returned to the caller.
dwPreferredNumEntries - Preferred number of enumeration entries.
pdwNumAuthMethods - Number of main mode auth methods actually enumerated.
pdwResumeHandle - Handle to the location in the main mode auth methods list from which to resume enumeration.
Return Value:
ERROR_SUCCESS - Success.
Win32 Error - Failure.
--*/ { DWORD dwError = 0; DWORD dwResumeHandle = 0; DWORD dwNumToEnum = 0; PINIMMAUTHMETHODS pIniMMAuthMethods = NULL; DWORD i = 0; PINIMMAUTHMETHODS pTemp = NULL; DWORD dwNumAuthMethods = 0; PMM_AUTH_METHODS pMMAuthMethods = NULL; PMM_AUTH_METHODS pTempMMAuthMethods = NULL;
dwResumeHandle = *pdwResumeHandle;
if (!dwPreferredNumEntries || (dwPreferredNumEntries > MAX_MMAUTH_ENUM_COUNT)) { dwNumToEnum = MAX_MMAUTH_ENUM_COUNT; } else { dwNumToEnum = dwPreferredNumEntries; }
ENTER_SPD_SECTION();
dwError = ValidateSecurity( SPD_OBJECT_SERVER, SERVER_ACCESS_ADMINISTER, NULL, NULL ); BAIL_ON_LOCK_ERROR(dwError);
pIniMMAuthMethods = gpIniMMAuthMethods;
for (i = 0; (i < dwResumeHandle) && (pIniMMAuthMethods != NULL); i++) { pIniMMAuthMethods = pIniMMAuthMethods->pNext; }
if (!pIniMMAuthMethods) { dwError = ERROR_NO_DATA; BAIL_ON_LOCK_ERROR(dwError); }
pTemp = pIniMMAuthMethods;
while (pTemp && (dwNumAuthMethods < dwNumToEnum)) { dwNumAuthMethods++; pTemp = pTemp->pNext; }
dwError = SPDApiBufferAllocate( sizeof(MM_AUTH_METHODS)*dwNumAuthMethods, &pMMAuthMethods ); BAIL_ON_LOCK_ERROR(dwError);
pTemp = pIniMMAuthMethods; pTempMMAuthMethods = pMMAuthMethods;
for (i = 0; i < dwNumAuthMethods; i++) {
dwError = CopyMMAuthMethods( pTemp, pTempMMAuthMethods ); BAIL_ON_LOCK_ERROR(dwError);
pTemp = pTemp->pNext; pTempMMAuthMethods++;
}
*ppMMAuthMethods = pMMAuthMethods; *pdwResumeHandle = dwResumeHandle + dwNumAuthMethods; *pdwNumAuthMethods = dwNumAuthMethods;
LEAVE_SPD_SECTION(); return (dwError);
lock:
LEAVE_SPD_SECTION();
if (pMMAuthMethods) { FreeMMAuthMethods( i, pMMAuthMethods ); }
*ppMMAuthMethods = NULL; *pdwResumeHandle = dwResumeHandle; *pdwNumAuthMethods = 0;
return (dwError); }
DWORD WINAPI SetMMAuthMethods( LPWSTR pServerName, GUID gMMAuthID, PMM_AUTH_METHODS pMMAuthMethods ) /*++
Routine Description:
This function updates main mode auth methods in the SPD.
Arguments:
pServerName - Server on which the main mode auth methods are to be updated.
gMMAuthID - Guid of the main mode auth methods to be updated.
pMMAuthMethods - New main mode auth methods which will replace the existing methods.
Return Value:
ERROR_SUCCESS - Success.
Win32 Error - Failure.
--*/ { DWORD dwError = 0; PINIMMAUTHMETHODS pIniMMAuthMethods = NULL;
//
// Validate main mode auth methods.
//
dwError = ValidateMMAuthMethods( pMMAuthMethods ); BAIL_ON_WIN32_ERROR(dwError);
ENTER_SPD_SECTION();
dwError = ValidateSecurity( SPD_OBJECT_SERVER, SERVER_ACCESS_ADMINISTER, NULL, NULL ); BAIL_ON_LOCK_ERROR(dwError);
pIniMMAuthMethods = FindMMAuthMethods( gpIniMMAuthMethods, gMMAuthID ); if (!pIniMMAuthMethods) { dwError = ERROR_IPSEC_MM_AUTH_NOT_FOUND; BAIL_ON_LOCK_ERROR(dwError); }
dwError = SetIniMMAuthMethods( pIniMMAuthMethods, pMMAuthMethods ); BAIL_ON_LOCK_ERROR(dwError);
if (pIniMMAuthMethods->bIsPersisted) { dwError = PersistMMAuthMethods( pMMAuthMethods ); BAIL_ON_LOCK_ERROR(dwError); }
LEAVE_SPD_SECTION();
(VOID) IKENotifyPolicyChange( &(pMMAuthMethods->gMMAuthID), POLICY_GUID_AUTH );
return (dwError);
lock:
LEAVE_SPD_SECTION();
error:
return (dwError); }
DWORD SetIniMMAuthMethods( PINIMMAUTHMETHODS pIniMMAuthMethods, PMM_AUTH_METHODS pMMAuthMethods ) { DWORD dwError = 0; DWORD dwNumAuthInfos = 0; PIPSEC_MM_AUTH_INFO pAuthenticationInfo = NULL;
dwError = CreateIniMMAuthInfos( pMMAuthMethods->dwNumAuthInfos, pMMAuthMethods->pAuthenticationInfo, &dwNumAuthInfos, &pAuthenticationInfo ); BAIL_ON_WIN32_ERROR(dwError);
FreeIniMMAuthInfos( pIniMMAuthMethods->dwNumAuthInfos, pIniMMAuthMethods->pAuthenticationInfo ); if ((pIniMMAuthMethods->dwFlags) & IPSEC_MM_AUTH_DEFAULT_AUTH) { gpIniDefaultMMAuthMethods = NULL; }
pIniMMAuthMethods->dwFlags = pMMAuthMethods->dwFlags; pIniMMAuthMethods->dwNumAuthInfos = dwNumAuthInfos; pIniMMAuthMethods->pAuthenticationInfo = pAuthenticationInfo;
if ((pIniMMAuthMethods->dwFlags) & IPSEC_MM_AUTH_DEFAULT_AUTH) { gpIniDefaultMMAuthMethods = pIniMMAuthMethods; }
error:
return (dwError); }
DWORD WINAPI GetMMAuthMethods( LPWSTR pServerName, GUID gMMAuthID, PMM_AUTH_METHODS * ppMMAuthMethods ) /*++
Routine Description:
This function gets main mode auth methods from the SPD.
Arguments:
pServerName - Server from which to get the main mode auth methods.
gMMAuthID - Guid of the main mode auth methods to get.
ppMMAuthMethods - Main mode auth methods found returned to the caller.
Return Value:
ERROR_SUCCESS - Success.
Win32 Error - Failure.
--*/ { DWORD dwError = 0; PINIMMAUTHMETHODS pIniMMAuthMethods = NULL; PMM_AUTH_METHODS pMMAuthMethods = NULL;
ENTER_SPD_SECTION();
dwError = ValidateSecurity( SPD_OBJECT_SERVER, SERVER_ACCESS_ADMINISTER, NULL, NULL ); BAIL_ON_LOCK_ERROR(dwError);
pIniMMAuthMethods = FindMMAuthMethods( gpIniMMAuthMethods, gMMAuthID ); if (!pIniMMAuthMethods) { dwError = ERROR_IPSEC_MM_AUTH_NOT_FOUND; BAIL_ON_LOCK_ERROR(dwError); }
dwError = GetIniMMAuthMethods( pIniMMAuthMethods, &pMMAuthMethods ); BAIL_ON_LOCK_ERROR(dwError);
*ppMMAuthMethods = pMMAuthMethods;
LEAVE_SPD_SECTION(); return (dwError);
lock:
LEAVE_SPD_SECTION();
*ppMMAuthMethods = NULL; return (dwError); }
DWORD GetIniMMAuthMethods( PINIMMAUTHMETHODS pIniMMAuthMethods, PMM_AUTH_METHODS * ppMMAuthMethods ) { DWORD dwError = 0; PMM_AUTH_METHODS pMMAuthMethods = NULL;
dwError = SPDApiBufferAllocate( sizeof(MM_AUTH_METHODS), &pMMAuthMethods ); BAIL_ON_WIN32_ERROR(dwError);
dwError = CopyMMAuthMethods( pIniMMAuthMethods, pMMAuthMethods ); BAIL_ON_WIN32_ERROR(dwError);
*ppMMAuthMethods = pMMAuthMethods; return (dwError);
error:
if (pMMAuthMethods) { SPDApiBufferFree(pMMAuthMethods); }
*ppMMAuthMethods = NULL; return (dwError); }
DWORD CopyMMAuthMethods( PINIMMAUTHMETHODS pIniMMAuthMethods, PMM_AUTH_METHODS pMMAuthMethods ) { DWORD dwError = 0;
memcpy( &(pMMAuthMethods->gMMAuthID), &(pIniMMAuthMethods->gMMAuthID), sizeof(GUID) );
pMMAuthMethods->dwFlags = pIniMMAuthMethods->dwFlags;
dwError = CreateMMAuthInfos( pIniMMAuthMethods->dwNumAuthInfos, pIniMMAuthMethods->pAuthenticationInfo, &(pMMAuthMethods->dwNumAuthInfos), &(pMMAuthMethods->pAuthenticationInfo) ); BAIL_ON_WIN32_ERROR(dwError);
error:
return (dwError); }
DWORD CreateMMAuthInfos( DWORD dwInNumAuthInfos, PIPSEC_MM_AUTH_INFO pInAuthenticationInfo, PDWORD pdwNumAuthInfos, PIPSEC_MM_AUTH_INFO * ppAuthenticationInfo ) { DWORD dwError = 0; PIPSEC_MM_AUTH_INFO pAuthenticationInfo = NULL; PIPSEC_MM_AUTH_INFO pTemp = NULL; PIPSEC_MM_AUTH_INFO pInTemp = NULL; DWORD i = 0;
//
// Number of auth infos and the auth infos themselves
// have already been validated.
//
dwError = SPDApiBufferAllocate( sizeof(IPSEC_MM_AUTH_INFO) * dwInNumAuthInfos, &(pAuthenticationInfo) ); BAIL_ON_WIN32_ERROR(dwError);
pTemp = pAuthenticationInfo; pInTemp = pInAuthenticationInfo;
for (i = 0; i < dwInNumAuthInfos; i++) {
pTemp->AuthMethod = pInTemp->AuthMethod;
//
// Auth info size and the auth info have already
// been validated.
//
if (pInTemp->AuthMethod == IKE_SSPI) {
pTemp->dwAuthInfoSize = 0; pTemp->pAuthInfo = NULL;
} else {
dwError = SPDApiBufferAllocate( pInTemp->dwAuthInfoSize, &(pTemp->pAuthInfo) ); BAIL_ON_WIN32_ERROR(dwError);
pTemp->dwAuthInfoSize = pInTemp->dwAuthInfoSize;
//
// Need to catch the exception when the size of auth info
// specified is more than the actual size. This can
// not be checked earlier in the validation routine.
//
//
memcpy( pTemp->pAuthInfo, pInTemp->pAuthInfo, pInTemp->dwAuthInfoSize );
}
pInTemp++; pTemp++;
}
*pdwNumAuthInfos = dwInNumAuthInfos; *ppAuthenticationInfo = pAuthenticationInfo; return (dwError);
error:
if (pAuthenticationInfo) { FreeMMAuthInfos( i, pAuthenticationInfo ); }
*pdwNumAuthInfos = 0; *ppAuthenticationInfo = NULL; return (dwError); }
VOID FreeMMAuthInfos( DWORD dwNumAuthInfos, PIPSEC_MM_AUTH_INFO pAuthenticationInfo ) { DWORD i = 0; PIPSEC_MM_AUTH_INFO pTemp = NULL;
if (pAuthenticationInfo) {
pTemp = pAuthenticationInfo;
for (i = 0; i < dwNumAuthInfos; i++) { if (pTemp->pAuthInfo) { SPDApiBufferFree(pTemp->pAuthInfo); } pTemp++; }
SPDApiBufferFree(pAuthenticationInfo);
} }
VOID FreeIniMMAuthMethodsList( PINIMMAUTHMETHODS pIniMMAuthMethodsList ) { PINIMMAUTHMETHODS pTemp = NULL; PINIMMAUTHMETHODS pIniMMAuthMethods = NULL;
pTemp = pIniMMAuthMethodsList;
while (pTemp) {
pIniMMAuthMethods = pTemp; pTemp = pTemp->pNext;
FreeIniMMAuthMethods(pIniMMAuthMethods);
} }
VOID FreeMMAuthMethods( DWORD dwNumAuthMethods, PMM_AUTH_METHODS pMMAuthMethods ) { DWORD i = 0;
if (pMMAuthMethods) {
for (i = 0; i < dwNumAuthMethods; i++) {
FreeMMAuthInfos( pMMAuthMethods[i].dwNumAuthInfos, pMMAuthMethods[i].pAuthenticationInfo );
}
SPDApiBufferFree(pMMAuthMethods);
} }
DWORD LocateMMAuthMethods( PMM_FILTER pMMFilter, PINIMMAUTHMETHODS * ppIniMMAuthMethods ) { DWORD dwError = 0; PINIMMAUTHMETHODS pIniMMAuthMethods = NULL;
if ((pMMFilter->dwFlags) & IPSEC_MM_AUTH_DEFAULT_AUTH) {
if (!gpIniDefaultMMAuthMethods) { dwError = ERROR_IPSEC_DEFAULT_MM_AUTH_NOT_FOUND; BAIL_ON_WIN32_ERROR(dwError); } pIniMMAuthMethods = gpIniDefaultMMAuthMethods;
} else {
pIniMMAuthMethods = FindMMAuthMethods( gpIniMMAuthMethods, pMMFilter->gMMAuthID ); if (!pIniMMAuthMethods) { dwError = ERROR_IPSEC_MM_AUTH_NOT_FOUND; BAIL_ON_WIN32_ERROR(dwError); }
}
*ppIniMMAuthMethods = pIniMMAuthMethods; return (dwError);
error:
*ppIniMMAuthMethods = NULL; return (dwError); }
|