PageRenderTime 57ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/Sources/UTIL/include/wpa.h

https://bitbucket.org/Mali_Laurent/ps50c550
C Header | 554 lines | 411 code | 81 blank | 62 comment | 30 complexity | 16013b92a0d4e1ec27b86b80e1a645f8 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, LGPL-2.1, AGPL-1.0, CC-BY-SA-3.0, BSD-3-Clause
  1. /*
  2. ***************************************************************************
  3. * Ralink Tech Inc.
  4. * 4F, No. 2 Technology 5th Rd.
  5. * Science-based Industrial Park
  6. * Hsin-chu, Taiwan, R.O.C.
  7. *
  8. * (c) Copyright 2002-2004, Ralink Technology, Inc.
  9. *
  10. * All rights reserved. Ralink's source code is an unpublished work and the
  11. * use of a copyright notice does not imply otherwise. This source code
  12. * contains confidential trade secret material of Ralink Tech. Any attemp
  13. * or participation in deciphering, decoding, reverse engineering or in any
  14. * way altering the source code is stricitly prohibited, unless the prior
  15. * written consent of Ralink Technology, Inc. is obtained.
  16. ***************************************************************************
  17. Module Name:
  18. wpa.h
  19. Abstract:
  20. Revision History:
  21. Who When What
  22. -------- ---------- ----------------------------------------------
  23. Name Date Modification logs
  24. */
  25. #ifndef __WPA_H__
  26. #define __WPA_H__
  27. #ifndef ROUND_UP
  28. #define ROUND_UP(__x, __y) \
  29. (((ULONG)((__x)+((__y)-1))) & ((ULONG)~((__y)-1)))
  30. #endif
  31. #define SET_UINT16_TO_ARRARY(_V, _LEN) \
  32. { \
  33. _V[0] = ((UINT16)_LEN) >> 8; \
  34. _V[1] = ((UINT16)_LEN & 0xFF); \
  35. }
  36. #define INC_UINT16_TO_ARRARY(_V, _LEN) \
  37. { \
  38. UINT16 var_len; \
  39. \
  40. var_len = (_V[0]<<8) | (_V[1]); \
  41. var_len += _LEN; \
  42. \
  43. _V[0] = (var_len & 0xFF00) >> 8; \
  44. _V[1] = (var_len & 0xFF); \
  45. }
  46. #define CONV_ARRARY_TO_UINT16(_V) ((_V[0]<<8) | (_V[1]))
  47. #define ADD_ONE_To_64BIT_VAR(_V) \
  48. { \
  49. UCHAR cnt = LEN_KEY_DESC_REPLAY; \
  50. do \
  51. { \
  52. cnt--; \
  53. _V[cnt]++; \
  54. if (cnt == 0) \
  55. break; \
  56. }while (_V[cnt] == 0); \
  57. }
  58. #define INC_TX_TSC(_tsc, _cnt) \
  59. { \
  60. INT i=0; \
  61. while (++_tsc[i] == 0x0) \
  62. { \
  63. i++; \
  64. if (i == (_cnt)) \
  65. break; \
  66. } \
  67. }
  68. #define IS_WPA_CAPABILITY(a) (((a) >= Ndis802_11AuthModeWPA) && ((a) <= Ndis802_11AuthModeWPA1PSKWPA2PSK))
  69. /*
  70. WFA recommend to restrict the encryption type in 11n-HT mode.
  71. So, the WEP and TKIP shall not be allowed to use HT rate.
  72. */
  73. #define IS_INVALID_HT_SECURITY(_mode) \
  74. (((_mode) == Ndis802_11Encryption1Enabled) || \
  75. ((_mode) == Ndis802_11Encryption2Enabled) || \
  76. ((_mode) == Ndis802_11Encryption4Enabled))
  77. #define MIX_CIPHER_WPA_TKIP_ON(x) (((x) & 0x08) != 0)
  78. #define MIX_CIPHER_WPA_AES_ON(x) (((x) & 0x04) != 0)
  79. #define MIX_CIPHER_WPA2_TKIP_ON(x) (((x) & 0x02) != 0)
  80. #define MIX_CIPHER_WPA2_AES_ON(x) (((x) & 0x01) != 0)
  81. /* Some definition are different between Keneral mode and Daemon mode */
  82. #ifdef WPA_DAEMON_MODE
  83. /* The definition for Daemon mode */
  84. #define WPA_GET_BSS_NUM(_pAd) (_pAd)->mbss_num
  85. #define WPA_GET_PMK(_pAd, _pEntry, _pmk) \
  86. { \
  87. _pmk = _pAd->MBSS[_pEntry->apidx].PMK; \
  88. }
  89. #define WPA_GET_GTK(_pAd, _pEntry, _gtk) \
  90. { \
  91. _gtk = _pAd->MBSS[_pEntry->apidx].GTK; \
  92. }
  93. #define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher) \
  94. { \
  95. _cipher = (_pAd)->MBSS[_pEntry->apidx].GroupEncrypType; \
  96. }
  97. #define WPA_GET_DEFAULT_KEY_ID(_pAd, _pEntry, _idx) \
  98. { \
  99. _idx = (_pAd)->MBSS[_pEntry->apidx].DefaultKeyId; \
  100. }
  101. #define WPA_GET_BMCST_TSC(_pAd, _pEntry, _tsc) \
  102. { \
  103. _tsc = 1; \
  104. }
  105. #define WPA_BSSID(_pAd, _apidx) (_pAd)->MBSS[_apidx].wlan_addr
  106. #define WPA_OS_MALLOC(_p, _s) \
  107. { \
  108. _p = os_malloc(_s); \
  109. }
  110. #define WPA_OS_FREE(_p) \
  111. { \
  112. os_free(_p); \
  113. }
  114. #define WPA_GET_CURRENT_TIME(_time) \
  115. { \
  116. struct timeval tv; \
  117. gettimeofday(&tv, NULL); \
  118. *(_time) = tv.tv_sec; \
  119. }
  120. #else
  121. /* The definition for Driver mode */
  122. #if defined(CONFIG_AP_SUPPORT) && defined(CONFIG_STA_SUPPORT)
  123. #define WPA_GET_BSS_NUM(_pAd) (((_pAd)->OpMode == OPMODE_AP) ? (_pAd)->ApCfg.BssidNum : 1)
  124. #define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher) \
  125. { \
  126. _cipher = Ndis802_11WEPDisabled; \
  127. if ((_pAd)->OpMode == OPMODE_AP) \
  128. { \
  129. if (IS_ENTRY_APCLI(_pEntry) && \
  130. ((_pEntry)->MatchAPCLITabIdx < MAX_APCLI_NUM)) \
  131. _cipher = (_pAd)->ApCfg.ApCliTab[(_pEntry)->MatchAPCLITabIdx].GroupCipher; \
  132. else if ((_pEntry)->apidx < (_pAd)->ApCfg.BssidNum) \
  133. _cipher = (_pAd)->ApCfg.MBSSID[_pEntry->apidx].GroupKeyWepStatus;\
  134. } \
  135. else \
  136. _cipher = (_pAd)->StaCfg.GroupCipher; \
  137. }
  138. #define WPA_BSSID(_pAd, _apidx) (((_pAd)->OpMode == OPMODE_AP) ?\
  139. (_pAd)->ApCfg.MBSSID[_apidx].Bssid :\
  140. (_pAd)->CommonCfg.Bssid)
  141. #elif defined(CONFIG_AP_SUPPORT)
  142. #define WPA_GET_BSS_NUM(_pAd) (_pAd)->ApCfg.BssidNum
  143. #define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher) \
  144. { \
  145. _cipher = Ndis802_11WEPDisabled; \
  146. if (IS_ENTRY_APCLI(_pEntry) && \
  147. ((_pEntry)->MatchAPCLITabIdx < MAX_APCLI_NUM)) \
  148. _cipher = (_pAd)->ApCfg.ApCliTab[(_pEntry)->MatchAPCLITabIdx].GroupCipher; \
  149. else if ((_pEntry)->apidx < (_pAd)->ApCfg.BssidNum) \
  150. _cipher = (_pAd)->ApCfg.MBSSID[_pEntry->apidx].GroupKeyWepStatus;\
  151. }
  152. #define WPA_BSSID(_pAd, _apidx) (_pAd)->ApCfg.MBSSID[_apidx].Bssid
  153. #elif defined(CONFIG_STA_SUPPORT)
  154. #define WPA_GET_BSS_NUM(_pAd) 1
  155. #define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher) \
  156. { \
  157. _cipher = (_pAd)->StaCfg.GroupCipher; \
  158. }
  159. #define WPA_BSSID(_pAd, _apidx) (_pAd)->CommonCfg.Bssid
  160. #endif // defined(CONFIG_STA_SUPPORT) //
  161. #define WPA_OS_MALLOC(_p, _s) \
  162. { \
  163. os_alloc_mem(NULL, (PUCHAR *)&_p, _s); \
  164. }
  165. #define WPA_OS_FREE(_p) \
  166. { \
  167. os_free_mem(NULL, _p); \
  168. }
  169. #define WPA_GET_CURRENT_TIME(_time) NdisGetSystemUpTime(_time);
  170. #endif // End of Driver Mode //
  171. /*========================================
  172. The prototype is defined in cmm_wpa.c
  173. ========================================*/
  174. void inc_iv_byte(
  175. UCHAR *iv,
  176. UINT len,
  177. UINT cnt);
  178. BOOLEAN WpaMsgTypeSubst(
  179. IN UCHAR EAPType,
  180. OUT INT *MsgType);
  181. VOID PRF(
  182. IN UCHAR *key,
  183. IN INT key_len,
  184. IN UCHAR *prefix,
  185. IN INT prefix_len,
  186. IN UCHAR *data,
  187. IN INT data_len,
  188. OUT UCHAR *output,
  189. IN INT len);
  190. int RtmpPasswordHash(
  191. char *password,
  192. unsigned char *ssid,
  193. int ssidlength,
  194. unsigned char *output);
  195. VOID KDF(
  196. IN PUINT8 key,
  197. IN INT key_len,
  198. IN PUINT8 label,
  199. IN INT label_len,
  200. IN PUINT8 data,
  201. IN INT data_len,
  202. OUT PUINT8 output,
  203. IN USHORT len);
  204. PUINT8 WPA_ExtractSuiteFromRSNIE(
  205. IN PUINT8 rsnie,
  206. IN UINT rsnie_len,
  207. IN UINT8 type,
  208. OUT UINT8 *count);
  209. VOID WpaShowAllsuite(
  210. IN PUINT8 rsnie,
  211. IN UINT rsnie_len);
  212. VOID RTMPInsertRSNIE(
  213. IN PUCHAR pFrameBuf,
  214. OUT PULONG pFrameLen,
  215. IN PUINT8 rsnie_ptr,
  216. IN UINT8 rsnie_len,
  217. IN PUINT8 pmkid_ptr,
  218. IN UINT8 pmkid_len);
  219. /*
  220. =====================================
  221. function prototype in cmm_wpa.c
  222. =====================================
  223. */
  224. VOID RTMPToWirelessSta(
  225. IN PRTMP_ADAPTER pAd,
  226. IN PMAC_TABLE_ENTRY pEntry,
  227. IN PUCHAR pHeader802_3,
  228. IN UINT HdrLen,
  229. IN PUCHAR pData,
  230. IN UINT DataLen,
  231. IN BOOLEAN bClearFrame);
  232. VOID WpaDerivePTK(
  233. IN PRTMP_ADAPTER pAd,
  234. IN UCHAR *PMK,
  235. IN UCHAR *ANonce,
  236. IN UCHAR *AA,
  237. IN UCHAR *SNonce,
  238. IN UCHAR *SA,
  239. OUT UCHAR *output,
  240. IN UINT len);
  241. VOID WpaDeriveGTK(
  242. IN UCHAR *PMK,
  243. IN UCHAR *GNonce,
  244. IN UCHAR *AA,
  245. OUT UCHAR *output,
  246. IN UINT len);
  247. VOID GenRandom(
  248. IN PRTMP_ADAPTER pAd,
  249. IN UCHAR *macAddr,
  250. OUT UCHAR *random);
  251. BOOLEAN RTMPCheckWPAframe(
  252. IN PRTMP_ADAPTER pAd,
  253. IN PMAC_TABLE_ENTRY pEntry,
  254. IN PUCHAR pData,
  255. IN ULONG DataByteCount,
  256. IN UCHAR FromWhichBSSID);
  257. BOOLEAN RTMPParseEapolKeyData(
  258. IN PRTMP_ADAPTER pAd,
  259. IN PUCHAR pKeyData,
  260. IN UCHAR KeyDataLen,
  261. IN UCHAR GroupKeyIndex,
  262. IN UCHAR MsgType,
  263. IN BOOLEAN bWPA2,
  264. IN MAC_TABLE_ENTRY *pEntry);
  265. VOID WPA_ConstructKdeHdr(
  266. IN UINT8 data_type,
  267. IN UINT8 data_len,
  268. OUT PUCHAR pBuf);
  269. VOID ConstructEapolMsg(
  270. IN PMAC_TABLE_ENTRY pEntry,
  271. IN UCHAR GroupKeyWepStatus,
  272. IN UCHAR MsgType,
  273. IN UCHAR DefaultKeyIdx,
  274. IN UCHAR *KeyNonce,
  275. IN UCHAR *TxRSC,
  276. IN UCHAR *GTK,
  277. IN UCHAR *RSNIE,
  278. IN UCHAR RSNIE_Len,
  279. OUT PEAPOL_PACKET pMsg);
  280. PCIPHER_KEY RTMPSwCipherKeySelection(
  281. IN PRTMP_ADAPTER pAd,
  282. IN PUCHAR pIV,
  283. IN RX_BLK *pRxBlk,
  284. IN PMAC_TABLE_ENTRY pEntry);
  285. NDIS_STATUS RTMPSoftDecryptionAction(
  286. IN PRTMP_ADAPTER pAd,
  287. IN PUCHAR pHdr,
  288. IN UCHAR UserPriority,
  289. IN PCIPHER_KEY pKey,
  290. INOUT PUCHAR pData,
  291. INOUT UINT16 *DataByteCnt);
  292. VOID RTMPSoftConstructIVHdr(
  293. IN UCHAR CipherAlg,
  294. IN UCHAR key_id,
  295. IN PUCHAR pTxIv,
  296. OUT PUCHAR pHdrIv,
  297. OUT UINT8 *hdr_iv_len);
  298. VOID RTMPSoftEncryptionAction(
  299. IN PRTMP_ADAPTER pAd,
  300. IN UCHAR CipherAlg,
  301. IN PUCHAR pHdr,
  302. IN PUCHAR pSrcBufData,
  303. IN UINT32 SrcBufLen,
  304. IN UCHAR KeyIdx,
  305. IN PCIPHER_KEY pKey,
  306. OUT UINT8 *ext_len);
  307. VOID RTMPMakeRSNIE(
  308. IN PRTMP_ADAPTER pAd,
  309. IN UINT AuthMode,
  310. IN UINT WepStatus,
  311. IN UCHAR apidx);
  312. VOID WPAInstallPairwiseKey(
  313. PRTMP_ADAPTER pAd,
  314. UINT8 BssIdx,
  315. PMAC_TABLE_ENTRY pEntry,
  316. BOOLEAN bAE);
  317. VOID WPAInstallSharedKey(
  318. PRTMP_ADAPTER pAd,
  319. UINT8 GroupCipher,
  320. UINT8 BssIdx,
  321. UINT8 KeyIdx,
  322. UINT8 Wcid,
  323. BOOLEAN bAE,
  324. PUINT8 pGtk);
  325. VOID RTMPSetWcidSecurityInfo(
  326. PRTMP_ADAPTER pAd,
  327. UINT8 BssIdx,
  328. UINT8 KeyIdx,
  329. UINT8 CipherAlg,
  330. UINT8 Wcid,
  331. UINT8 KeyTabFlag);
  332. VOID CalculateMIC(
  333. IN UCHAR KeyDescVer,
  334. IN UCHAR *PTK,
  335. OUT PEAPOL_PACKET pMsg);
  336. PSTRING GetEapolMsgType(CHAR msg);
  337. #ifdef CONFIG_STA_SUPPORT
  338. /*
  339. =====================================
  340. function prototype in cmm_wpa_adhoc.c
  341. =====================================
  342. */
  343. VOID WpaProfileInit(
  344. IN PRTMP_ADAPTER pAd,
  345. IN MAC_TABLE_ENTRY *pEntry);
  346. VOID WpaProfileRelease(
  347. IN PRTMP_ADAPTER pAd,
  348. IN MAC_TABLE_ENTRY *pEntry);
  349. VOID WpaProfileReset(
  350. IN PRTMP_ADAPTER pAd,
  351. IN MAC_TABLE_ENTRY *pEntry,
  352. IN PFOUR_WAY_HANDSHAKE_PROFILE p4WayProfile);
  353. VOID WpaProfileDataHook(
  354. IN PRTMP_ADAPTER pAd,
  355. IN MAC_TABLE_ENTRY *pEntry,
  356. IN PFOUR_WAY_HANDSHAKE_PROFILE p4WayProfile);
  357. VOID Adhoc_WpaEAPOLStartAction(
  358. IN PRTMP_ADAPTER pAd,
  359. IN MLME_QUEUE_ELEM *Elem);
  360. VOID Adhoc_WpaEAPOLKeyAction(
  361. IN PRTMP_ADAPTER pAd,
  362. IN MLME_QUEUE_ELEM *Elem);
  363. VOID Adhoc_WpaRetryExec(
  364. IN PVOID SystemSpecific1,
  365. IN PVOID FunctionContext,
  366. IN PVOID SystemSpecific2,
  367. IN PVOID SystemSpecific3);
  368. VOID Adhoc_ConstructEapolMsg(
  369. IN PMAC_TABLE_ENTRY pEntry,
  370. IN UCHAR GroupKeyWepStatus,
  371. IN UCHAR MsgType,
  372. IN UCHAR DefaultKeyIdx,
  373. IN UCHAR *KeyNonce,
  374. IN UCHAR *TxRSC,
  375. IN UCHAR *GTK,
  376. IN UCHAR *RSNIE,
  377. IN UCHAR RSNIE_Len,
  378. IN PFOUR_WAY_HANDSHAKE_PROFILE p4WayProfile,
  379. OUT PEAPOL_PACKET pMsg);
  380. VOID Adhoc_ConstructEapolKeyData(
  381. IN PMAC_TABLE_ENTRY pEntry,
  382. IN UCHAR GroupKeyWepStatus,
  383. IN UCHAR keyDescVer,
  384. IN UCHAR MsgType,
  385. IN UCHAR DefaultKeyIdx,
  386. IN UCHAR *GTK,
  387. IN UCHAR *RSNIE,
  388. IN UCHAR RSNIE_LEN,
  389. IN PFOUR_WAY_HANDSHAKE_PROFILE p4WayProfile,
  390. OUT PEAPOL_PACKET pMsg);
  391. #endif // CONFIG_STA_SUPPORT //
  392. /*
  393. =====================================
  394. function prototype in cmm_wep.c
  395. =====================================
  396. */
  397. UINT RTMP_CALC_FCS32(
  398. IN UINT Fcs,
  399. IN PUCHAR Cp,
  400. IN INT Len);
  401. VOID RTMPConstructWEPIVHdr(
  402. IN UINT8 key_idx,
  403. IN UCHAR *pn,
  404. OUT UCHAR *iv_hdr);
  405. BOOLEAN RTMPSoftEncryptWEP(
  406. IN PRTMP_ADAPTER pAd,
  407. IN PUCHAR pIvHdr,
  408. IN PCIPHER_KEY pKey,
  409. INOUT PUCHAR pData,
  410. IN ULONG DataByteCnt);
  411. BOOLEAN RTMPSoftDecryptWEP(
  412. IN PRTMP_ADAPTER pAd,
  413. IN PCIPHER_KEY pKey,
  414. INOUT PUCHAR pData,
  415. INOUT UINT16 *DataByteCnt);
  416. /*
  417. =====================================
  418. function prototype in cmm_tkip.c
  419. =====================================
  420. */
  421. BOOLEAN RTMPSoftDecryptTKIP(
  422. IN PRTMP_ADAPTER pAd,
  423. IN PUCHAR pHdr,
  424. IN UCHAR UserPriority,
  425. IN PCIPHER_KEY pKey,
  426. INOUT PUCHAR pData,
  427. IN UINT16 *DataByteCnt);
  428. VOID TKIP_GTK_KEY_WRAP(
  429. IN UCHAR *key,
  430. IN UCHAR *iv,
  431. IN UCHAR *input_text,
  432. IN UINT32 input_len,
  433. OUT UCHAR *output_text);
  434. VOID TKIP_GTK_KEY_UNWRAP(
  435. IN UCHAR *key,
  436. IN UCHAR *iv,
  437. IN UCHAR *input_text,
  438. IN UINT32 input_len,
  439. OUT UCHAR *output_text);
  440. /*
  441. =====================================
  442. function prototype in cmm_aes.c
  443. =====================================
  444. */
  445. BOOLEAN RTMPSoftDecryptAES(
  446. IN PRTMP_ADAPTER pAd,
  447. IN PUCHAR pData,
  448. IN ULONG DataByteCnt,
  449. IN PCIPHER_KEY pWpaKey);
  450. VOID RTMPConstructCCMPHdr(
  451. IN UINT8 key_idx,
  452. IN UCHAR *pn,
  453. OUT UCHAR *ccmp_hdr);
  454. BOOLEAN RTMPSoftEncryptCCMP(
  455. IN PRTMP_ADAPTER pAd,
  456. IN PUCHAR pHdr,
  457. IN PUCHAR pIV,
  458. IN PUCHAR pKey,
  459. INOUT PUCHAR pData,
  460. IN UINT32 DataLen);
  461. BOOLEAN RTMPSoftDecryptCCMP(
  462. IN PRTMP_ADAPTER pAd,
  463. IN PUCHAR pHdr,
  464. IN PCIPHER_KEY pKey,
  465. INOUT PUCHAR pData,
  466. INOUT UINT16 *DataLen);
  467. VOID CCMP_test_vector(
  468. IN PRTMP_ADAPTER pAd,
  469. IN INT input);
  470. #endif