Leaked source code of windows server 2003
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.

2146 lines
58 KiB

  1. //++
  2. //
  3. // Copyright (C) Microsoft Corporation, 1987 - 2001
  4. //
  5. // Module Name:
  6. //
  7. // spdcheck.c
  8. //
  9. // Abstract:
  10. //
  11. // SPD Check stats for netdiag
  12. //
  13. // Author:
  14. //
  15. // Madhurima Pawar (mpawar) - 10/15/2001
  16. //
  17. // Environment:
  18. //
  19. // User mode only.
  20. // Contains NT-specific code.
  21. //
  22. //
  23. #include "precomp.h"
  24. #include <snmp.h>
  25. #include <tcpinfo.h>
  26. #include <ipinfo.h>
  27. #include <llinfo.h>
  28. #include <windows.h>
  29. #include <winsock2.h>
  30. #include <ipexport.h>
  31. #include <icmpapi.h>
  32. #include <stdlib.h>
  33. #include <assert.h>
  34. #include <tchar.h>
  35. #include <wincrypt.h>
  36. #include <stdio.h>
  37. #include <objbase.h>
  38. #include <dsgetdc.h>
  39. #include <lm.h>
  40. #include <userenv.h>
  41. #include<crtdbg.h>
  42. ////////////////////////////////////////////////////////////////////////////////////////////////////
  43. //++
  44. //function prototypes
  45. //--
  46. DWORD IPSecGetAssignedDirectoryPolicyData(CHECKLIST *pcheckList, HANDLE hPolicyStore, PIPSEC_POLICY_DATA *ppIpsecPolicyData );
  47. void MMPolicyCheck(CHECKLIST *pcheckList,
  48. HANDLE hPolicyStore,
  49. IPSEC_POLICY_DATA *pIpsecPolicyData );
  50. void CompareMMPolicies(CHECKLIST *pcheckList,
  51. IPSEC_ISAKMP_DATA *pIpsecISAKMPData,
  52. IPSEC_MM_POLICY *pMMPolicy);
  53. void NFAProcess(CHECKLIST *pcheckList, HANDLE hPolicyStore, IPSEC_POLICY_DATA *pIpsecPolicyData );
  54. void DefaultRuleCheck( PIPSEC_NFA_DATA pIpsecNFAData,
  55. PPOLICYPARAMS ppolicyParams);
  56. void MMAuthCheck(CHECKLIST *pcheckList,
  57. PIPSEC_NFA_DATA pIpsecNFAData,
  58. GUID gMMAuthID,
  59. PPOLICYPARAMS ppolicyParams );
  60. void QMPolicyCheck(CHECKLIST *pcheckList,
  61. PIPSEC_NFA_DATA pIpsecNFAData,
  62. GUID gPolicyID,
  63. PPOLICYPARAMS ppolicyParams);
  64. DWORD CompareQMPolicies(CHECKLIST *pcheckList,
  65. PPOLICYPARAMS ppolicyParams,
  66. DWORD dwTunnelFlag,
  67. IPSEC_NEGPOL_DATA *pIpsecNegPolData,
  68. IPSEC_QM_POLICY *pQMPolicy);
  69. DWORD CompareQMOffers(PIPSEC_SECURITY_METHOD pTempMethod, PIPSEC_QM_OFFER pTempOffer);
  70. DWORD TransportFilterCheck(CHECKLIST* pcheckList, POLICYPARAMS *ppolicyParams, PIPSEC_NFA_DATA pIpsecNFAData);
  71. DWORD CompareTransportFilter(CHECKLIST* pcheckList, POLICYPARAMS *ppolicyParams,PIPSEC_NFA_DATA pIpsecNFAData, IPSEC_FILTER_SPEC *pFilterSpec, TRANSPORT_FILTER *pTxFilter);
  72. DWORD ComparePAInterfaceType(CHECKLIST* pcheckList, DWORD dwInterfaceType, IF_TYPE InterfaceType);
  73. DWORD ComparePAAddress(CHECKLIST* pcheckList, ULONG uMask, ULONG uAddr, ADDR addr );
  74. DWORD CompareFilterActions(CHECKLIST* pcheckList, POLICYPARAMS *ppolicyParams, FILTER_ACTION InboundFilterFlag, FILTER_ACTION OutboundFilterFlag);
  75. DWORD TunnelFilterCheck(CHECKLIST* pcheckList,
  76. POLICYPARAMS *ppolicyParams,
  77. PIPSEC_NFA_DATA pIpsecNFAData);
  78. DWORD CompareTunnelFilter(CHECKLIST* pcheckList,
  79. POLICYPARAMS *ppolicyParams,
  80. PIPSEC_NFA_DATA pIpsecNFAData,
  81. IPSEC_FILTER_SPEC *pFilterSpec,
  82. TUNNEL_FILTER *pTnFilter);
  83. DWORD ComparePATunnelAddress(CHECKLIST* pcheckList, ULONG uAddr, ADDR addr );
  84. void MMFilterCheck(CHECKLIST *pcheckList,
  85. POLICYPARAMS *ppolicyParams,
  86. PIPSEC_NFA_DATA pIpsecNFAData,
  87. IPSEC_FILTER_SPEC *pFilterSpec);
  88. DWORD CompareMMFilter(CHECKLIST* pcheckList,
  89. POLICYPARAMS *ppolicyParams,
  90. PIPSEC_NFA_DATA pIpsecNFAData,
  91. IPSEC_FILTER_SPEC *pFilterSpec,
  92. MM_FILTER *pMMFilter);
  93. DWORD CompareAddress(IPSEC_FILTER ListFilter, IPSEC_FILTER Filter);
  94. DWORD CheckFilterList(IPSEC_FILTER Filter);
  95. FILTERLIST * GetNode(CHECKLIST* pcheckList, IPSEC_FILTER Filter);
  96. void AddNodeToList(FILTERLIST *pList);
  97. /////////////////////////////////////////////////////////////////////////////////////////////////////
  98. BOOL SPDCheckTEST(NETDIAG_PARAMS* pParams, NETDIAG_RESULT* pResults)
  99. //++
  100. //Description:
  101. //This is part of the ipsec test for netdiag.
  102. //
  103. //Arguments:
  104. // IN/OUT NETDIAG_PARAMS
  105. // IN/OUT NETDIAG_RESULT
  106. //Return:
  107. // S_OK or S_FALSE
  108. //Author:
  109. // Madhurima Pawar (mpawar) 10/15/01
  110. //--
  111. {
  112. HANDLE hPolicyStore = NULL;
  113. HKEY hRegKey;
  114. DWORD dwError = ERROR_SUCCESS;
  115. //polstore data
  116. IPSEC_POLICY_DATA *pIpsecPolicyData = NULL;
  117. CHECKLIST checkList;
  118. //initialize checklist
  119. checkList.pParams = pParams;
  120. checkList.pResults = pResults;
  121. gErrorFlag = 0;
  122. //open the polstore
  123. switch(piAssignedPolicy.iPolicySource)
  124. {
  125. case PS_DS_POLICY:
  126. dwError = IPSecOpenPolicyStore(NULL,
  127. IPSEC_DIRECTORY_PROVIDER,
  128. NULL,
  129. &hPolicyStore
  130. );
  131. reportErr();
  132. piAssignedPolicy.iPolicySource = PS_DS_POLICY;
  133. dwError = IPSecGetAssignedDirectoryPolicyData(&checkList,
  134. hPolicyStore,
  135. &pIpsecPolicyData);
  136. BAIL_ON_WIN32_ERROR(dwError);
  137. break;
  138. case PS_LOC_POLICY:
  139. dwError = IPSecOpenPolicyStore(NULL,
  140. IPSEC_REGISTRY_PROVIDER,
  141. NULL,
  142. &hPolicyStore);
  143. //BAIL_ON_WIN32_ERROR(dwError);
  144. reportErr();
  145. piAssignedPolicy.iPolicySource = PS_LOC_POLICY;
  146. dwError = IPSecGetAssignedPolicyData(hPolicyStore,
  147. &pIpsecPolicyData
  148. );
  149. reportErr();
  150. //make sure it is the same as in registry
  151. if(!IsEqualGUID(&(pIpsecPolicyData->PolicyIdentifier),&(piAssignedPolicy.policyGUID)))
  152. //reportErr(IDS_SPD_LP_ERROR);
  153. //list the policy in polstore that is absent
  154. break;
  155. }
  156. _ASSERT(pIpsecPolicyData);
  157. //check for MM policy in SPD
  158. MMPolicyCheck(&checkList,hPolicyStore,pIpsecPolicyData);
  159. //perform checks for all the filters in the rule
  160. NFAProcess(&checkList,hPolicyStore, pIpsecPolicyData);
  161. if(gErrorFlag){
  162. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput, Nd_Verbose, IDS_SPD_ERR_STATUS1);
  163. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput, Nd_Verbose, IDS_SPD_ERR_STATUS2);
  164. }else{
  165. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput, Nd_Verbose, IDS_SPD_SUCC_STATUS);
  166. }//end else
  167. error:
  168. if(pIpsecPolicyData){
  169. IPSecFreePolMem(pIpsecPolicyData);
  170. pIpsecPolicyData = NULL;
  171. }
  172. //closing the polstore
  173. if (hPolicyStore) {
  174. (VOID) IPSecClosePolicyStore(hPolicyStore);
  175. hPolicyStore = NULL;
  176. }
  177. if(gpFilterList){
  178. Free(gpFilterList);
  179. gpFilterList = NULL;
  180. }
  181. if(gErrorFlag)
  182. return S_FALSE;
  183. return S_OK;
  184. }
  185. DWORD IPSecGetAssignedDirectoryPolicyData(CHECKLIST *pcheckList,
  186. HANDLE hPolicyStore,
  187. PIPSEC_POLICY_DATA *ppIpsecPolicyData)
  188. //++
  189. //Description:
  190. // This funtion gets assigned directory policy
  191. //
  192. //Arguments:
  193. // IN/OUT CHECKLIST
  194. // IN hPolicyStore
  195. // IN PIPSEC_POLICY_DATA
  196. //
  197. //Return:
  198. // failure or ERROR_SUCCESS
  199. //Author:
  200. // Madhurima Pawar (mpawar) 10/15/01
  201. //--
  202. {
  203. DWORD dwError = ERROR_SUCCESS,
  204. dwNumPolicyObjects = 0,
  205. i = 0;
  206. PIPSEC_POLICY_DATA *ppIpsecTempPolicyData = NULL;
  207. NETDIAG_PARAMS* pParams = pcheckList->pParams;
  208. NETDIAG_RESULT* pResults = pcheckList->pResults;
  209. dwError = IPSecEnumPolicyData(
  210. hPolicyStore,
  211. &ppIpsecTempPolicyData,
  212. &dwNumPolicyObjects
  213. );
  214. reportErr();
  215. _ASSERT(ppIpsecTempPolicyData);
  216. // find the applied directory policy in polstore
  217. for(i = 0; i <dwNumPolicyObjects; i++)
  218. {
  219. if(IsEqualGUID(&(ppIpsecTempPolicyData[i]->PolicyIdentifier),&(piAssignedPolicy.policyGUID)))
  220. {
  221. dwError = IPSecCopyPolicyData(ppIpsecTempPolicyData[i], ppIpsecPolicyData );
  222. reportErr();
  223. break;
  224. }
  225. }
  226. if(!(*ppIpsecPolicyData))
  227. reportErr();
  228. error:
  229. if(ppIpsecTempPolicyData){
  230. IPSecFreeMulPolicyData(ppIpsecTempPolicyData, dwNumPolicyObjects);
  231. ppIpsecTempPolicyData = NULL;
  232. }
  233. return dwError;
  234. }
  235. void MMPolicyCheck(CHECKLIST *pcheckList,
  236. HANDLE hPolicyStore,
  237. IPSEC_POLICY_DATA *pIpsecPolicyData )
  238. //++
  239. //Description:
  240. //Performs Main Mode Policy Check
  241. //
  242. //Arguments:
  243. // IN/OUT checklist
  244. // IN hPolicyStore
  245. // IN pIpsecPolicyData
  246. //
  247. //Return:
  248. // none
  249. //Author:
  250. // Madhurima Pawar (mpawar) 10/15/01
  251. //--
  252. {
  253. DWORD dwError = ERROR_SUCCESS;
  254. IPSEC_ISAKMP_DATA *pIpsecISAKMPData = NULL;
  255. IPSEC_MM_POLICY *pMMPolicy = NULL;
  256. NETDIAG_PARAMS* pParams = pcheckList->pParams;
  257. NETDIAG_RESULT* pResults = pcheckList->pResults;
  258. //get the policy data from Polstore
  259. dwError = IPSecGetISAKMPData(hPolicyStore,
  260. pIpsecPolicyData->ISAKMPIdentifier,
  261. &pIpsecISAKMPData);
  262. reportErr();
  263. _ASSERT(pIpsecISAKMPData);
  264. //get MM policy from SPD
  265. dwError = GetMMPolicyByID(NULL,
  266. 0,
  267. pIpsecPolicyData->ISAKMPIdentifier,
  268. &pMMPolicy,
  269. NULL);
  270. if(dwError)
  271. {
  272. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  273. Nd_Verbose, IDS_SPD_MM_POLICY_ABSENT);
  274. PrintISAKMPDataList(pcheckList,
  275. pIpsecISAKMPData);
  276. gErrorFlag = 1;
  277. goto error;
  278. }
  279. _ASSERT(pMMPolicy);
  280. CompareMMPolicies( pcheckList, pIpsecISAKMPData, pMMPolicy);
  281. error:
  282. if(pMMPolicy){
  283. SPDApiBufferFree((LPVOID)pMMPolicy);
  284. pMMPolicy = NULL;
  285. }
  286. if(pIpsecISAKMPData){
  287. IPSecFreeISAKMPData(pIpsecISAKMPData);
  288. pIpsecISAKMPData = NULL;
  289. }
  290. return ;
  291. }
  292. void CompareMMPolicies(CHECKLIST *pcheckList,
  293. IPSEC_ISAKMP_DATA *pIpsecISAKMPData,
  294. IPSEC_MM_POLICY *pMMPolicy)
  295. //++
  296. //Description:
  297. //Compares MM Policies with the Polsore ISAKMP Data
  298. //
  299. //Arguments:
  300. // IN IPSEC_ISAKMP_DATA
  301. // IN IPSEC_MM_POLICY
  302. //
  303. //Return:
  304. // none
  305. //Author:
  306. // Madhurima Pawar (mpawar) 10/15/01
  307. //--
  308. {
  309. DWORD i = 0,
  310. dwErrorFlag = 0;
  311. PCRYPTO_BUNDLE pBundle = NULL;
  312. PIPSEC_MM_OFFER pOffer = NULL;
  313. NETDIAG_PARAMS* pParams = pcheckList->pParams;
  314. NETDIAG_RESULT* pResults = pcheckList->pResults;
  315. if(pMMPolicy->dwOfferCount != pIpsecISAKMPData->dwNumISAKMPSecurityMethods)
  316. dwErrorFlag = 1;
  317. pBundle = pIpsecISAKMPData->pSecurityMethods;
  318. pOffer = pMMPolicy->pOffers;
  319. //comparing the security methods
  320. for (i = 0; i < pIpsecISAKMPData->dwNumISAKMPSecurityMethods; i++)
  321. {
  322. if(pOffer->Lifetime.uKeyExpirationKBytes != pBundle->Lifetime.KBytes)
  323. dwErrorFlag = 1;
  324. if(pOffer->Lifetime.uKeyExpirationTime != pBundle->Lifetime.Seconds)
  325. dwErrorFlag = 1;
  326. if(pOffer->dwQuickModeLimit != pBundle->QuickModeLimit)
  327. dwErrorFlag = 1;
  328. switch(pBundle->OakleyGroup)
  329. {
  330. case DH_GROUP_1:
  331. case DH_GROUP_2:
  332. if(pOffer->dwDHGroup != pBundle->OakleyGroup)
  333. dwErrorFlag = 1;
  334. break;
  335. default:
  336. if(pOffer->dwDHGroup != DH_GROUP_1)
  337. dwErrorFlag = 1;
  338. break;
  339. }//end switch
  340. switch (pBundle->EncryptionAlgorithm.AlgorithmIdentifier)
  341. {
  342. case IPSEC_ESP_DES:
  343. if(pOffer->EncryptionAlgorithm.uAlgoIdentifier != CONF_ALGO_DES)
  344. dwErrorFlag = 1;
  345. break;
  346. case IPSEC_ESP_DES_40:
  347. if(pOffer->EncryptionAlgorithm.uAlgoIdentifier != CONF_ALGO_DES)
  348. dwErrorFlag = 1;
  349. break;
  350. case IPSEC_ESP_3_DES:
  351. if(pOffer->EncryptionAlgorithm.uAlgoIdentifier != CONF_ALGO_3_DES)
  352. dwErrorFlag = 1;
  353. break;
  354. default:
  355. if(pOffer->EncryptionAlgorithm.uAlgoIdentifier != CONF_ALGO_NONE)
  356. dwErrorFlag = 1;
  357. break;
  358. }//end of switch
  359. if(pOffer->HashingAlgorithm.uAlgoKeyLen != pBundle->HashAlgorithm.KeySize)
  360. dwErrorFlag = 1;
  361. if( pOffer->HashingAlgorithm.uAlgoRounds != pBundle->HashAlgorithm.Rounds)
  362. dwErrorFlag = 1;
  363. switch(pBundle->HashAlgorithm.AlgorithmIdentifier)
  364. {
  365. case IPSEC_AH_MD5:
  366. if(pOffer->HashingAlgorithm.uAlgoIdentifier != AUTH_ALGO_MD5)
  367. dwErrorFlag = 1;
  368. break;
  369. case IPSEC_AH_SHA:
  370. if(pOffer->HashingAlgorithm.uAlgoIdentifier != AUTH_ALGO_SHA1)
  371. dwErrorFlag = 1;
  372. break;
  373. default:
  374. if(pOffer->HashingAlgorithm.uAlgoIdentifier != AUTH_ALGO_NONE)
  375. dwErrorFlag = 1;
  376. break;
  377. }//end of switch
  378. }//end of for
  379. if(dwErrorFlag){
  380. //print the error message for MM Policy Check
  381. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  382. Nd_Verbose, IDS_SPD_MM_POLICY);
  383. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  384. Nd_Verbose, IDS_SPD_STORAGE_FILTER);
  385. PrintISAKMPDataList(pcheckList,
  386. pIpsecISAKMPData);
  387. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  388. Nd_Verbose, IDS_SPD);
  389. PrintMMPolicy(pcheckList, *pMMPolicy);
  390. gErrorFlag = 1;
  391. }
  392. return;
  393. }
  394. void NFAProcess(CHECKLIST *pcheckList, HANDLE hPolicyStore, IPSEC_POLICY_DATA *pIpsecPolicyData )
  395. //++
  396. //Description:
  397. //Performs Check for all the rules of the active policy
  398. //
  399. //Arguments:
  400. // IN/OUT checklist
  401. // IN hPolicyStore
  402. // IN pIpsecPolicyData
  403. //
  404. //Return:
  405. // none
  406. //Author:
  407. // Madhurima Pawar (mpawar) 10/15/01
  408. //--
  409. {
  410. POLICYPARAMS policyParams;
  411. DWORD dwError = ERROR_SUCCESS,
  412. i = 0,
  413. dwNumNFAObjects = 0,
  414. dwFlag = 0;
  415. PIPSEC_NFA_DATA *ppIpsecNFAData = NULL;
  416. NETDIAG_PARAMS* pParams = pcheckList->pParams;
  417. NETDIAG_RESULT* pResults = pcheckList->pResults;
  418. //get all the rules from SPD for the assigned policy
  419. dwError = IPSecEnumNFAData(hPolicyStore,
  420. pIpsecPolicyData->PolicyIdentifier,
  421. &ppIpsecNFAData,
  422. &dwNumNFAObjects
  423. );
  424. reportErr();
  425. _ASSERT(ppIpsecNFAData);
  426. //initialize the filter list
  427. gpFilterList = NULL;
  428. dwNumofFilters = 0;
  429. for(i = 0; i <dwNumNFAObjects; i++ )
  430. {
  431. //initialize the filterParams
  432. policyParams.hPolicyStore = hPolicyStore;
  433. policyParams.dwFlags= 0;
  434. //check if the rule is active
  435. if(!ppIpsecNFAData[i]->dwActiveFlag)
  436. continue;
  437. DefaultRuleCheck(ppIpsecNFAData[i], &policyParams);
  438. //if rule is default, no filters present
  439. //check for default auth methods and QM Policies
  440. dwFlag = policyParams.dwFlags & PROCESS_NONE;
  441. if(PROCESS_NONE == dwFlag){
  442. MMAuthCheck(pcheckList,
  443. ppIpsecNFAData[i],
  444. ppIpsecNFAData[i]->NFAIdentifier,
  445. &policyParams);
  446. QMPolicyCheck(pcheckList,
  447. ppIpsecNFAData[i],
  448. ppIpsecNFAData[i]->NegPolIdentifier,
  449. &policyParams);
  450. continue;
  451. }
  452. switch(ppIpsecNFAData[i]->dwTunnelFlags)
  453. {
  454. case 0:
  455. dwError = TransportFilterCheck(pcheckList, &policyParams, ppIpsecNFAData[i]);
  456. break;
  457. case 1:
  458. dwError = TunnelFilterCheck(pcheckList, &policyParams, ppIpsecNFAData[i]);
  459. break;
  460. }//end switch
  461. }//end for
  462. error:
  463. if(ppIpsecNFAData){
  464. IPSecFreeMulNFAData(ppIpsecNFAData, dwNumNFAObjects);
  465. ppIpsecNFAData = NULL;
  466. }
  467. return ;
  468. }
  469. void MMAuthCheck(CHECKLIST *pcheckList,
  470. PIPSEC_NFA_DATA pIpsecNFAData,
  471. GUID gMMAuthID,
  472. PPOLICYPARAMS ppolicyParams )
  473. //++
  474. //Description:
  475. //Performs Main Mode Authentication Check
  476. //
  477. //Arguments:
  478. // IN/OUT checklist
  479. // IN PIPSEC_NFA_DATA
  480. // IN gMMAuthID
  481. // IN/OUT PPOLICYPARAMS
  482. //
  483. //Return:
  484. // none
  485. //Author:
  486. // Madhurima Pawar (mpawar) 10/15/01
  487. //--
  488. {
  489. PIPSEC_AUTH_METHOD pAuthMethod = NULL,
  490. *ppTempAuthMethods = NULL;
  491. PMM_AUTH_METHODS pMMAuthMethods = NULL;
  492. PINT_MM_AUTH_METHODS pIntMMAuthMethods = NULL;
  493. PINT_IPSEC_MM_AUTH_INFO pTempAuthInfo = NULL;
  494. PBYTE pEncodedName = NULL;
  495. DWORD dwError = ERROR_SUCCESS,
  496. dwAuthMethodCount = 0,
  497. dwFlag = 0,
  498. i = 0,
  499. dwEncodedLength;
  500. NETDIAG_PARAMS* pParams = pcheckList->pParams;
  501. NETDIAG_RESULT* pResults = pcheckList->pResults;
  502. //initialize variables
  503. pEncodedName = (PBYTE)malloc(sizeof(BYTE));
  504. if(!pEncodedName){
  505. //reportErr(IDS_SPD_MEM_ERROR);
  506. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  507. Nd_Verbose, IDS_SPD_MEM_ERROR);
  508. gErrorFlag = 1;
  509. goto error;
  510. }
  511. //get MM Auth methods from SPD
  512. dwError = GetMMAuthMethods(NULL,
  513. 0,
  514. gMMAuthID,
  515. &pMMAuthMethods,
  516. NULL);
  517. if(dwError)
  518. {
  519. for (i=0;i<(pIpsecNFAData->dwAuthMethodCount);i++)
  520. {
  521. if(pIpsecNFAData->ppAuthMethods[i]){
  522. PrintAuthMethodsList( pcheckList,
  523. pAuthMethod);
  524. }
  525. }
  526. gErrorFlag = 1;
  527. goto error;
  528. }//end of dwError
  529. _ASSERT(pMMAuthMethods);
  530. //convert the ext auth structure to int auth structure
  531. if ((dwError = ConvertExtMMAuthToInt(pMMAuthMethods, &pIntMMAuthMethods)) != ERROR_SUCCESS)
  532. reportErr();
  533. //check for default rule
  534. dwFlag = ppolicyParams->dwFlags & PROCESS_NONE;
  535. if(PROCESS_NONE == dwFlag){
  536. dwFlag = pIntMMAuthMethods->dwFlags & IPSEC_MM_AUTH_DEFAULT_AUTH;
  537. if(IPSEC_MM_AUTH_DEFAULT_AUTH != dwFlag )
  538. dwError = -1;
  539. }else{
  540. if(pIntMMAuthMethods->dwFlags)
  541. dwError = -1;
  542. }//end else
  543. //check for auth method count
  544. if(pIpsecNFAData->dwAuthMethodCount != pIntMMAuthMethods->dwNumAuthInfos)
  545. dwError = -1;
  546. ppTempAuthMethods = pIpsecNFAData->ppAuthMethods;
  547. pTempAuthInfo = pIntMMAuthMethods->pAuthenticationInfo;
  548. for (i = 0; i < pIntMMAuthMethods->dwNumAuthInfos; i++) {
  549. pAuthMethod = *(ppTempAuthMethods + i);
  550. if(pTempAuthInfo->AuthMethod != (MM_AUTH_ENUM) pAuthMethod->dwAuthType)
  551. dwError = -1;
  552. switch((MM_AUTH_ENUM) pAuthMethod->dwAuthType) {
  553. case IKE_SSPI:
  554. if(pTempAuthInfo->dwAuthInfoSize)
  555. dwError = -1;
  556. if(pTempAuthInfo->pAuthInfo)
  557. dwError = -1;
  558. break;
  559. case IKE_RSA_SIGNATURE:
  560. if (pAuthMethod->dwAltAuthLen && pAuthMethod->pAltAuthMethod) {
  561. if(pTempAuthInfo->dwAuthInfoSize != pAuthMethod->dwAltAuthLen)
  562. dwError = -1;
  563. if(memcmp(pTempAuthInfo->pAuthInfo,pAuthMethod->pAltAuthMethod,pAuthMethod->dwAuthLen))
  564. dwError = -1;
  565. }else {
  566. if (!CertStrToName(X509_ASN_ENCODING,
  567. (LPCSTR)pAuthMethod->pszAuthMethod,
  568. CERT_X500_NAME_STR,
  569. NULL,
  570. NULL,
  571. &dwEncodedLength,
  572. NULL)) {
  573. reportErr();
  574. }//end if
  575. if(dwEncodedLength != pTempAuthInfo->dwAuthInfoSize)
  576. dwError = -1;
  577. if (!CertStrToName(X509_ASN_ENCODING,
  578. (LPCSTR)pAuthMethod->pszAuthMethod,
  579. CERT_X500_NAME_STR,
  580. NULL,
  581. pEncodedName,
  582. &dwEncodedLength,
  583. NULL)) {
  584. reportErr();
  585. }//end if
  586. if(memcmp(pEncodedName, pTempAuthInfo->pAuthInfo,dwEncodedLength))
  587. dwError = -1;
  588. }//end else
  589. break;
  590. default:
  591. if(pTempAuthInfo->dwAuthInfoSize != ((pAuthMethod->dwAuthLen)*sizeof(WCHAR)))
  592. dwError = -1;
  593. if(memcmp(pTempAuthInfo->pAuthInfo,
  594. (LPBYTE)pAuthMethod->pszAuthMethod,
  595. (pAuthMethod->dwAuthLen)*sizeof(WCHAR)))
  596. dwError = -1;
  597. break;
  598. }//end switch
  599. pTempAuthInfo++;
  600. }//end for
  601. if(dwError){
  602. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  603. Nd_Verbose, IDS_SPD_AUTH_ERROR);
  604. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  605. Nd_Verbose, IDS_SPD_STORAGE_FILTER);
  606. for (i=0;i<(pIpsecNFAData->dwAuthMethodCount);i++)
  607. {
  608. if(pIpsecNFAData->ppAuthMethods[i]){
  609. PrintAuthMethodsList( pcheckList, pAuthMethod);
  610. }
  611. }//end of for
  612. gErrorFlag = 1;
  613. //print Error
  614. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  615. Nd_Verbose, IDS_SPD);
  616. //print from SPD
  617. if((PrintMMAuth(pcheckList, pIntMMAuthMethods)) ==S_FALSE)
  618. reportErr();
  619. gErrorFlag = 1;
  620. }
  621. error:
  622. if(pMMAuthMethods){
  623. SPDApiBufferFree((LPVOID)pMMAuthMethods);
  624. pMMAuthMethods = NULL;
  625. }
  626. if(pIntMMAuthMethods){
  627. FreeIntMMAuthMethods(pIntMMAuthMethods);
  628. pIntMMAuthMethods = NULL;
  629. }
  630. if(pEncodedName){
  631. Free(pEncodedName);
  632. pEncodedName = NULL;
  633. }
  634. return ;
  635. }
  636. void DefaultRuleCheck( PIPSEC_NFA_DATA pIpsecNFAData,
  637. PPOLICYPARAMS ppolicyParams)
  638. //++
  639. //Description:
  640. //Performs Check for presence of Default Rule and permit/block filters
  641. //
  642. //Arguments:
  643. // IN PIPSEC_NFA_DATA
  644. // IN/OUT PPOLICYPARAMS
  645. //
  646. //Return:
  647. // none
  648. //Author:
  649. // Madhurima Pawar (mpawar) 10/15/01
  650. //--
  651. {
  652. DWORD dwError = ERROR_SUCCESS;
  653. IPSEC_NEGPOL_DATA *pIpsecNegPolData = NULL;
  654. //get the negpolicy from Polstore
  655. dwError = IPSecGetNegPolData(ppolicyParams->hPolicyStore,
  656. pIpsecNFAData->NegPolIdentifier,//negPolIndentifier
  657. &pIpsecNegPolData);
  658. if(dwError)
  659. {
  660. _tprintf(TEXT("Error: %d NegPolicy absent in Polstore\n"), dwError);
  661. goto error;
  662. }//end dwError
  663. _ASSERT(pIpsecNegPolData);
  664. if(IsEqualGUID(&(GUID_NEGOTIATION_ACTION_NO_IPSEC),
  665. &(pIpsecNegPolData->NegPolAction)) ||
  666. IsEqualGUID(&(pIpsecNegPolData->NegPolAction),
  667. &(GUID_NEGOTIATION_ACTION_BLOCK))){
  668. ppolicyParams->dwFlags |= PROCESS_QM_FILTER;
  669. }else if(IsEqualGUID(&(GUID_NEGOTIATION_TYPE_DEFAULT),
  670. &(pIpsecNegPolData->NegPolType)))
  671. ppolicyParams->dwFlags |= PROCESS_NONE;
  672. else
  673. ppolicyParams->dwFlags |= PROCESS_BOTH;
  674. //NegPolAction requred while checking for Filter Action (block/permit)
  675. ppolicyParams->gNegPolAction = pIpsecNegPolData->NegPolAction;
  676. error:
  677. if(pIpsecNegPolData){
  678. IPSecFreeNegPolData(pIpsecNegPolData);
  679. pIpsecNegPolData = NULL;
  680. }
  681. return;
  682. }
  683. void QMPolicyCheck(CHECKLIST *pcheckList,
  684. PIPSEC_NFA_DATA pIpsecNFAData,
  685. GUID gPolicyID,
  686. PPOLICYPARAMS ppolicyParams)
  687. //++
  688. //Description:
  689. //Performs Quick Mode Policy Check
  690. //
  691. //Arguments:
  692. // IN/OUT checklist
  693. // IN pIpsecNFAData
  694. // IN gPolicyID
  695. // OUT ppolicyParams
  696. //
  697. //Return:
  698. // none
  699. //
  700. //Author:
  701. // Madhurima Pawar (mpawar) 10/15/01
  702. //--
  703. {
  704. DWORD dwError = ERROR_SUCCESS;
  705. IPSEC_QM_POLICY *pQMPolicy = NULL;
  706. IPSEC_NEGPOL_DATA *pIpsecNegPolData = NULL;
  707. NETDIAG_PARAMS* pParams = pcheckList->pParams;
  708. NETDIAG_RESULT* pResults = pcheckList->pResults;
  709. //get the negpolicy from Polstore
  710. dwError = IPSecGetNegPolData(ppolicyParams->hPolicyStore,
  711. pIpsecNFAData->NegPolIdentifier,//negPolIndentifier
  712. &pIpsecNegPolData);
  713. reportErr();
  714. _ASSERT(pIpsecNegPolData);
  715. dwError = GetQMPolicyByID(NULL,
  716. 0,
  717. gPolicyID,
  718. 0,
  719. &pQMPolicy,
  720. NULL);
  721. if(dwError)
  722. {
  723. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  724. Nd_Verbose, IDS_SPD_NEG_POLICY_ABSENT);
  725. PrintNegPolDataList( pcheckList,
  726. pIpsecNegPolData);
  727. gErrorFlag = 1;
  728. goto error;
  729. }//end of if dwError*/
  730. _ASSERT(pQMPolicy);
  731. if(CompareQMPolicies(pcheckList,
  732. ppolicyParams,
  733. pIpsecNFAData->dwTunnelFlags,
  734. pIpsecNegPolData,
  735. pQMPolicy))
  736. {
  737. //report error
  738. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  739. Nd_Verbose, IDS_SPD_NEG_POLICY);
  740. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  741. Nd_Verbose, IDS_SPD_STORAGE_FILTER);
  742. PrintNegPolDataList( pcheckList,
  743. pIpsecNegPolData);
  744. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  745. Nd_Verbose, IDS_SPD);
  746. PrintFilterAction(pcheckList, *pQMPolicy);
  747. gErrorFlag = 1;
  748. }
  749. error:
  750. if(pIpsecNegPolData){
  751. IPSecFreeNegPolData(pIpsecNegPolData);
  752. pIpsecNegPolData = NULL;
  753. }
  754. if(pQMPolicy){
  755. SPDApiBufferFree((LPVOID)pQMPolicy);
  756. pQMPolicy= NULL;
  757. }
  758. return;
  759. }
  760. DWORD CompareQMPolicies(CHECKLIST *pcheckList,
  761. PPOLICYPARAMS ppolicyParams,
  762. DWORD dwTunnelFlag,
  763. IPSEC_NEGPOL_DATA *pIpsecNegPolData,
  764. IPSEC_QM_POLICY *pQMPolicy)
  765. //++
  766. //Description:
  767. //Compares QM Policies with the Polsore NegPolicyData
  768. //
  769. //Arguments:
  770. // IN/OUT CHECKLIST
  771. // IN PPOLICYPARAMS
  772. // IN dwTunnelFlag
  773. // IN IPSEC_NEGPOL_DATA
  774. // IN IPSEC_QM_POLICY
  775. //
  776. //Return:
  777. // success or failure code
  778. //
  779. //Author:
  780. // Madhurima Pawar (mpawar) 10/15/01
  781. //--
  782. {
  783. DWORD dwFlag = 0,
  784. i = 0,
  785. dwOfferCount = 0,
  786. dwTempOfferCount = 0;
  787. PIPSEC_SECURITY_METHOD pIpsecSecurityMethods = NULL,
  788. pTempMethod = NULL;
  789. BOOL bAllowsSoft = FALSE;
  790. PIPSEC_QM_OFFER pTempOffer = NULL;
  791. if (pIpsecNegPolData->dwSecurityMethodCount > IPSEC_MAX_QM_OFFERS) {
  792. dwTempOfferCount = IPSEC_MAX_QM_OFFERS;
  793. }
  794. else {
  795. dwTempOfferCount = pIpsecNegPolData->dwSecurityMethodCount;
  796. }
  797. pTempMethod = pIpsecNegPolData->pIpsecSecurityMethods;
  798. for (i = 0; i < dwTempOfferCount; i++) {
  799. if (pTempMethod->Count == 0) {
  800. bAllowsSoft = TRUE;
  801. }//end if
  802. else {
  803. dwOfferCount++;
  804. }//end else
  805. pTempMethod++;
  806. }//end for
  807. //comparing offers
  808. pTempOffer = pQMPolicy->pOffers;
  809. pTempMethod = pIpsecNegPolData->pIpsecSecurityMethods;
  810. i = 0;
  811. while (i < dwOfferCount) {
  812. if (pTempMethod->Count) {
  813. if(CompareQMOffers(pTempMethod, pTempOffer))
  814. return -1;
  815. i++;
  816. pTempOffer++;
  817. }
  818. pTempMethod++;
  819. }//end of while
  820. if(dwOfferCount != pQMPolicy->dwOfferCount)
  821. return -1;
  822. //
  823. if (!memcmp(&(pIpsecNegPolData->NegPolType), &(GUID_NEGOTIATION_TYPE_DEFAULT), sizeof(GUID))){
  824. dwFlag = pQMPolicy->dwFlags & IPSEC_QM_POLICY_DEFAULT_POLICY;
  825. if(dwFlag != IPSEC_QM_POLICY_DEFAULT_POLICY)
  826. return -1;
  827. }
  828. if (dwTunnelFlag) {
  829. dwFlag = pQMPolicy->dwFlags & IPSEC_QM_POLICY_TUNNEL_MODE;
  830. if(dwFlag != IPSEC_QM_POLICY_TUNNEL_MODE)
  831. return -1;
  832. }
  833. dwFlag = ppolicyParams->dwFlags & ALLOW_SOFT;
  834. if (ALLOW_SOFT == dwFlag) {
  835. dwFlag = pQMPolicy->dwFlags & IPSEC_QM_POLICY_ALLOW_SOFT;
  836. if(dwFlag != IPSEC_QM_POLICY_ALLOW_SOFT)
  837. return -1;
  838. }//end if ALLOW_SOFT
  839. if(0 != pQMPolicy->dwReserved)
  840. return -1;
  841. return 0;
  842. }
  843. DWORD CompareQMOffers(PIPSEC_SECURITY_METHOD pMethod, PIPSEC_QM_OFFER pOffer)
  844. //++
  845. //Description:
  846. //Compares QM offers in SPD Polsore
  847. //
  848. //Arguments:
  849. // IN PIPSEC_SECURITY_METHOD
  850. // IN PIPSEC_QM_OFFER
  851. //
  852. //Return:
  853. // success or failure
  854. //
  855. //Author:
  856. // Madhurima Pawar (mpawar) 10/15/01
  857. //--
  858. {
  859. DWORD i = 0,
  860. j = 0,
  861. k = 0;
  862. if(pOffer->Lifetime.uKeyExpirationKBytes != pMethod->Lifetime.KeyExpirationBytes)
  863. return -1;
  864. if(pOffer->Lifetime.uKeyExpirationTime != pMethod->Lifetime.KeyExpirationTime)
  865. return -1;
  866. if(pOffer->dwFlags != pMethod->Flags)
  867. return -1;
  868. if(pOffer->bPFSRequired != pMethod->PfsQMRequired)
  869. return -1;
  870. if (pMethod->PfsQMRequired) {
  871. if(PFS_GROUP_MM != pOffer->dwPFSGroup )
  872. return -1;
  873. }
  874. else {
  875. if(PFS_GROUP_NONE != pOffer->dwPFSGroup)
  876. return -1;
  877. }
  878. i = 0;
  879. for (j = 0; (j < pMethod->Count) && (i < QM_MAX_ALGOS) ; j++) {
  880. switch (pMethod->Algos[j].operation) {
  881. case Auth:
  882. switch (pMethod->Algos[j].algoIdentifier) {
  883. case IPSEC_AH_MD5:
  884. if(AUTH_ALGO_MD5 != pOffer->Algos[i].uAlgoIdentifier)
  885. return -1;
  886. break;
  887. case IPSEC_AH_SHA:
  888. if(AUTH_ALGO_SHA1 != pOffer->Algos[i].uAlgoIdentifier)
  889. return -1;
  890. break;
  891. default:
  892. if(AUTH_ALGO_NONE != pOffer->Algos[i].uAlgoIdentifier)
  893. return -1;
  894. break;
  895. }//end switch(pMethod->Algos[j].algoIdentifier)
  896. if(HMAC_AUTH_ALGO_NONE != pOffer->Algos[i].uSecAlgoIdentifier)
  897. return -1;
  898. if(AUTHENTICATION != pOffer->Algos[i].Operation)
  899. return -1;
  900. if(pOffer->Algos[i].uAlgoKeyLen != pMethod->Algos[j].algoKeylen)
  901. return -1;
  902. if(pOffer->Algos[i].uAlgoRounds != pMethod->Algos[j].algoRounds)
  903. return -1;
  904. if(0 != pOffer->Algos[i].uSecAlgoKeyLen)
  905. return -1;
  906. if(0 != pOffer->Algos[i].uSecAlgoRounds)
  907. return -1;
  908. if(0 != pOffer->Algos[i].MySpi)
  909. return -1;
  910. if(0 != pOffer->Algos[i].PeerSpi )
  911. return -1;
  912. i++;
  913. break;
  914. case Encrypt:
  915. switch (pMethod->Algos[j].algoIdentifier) {
  916. case IPSEC_ESP_DES:
  917. if(CONF_ALGO_DES != pOffer->Algos[i].uAlgoIdentifier)
  918. return -1;
  919. break;
  920. case IPSEC_ESP_DES_40:
  921. if(CONF_ALGO_DES != pOffer->Algos[i].uAlgoIdentifier)
  922. return -1;
  923. break;
  924. case IPSEC_ESP_3_DES:
  925. if(CONF_ALGO_3_DES != pOffer->Algos[i].uAlgoIdentifier)
  926. return -1;
  927. break;
  928. default:
  929. if(CONF_ALGO_NONE != pOffer->Algos[i].uAlgoIdentifier)
  930. return -1;
  931. break;
  932. }//end switch (pMethod->Algos[j].algoIdentifier)
  933. switch (pMethod->Algos[j].secondaryAlgoIdentifier) {
  934. case IPSEC_AH_MD5:
  935. if(HMAC_AUTH_ALGO_MD5 != pOffer->Algos[i].uSecAlgoIdentifier)
  936. return -1;
  937. break;
  938. case IPSEC_AH_SHA:
  939. if(HMAC_AUTH_ALGO_SHA1 != pOffer->Algos[i].uSecAlgoIdentifier)
  940. return -1;
  941. break;
  942. default:
  943. if(HMAC_AUTH_ALGO_NONE != pOffer->Algos[i].uSecAlgoIdentifier)
  944. return -1;
  945. break;
  946. }//end switch (pMethod->Algos[j].secondaryAlgoIdentifier)
  947. if(ENCRYPTION != pOffer->Algos[i].Operation)
  948. return -1;
  949. if(pOffer->Algos[i].uAlgoKeyLen != pMethod->Algos[j].algoKeylen)
  950. return -1;
  951. if(pOffer->Algos[i].uAlgoRounds != pMethod->Algos[j].algoRounds)
  952. return -1;
  953. if(0 != pOffer->Algos[i].uSecAlgoKeyLen)
  954. return -1;
  955. if(0 != pOffer->Algos[i].uSecAlgoRounds)
  956. return -1;
  957. if(0 != pOffer->Algos[i].MySpi)
  958. return -1;
  959. if(0 != pOffer->Algos[i].PeerSpi)
  960. return -1;
  961. i++;
  962. break;
  963. case None:
  964. case Compress:
  965. default:
  966. break;
  967. }//end switch (pMethod->Algos[j].operation)
  968. }//end for
  969. if(pOffer->dwNumAlgos != i)
  970. return -1;
  971. return 0;
  972. }
  973. DWORD TransportFilterCheck(CHECKLIST* pcheckList,
  974. POLICYPARAMS *ppolicyParams,
  975. PIPSEC_NFA_DATA pIpsecNFAData)
  976. //++
  977. //Description:
  978. //Performs Transport Mode Filter Check
  979. //
  980. //Arguments:
  981. // IN/OUT checklist
  982. // IN/OUT POLICYPARAMS
  983. // IN PIPSEC_NFA_DATA
  984. //
  985. //Returns:
  986. // Success or Failure
  987. //
  988. //Author:
  989. // Madhurima Pawar (mpawar) 10/15/01
  990. //--
  991. {
  992. DWORD dwError = ERROR_SUCCESS,
  993. dwNumFilters = 0,
  994. dwResumeHandle = 0,
  995. i = 0,
  996. dwFlag = 0;
  997. GUID gGenericFilterID = {0};
  998. TRANSPORT_FILTER *pTransportFilters = NULL;
  999. IPSEC_FILTER_DATA *pIpsecFilterData = NULL;
  1000. IPSEC_FILTER_SPEC *pIpsecFilterSpec = NULL;
  1001. FILTERLIST *pTempList = NULL;
  1002. NETDIAG_PARAMS* pParams = pcheckList->pParams;
  1003. NETDIAG_RESULT* pResults = pcheckList->pResults;
  1004. //get the filter from the polstore
  1005. dwError = IPSecGetFilterData(
  1006. ppolicyParams->hPolicyStore,
  1007. pIpsecNFAData->FilterIdentifier,
  1008. &pIpsecFilterData);
  1009. reportErr();
  1010. _ASSERT(pIpsecFilterData);
  1011. //process each filter from filter data
  1012. for(i = 0; i < pIpsecFilterData->dwNumFilterSpecs; i ++)
  1013. {
  1014. pIpsecFilterSpec = pIpsecFilterData->ppFilterSpecs[i];
  1015. _ASSERT(pIpsecFilterSpec);
  1016. dwResumeHandle = 0;
  1017. while(1)
  1018. {
  1019. //match transport filter from spd
  1020. dwError = EnumTransportFilters(
  1021. NULL,
  1022. 0,
  1023. NULL,
  1024. ENUM_GENERIC_FILTERS,
  1025. gGenericFilterID,
  1026. 0, //max limit set by spd server
  1027. &pTransportFilters,
  1028. &dwNumFilters,
  1029. &dwResumeHandle,
  1030. NULL
  1031. );
  1032. if(dwError)
  1033. {
  1034. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  1035. Nd_Verbose, IDS_SPD_FILTER_ABSENT);
  1036. PrintFilterSpecList(pcheckList,
  1037. pIpsecFilterSpec,
  1038. pIpsecNFAData);
  1039. gErrorFlag = 1;
  1040. goto error;
  1041. }//end if
  1042. _ASSERT(pTransportFilters);
  1043. Match(pIpsecFilterSpec->FilterSpecGUID, pTransportFilters, dwNumFilters);
  1044. if(dwNumFilters != -1)
  1045. {
  1046. if(dwNumofFilters){
  1047. dwError = CheckFilterList(pIpsecFilterSpec->Filter);
  1048. if(-1 != dwError)
  1049. break;
  1050. }
  1051. //add filter to the list
  1052. pTempList = GetNode(pcheckList,pIpsecFilterSpec->Filter);
  1053. AddNodeToList(pTempList);
  1054. if(CompareTransportFilter(pcheckList,
  1055. ppolicyParams,
  1056. pIpsecNFAData,
  1057. pIpsecFilterSpec,
  1058. &(pTransportFilters[dwNumFilters])))
  1059. {
  1060. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  1061. Nd_Verbose, IDS_SPD_FILTER);
  1062. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  1063. Nd_Verbose, IDS_SPD_STORAGE_FILTER);
  1064. PrintFilterSpecList(pcheckList,
  1065. pIpsecFilterSpec,
  1066. pIpsecNFAData);
  1067. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  1068. Nd_Verbose, IDS_SPD);
  1069. PrintTxFilter( pcheckList,
  1070. pTransportFilters[dwNumFilters]);
  1071. gErrorFlag = 1;
  1072. }
  1073. dwFlag = ppolicyParams->dwFlags & PROCESS_BOTH;
  1074. if(PROCESS_BOTH == dwFlag)
  1075. MMFilterCheck(pcheckList,
  1076. ppolicyParams,
  1077. pIpsecNFAData,
  1078. pIpsecFilterSpec);
  1079. break;
  1080. }
  1081. if(pTransportFilters){
  1082. SPDApiBufferFree((LPVOID)pTransportFilters);
  1083. pTransportFilters = NULL;
  1084. }
  1085. dwNumFilters = 0;
  1086. }//end while
  1087. if(pTransportFilters){
  1088. SPDApiBufferFree((LPVOID)pTransportFilters);
  1089. pTransportFilters = NULL;
  1090. }
  1091. dwNumFilters = 0;
  1092. }//end for
  1093. error:
  1094. if(pIpsecFilterData){
  1095. IPSecFreeFilterData(pIpsecFilterData);
  1096. pIpsecFilterData = NULL;
  1097. }
  1098. if(pTransportFilters){
  1099. SPDApiBufferFree((LPVOID)pTransportFilters);
  1100. pTransportFilters = NULL;
  1101. }
  1102. return dwError;
  1103. }
  1104. DWORD CompareTransportFilter(CHECKLIST* pcheckList,
  1105. POLICYPARAMS *ppolicyParams,
  1106. PIPSEC_NFA_DATA pIpsecNFAData,
  1107. IPSEC_FILTER_SPEC *pFilterSpec,
  1108. TRANSPORT_FILTER *pTxFilter)
  1109. //++
  1110. //Description:
  1111. //Performs Transport Mode Filter Check
  1112. //
  1113. //Arguments:
  1114. // IN/OUT checklist
  1115. // IN/OUT POLICYPARAMS
  1116. // IN PIPSEC_NFA_DATA
  1117. // IN IPSEC_FILTER_SPEC
  1118. // IN TRANSPORT_FILTER
  1119. //
  1120. //Return:
  1121. // failure or success
  1122. //Author:
  1123. // Madhurima Pawar (mpawar) 10/15/01
  1124. //--
  1125. {
  1126. DWORD dwFlag = 0,
  1127. dwError = ERROR_SUCCESS;
  1128. NETDIAG_PARAMS* pParams = pcheckList->pParams;
  1129. NETDIAG_RESULT* pResults = pcheckList->pResults;
  1130. if(IPSEC_PROTOCOL_V4 != pTxFilter->IpVersion)
  1131. return -1;
  1132. //interface type
  1133. if(ComparePAInterfaceType(pcheckList, pIpsecNFAData->dwInterfaceType, pTxFilter->InterfaceType))
  1134. return -1;
  1135. if(pTxFilter->bCreateMirror != (BOOL) pFilterSpec->dwMirrorFlag)
  1136. return -1;
  1137. dwFlag = ComparePAAddress(pcheckList, pFilterSpec->Filter.SrcMask, pFilterSpec->Filter.SrcAddr, pTxFilter->SrcAddr);
  1138. //taking care of filters to special servers
  1139. if(1 == dwFlag)
  1140. {
  1141. if (pFilterSpec->Filter.ExType) {
  1142. if (pFilterSpec->Filter.ExType & EXT_DEST) {
  1143. if(pTxFilter->DesAddr.AddrType !=
  1144. ExTypeToAddrType(pFilterSpec->Filter.ExType))
  1145. return -1;
  1146. } else {
  1147. if(pTxFilter->SrcAddr.AddrType !=
  1148. ExTypeToAddrType(pFilterSpec->Filter.ExType))
  1149. return -1;
  1150. }
  1151. }//end if
  1152. }else if(-1 == dwFlag){
  1153. return -1;
  1154. }
  1155. dwFlag = ComparePAAddress(pcheckList, pFilterSpec->Filter.DestMask,pFilterSpec->Filter.DestAddr, pTxFilter->DesAddr);
  1156. if(1 == dwFlag)
  1157. {
  1158. if (pFilterSpec->Filter.ExType) {
  1159. if (pFilterSpec->Filter.ExType & EXT_DEST) {
  1160. if(pTxFilter->DesAddr.AddrType !=
  1161. ExTypeToAddrType(pFilterSpec->Filter.ExType))
  1162. return -1;
  1163. } else {
  1164. if(pTxFilter->SrcAddr.AddrType !=
  1165. ExTypeToAddrType(pFilterSpec->Filter.ExType))
  1166. return -1;
  1167. }
  1168. }//end if
  1169. }else if(-1 == dwFlag){
  1170. return -1;
  1171. }
  1172. if(pTxFilter->Protocol.ProtocolType != PROTOCOL_UNIQUE)
  1173. return -1;
  1174. if(pTxFilter->Protocol.dwProtocol != pFilterSpec->Filter.Protocol)
  1175. return -1;
  1176. if(pTxFilter->SrcPort.PortType != PORT_UNIQUE)
  1177. return -1;
  1178. if(pTxFilter->SrcPort.wPort != pFilterSpec->Filter.SrcPort)
  1179. return -1;
  1180. if(pTxFilter->DesPort.PortType != PORT_UNIQUE)
  1181. return -1;
  1182. if(pTxFilter->DesPort.wPort != pFilterSpec->Filter.DestPort)
  1183. return -1;
  1184. if(pTxFilter->bCreateMirror != (BOOL) pFilterSpec->dwMirrorFlag)
  1185. return -1;
  1186. if(CompareFilterActions(pcheckList,
  1187. ppolicyParams,
  1188. pTxFilter->InboundFilterAction,
  1189. pTxFilter->OutboundFilterAction))
  1190. return -1;
  1191. //for block/permit the QM Policy is absent
  1192. dwFlag = ppolicyParams->dwFlags & PROCESS_QM_FILTER;
  1193. if(PROCESS_QM_FILTER != dwFlag)
  1194. QMPolicyCheck(pcheckList,
  1195. pIpsecNFAData,
  1196. pTxFilter->gPolicyID,
  1197. ppolicyParams);
  1198. return 0;
  1199. }
  1200. DWORD CheckFilterList(IPSEC_FILTER Filter)
  1201. //++
  1202. //Description:
  1203. //Checks the filter against the filterList
  1204. //
  1205. //Arguments:
  1206. // IN IPSEC_FILTER
  1207. //
  1208. //Return Argument:
  1209. // success or failure
  1210. //
  1211. //Author:
  1212. // Madhurima Pawar (mpawar) 10/15/01
  1213. //--
  1214. {
  1215. DWORD iter = 0,
  1216. iReturn = 0;
  1217. FILTERLIST *pTempFilter = NULL;
  1218. iter = dwNumofFilters;
  1219. pTempFilter = gpFilterList;
  1220. while(iter--){
  1221. iReturn = CompareAddress(pTempFilter->ipsecFilter, Filter);
  1222. if(-1 != iReturn);
  1223. return iReturn; //return the location of filter in the list
  1224. pTempFilter = pTempFilter->next;
  1225. }//end for loop
  1226. return iter; //-1 if filter not present in the list
  1227. }
  1228. DWORD CompareAddress(IPSEC_FILTER ListFilter, IPSEC_FILTER Filter)
  1229. {
  1230. if(memcmp(&(ListFilter.SrcAddr), &(Filter.SrcAddr), sizeof(IPAddr)))
  1231. return -1;
  1232. if(memcmp(&(ListFilter.SrcMask), &(Filter.SrcMask), sizeof(IPMask)))
  1233. return -1;
  1234. if(memcmp(&(ListFilter.DestAddr),&( Filter.DestAddr), sizeof(IPAddr)))
  1235. return -1;
  1236. if(memcmp(&(ListFilter.DestMask), &(Filter.DestMask), sizeof(IPMask)))
  1237. return -1;
  1238. if(memcmp(&(ListFilter.TunnelAddr), &(Filter.TunnelAddr), sizeof(IPAddr)))
  1239. return -1;
  1240. if(ListFilter.Protocol != Filter.Protocol)
  1241. return -1;
  1242. if(ListFilter.SrcPort != Filter.SrcPort)
  1243. return -1;
  1244. if(ListFilter.DestPort != Filter.DestPort)
  1245. return -1;
  1246. if(ListFilter.TunnelFilter != Filter.TunnelFilter)
  1247. return -1;
  1248. return 0;
  1249. }
  1250. FILTERLIST * GetNode(CHECKLIST* pcheckList, IPSEC_FILTER Filter)
  1251. //++
  1252. //Description:
  1253. //Gets node after initializing all its fields
  1254. //
  1255. //Arguments:
  1256. // IN IPSEC_FILTER
  1257. //
  1258. //Return:
  1259. // FILTERLIST
  1260. //
  1261. //Author:
  1262. // Madhurima Pawar (mpawar) 10/15/01
  1263. //--
  1264. {
  1265. FILTERLIST *pTempList = NULL;
  1266. NETDIAG_PARAMS* pParams = pcheckList->pParams;
  1267. NETDIAG_RESULT* pResults = pcheckList->pResults;
  1268. pTempList = (PFILTERLIST)malloc(sizeof(FILTERLIST));
  1269. if(!pTempList){
  1270. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput, Nd_Verbose,
  1271. IDS_SPD_MEM_ERROR );
  1272. goto error;
  1273. }
  1274. memcpy(&(pTempList->ipsecFilter.SrcAddr), &(Filter.SrcAddr), sizeof(IPAddr));
  1275. memcpy(&(pTempList->ipsecFilter.SrcMask), &(Filter.SrcMask), sizeof(IPMask));
  1276. memcpy(&(pTempList->ipsecFilter.DestAddr), &(Filter.DestAddr), sizeof(IPAddr));
  1277. memcpy(&(pTempList->ipsecFilter.DestMask), &(Filter.DestMask), sizeof(IPMask));
  1278. memcpy(&(pTempList->ipsecFilter.TunnelAddr), &(Filter.TunnelAddr), sizeof(IPAddr));
  1279. pTempList->ipsecFilter.Protocol = Filter.Protocol;
  1280. pTempList->ipsecFilter.SrcPort = Filter.SrcPort;
  1281. pTempList->ipsecFilter.DestPort = Filter.DestPort;
  1282. pTempList->ipsecFilter.TunnelFilter = Filter.TunnelFilter;
  1283. pTempList->next = NULL;
  1284. error:
  1285. return pTempList;
  1286. }
  1287. void AddNodeToList(FILTERLIST *pList)
  1288. //++
  1289. //Description:
  1290. // Adds node to a list
  1291. //
  1292. //Arguments:
  1293. // IN IPSEC_FILTER
  1294. //
  1295. //Return:
  1296. // none
  1297. //
  1298. //Author:
  1299. // Madhurima Pawar (mpawar) 10/15/01
  1300. //--
  1301. {
  1302. FILTERLIST *pTempList = NULL;
  1303. pTempList = gpFilterList;
  1304. if(!gpFilterList){
  1305. gpFilterList = pList;
  1306. dwNumofFilters ++;
  1307. return;
  1308. }
  1309. while(pTempList->next){
  1310. pTempList = pTempList->next;
  1311. }
  1312. pTempList->next = pList;
  1313. dwNumofFilters ++;
  1314. return;
  1315. }
  1316. DWORD TunnelFilterCheck(CHECKLIST* pcheckList,
  1317. POLICYPARAMS *ppolicyParams,
  1318. PIPSEC_NFA_DATA pIpsecNFAData)
  1319. //++
  1320. //Description:
  1321. //Performs Tunnel Mode Filter Check
  1322. //
  1323. //Arguments:
  1324. // IN/OUT checklist
  1325. // IN POLICYPARAMS
  1326. // IN PIPSEC_NFA_DATA
  1327. //
  1328. //Returns:
  1329. // Success or Failure
  1330. //
  1331. //Author:
  1332. // Madhurima Pawar (mpawar) 10/15/01
  1333. //--
  1334. {
  1335. DWORD dwError = ERROR_SUCCESS,
  1336. dwNumFilters = 0,
  1337. dwResumeHandle = 0,
  1338. i = 0,
  1339. dwFlag = 0;
  1340. GUID gGenericFilterID = {0};
  1341. TUNNEL_FILTER *pTunnelFilters = NULL;
  1342. IPSEC_FILTER_DATA *pIpsecFilterData = NULL;
  1343. IPSEC_FILTER_SPEC *pIpsecFilterSpec = NULL;
  1344. FILTERLIST *pTempList = NULL;
  1345. NETDIAG_PARAMS* pParams = pcheckList->pParams;
  1346. NETDIAG_RESULT* pResults = pcheckList->pResults;
  1347. //get the filter from the polstore
  1348. dwError = IPSecGetFilterData(
  1349. ppolicyParams->hPolicyStore,
  1350. pIpsecNFAData->FilterIdentifier,
  1351. &pIpsecFilterData);
  1352. reportErr();
  1353. _ASSERT(pIpsecFilterData);
  1354. //process each filter from filter data
  1355. for(i = 0; i < pIpsecFilterData->dwNumFilterSpecs; i ++)
  1356. {
  1357. pIpsecFilterSpec = pIpsecFilterData->ppFilterSpecs[i];
  1358. _ASSERT(pIpsecFilterSpec);
  1359. dwResumeHandle = 0;
  1360. while(1)
  1361. {
  1362. //match transport filter from spd
  1363. dwError = EnumTunnelFilters(
  1364. NULL,
  1365. 0,
  1366. NULL,
  1367. ENUM_GENERIC_FILTERS,
  1368. gGenericFilterID,
  1369. 0, //max limit set by spd server
  1370. &pTunnelFilters,
  1371. &dwNumFilters,
  1372. &dwResumeHandle,
  1373. NULL
  1374. );
  1375. if(dwError)
  1376. {
  1377. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  1378. Nd_Verbose, IDS_SPD_FILTER_ABSENT);
  1379. PrintFilterSpecList(pcheckList,
  1380. pIpsecFilterSpec,
  1381. pIpsecNFAData);
  1382. gErrorFlag = 1;
  1383. goto error;
  1384. }//end if
  1385. _ASSERT(pTunnelFilters);
  1386. Match(pIpsecFilterSpec->FilterSpecGUID, pTunnelFilters, dwNumFilters);
  1387. if(dwNumFilters != -1)
  1388. {
  1389. if(dwNumofFilters){
  1390. dwError = CheckFilterList(pIpsecFilterSpec->Filter);
  1391. if(-1 != dwError)
  1392. break;
  1393. }
  1394. //add filter to the list
  1395. pTempList = GetNode(pcheckList, pIpsecFilterSpec->Filter);
  1396. AddNodeToList(pTempList);
  1397. if(CompareTunnelFilter(pcheckList,
  1398. ppolicyParams,
  1399. pIpsecNFAData,
  1400. pIpsecFilterSpec,
  1401. &(pTunnelFilters[dwNumFilters])))
  1402. {
  1403. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  1404. Nd_Verbose, IDS_SPD_FILTER);
  1405. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  1406. Nd_Verbose, IDS_SPD_STORAGE_FILTER);
  1407. PrintFilterSpecList(pcheckList,
  1408. pIpsecFilterSpec,
  1409. pIpsecNFAData);
  1410. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  1411. Nd_Verbose, IDS_SPD);
  1412. PrintTnFilter(pcheckList, pTunnelFilters[dwNumFilters]);
  1413. //call function to print storage transport filter
  1414. gErrorFlag = 1;
  1415. }
  1416. dwFlag = ppolicyParams->dwFlags & PROCESS_BOTH;
  1417. if(PROCESS_BOTH == dwFlag)
  1418. MMFilterCheck(pcheckList,
  1419. ppolicyParams,
  1420. pIpsecNFAData,
  1421. pIpsecFilterSpec);
  1422. break;
  1423. }//end if dwNumFilters
  1424. if(pTunnelFilters){
  1425. SPDApiBufferFree((LPVOID)pTunnelFilters);
  1426. pTunnelFilters = NULL;
  1427. }
  1428. dwNumFilters = 0;
  1429. }//end while
  1430. if(pTunnelFilters){
  1431. SPDApiBufferFree((LPVOID)pTunnelFilters);
  1432. pTunnelFilters = NULL;
  1433. }
  1434. dwNumFilters = 0;
  1435. }//end for
  1436. error:
  1437. if(pTunnelFilters){
  1438. SPDApiBufferFree((LPVOID)pTunnelFilters);
  1439. pTunnelFilters = NULL;
  1440. }
  1441. if(pIpsecFilterData){
  1442. IPSecFreeFilterData(pIpsecFilterData);
  1443. pIpsecFilterData = NULL;
  1444. }
  1445. return dwError;
  1446. }
  1447. DWORD CompareTunnelFilter(CHECKLIST* pcheckList,
  1448. POLICYPARAMS *ppolicyParams,
  1449. PIPSEC_NFA_DATA pIpsecNFAData,
  1450. IPSEC_FILTER_SPEC *pFilterSpec,
  1451. TUNNEL_FILTER *pTnFilter)
  1452. //++
  1453. //Description:
  1454. // Performs Tunnel Mode Filter Check
  1455. //
  1456. //Arguments:
  1457. // IN/OUT checklist
  1458. // IN POLICYPARAMS
  1459. // IN PIPSEC_NFA_DATA
  1460. // IN IPSEC_FILTER_SPEC
  1461. // IN TUNNEL_FILTER
  1462. //
  1463. //Return:
  1464. // success or failure code.
  1465. //Author:
  1466. // Madhurima Pawar (mpawar) 10/15/01
  1467. //--
  1468. {
  1469. DWORD dwFlag = 0;
  1470. if(IPSEC_PROTOCOL_V4 != pTnFilter->IpVersion)
  1471. return -1;
  1472. //interface type
  1473. if(ComparePAInterfaceType(pcheckList,
  1474. pIpsecNFAData->dwInterfaceType,
  1475. pTnFilter->InterfaceType))
  1476. return -1;
  1477. dwFlag = ComparePAAddress(pcheckList,
  1478. pFilterSpec->Filter.SrcMask,
  1479. pFilterSpec->Filter.SrcAddr,
  1480. pTnFilter->SrcAddr);
  1481. if(1 == dwFlag ) {
  1482. if (pFilterSpec->Filter.ExType & EXT_DEST) {
  1483. if(pTnFilter->DesAddr.AddrType != ExTypeToAddrType(pFilterSpec->Filter.ExType))
  1484. return -1;
  1485. } else {
  1486. if(pTnFilter->SrcAddr.AddrType != ExTypeToAddrType(pFilterSpec->Filter.ExType))
  1487. return -1;
  1488. }//end else
  1489. }else if(-1 == dwFlag)
  1490. return -1;
  1491. dwFlag = ComparePAAddress(pcheckList,
  1492. pFilterSpec->Filter.DestMask,
  1493. pFilterSpec->Filter.DestAddr,
  1494. pTnFilter->DesAddr);
  1495. if(1 == dwFlag){
  1496. if (pFilterSpec->Filter.ExType) {
  1497. if (pFilterSpec->Filter.ExType & EXT_DEST) {
  1498. if(pTnFilter->DesAddr.AddrType != ExTypeToAddrType(
  1499. pFilterSpec->Filter.ExType
  1500. ))
  1501. return -1;
  1502. } else {
  1503. if(pTnFilter->SrcAddr.AddrType != ExTypeToAddrType(
  1504. pFilterSpec->Filter.ExType
  1505. ))
  1506. return -1;
  1507. }//end else
  1508. }//end if
  1509. }else if(-1 == dwFlag)
  1510. return -1;
  1511. if( ComparePAAddress(pcheckList,
  1512. SUBNET_MASK_ANY,
  1513. SUBNET_ADDRESS_ANY,
  1514. pTnFilter->SrcTunnelAddr))
  1515. return -1;
  1516. if(ComparePATunnelAddress(pcheckList,
  1517. (ULONG) pIpsecNFAData->dwTunnelIpAddr,
  1518. pTnFilter->DesTunnelAddr))
  1519. return -1;
  1520. if(pTnFilter->Protocol.ProtocolType != PROTOCOL_UNIQUE)
  1521. return -1;
  1522. if(pTnFilter->Protocol.dwProtocol != pFilterSpec->Filter.Protocol)
  1523. return -1;
  1524. if(pTnFilter->SrcPort.PortType != PORT_UNIQUE)
  1525. return -1;
  1526. if(pTnFilter->SrcPort.wPort != pFilterSpec->Filter.SrcPort)
  1527. return -1;
  1528. if(pTnFilter->DesPort.PortType != PORT_UNIQUE)
  1529. return -1;
  1530. if(pTnFilter->DesPort.wPort != pFilterSpec->Filter.DestPort)
  1531. return -1;
  1532. if(pTnFilter->bCreateMirror != (BOOL) pFilterSpec->dwMirrorFlag)
  1533. return -1;
  1534. if(CompareFilterActions(pcheckList,
  1535. ppolicyParams,
  1536. pTnFilter->InboundFilterAction,
  1537. pTnFilter->OutboundFilterAction))
  1538. return -1;
  1539. dwFlag = ppolicyParams->dwFlags & PROCESS_QM_FILTER;
  1540. if(PROCESS_QM_FILTER != dwFlag)
  1541. QMPolicyCheck(pcheckList,
  1542. pIpsecNFAData,
  1543. pTnFilter->gPolicyID,
  1544. ppolicyParams);
  1545. return 0;
  1546. }
  1547. DWORD ComparePAInterfaceType(CHECKLIST* pcheckList, DWORD dwInterfaceType, IF_TYPE InterfaceType)
  1548. //++
  1549. //Description:
  1550. // Performs Interface Type comparisons
  1551. //
  1552. //Arguments:
  1553. // IN/OUT checklist
  1554. // IN dwInterfaceType
  1555. // IN IF_TYPE
  1556. //
  1557. //Return Arguments:
  1558. // Success or Failure
  1559. //
  1560. //Author:
  1561. // Madhurima Pawar (mpawar) 10/15/01
  1562. //--
  1563. {
  1564. DWORD dwFlag = 0;
  1565. dwFlag = dwInterfaceType & PAS_INTERFACE_TYPE_DIALUP;
  1566. if (PAS_INTERFACE_TYPE_DIALUP == dwFlag) {
  1567. if(InterfaceType != INTERFACE_TYPE_DIALUP)
  1568. return -1;
  1569. return 0;
  1570. }
  1571. dwFlag = dwInterfaceType & PAS_INTERFACE_TYPE_LAN;
  1572. if (PAS_INTERFACE_TYPE_LAN == dwFlag) {
  1573. if(INTERFACE_TYPE_LAN != InterfaceType)
  1574. return -1;
  1575. return 0;
  1576. }
  1577. dwFlag = dwInterfaceType & PAS_INTERFACE_TYPE_ALL;
  1578. if(PAS_INTERFACE_TYPE_ALL != dwFlag)
  1579. return -1;
  1580. return 0;
  1581. }
  1582. DWORD ComparePAAddress(CHECKLIST* pcheckList, ULONG uMask, ULONG uAddr, ADDR addr )
  1583. //++
  1584. //Description:
  1585. // Performs address comparisons
  1586. //
  1587. //Arguments:
  1588. // IN/OUT checklist
  1589. // IN uMask
  1590. // IN uAddr
  1591. // IN addr
  1592. //
  1593. //Return Arguments:
  1594. // Success or Failure
  1595. //
  1596. //Author:
  1597. // Madhurima Pawar (mpawar) 10/15/01
  1598. //--
  1599. {
  1600. DWORD dwError = 0;
  1601. if (IP_ADDRESS_MASK_NONE == uMask) {
  1602. if(addr.AddrType != IP_ADDR_UNIQUE)
  1603. dwError = 1;
  1604. if(addr.uIpAddr != uAddr)
  1605. dwError = -1;
  1606. if(addr.uSubNetMask != uMask)
  1607. dwError = -1;
  1608. }
  1609. else {
  1610. if(IP_ADDR_SUBNET != addr.AddrType)
  1611. dwError = 1;
  1612. if(addr.uIpAddr != uAddr)
  1613. dwError = -1;
  1614. if(addr.uSubNetMask != uMask)
  1615. dwError = -1;
  1616. }
  1617. if(addr.pgInterfaceID)
  1618. dwError = -1;
  1619. return dwError;
  1620. }
  1621. DWORD ComparePATunnelAddress(CHECKLIST* pcheckList, ULONG uAddr, ADDR addr )
  1622. //++
  1623. //Description:
  1624. // Performs tunnel address comparisons
  1625. //
  1626. //Arguments:
  1627. // IN/OUT checklist
  1628. // IN uAddr
  1629. // IN Addr
  1630. //
  1631. //Return:
  1632. // success or failure
  1633. //
  1634. //Author:
  1635. // Madhurima Pawar (mpawar) 10/15/01
  1636. //--
  1637. {
  1638. if (SUBNET_ADDRESS_ANY == uAddr) {
  1639. if(IP_ADDR_SUBNET != addr.AddrType)
  1640. return -1;
  1641. if(addr.uIpAddr != uAddr)
  1642. return -1;
  1643. if(SUBNET_MASK_ANY != addr.uSubNetMask)
  1644. return -1;
  1645. }
  1646. else {
  1647. if(IP_ADDR_UNIQUE != addr.AddrType)
  1648. return -1;
  1649. if(addr.uIpAddr != uAddr)
  1650. return -1;
  1651. if(IP_ADDRESS_MASK_NONE != addr.uSubNetMask)
  1652. return -1;
  1653. }
  1654. if(addr.pgInterfaceID)
  1655. return -1;
  1656. return 0;
  1657. }
  1658. DWORD CompareFilterActions(CHECKLIST* pcheckList,
  1659. POLICYPARAMS *ppolicyParams,
  1660. FILTER_ACTION InboundFilterFlag,
  1661. FILTER_ACTION OutboundFilterFlag )
  1662. //++
  1663. //Description:
  1664. // Performs tunnel address comparisons
  1665. //
  1666. //Arguments:
  1667. // IN/OUT checklist
  1668. // IN POLICYPARAMS
  1669. // IN InboundFilterFlag
  1670. // IN OutboundFilterFlag
  1671. //
  1672. //Return:
  1673. // success or failure code
  1674. //
  1675. //Author:
  1676. // Madhurima Pawar (mpawar) 10/15/01
  1677. //--
  1678. {
  1679. DWORD dwFlags = 0;
  1680. if (IsEqualGUID(&(ppolicyParams->gNegPolAction),
  1681. &(GUID_NEGOTIATION_ACTION_BLOCK))) {
  1682. if(InboundFilterFlag != BLOCKING){
  1683. if(InboundFilterFlag == PASS_THRU)
  1684. ppolicyParams->dwFlags |= ALLOW_SOFT;
  1685. else
  1686. return -1;
  1687. }//end if
  1688. if(OutboundFilterFlag != BLOCKING)
  1689. return -1;
  1690. return 0;
  1691. }
  1692. if (IsEqualGUID(&(ppolicyParams->gNegPolAction),
  1693. &(GUID_NEGOTIATION_ACTION_NO_IPSEC))) {
  1694. if(InboundFilterFlag != PASS_THRU){
  1695. if(InboundFilterFlag == PASS_THRU)
  1696. ppolicyParams->dwFlags |= ALLOW_SOFT;
  1697. else
  1698. return -1;
  1699. }//end if
  1700. if(OutboundFilterFlag != PASS_THRU)
  1701. return -1;
  1702. return 0;
  1703. }
  1704. if (IsEqualGUID(&(ppolicyParams->gNegPolAction),
  1705. &(GUID_NEGOTIATION_ACTION_INBOUND_PASSTHRU))) {
  1706. if(InboundFilterFlag != PASS_THRU)
  1707. return -1;
  1708. if(OutboundFilterFlag != NEGOTIATE_SECURITY)
  1709. return -1;
  1710. return 0;
  1711. }
  1712. if(InboundFilterFlag != NEGOTIATE_SECURITY){
  1713. if(InboundFilterFlag == PASS_THRU)
  1714. ppolicyParams->dwFlags |= ALLOW_SOFT;
  1715. else
  1716. return -1;
  1717. }
  1718. if(OutboundFilterFlag != NEGOTIATE_SECURITY)
  1719. return -1;
  1720. return 0;
  1721. }
  1722. void MMFilterCheck(CHECKLIST *pcheckList,
  1723. POLICYPARAMS *ppolicyParams,
  1724. PIPSEC_NFA_DATA pIpsecNFAData,
  1725. IPSEC_FILTER_SPEC *pFilterSpec)
  1726. //++
  1727. //Description:
  1728. //Performs Main Mode Filter Check
  1729. //
  1730. //Arguments:
  1731. // IN/OUT checklist
  1732. // IN POLICYPARAMS
  1733. // IN PIPSEC_NFA_DATA
  1734. // IN IPSEC_FILTER_SPEC
  1735. //
  1736. //Return:
  1737. // none
  1738. //
  1739. //Author:
  1740. // Madhurima Pawar (mpawar) 10/15/01
  1741. //--
  1742. {
  1743. DWORD dwError = ERROR_SUCCESS,
  1744. dwNumMMFilters = 0,
  1745. dwResumeHandle = 0,
  1746. i = 0;
  1747. GUID gGenericFilterID = {0};
  1748. MM_FILTER *pMMFilters = NULL;
  1749. NETDIAG_PARAMS* pParams = pcheckList->pParams;
  1750. NETDIAG_RESULT* pResults = pcheckList->pResults;
  1751. while(1)
  1752. {
  1753. //match main mode filter from spd
  1754. dwError = EnumMMFilters(
  1755. NULL,
  1756. 0,
  1757. NULL,
  1758. ENUM_GENERIC_FILTERS,
  1759. gGenericFilterID,
  1760. 0, //max limit set by spd server
  1761. &pMMFilters,
  1762. &dwNumMMFilters,
  1763. &dwResumeHandle,
  1764. NULL
  1765. );
  1766. if(dwError)
  1767. {
  1768. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  1769. Nd_Verbose, IDS_SPD_FILTER_ABSENT);
  1770. PrintFilterSpecList(pcheckList,
  1771. pFilterSpec,
  1772. pIpsecNFAData);
  1773. gErrorFlag = 1;
  1774. goto error;
  1775. }//end if
  1776. _ASSERT(pMMFilters);
  1777. //get corresponding MM filter
  1778. Match(pFilterSpec->FilterSpecGUID, pMMFilters, dwNumMMFilters);
  1779. //match corresponding MM filter
  1780. if(dwNumMMFilters != -1){
  1781. //perform MM filter and polstore filter match
  1782. if(CompareMMFilter(pcheckList,
  1783. ppolicyParams,
  1784. pIpsecNFAData,
  1785. pFilterSpec,
  1786. &(pMMFilters[dwNumMMFilters])))
  1787. {
  1788. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  1789. Nd_Verbose, IDS_SPD_FILTER);
  1790. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput,
  1791. Nd_Verbose, IDS_SPD_STORAGE_FILTER);
  1792. PrintFilterSpecList(pcheckList,
  1793. pFilterSpec,
  1794. pIpsecNFAData);
  1795. AddMessageToList( &pResults->IPSec.lmsgGlobalOutput, Nd_Verbose, IDS_SPD);
  1796. PrintMMFilter( pcheckList, pMMFilters[dwNumMMFilters]);
  1797. gErrorFlag = 1;
  1798. }
  1799. break;
  1800. }//end if
  1801. if(pMMFilters){
  1802. SPDApiBufferFree((LPVOID)pMMFilters);
  1803. pMMFilters = NULL;
  1804. }
  1805. dwNumMMFilters = 0;
  1806. }//end while
  1807. error:
  1808. if(pMMFilters){
  1809. SPDApiBufferFree((LPVOID)pMMFilters);
  1810. pMMFilters = NULL;
  1811. }
  1812. return ;
  1813. }
  1814. DWORD CompareMMFilter(CHECKLIST* pcheckList,
  1815. POLICYPARAMS *ppolicyParams,
  1816. PIPSEC_NFA_DATA pIpsecNFAData,
  1817. IPSEC_FILTER_SPEC *pFilterSpec,
  1818. MM_FILTER *pMMFilter)
  1819. //++
  1820. //Description:
  1821. //Performs Main Mode Filter Comparison
  1822. //
  1823. //Arguments:
  1824. // IN/OUT checklist
  1825. // IN POLICYPARAMS
  1826. // IN PIPSEC_NFA_DATA
  1827. // IN IPSEC_FILTER_SPEC
  1828. // IN MM_FILTER
  1829. //
  1830. //Return:
  1831. // Success or failure
  1832. //Author:
  1833. // Madhurima Pawar (mpawar) 10/15/01
  1834. //--
  1835. {
  1836. DWORD dwFlag = 0;
  1837. if(ComparePAInterfaceType(pcheckList,pIpsecNFAData->dwInterfaceType, pMMFilter->InterfaceType))
  1838. return -1;
  1839. if (!(pIpsecNFAData->dwTunnelFlags)) {
  1840. dwFlag = ComparePAAddress(pcheckList,
  1841. pFilterSpec->Filter.SrcMask,
  1842. pFilterSpec->Filter.SrcAddr,
  1843. pMMFilter->SrcAddr);
  1844. if(1 == dwFlag){
  1845. if (pFilterSpec->Filter.ExType) {
  1846. if (pFilterSpec->Filter.ExType & EXT_DEST) {
  1847. if(pMMFilter->DesAddr.AddrType != ExTypeToAddrType(
  1848. pFilterSpec->Filter.ExType))
  1849. return -1;
  1850. } else {
  1851. if(pMMFilter->SrcAddr.AddrType != ExTypeToAddrType(
  1852. pFilterSpec->Filter.ExType))
  1853. return -1;
  1854. }
  1855. }
  1856. }else if (-1 == dwFlag)
  1857. return -1;
  1858. dwFlag = ComparePAAddress(pcheckList,
  1859. pFilterSpec->Filter.DestMask,
  1860. pFilterSpec->Filter.DestAddr,
  1861. pMMFilter->DesAddr);
  1862. if(1 == dwFlag){
  1863. if (pFilterSpec->Filter.ExType) {
  1864. if (pFilterSpec->Filter.ExType & EXT_DEST) {
  1865. if(pMMFilter->DesAddr.AddrType != ExTypeToAddrType(
  1866. pFilterSpec->Filter.ExType))
  1867. return -1;
  1868. } else {
  1869. if(pMMFilter->SrcAddr.AddrType != ExTypeToAddrType(
  1870. pFilterSpec->Filter.ExType))
  1871. return -1;
  1872. }
  1873. }
  1874. }else if(-1 == dwFlag)
  1875. return -1;
  1876. if(pMMFilter->bCreateMirror != (BOOL) pFilterSpec->dwMirrorFlag)
  1877. return -1;
  1878. }else{
  1879. if(ComparePAAddress(pcheckList,
  1880. IP_ADDRESS_MASK_NONE,
  1881. IP_ADDRESS_ME,
  1882. pMMFilter->SrcAddr))
  1883. return -1;
  1884. if(pMMFilter->bCreateMirror != TRUE)
  1885. return -1;
  1886. if(ComparePATunnelAddress(pcheckList,
  1887. (ULONG) pIpsecNFAData->dwTunnelIpAddr,
  1888. pMMFilter->DesAddr))
  1889. return -1;
  1890. }//end else
  1891. MMAuthCheck(pcheckList,pIpsecNFAData, pMMFilter->gMMAuthID, ppolicyParams);
  1892. return 0;
  1893. }