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.

1052 lines
30 KiB

  1. /**********************************************************************/
  2. /** Microsoft Windows/NT **/
  3. /** Copyright(c) Microsoft Corporation, 1997 - 2002 **/
  4. /**********************************************************************/
  5. /*
  6. spddb.h
  7. FILE HISTORY:
  8. */
  9. #ifndef _SPDDB_H
  10. #define _SPDDB_H
  11. #ifndef _HARRAY_H
  12. #include "harray.h"
  13. #endif
  14. #include "ipsec.h"
  15. #include "winipsec.h"
  16. #include "ipsecshr.h"
  17. #include "spdutil.h"
  18. #include "wincrypt.h"
  19. #include "redblack.h"
  20. #include "util.h"
  21. interface ISpdInfo;
  22. template <class T>
  23. void
  24. FreeItemsAndEmptyArray (
  25. T& array);
  26. DWORD IsAdmin(LPCTSTR szMachineName, LPCTSTR szAccount, LPCTSTR szPassword, BOOL * pfIsAdmin);
  27. typedef enum _IPSECMON_INFO_TYPE {MON_MM_FILTER=0x1,MON_MM_POLICY=0x2,MON_MM_SA=0x4,MON_MM_SP_FILTER=0x8,
  28. MON_QM_FILTER=0x10, MON_QM_SP_FILTER=0x20,
  29. MON_QM_POLICY=0x40,MON_QM_SA=0x80,MON_STATS=0x100,
  30. MON_MM_AUTH=0x200, MON_INIT=0x400} IPSECMON_INFO_TYPE;
  31. typedef struct _QMPOLINFO
  32. {
  33. DWORD dwFlags;
  34. WCHAR szPolicyName[1];
  35. } QMPOLOCYINFO, *PQMPOLOCYINFO;
  36. class CFilterInfo
  37. {
  38. public:
  39. FILTER_TYPE m_FilterType;
  40. GUID m_guidFltr;
  41. CString m_stName;
  42. IF_TYPE m_InterfaceType;
  43. BOOL m_bCreateMirror;
  44. ADDR m_SrcAddr;
  45. ADDR m_DesAddr;
  46. ADDR m_MyTnlAddr; //only valid for tunnel filters
  47. ADDR m_PeerTnlAddr; //only valid for tunnel filters
  48. PROTOCOL m_Protocol;
  49. PORT m_SrcPort;
  50. PORT m_DesPort;
  51. FILTER_ACTION m_InboundFilterAction;
  52. FILTER_ACTION m_OutboundFilterAction;
  53. DWORD m_dwDirection;
  54. DWORD m_dwWeight;
  55. GUID m_guidPolicyID;
  56. CString m_stPolicyName;
  57. DWORD m_dwFlags;
  58. public:
  59. CFilterInfo() { m_FilterType = FILTER_TYPE_ANY; };
  60. CFilterInfo& operator=(const TRANSPORT_FILTER TransFltr)
  61. {
  62. m_FilterType = FILTER_TYPE_TRANSPORT;
  63. m_guidFltr = TransFltr.gFilterID;
  64. m_stName = TransFltr.pszFilterName;
  65. m_InterfaceType = TransFltr.InterfaceType;
  66. m_bCreateMirror = TransFltr.bCreateMirror;
  67. m_SrcAddr = TransFltr.SrcAddr;
  68. m_DesAddr = TransFltr.DesAddr;
  69. m_Protocol = TransFltr.Protocol;
  70. m_SrcPort = TransFltr.SrcPort;
  71. m_DesPort = TransFltr.DesPort;
  72. m_InboundFilterAction = TransFltr.InboundFilterAction;
  73. m_OutboundFilterAction = TransFltr.OutboundFilterAction;
  74. m_dwDirection = TransFltr.dwDirection;
  75. m_dwWeight = TransFltr.dwWeight;
  76. m_guidPolicyID = TransFltr.gPolicyID;
  77. m_stPolicyName = _T("");
  78. ZeroMemory(&m_MyTnlAddr, sizeof(m_MyTnlAddr));
  79. ZeroMemory(&m_PeerTnlAddr, sizeof(m_PeerTnlAddr));
  80. return *this;
  81. };
  82. CFilterInfo& operator=(const TUNNEL_FILTER Fltr)
  83. {
  84. m_FilterType = FILTER_TYPE_TUNNEL;
  85. m_guidFltr = Fltr.gFilterID;
  86. m_stName = Fltr.pszFilterName;
  87. m_InterfaceType = Fltr.InterfaceType;
  88. m_bCreateMirror = Fltr.bCreateMirror;
  89. m_SrcAddr = Fltr.SrcAddr;
  90. m_DesAddr = Fltr.DesAddr;
  91. m_Protocol = Fltr.Protocol;
  92. m_SrcPort = Fltr.SrcPort;
  93. m_DesPort = Fltr.DesPort;
  94. m_InboundFilterAction = Fltr.InboundFilterAction;
  95. m_OutboundFilterAction = Fltr.OutboundFilterAction;
  96. m_dwDirection = Fltr.dwDirection;
  97. m_dwWeight = Fltr.dwWeight;
  98. m_guidPolicyID = Fltr.gPolicyID;
  99. m_stPolicyName = _T("");
  100. m_MyTnlAddr = Fltr.SrcTunnelAddr;
  101. m_PeerTnlAddr = Fltr.DesTunnelAddr;
  102. return *this;
  103. }
  104. };
  105. class CMmFilterInfo
  106. {
  107. public:
  108. GUID m_guidFltr;
  109. CString m_stName;
  110. IF_TYPE m_InterfaceType;
  111. BOOL m_bCreateMirror;
  112. ADDR m_SrcAddr;
  113. ADDR m_DesAddr;
  114. DWORD m_dwDirection;
  115. DWORD m_dwWeight;
  116. GUID m_guidPolicyID;
  117. GUID m_guidAuthID;
  118. CString m_stPolicyName;
  119. CString m_stAuthDescription;
  120. DWORD m_dwFlags;
  121. public:
  122. CMmFilterInfo() {};
  123. CMmFilterInfo& operator=(const MM_FILTER Fltr)
  124. {
  125. m_guidFltr = Fltr.gFilterID;
  126. m_stName = Fltr.pszFilterName;
  127. m_InterfaceType = Fltr.InterfaceType;
  128. m_bCreateMirror = Fltr.bCreateMirror;
  129. m_SrcAddr = Fltr.SrcAddr;
  130. m_DesAddr = Fltr.DesAddr;
  131. m_dwDirection = Fltr.dwDirection;
  132. m_dwWeight = Fltr.dwWeight;
  133. m_guidPolicyID = Fltr.gPolicyID;
  134. m_guidAuthID = Fltr.gMMAuthID;
  135. m_stPolicyName.Empty();
  136. m_stAuthDescription.Empty();
  137. return *this;
  138. };
  139. };
  140. typedef CArray<CMmFilterInfo *, CMmFilterInfo *> CMmFilterInfoArray;
  141. class CMmAuthInfo
  142. {
  143. public:
  144. MM_AUTH_ENUM m_AuthMethod;
  145. DWORD m_dwAuthInfoSize;
  146. LPBYTE m_pAuthInfo;
  147. public:
  148. CMmAuthInfo()
  149. {
  150. m_dwAuthInfoSize = 0;
  151. m_pAuthInfo = NULL;
  152. };
  153. CMmAuthInfo(const CMmAuthInfo& info)
  154. {
  155. m_AuthMethod = info.m_AuthMethod;
  156. m_dwAuthInfoSize = info.m_dwAuthInfoSize;
  157. m_pAuthInfo = new BYTE[m_dwAuthInfoSize];
  158. Assert(info.m_pAuthInfo);
  159. if (m_pAuthInfo)
  160. {
  161. memcpy(m_pAuthInfo, info.m_pAuthInfo, m_dwAuthInfoSize);
  162. }
  163. };
  164. CMmAuthInfo& operator=(const INT_IPSEC_MM_AUTH_INFO AuthInfo)
  165. {
  166. if (m_pAuthInfo)
  167. {
  168. delete [] m_pAuthInfo;
  169. m_pAuthInfo = NULL;
  170. }
  171. m_AuthMethod = AuthInfo.AuthMethod;
  172. if (0 != AuthInfo.dwAuthInfoSize && NULL != AuthInfo.pAuthInfo) {
  173. if (m_AuthMethod != IKE_RSA_SIGNATURE) {
  174. m_dwAuthInfoSize = AuthInfo.dwAuthInfoSize + 2; //To append the _T('\0') at the end
  175. m_pAuthInfo = new BYTE[m_dwAuthInfoSize];
  176. if (m_pAuthInfo)
  177. {
  178. ZeroMemory(m_pAuthInfo, m_dwAuthInfoSize * sizeof(BYTE));
  179. memcpy(m_pAuthInfo, AuthInfo.pAuthInfo, AuthInfo.dwAuthInfoSize);
  180. }
  181. } else {
  182. DWORD dwNameSize=0;
  183. CRYPT_DATA_BLOB NameBlob;
  184. m_pAuthInfo=NULL;
  185. NameBlob.pbData=AuthInfo.pAuthInfo;
  186. NameBlob.cbData=AuthInfo.dwAuthInfoSize;
  187. dwNameSize = CertNameToStr(
  188. X509_ASN_ENCODING,
  189. &NameBlob,
  190. CERT_X500_NAME_STR,
  191. (LPWSTR)m_pAuthInfo,
  192. dwNameSize);
  193. if (dwNameSize >= 1) {
  194. m_pAuthInfo=new BYTE[dwNameSize * sizeof(wchar_t)];
  195. if (m_pAuthInfo) {
  196. dwNameSize=CertNameToStr(
  197. X509_ASN_ENCODING,
  198. &NameBlob,
  199. CERT_X500_NAME_STR,
  200. (LPWSTR)m_pAuthInfo,
  201. dwNameSize);
  202. }
  203. m_dwAuthInfoSize=dwNameSize;
  204. }
  205. }
  206. }
  207. else
  208. {
  209. m_dwAuthInfoSize = 0;
  210. }
  211. return *this;
  212. };
  213. CMmAuthInfo& operator=(const CMmAuthInfo& info)
  214. {
  215. if (this == &info)
  216. return *this;
  217. if (m_pAuthInfo)
  218. {
  219. delete [] m_pAuthInfo;
  220. }
  221. m_AuthMethod = info.m_AuthMethod;
  222. m_dwAuthInfoSize = info.m_dwAuthInfoSize;
  223. if (0 != info.m_dwAuthInfoSize && NULL != info.m_pAuthInfo)
  224. {
  225. m_pAuthInfo = new BYTE[m_dwAuthInfoSize];
  226. if (m_pAuthInfo)
  227. {
  228. memcpy(m_pAuthInfo, info.m_pAuthInfo, m_dwAuthInfoSize);
  229. }
  230. }
  231. return *this;
  232. };
  233. ~CMmAuthInfo()
  234. {
  235. if (m_pAuthInfo)
  236. {
  237. delete [] m_pAuthInfo;
  238. }
  239. };
  240. };
  241. typedef CArray<CMmAuthInfo *, CMmAuthInfo *> CMmAuthInfoArray;
  242. class CMmAuthMethods
  243. {
  244. public:
  245. GUID m_guidID;
  246. CMmAuthInfoArray m_arrAuthInfo;
  247. CString m_stDescription;
  248. CMmAuthMethods() {}
  249. CMmAuthMethods(const CMmAuthMethods & methods)
  250. {
  251. m_guidID = methods.m_guidID;
  252. FreeItemsAndEmptyArray (m_arrAuthInfo);
  253. m_arrAuthInfo.SetSize(methods.m_arrAuthInfo.GetSize());
  254. for (int i = 0; i < methods.m_arrAuthInfo.GetSize(); i++)
  255. {
  256. CMmAuthInfo * pAuth = new CMmAuthInfo;
  257. *pAuth = *(methods.m_arrAuthInfo[i]);
  258. m_arrAuthInfo[i] = pAuth;
  259. }
  260. m_stDescription = methods.m_stDescription;
  261. }
  262. CMmAuthMethods& operator=(const CMmAuthMethods & methods)
  263. {
  264. if (&methods == this)
  265. return *this;
  266. m_guidID = methods.m_guidID;
  267. FreeItemsAndEmptyArray (m_arrAuthInfo);
  268. m_arrAuthInfo.SetSize(methods.m_arrAuthInfo.GetSize());
  269. for (int i = 0; i < methods.m_arrAuthInfo.GetSize(); i++)
  270. {
  271. CMmAuthInfo * pAuth = new CMmAuthInfo;
  272. *pAuth = *(methods.m_arrAuthInfo[i]);
  273. m_arrAuthInfo[i] = pAuth;
  274. }
  275. m_stDescription = methods.m_stDescription;
  276. return *this;
  277. }
  278. CMmAuthMethods& operator=(const INT_MM_AUTH_METHODS & methods)
  279. {
  280. m_guidID = methods.gMMAuthID;
  281. FreeItemsAndEmptyArray (m_arrAuthInfo);
  282. m_arrAuthInfo.SetSize(methods.dwNumAuthInfos);
  283. for (int i = 0; i < (int)methods.dwNumAuthInfos; i++)
  284. {
  285. CMmAuthInfo * pAuth = new CMmAuthInfo;
  286. *pAuth = methods.pAuthenticationInfo[i];
  287. m_arrAuthInfo[i] = pAuth;
  288. }
  289. //construct the description
  290. m_stDescription.Empty();
  291. CString st;
  292. for (i = 0; i < m_arrAuthInfo.GetSize(); i++)
  293. {
  294. if (0 != i)
  295. {
  296. m_stDescription += _T(", ");
  297. }
  298. MmAuthToString(m_arrAuthInfo[i]->m_AuthMethod, &st);
  299. m_stDescription += st;
  300. }
  301. return *this;
  302. }
  303. ~CMmAuthMethods() { FreeItemsAndEmptyArray (m_arrAuthInfo); }
  304. };
  305. typedef CArray<CMmAuthMethods *, CMmAuthMethods *> CMmAuthMethodsArray;
  306. class CMmOffer
  307. {
  308. public:
  309. KEY_LIFETIME m_Lifetime;
  310. DWORD m_dwFlags;
  311. DWORD m_dwQuickModeLimit;
  312. DWORD m_dwDHGroup;
  313. IPSEC_MM_ALGO m_EncryptionAlgorithm;
  314. IPSEC_MM_ALGO m_HashingAlgorithm;
  315. public:
  316. CMmOffer() {};
  317. CMmOffer(const CMmOffer & offer)
  318. {
  319. m_Lifetime = offer.m_Lifetime;
  320. m_dwFlags = offer.m_dwFlags;
  321. m_dwQuickModeLimit = offer.m_dwQuickModeLimit;
  322. m_dwDHGroup = offer.m_dwDHGroup;
  323. m_EncryptionAlgorithm = offer.m_EncryptionAlgorithm;
  324. m_HashingAlgorithm = offer.m_HashingAlgorithm;
  325. };
  326. CMmOffer& operator=(const CMmOffer& offer)
  327. {
  328. if (this == &offer)
  329. return *this;
  330. m_Lifetime = offer.m_Lifetime;
  331. m_dwFlags = offer.m_dwFlags;
  332. m_dwQuickModeLimit = offer.m_dwQuickModeLimit;
  333. m_dwDHGroup = offer.m_dwDHGroup;
  334. m_EncryptionAlgorithm = offer.m_EncryptionAlgorithm;
  335. m_HashingAlgorithm = offer.m_HashingAlgorithm;
  336. return *this;
  337. };
  338. CMmOffer& operator=(const IPSEC_MM_OFFER MmOffer)
  339. {
  340. m_Lifetime = MmOffer.Lifetime;
  341. m_dwFlags = MmOffer.dwFlags;
  342. m_dwQuickModeLimit = MmOffer.dwQuickModeLimit;
  343. m_dwDHGroup = MmOffer.dwDHGroup;
  344. m_EncryptionAlgorithm = MmOffer.EncryptionAlgorithm;
  345. m_HashingAlgorithm = MmOffer.HashingAlgorithm;
  346. return *this;
  347. };
  348. ~CMmOffer() {}
  349. };
  350. typedef CArray<CMmOffer *, CMmOffer *> CMmOfferArray;
  351. class CMmPolicyInfo
  352. {
  353. public:
  354. GUID m_guidID;
  355. CString m_stName;
  356. DWORD m_dwFlags;
  357. DWORD m_dwOfferCount;
  358. CMmOfferArray m_arrOffers;
  359. public:
  360. CMmPolicyInfo() {};
  361. CMmPolicyInfo(const CMmPolicyInfo &info)
  362. {
  363. m_guidID = info.m_guidID;
  364. m_stName = info.m_stName;
  365. m_dwFlags = info.m_dwFlags;
  366. m_dwOfferCount = info.m_dwOfferCount;
  367. FreeItemsAndEmptyArray (m_arrOffers);
  368. m_arrOffers.SetSize(m_dwOfferCount);
  369. for (DWORD i = 0; i < m_dwOfferCount; i++)
  370. {
  371. CMmOffer * pOffer = new CMmOffer;
  372. *pOffer = *info.m_arrOffers[i];
  373. m_arrOffers[i] = pOffer;
  374. }
  375. };
  376. CMmPolicyInfo& operator=(const CMmPolicyInfo &info)
  377. {
  378. if (&info == this)
  379. return *this;
  380. m_guidID = info.m_guidID;
  381. m_stName = info.m_stName;
  382. m_dwFlags = info.m_dwFlags;
  383. m_dwOfferCount = info.m_dwOfferCount;
  384. FreeItemsAndEmptyArray (m_arrOffers);
  385. m_arrOffers.SetSize(m_dwOfferCount);
  386. for (DWORD i = 0; i < m_dwOfferCount; i++)
  387. {
  388. CMmOffer * pOffer = new CMmOffer;
  389. *pOffer = *info.m_arrOffers[i];
  390. m_arrOffers[i] = pOffer;
  391. }
  392. return *this;
  393. };
  394. CMmPolicyInfo& operator=(const IPSEC_MM_POLICY MmPol)
  395. {
  396. m_guidID = MmPol.gPolicyID;
  397. m_stName = MmPol.pszPolicyName;
  398. m_dwFlags = MmPol.dwFlags;
  399. m_dwOfferCount = MmPol.dwOfferCount;
  400. FreeItemsAndEmptyArray (m_arrOffers);
  401. m_arrOffers.SetSize(m_dwOfferCount);
  402. for (DWORD i = 0; i < m_dwOfferCount; i++)
  403. {
  404. CMmOffer * pOffer = new CMmOffer;
  405. *pOffer = MmPol.pOffers[i];
  406. m_arrOffers[i] = (pOffer);
  407. }
  408. return *this;
  409. };
  410. ~CMmPolicyInfo() { FreeItemsAndEmptyArray (m_arrOffers); }
  411. };
  412. class CMmSA
  413. {
  414. public:
  415. GUID m_guidPolicy;
  416. CMmOffer m_SelectedOffer;
  417. MM_AUTH_ENUM m_Auth;
  418. IKE_COOKIE_PAIR m_MMSpi;
  419. ADDR m_MeAddr;
  420. ADDR m_PeerAddr;
  421. CString m_stMyId;
  422. CString m_stMyCertChain;
  423. CString m_stPeerId;
  424. CString m_stPeerCertChain;
  425. CString m_stPolicyName;
  426. DWORD m_dwFlags;
  427. DWORD m_dwPolFlags;
  428. //
  429. // TBD - Add UDP encapsulation context later on.
  430. // IPSEC_UDP_ENCAP_CONTEXT m_UdpEncapContext;
  431. //
  432. public:
  433. CMmSA() {};
  434. CMmSA& operator=(const IPSEC_MM_SA sa)
  435. {
  436. m_guidPolicy = sa.gMMPolicyID;
  437. m_SelectedOffer = sa.SelectedMMOffer;
  438. m_Auth = sa.MMAuthEnum;
  439. m_MMSpi = sa.MMSpi;
  440. m_MeAddr = sa.Me;
  441. m_PeerAddr = sa.Peer;
  442. GetAuthId( (PIPSEC_MM_SA) &sa, &m_stMyId, FALSE);
  443. GetAuthId( (PIPSEC_MM_SA) &sa, &m_stPeerId, TRUE);
  444. m_dwFlags = sa.dwFlags;
  445. //
  446. // TBD - Add UDP encapsulation context later on.
  447. // m_UdpEncapContext = sa.UdpEncapContext;
  448. //
  449. m_stPolicyName.Empty(); //Should set the name in LoadMiscMmSAInfo
  450. m_dwPolFlags = 0; //should set the flag in LoadMiscMmSAInfo
  451. return *this;
  452. };
  453. };
  454. typedef CArray<CMmSA *, CMmSA *> CMmSAArray;
  455. class CQmAlgo
  456. {
  457. public:
  458. IPSEC_OPERATION m_Operation;
  459. ULONG m_ulAlgo;
  460. HMAC_AUTH_ALGO_ENUM m_SecAlgo;
  461. ULONG m_ulKeyLen;
  462. ULONG m_ulRounds;
  463. ULONG m_ulSecKeyLen;
  464. ULONG m_ulSecRounds;
  465. public:
  466. CQmAlgo() {};
  467. CQmAlgo& operator=(const IPSEC_QM_ALGO algo)
  468. {
  469. m_Operation = algo.Operation;
  470. m_ulAlgo = algo.uAlgoIdentifier;
  471. m_SecAlgo= algo.uSecAlgoIdentifier;
  472. m_ulKeyLen = algo.uAlgoKeyLen;
  473. m_ulRounds = algo.uAlgoRounds;
  474. m_ulSecKeyLen = algo.uSecAlgoKeyLen;
  475. m_ulSecRounds = algo.uSecAlgoRounds;
  476. return *this;
  477. };
  478. };
  479. typedef CArray<CQmAlgo *, CQmAlgo *> CQmAlgoArray;
  480. class CQmOffer
  481. {
  482. public:
  483. KEY_LIFETIME m_Lifetime;
  484. DWORD m_dwFlags;
  485. BOOL m_fPFSRequired;
  486. DWORD m_dwPFSGroup;
  487. DWORD m_dwNumAlgos;
  488. CQmAlgo m_arrAlgos[QM_MAX_ALGOS];
  489. public:
  490. CQmOffer() {};
  491. CQmOffer& operator=(const IPSEC_QM_OFFER offer)
  492. {
  493. m_Lifetime = offer.Lifetime;
  494. m_dwFlags = offer.dwFlags;
  495. m_fPFSRequired = offer.bPFSRequired;
  496. m_dwPFSGroup = offer.dwPFSGroup;
  497. m_dwNumAlgos = offer.dwNumAlgos;
  498. for (DWORD i = 0; i < m_dwNumAlgos; i++)
  499. {
  500. m_arrAlgos[i] = offer.Algos[i];
  501. }
  502. return *this;
  503. };
  504. };
  505. typedef CArray<CQmOffer *, CQmOffer *> CQmOfferArray;
  506. class CQmPolicyInfo
  507. {
  508. public:
  509. GUID m_guidID;
  510. CString m_stName;
  511. DWORD m_dwFlags;
  512. CQmOfferArray m_arrOffers;
  513. public:
  514. CQmPolicyInfo() {};
  515. ~CQmPolicyInfo() { FreeItemsAndEmptyArray(m_arrOffers); }
  516. CQmPolicyInfo(const CQmPolicyInfo& pol)
  517. {
  518. m_guidID = pol.m_guidID;
  519. m_stName = pol.m_stName;
  520. m_dwFlags = pol.m_dwFlags;
  521. int nSize = (int)pol.m_arrOffers.GetSize();
  522. m_arrOffers.SetSize(nSize);
  523. for(int i = 0; i < nSize; i++)
  524. {
  525. CQmOffer * pOffer = new CQmOffer;
  526. *pOffer = *pol.m_arrOffers[i];
  527. m_arrOffers[i] = pOffer;
  528. }
  529. };
  530. CQmPolicyInfo& operator=(const CQmPolicyInfo& pol)
  531. {
  532. if (&pol == this)
  533. return *this;
  534. m_guidID = pol.m_guidID;
  535. m_stName = pol.m_stName;
  536. m_dwFlags = pol.m_dwFlags;
  537. int nSize = (int)pol.m_arrOffers.GetSize();
  538. FreeItemsAndEmptyArray(m_arrOffers);
  539. m_arrOffers.SetSize(nSize);
  540. for(int i = 0; i < nSize; i++)
  541. {
  542. CQmOffer * pOffer = new CQmOffer;
  543. *pOffer = *pol.m_arrOffers[i];
  544. m_arrOffers[i] = pOffer;
  545. }
  546. return *this;
  547. };
  548. CQmPolicyInfo& operator=(const IPSEC_QM_POLICY& pol)
  549. {
  550. m_guidID = pol.gPolicyID;
  551. m_stName = pol.pszPolicyName;
  552. m_dwFlags = pol.dwFlags;
  553. int nSize = pol.dwOfferCount;
  554. FreeItemsAndEmptyArray(m_arrOffers);
  555. m_arrOffers.SetSize(nSize);
  556. for(int i = 0; i < nSize; i++)
  557. {
  558. CQmOffer * pOffer = new CQmOffer;
  559. *pOffer = pol.pOffers[i];
  560. m_arrOffers[i] = pOffer;
  561. }
  562. return *this;
  563. };
  564. };
  565. //The filter setting used by the driver, corresponding to IPSEC_QM_FILTER
  566. class CQmDriverFilter
  567. {
  568. public:
  569. QM_FILTER_TYPE m_Type;
  570. ADDR m_SrcAddr;
  571. ADDR m_DesAddr;
  572. PROTOCOL m_Protocol;
  573. PORT m_SrcPort;
  574. PORT m_DesPort;
  575. ADDR m_MyTunnelEndpt;
  576. ADDR m_PeerTunnelEndpt;
  577. DWORD m_dwFlags;
  578. CQmDriverFilter& operator=(const IPSEC_QM_FILTER fltr)
  579. {
  580. m_Type = fltr.QMFilterType;
  581. m_SrcAddr = fltr.SrcAddr;
  582. m_DesAddr = fltr.DesAddr;
  583. m_Protocol = fltr.Protocol;
  584. m_DesPort = fltr.DesPort;
  585. m_SrcPort = fltr.SrcPort;
  586. m_MyTunnelEndpt = fltr.MyTunnelEndpt;
  587. m_PeerTunnelEndpt = fltr.PeerTunnelEndpt;
  588. m_dwFlags = fltr.dwFlags;
  589. return *this;
  590. }
  591. };
  592. class CQmSA
  593. {
  594. public:
  595. GUID m_guidPolicy;
  596. GUID m_guidFilter;
  597. CQmOffer m_SelectedOffer;
  598. CQmDriverFilter m_QmDriverFilter;
  599. IKE_COOKIE_PAIR m_MMSpi;
  600. CString m_stPolicyName;
  601. DWORD m_dwPolFlags;
  602. //
  603. // TBD - Add UDP encapsulation context later on.
  604. // IPSEC_UDP_ENCAP_CONTEXT m_UdpEncapContext;
  605. //
  606. CQmSA& operator=(const IPSEC_QM_SA sa)
  607. {
  608. m_guidPolicy = sa.gQMPolicyID;
  609. m_guidFilter = sa.gQMFilterID;
  610. m_SelectedOffer = sa.SelectedQMOffer;
  611. m_QmDriverFilter = sa.IpsecQMFilter;
  612. m_MMSpi = sa.MMSpi;
  613. //Need LoadMiscQmSAInfo to set the policy name and m_dwPolFlags
  614. m_stPolicyName.Empty();
  615. m_dwPolFlags = 0;
  616. //
  617. // TBD - Add UDP encapsulation context later on.
  618. // m_UdpEncapContext = sa.UdpEncapContext;
  619. //
  620. return *this;
  621. }
  622. };
  623. typedef CArray<CQmSA *, CQmSA *> CQmSAArray;
  624. class CIkeStatistics
  625. {
  626. public:
  627. DWORD m_dwActiveAcquire;
  628. DWORD m_dwActiveReceive;
  629. DWORD m_dwAcquireFail;
  630. DWORD m_dwReceiveFail;
  631. DWORD m_dwSendFail;
  632. DWORD m_dwAcquireHeapSize;
  633. DWORD m_dwReceiveHeapSize;
  634. DWORD m_dwNegotiationFailures;
  635. DWORD m_dwAuthenticationFailures;
  636. DWORD m_dwInvalidCookiesReceived;
  637. DWORD m_dwTotalAcquire;
  638. DWORD m_dwTotalGetSpi;
  639. DWORD m_dwTotalKeyAdd;
  640. DWORD m_dwTotalKeyUpdate;
  641. DWORD m_dwGetSpiFail;
  642. DWORD m_dwKeyAddFail;
  643. DWORD m_dwKeyUpdateFail;
  644. DWORD m_dwIsadbListSize;
  645. DWORD m_dwConnListSize;
  646. DWORD m_dwOakleyMainModes;
  647. DWORD m_dwOakleyQuickModes;
  648. DWORD m_dwSoftAssociations;
  649. DWORD m_dwInvalidPacketsReceived;
  650. CIkeStatistics & operator=(const IKE_STATISTICS stats)
  651. {
  652. m_dwActiveAcquire = stats.dwActiveAcquire;
  653. m_dwActiveReceive = stats.dwActiveReceive;
  654. m_dwAcquireFail = stats.dwAcquireFail;
  655. m_dwReceiveFail = stats.dwReceiveFail;
  656. m_dwSendFail = stats.dwSendFail;
  657. m_dwAcquireHeapSize = stats.dwAcquireHeapSize;
  658. m_dwReceiveHeapSize = stats.dwReceiveHeapSize;
  659. m_dwNegotiationFailures = stats.dwNegotiationFailures;
  660. m_dwAuthenticationFailures = stats.dwAuthenticationFailures;
  661. m_dwInvalidCookiesReceived = stats.dwInvalidCookiesReceived;
  662. m_dwTotalAcquire = stats.dwTotalAcquire;
  663. m_dwTotalGetSpi = stats.dwTotalGetSpi;
  664. m_dwTotalKeyAdd = stats.dwTotalKeyAdd;
  665. m_dwTotalKeyUpdate = stats.dwTotalKeyUpdate;
  666. m_dwGetSpiFail = stats.dwGetSpiFail;
  667. m_dwKeyAddFail = stats.dwKeyAddFail;
  668. m_dwKeyUpdateFail = stats.dwKeyUpdateFail;
  669. m_dwIsadbListSize = stats.dwIsadbListSize;
  670. m_dwConnListSize = stats.dwConnListSize;
  671. m_dwOakleyMainModes = stats.dwOakleyMainModes;
  672. m_dwOakleyQuickModes = stats.dwOakleyQuickModes;
  673. m_dwSoftAssociations = stats.dwSoftAssociations;
  674. m_dwInvalidPacketsReceived = stats.dwInvalidPacketsReceived;
  675. return *this;
  676. }
  677. };
  678. class CIpsecStatistics
  679. {
  680. public:
  681. DWORD m_dwNumActiveAssociations;
  682. DWORD m_dwNumOffloadedSAs;
  683. DWORD m_dwNumPendingKeyOps;
  684. DWORD m_dwNumKeyAdditions;
  685. DWORD m_dwNumKeyDeletions;
  686. DWORD m_dwNumReKeys;
  687. DWORD m_dwNumActiveTunnels;
  688. DWORD m_dwNumBadSPIPackets;
  689. DWORD m_dwNumPacketsNotDecrypted;
  690. DWORD m_dwNumPacketsNotAuthenticated;
  691. DWORD m_dwNumPacketsWithReplayDetection;
  692. ULARGE_INTEGER m_uConfidentialBytesSent;
  693. ULARGE_INTEGER m_uConfidentialBytesReceived;
  694. ULARGE_INTEGER m_uAuthenticatedBytesSent;
  695. ULARGE_INTEGER m_uAuthenticatedBytesReceived;
  696. ULARGE_INTEGER m_uTransportBytesSent;
  697. ULARGE_INTEGER m_uTransportBytesReceived;
  698. ULARGE_INTEGER m_uBytesSentInTunnels;
  699. ULARGE_INTEGER m_uBytesReceivedInTunnels;
  700. ULARGE_INTEGER m_uOffloadedBytesSent;
  701. ULARGE_INTEGER m_uOffloadedBytesReceived;
  702. CIpsecStatistics & operator=(const IPSEC_STATISTICS stats)
  703. {
  704. m_dwNumActiveAssociations = stats.dwNumActiveAssociations;
  705. m_dwNumOffloadedSAs = stats.dwNumOffloadedSAs;
  706. m_dwNumPendingKeyOps = stats.dwNumPendingKeyOps;
  707. m_dwNumKeyAdditions = stats.dwNumKeyAdditions;
  708. m_dwNumKeyDeletions = stats.dwNumKeyDeletions;
  709. m_dwNumReKeys = stats.dwNumReKeys;
  710. m_dwNumActiveTunnels = stats.dwNumActiveTunnels;
  711. m_dwNumBadSPIPackets = stats.dwNumBadSPIPackets;
  712. m_dwNumPacketsNotDecrypted = stats.dwNumPacketsNotDecrypted;
  713. m_dwNumPacketsNotAuthenticated = stats.dwNumPacketsNotAuthenticated;
  714. m_dwNumPacketsWithReplayDetection = stats.dwNumPacketsWithReplayDetection;
  715. m_uConfidentialBytesSent = stats.uConfidentialBytesSent;
  716. m_uConfidentialBytesReceived = stats.uConfidentialBytesReceived;
  717. m_uAuthenticatedBytesSent = stats.uAuthenticatedBytesSent;
  718. m_uAuthenticatedBytesReceived = stats.uAuthenticatedBytesReceived;
  719. m_uBytesSentInTunnels = stats.uBytesSentInTunnels;
  720. m_uTransportBytesSent = stats.uTransportBytesSent;
  721. m_uTransportBytesReceived = stats.uTransportBytesReceived;
  722. m_uBytesReceivedInTunnels = stats.uBytesReceivedInTunnels;
  723. m_uOffloadedBytesSent = stats.uOffloadedBytesSent;
  724. m_uOffloadedBytesReceived = stats.uOffloadedBytesReceived;
  725. return *this;
  726. }
  727. };
  728. typedef CArray<CQmPolicyInfo *, CQmPolicyInfo *> CQmPolicyInfoArray;
  729. typedef CArray<CMmPolicyInfo *, CMmPolicyInfo *> CMmPolicyInfoArray;
  730. typedef CArray<CFilterInfo *, CFilterInfo *> CFilterInfoArray;
  731. struct SA_ENTRY
  732. {
  733. IPSEC_SA_INFO * psaInfo;
  734. CString stPolicyName;
  735. CString stFilterName;
  736. };
  737. // for our interface
  738. #define DeclareISpdInfoMembers(IPURE) \
  739. STDMETHOD(Destroy) (THIS) IPURE; \
  740. STDMETHOD(SetComputerName) (THIS_ LPTSTR pszName) IPURE; \
  741. STDMETHOD(GetComputerName) (THIS_ CString * pstName) IPURE; \
  742. STDMETHOD(EnumQmFilters) (THIS) IPURE; \
  743. STDMETHOD(EnumMmPolicies) (THIS) IPURE; \
  744. STDMETHOD(EnumMmFilters) (THIS) IPURE; \
  745. STDMETHOD(EnumQmPolicies) (THIS) IPURE; \
  746. STDMETHOD(EnumSpecificFilters) (THIS_ GUID * pTransFilterGuid, CFilterInfoArray * parraySpecificFilters, FILTER_TYPE fltrType) IPURE; \
  747. STDMETHOD(EnumMmSpecificFilters) (THIS_ GUID * pGenFilterGuid, CMmFilterInfoArray * parraySpecificFilters) IPURE; \
  748. STDMETHOD(EnumQmSAsFromMmSA) (THIS_ const CMmSA & MmSA, CQmSAArray * parrayQmSAs) IPURE; \
  749. STDMETHOD(EnumMmAuthMethods) (THIS) IPURE; \
  750. STDMETHOD(EnumMmSAs) (THIS) IPURE; \
  751. STDMETHOD(EnumQmSAs) (THIS) IPURE; \
  752. STDMETHOD(GetFilterInfo) (THIS_ int iIndex, CFilterInfo * pTransFltr) IPURE; \
  753. STDMETHOD(GetSpecificFilterInfo) (THIS_ int iIndex, CFilterInfo * pTransFltr) IPURE; \
  754. STDMETHOD(GetMmPolicyInfo) (THIS_ int iIndex, CMmPolicyInfo * pMmPolicy) IPURE; \
  755. STDMETHOD(GetMmFilterInfo) (THIS_ int iIndex, CMmFilterInfo * pMmPolicy) IPURE; \
  756. STDMETHOD(GetMmSpecificFilterInfo) (THIS_ int iIndex, CMmFilterInfo * pMmPolicy) IPURE; \
  757. STDMETHOD(GetQmPolicyInfo) (THIS_ int iIndex, CQmPolicyInfo * pMmPolicy) IPURE; \
  758. STDMETHOD(GetQmPolicyNameByGuid) (THIS_ GUID Guid, CString * pst) IPURE; \
  759. STDMETHOD(GetMmAuthMethodsInfo) (THIS_ int iIndex, CMmAuthMethods * pMmAuth) IPURE; \
  760. STDMETHOD(GetMmSAInfo) (THIS_ int iIndex, CMmSA * pSA) IPURE; \
  761. STDMETHOD(GetQmSAInfo) (THIS_ int iIndex, CQmSA * pSA) IPURE; \
  762. STDMETHOD(GetMmAuthMethodsInfoByGuid) (THIS_ GUID guid, CMmAuthMethods * pMmAuth) IPURE; \
  763. STDMETHOD(GetMmPolicyNameByGuid) (THIS_ GUID Guid, CString * pst) IPURE; \
  764. STDMETHOD_(DWORD, GetQmFilterCountOfCurrentViewType) (THIS) IPURE; \
  765. STDMETHOD_(DWORD, GetQmSpFilterCountOfCurrentViewType) (THIS) IPURE; \
  766. STDMETHOD_(DWORD, GetMmFilterCount) (THIS) IPURE; \
  767. STDMETHOD_(DWORD, GetMmSpecificFilterCount) (THIS) IPURE; \
  768. STDMETHOD_(DWORD, GetMmPolicyCount) (THIS) IPURE; \
  769. STDMETHOD_(DWORD, GetMmAuthMethodsCount) (THIS) IPURE; \
  770. STDMETHOD_(DWORD, GetMmSACount) (THIS) IPURE; \
  771. STDMETHOD_(DWORD, GetQmSACount) (THIS) IPURE; \
  772. STDMETHOD_(DWORD, GetQmPolicyCount) (THIS) IPURE; \
  773. STDMETHOD(GetMatchFilters) (THIS_ CFilterInfo * pfltrSearchCondition, DWORD dwPreferredNum, CFilterInfoArray * parrFilters) IPURE; \
  774. STDMETHOD(GetMatchMMFilters) (THIS_ CMmFilterInfo * pfltrSearchCondition, DWORD dwPreferredNum, CMmFilterInfoArray * parrFilters) IPURE; \
  775. STDMETHOD(SortFilters) (THIS_ DWORD dwIndexType, DWORD dwSortOptions) IPURE; \
  776. STDMETHOD(SortSpecificFilters) (THIS_ DWORD dwIndexType, DWORD dwSortOptions) IPURE; \
  777. STDMETHOD(SortMmFilters) (DWORD dwIndexType, DWORD dwSortOptions) IPURE; \
  778. STDMETHOD(SortMmSpecificFilters) (DWORD dwIndexType, DWORD dwSortOptions) IPURE; \
  779. STDMETHOD(SortMmPolicies) (DWORD dwIndexType, DWORD dwSortOptions) IPURE; \
  780. STDMETHOD(SortQmPolicies) (DWORD dwIndexType, DWORD dwSortOptions) IPURE; \
  781. STDMETHOD(SortMmSAs) (DWORD dwIndexType, DWORD dwSortOptions) IPURE; \
  782. STDMETHOD(SortQmSAs) (DWORD dwIndexType, DWORD dwSortOptions) IPURE; \
  783. STDMETHOD(LoadStatistics) (THIS) IPURE; \
  784. STDMETHOD_(void, GetLoadedStatistics) (CIkeStatistics * pIkeStats, CIpsecStatistics * pIpsecStats) IPURE; \
  785. STDMETHOD_(void, ChangeQmFilterViewType) (FILTER_TYPE FltrType) IPURE; \
  786. STDMETHOD_(void, ChangeQmSpFilterViewType) (FILTER_TYPE FltrType) IPURE; \
  787. STDMETHOD_(DWORD, GetInitInfo) (THIS) IPURE; \
  788. STDMETHOD_(void, SetInitInfo) (THIS_ DWORD dwInitInfo) IPURE; \
  789. STDMETHOD_(DWORD, GetActiveInfo) (THIS) IPURE; \
  790. STDMETHOD_(void, SetActiveInfo) (THIS_ DWORD dwActiveInfo) IPURE; \
  791. STDMETHOD(EnumQmSpFilters) (THIS) IPURE; \
  792. #undef INTERFACE
  793. #define INTERFACE ISpdInfo
  794. DECLARE_INTERFACE_(ISpdInfo, IUnknown)
  795. {
  796. public:
  797. DeclareIUnknownMembers(PURE)
  798. DeclareISpdInfoMembers(PURE)
  799. };
  800. typedef ComSmartPointer<ISpdInfo, &IID_ISpdInfo> SPISpdInfo;
  801. class CSpdInfo : public ISpdInfo
  802. {
  803. public:
  804. CSpdInfo();
  805. ~CSpdInfo();
  806. DeclareIUnknownMembers(IMPL);
  807. DeclareISpdInfoMembers(IMPL);
  808. private:
  809. CFilterInfoArray m_arrayFilters; //for generic filters
  810. CIndexMgrFilter m_IndexMgrFilters;
  811. CFilterInfoArray m_arraySpecificFilters; //for specific filters
  812. CIndexMgrFilter m_IndexMgrSpecificFilters;
  813. CMmFilterInfoArray m_arrayMmFilters;
  814. CIndexMgrMmFilter m_IndexMgrMmFilters;
  815. CMmFilterInfoArray m_arrayMmSpecificFilters;
  816. CIndexMgrMmFilter m_IndexMgrMmSpecificFilters;
  817. CMmPolicyInfoArray m_arrayMmPolicies;
  818. CIndexMgrMmPolicy m_IndexMgrMmPolicies;
  819. CMmSAArray m_arrayMmSAs;
  820. CIndexMgrMmSA m_IndexMgrMmSAs;
  821. CQmSAArray m_arrayQmSAs;
  822. CIndexMgrQmSA m_IndexMgrQmSAs;
  823. CQmPolicyInfoArray m_arrayQmPolicies;
  824. CIndexMgrQmPolicy m_IndexMgrQmPolicies;
  825. CMmAuthMethodsArray m_arrMmAuthMethods;
  826. CIkeStatistics m_IkeStats;
  827. CIpsecStatistics m_IpsecStats;
  828. CCriticalSection m_csData;
  829. CString m_stMachineName;
  830. LONG m_cRef;
  831. DWORD m_Init;
  832. DWORD m_Active;
  833. HANDLE m_hSubAllocator;
  834. NAME_TREE m_QmPolicyTree;
  835. private:
  836. void ConvertToExternalFilterData(CFilterInfo * pfltrIn, TRANSPORT_FILTER * pfltrOut);
  837. void CSpdInfo::ConvertToExternalMMFilterData (
  838. CMmFilterInfo * pfltrIn,
  839. MM_FILTER * pfltrOut);
  840. HRESULT LoadMiscMmFilterInfo(CMmFilterInfo * pFltr);
  841. HRESULT LoadMiscFilterInfo(CFilterInfo * pFilter);
  842. HRESULT LoadMiscMmSAInfo(CMmSA * pSA);
  843. HRESULT LoadMiscQmSAInfo(CQmSA * pSA);
  844. HRESULT InternalEnumMmFilters(
  845. DWORD dwLevel,
  846. GUID guid,
  847. CMmFilterInfoArray * pArray,
  848. DWORD dwPreferredNum = 0 /*by default get all entries*/);
  849. HRESULT InternalEnumTransportFilters(
  850. DWORD dwLevel,
  851. GUID guid,
  852. CFilterInfoArray * pArray,
  853. DWORD dwPreferredNum = 0 /*by default get all entries*/);
  854. HRESULT InternalEnumTunnelFilters(
  855. DWORD dwLevel,
  856. GUID guid,
  857. CFilterInfoArray * pArray,
  858. DWORD dwPreferredNum = 0 /*by default get all entries*/);
  859. HRESULT InternalEnumMmPolicies(
  860. CMmPolicyInfoArray * pArray,
  861. DWORD dwPreferredNum = 0 /*by default get all entries*/);
  862. HRESULT InternalEnumQmPolicies(
  863. CQmPolicyInfoArray * pArray,
  864. DWORD dwPreferredNum = 0 /*by default get all entries*/);
  865. HRESULT InternalEnumMmAuthMethods(
  866. CMmAuthMethodsArray * pArray,
  867. DWORD dwPreferredNum = 0 /*by default get all entries*/);
  868. HRESULT InternalEnumMmSAs(CMmSAArray * pArray);
  869. HRESULT InternalEnumQmSAs(CQmSAArray * pArray);
  870. void FreeIpsecSAList();
  871. HRESULT CallPA();
  872. HRESULT GetQmPolicyByGuid(GUID guid, PIPSEC_QM_POLICY *ppPolicy);
  873. HRESULT InitQmPolicyTree();
  874. HRESULT InsertQmPolicyToTree(PIPSEC_QM_POLICY pPolicy);
  875. PQMPOLOCYINFO GetQmPolInfoFromTree(GUID PolicyID);
  876. };
  877. HRESULT CreateSpdInfo(ISpdInfo **ppSpdInfo);
  878. #endif