wpa_common.c 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550
  1. /*
  2. * WPA/RSN - Shared functions for supplicant and authenticator
  3. * Copyright (c) 2002-2013, Jouni Malinen <j@w1.fi>
  4. *
  5. * This software may be distributed under the terms of the BSD license.
  6. * See README for more details.
  7. */
  8. #include "includes.h"
  9. #include "common.h"
  10. #include "crypto/md5.h"
  11. #include "crypto/sha1.h"
  12. #include "crypto/sha256.h"
  13. #include "crypto/aes_wrap.h"
  14. #include "crypto/crypto.h"
  15. #include "ieee802_11_defs.h"
  16. #include "defs.h"
  17. #include "wpa_common.h"
  18. /**
  19. * wpa_eapol_key_mic - Calculate EAPOL-Key MIC
  20. * @key: EAPOL-Key Key Confirmation Key (KCK)
  21. * @akmp: WPA_KEY_MGMT_* used in key derivation
  22. * @ver: Key descriptor version (WPA_KEY_INFO_TYPE_*)
  23. * @buf: Pointer to the beginning of the EAPOL header (version field)
  24. * @len: Length of the EAPOL frame (from EAPOL header to the end of the frame)
  25. * @mic: Pointer to the buffer to which the EAPOL-Key MIC is written
  26. * Returns: 0 on success, -1 on failure
  27. *
  28. * Calculate EAPOL-Key MIC for an EAPOL-Key packet. The EAPOL-Key MIC field has
  29. * to be cleared (all zeroes) when calling this function.
  30. *
  31. * Note: 'IEEE Std 802.11i-2004 - 8.5.2 EAPOL-Key frames' has an error in the
  32. * description of the Key MIC calculation. It includes packet data from the
  33. * beginning of the EAPOL-Key header, not EAPOL header. This incorrect change
  34. * happened during final editing of the standard and the correct behavior is
  35. * defined in the last draft (IEEE 802.11i/D10).
  36. */
  37. int wpa_eapol_key_mic(const u8 *key, int akmp, int ver, const u8 *buf,
  38. size_t len, u8 *mic)
  39. {
  40. u8 hash[SHA256_MAC_LEN];
  41. switch (ver) {
  42. #ifndef CONFIG_FIPS
  43. case WPA_KEY_INFO_TYPE_HMAC_MD5_RC4:
  44. return hmac_md5(key, 16, buf, len, mic);
  45. #endif /* CONFIG_FIPS */
  46. case WPA_KEY_INFO_TYPE_HMAC_SHA1_AES:
  47. if (hmac_sha1(key, 16, buf, len, hash))
  48. return -1;
  49. os_memcpy(mic, hash, MD5_MAC_LEN);
  50. break;
  51. #if defined(CONFIG_IEEE80211R) || defined(CONFIG_IEEE80211W)
  52. case WPA_KEY_INFO_TYPE_AES_128_CMAC:
  53. return omac1_aes_128(key, buf, len, mic);
  54. #endif /* CONFIG_IEEE80211R || CONFIG_IEEE80211W */
  55. case WPA_KEY_INFO_TYPE_AKM_DEFINED:
  56. switch (akmp) {
  57. #ifdef CONFIG_HS20
  58. case WPA_KEY_MGMT_OSEN:
  59. return omac1_aes_128(key, buf, len, mic);
  60. #endif /* CONFIG_HS20 */
  61. #ifdef CONFIG_SUITEB
  62. case WPA_KEY_MGMT_IEEE8021X_SUITE_B:
  63. if (hmac_sha256(key, 16, buf, len, hash))
  64. return -1;
  65. os_memcpy(mic, hash, MD5_MAC_LEN);
  66. break;
  67. #endif /* CONFIG_SUITEB */
  68. default:
  69. return -1;
  70. }
  71. break;
  72. default:
  73. return -1;
  74. }
  75. return 0;
  76. }
  77. /**
  78. * wpa_pmk_to_ptk - Calculate PTK from PMK, addresses, and nonces
  79. * @pmk: Pairwise master key
  80. * @pmk_len: Length of PMK
  81. * @label: Label to use in derivation
  82. * @addr1: AA or SA
  83. * @addr2: SA or AA
  84. * @nonce1: ANonce or SNonce
  85. * @nonce2: SNonce or ANonce
  86. * @ptk: Buffer for pairwise transient key
  87. * @ptk_len: Length of PTK
  88. * @use_sha256: Whether to use SHA256-based KDF
  89. *
  90. * IEEE Std 802.11i-2004 - 8.5.1.2 Pairwise key hierarchy
  91. * PTK = PRF-X(PMK, "Pairwise key expansion",
  92. * Min(AA, SA) || Max(AA, SA) ||
  93. * Min(ANonce, SNonce) || Max(ANonce, SNonce))
  94. *
  95. * STK = PRF-X(SMK, "Peer key expansion",
  96. * Min(MAC_I, MAC_P) || Max(MAC_I, MAC_P) ||
  97. * Min(INonce, PNonce) || Max(INonce, PNonce))
  98. */
  99. void wpa_pmk_to_ptk(const u8 *pmk, size_t pmk_len, const char *label,
  100. const u8 *addr1, const u8 *addr2,
  101. const u8 *nonce1, const u8 *nonce2,
  102. u8 *ptk, size_t ptk_len, int use_sha256)
  103. {
  104. u8 data[2 * ETH_ALEN + 2 * WPA_NONCE_LEN];
  105. if (os_memcmp(addr1, addr2, ETH_ALEN) < 0) {
  106. os_memcpy(data, addr1, ETH_ALEN);
  107. os_memcpy(data + ETH_ALEN, addr2, ETH_ALEN);
  108. } else {
  109. os_memcpy(data, addr2, ETH_ALEN);
  110. os_memcpy(data + ETH_ALEN, addr1, ETH_ALEN);
  111. }
  112. if (os_memcmp(nonce1, nonce2, WPA_NONCE_LEN) < 0) {
  113. os_memcpy(data + 2 * ETH_ALEN, nonce1, WPA_NONCE_LEN);
  114. os_memcpy(data + 2 * ETH_ALEN + WPA_NONCE_LEN, nonce2,
  115. WPA_NONCE_LEN);
  116. } else {
  117. os_memcpy(data + 2 * ETH_ALEN, nonce2, WPA_NONCE_LEN);
  118. os_memcpy(data + 2 * ETH_ALEN + WPA_NONCE_LEN, nonce1,
  119. WPA_NONCE_LEN);
  120. }
  121. #ifdef CONFIG_IEEE80211W
  122. if (use_sha256)
  123. sha256_prf(pmk, pmk_len, label, data, sizeof(data),
  124. ptk, ptk_len);
  125. else
  126. #endif /* CONFIG_IEEE80211W */
  127. sha1_prf(pmk, pmk_len, label, data, sizeof(data), ptk,
  128. ptk_len);
  129. wpa_printf(MSG_DEBUG, "WPA: PTK derivation - A1=" MACSTR " A2=" MACSTR,
  130. MAC2STR(addr1), MAC2STR(addr2));
  131. wpa_hexdump(MSG_DEBUG, "WPA: Nonce1", nonce1, WPA_NONCE_LEN);
  132. wpa_hexdump(MSG_DEBUG, "WPA: Nonce2", nonce2, WPA_NONCE_LEN);
  133. wpa_hexdump_key(MSG_DEBUG, "WPA: PMK", pmk, pmk_len);
  134. wpa_hexdump_key(MSG_DEBUG, "WPA: PTK", ptk, ptk_len);
  135. }
  136. #ifdef CONFIG_IEEE80211R
  137. int wpa_ft_mic(const u8 *kck, const u8 *sta_addr, const u8 *ap_addr,
  138. u8 transaction_seqnum, const u8 *mdie, size_t mdie_len,
  139. const u8 *ftie, size_t ftie_len,
  140. const u8 *rsnie, size_t rsnie_len,
  141. const u8 *ric, size_t ric_len, u8 *mic)
  142. {
  143. u8 *buf, *pos;
  144. size_t buf_len;
  145. buf_len = 2 * ETH_ALEN + 1 + mdie_len + ftie_len + rsnie_len + ric_len;
  146. buf = os_malloc(buf_len);
  147. if (buf == NULL)
  148. return -1;
  149. pos = buf;
  150. os_memcpy(pos, sta_addr, ETH_ALEN);
  151. pos += ETH_ALEN;
  152. os_memcpy(pos, ap_addr, ETH_ALEN);
  153. pos += ETH_ALEN;
  154. *pos++ = transaction_seqnum;
  155. if (rsnie) {
  156. os_memcpy(pos, rsnie, rsnie_len);
  157. pos += rsnie_len;
  158. }
  159. if (mdie) {
  160. os_memcpy(pos, mdie, mdie_len);
  161. pos += mdie_len;
  162. }
  163. if (ftie) {
  164. struct rsn_ftie *_ftie;
  165. os_memcpy(pos, ftie, ftie_len);
  166. if (ftie_len < 2 + sizeof(*_ftie)) {
  167. os_free(buf);
  168. return -1;
  169. }
  170. _ftie = (struct rsn_ftie *) (pos + 2);
  171. os_memset(_ftie->mic, 0, sizeof(_ftie->mic));
  172. pos += ftie_len;
  173. }
  174. if (ric) {
  175. os_memcpy(pos, ric, ric_len);
  176. pos += ric_len;
  177. }
  178. wpa_hexdump(MSG_MSGDUMP, "FT: MIC data", buf, pos - buf);
  179. if (omac1_aes_128(kck, buf, pos - buf, mic)) {
  180. os_free(buf);
  181. return -1;
  182. }
  183. os_free(buf);
  184. return 0;
  185. }
  186. static int wpa_ft_parse_ftie(const u8 *ie, size_t ie_len,
  187. struct wpa_ft_ies *parse)
  188. {
  189. const u8 *end, *pos;
  190. parse->ftie = ie;
  191. parse->ftie_len = ie_len;
  192. pos = ie + sizeof(struct rsn_ftie);
  193. end = ie + ie_len;
  194. while (pos + 2 <= end && pos + 2 + pos[1] <= end) {
  195. switch (pos[0]) {
  196. case FTIE_SUBELEM_R1KH_ID:
  197. if (pos[1] != FT_R1KH_ID_LEN) {
  198. wpa_printf(MSG_DEBUG, "FT: Invalid R1KH-ID "
  199. "length in FTIE: %d", pos[1]);
  200. return -1;
  201. }
  202. parse->r1kh_id = pos + 2;
  203. break;
  204. case FTIE_SUBELEM_GTK:
  205. parse->gtk = pos + 2;
  206. parse->gtk_len = pos[1];
  207. break;
  208. case FTIE_SUBELEM_R0KH_ID:
  209. if (pos[1] < 1 || pos[1] > FT_R0KH_ID_MAX_LEN) {
  210. wpa_printf(MSG_DEBUG, "FT: Invalid R0KH-ID "
  211. "length in FTIE: %d", pos[1]);
  212. return -1;
  213. }
  214. parse->r0kh_id = pos + 2;
  215. parse->r0kh_id_len = pos[1];
  216. break;
  217. #ifdef CONFIG_IEEE80211W
  218. case FTIE_SUBELEM_IGTK:
  219. parse->igtk = pos + 2;
  220. parse->igtk_len = pos[1];
  221. break;
  222. #endif /* CONFIG_IEEE80211W */
  223. }
  224. pos += 2 + pos[1];
  225. }
  226. return 0;
  227. }
  228. int wpa_ft_parse_ies(const u8 *ies, size_t ies_len,
  229. struct wpa_ft_ies *parse)
  230. {
  231. const u8 *end, *pos;
  232. struct wpa_ie_data data;
  233. int ret;
  234. const struct rsn_ftie *ftie;
  235. int prot_ie_count = 0;
  236. os_memset(parse, 0, sizeof(*parse));
  237. if (ies == NULL)
  238. return 0;
  239. pos = ies;
  240. end = ies + ies_len;
  241. while (pos + 2 <= end && pos + 2 + pos[1] <= end) {
  242. switch (pos[0]) {
  243. case WLAN_EID_RSN:
  244. parse->rsn = pos + 2;
  245. parse->rsn_len = pos[1];
  246. ret = wpa_parse_wpa_ie_rsn(parse->rsn - 2,
  247. parse->rsn_len + 2,
  248. &data);
  249. if (ret < 0) {
  250. wpa_printf(MSG_DEBUG, "FT: Failed to parse "
  251. "RSN IE: %d", ret);
  252. return -1;
  253. }
  254. if (data.num_pmkid == 1 && data.pmkid)
  255. parse->rsn_pmkid = data.pmkid;
  256. break;
  257. case WLAN_EID_MOBILITY_DOMAIN:
  258. parse->mdie = pos + 2;
  259. parse->mdie_len = pos[1];
  260. break;
  261. case WLAN_EID_FAST_BSS_TRANSITION:
  262. if (pos[1] < sizeof(*ftie))
  263. return -1;
  264. ftie = (const struct rsn_ftie *) (pos + 2);
  265. prot_ie_count = ftie->mic_control[1];
  266. if (wpa_ft_parse_ftie(pos + 2, pos[1], parse) < 0)
  267. return -1;
  268. break;
  269. case WLAN_EID_TIMEOUT_INTERVAL:
  270. parse->tie = pos + 2;
  271. parse->tie_len = pos[1];
  272. break;
  273. case WLAN_EID_RIC_DATA:
  274. if (parse->ric == NULL)
  275. parse->ric = pos;
  276. break;
  277. }
  278. pos += 2 + pos[1];
  279. }
  280. if (prot_ie_count == 0)
  281. return 0; /* no MIC */
  282. /*
  283. * Check that the protected IE count matches with IEs included in the
  284. * frame.
  285. */
  286. if (parse->rsn)
  287. prot_ie_count--;
  288. if (parse->mdie)
  289. prot_ie_count--;
  290. if (parse->ftie)
  291. prot_ie_count--;
  292. if (prot_ie_count < 0) {
  293. wpa_printf(MSG_DEBUG, "FT: Some required IEs not included in "
  294. "the protected IE count");
  295. return -1;
  296. }
  297. if (prot_ie_count == 0 && parse->ric) {
  298. wpa_printf(MSG_DEBUG, "FT: RIC IE(s) in the frame, but not "
  299. "included in protected IE count");
  300. return -1;
  301. }
  302. /* Determine the end of the RIC IE(s) */
  303. pos = parse->ric;
  304. while (pos && pos + 2 <= end && pos + 2 + pos[1] <= end &&
  305. prot_ie_count) {
  306. prot_ie_count--;
  307. pos += 2 + pos[1];
  308. }
  309. parse->ric_len = pos - parse->ric;
  310. if (prot_ie_count) {
  311. wpa_printf(MSG_DEBUG, "FT: %d protected IEs missing from "
  312. "frame", (int) prot_ie_count);
  313. return -1;
  314. }
  315. return 0;
  316. }
  317. #endif /* CONFIG_IEEE80211R */
  318. static int rsn_selector_to_bitfield(const u8 *s)
  319. {
  320. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_NONE)
  321. return WPA_CIPHER_NONE;
  322. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_WEP40)
  323. return WPA_CIPHER_WEP40;
  324. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_TKIP)
  325. return WPA_CIPHER_TKIP;
  326. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_CCMP)
  327. return WPA_CIPHER_CCMP;
  328. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_WEP104)
  329. return WPA_CIPHER_WEP104;
  330. #ifdef CONFIG_IEEE80211W
  331. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_AES_128_CMAC)
  332. return WPA_CIPHER_AES_128_CMAC;
  333. #endif /* CONFIG_IEEE80211W */
  334. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_GCMP)
  335. return WPA_CIPHER_GCMP;
  336. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_CCMP_256)
  337. return WPA_CIPHER_CCMP_256;
  338. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_GCMP_256)
  339. return WPA_CIPHER_GCMP_256;
  340. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_BIP_GMAC_128)
  341. return WPA_CIPHER_BIP_GMAC_128;
  342. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_BIP_GMAC_256)
  343. return WPA_CIPHER_BIP_GMAC_256;
  344. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_BIP_CMAC_256)
  345. return WPA_CIPHER_BIP_CMAC_256;
  346. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED)
  347. return WPA_CIPHER_GTK_NOT_USED;
  348. return 0;
  349. }
  350. static int rsn_key_mgmt_to_bitfield(const u8 *s)
  351. {
  352. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_UNSPEC_802_1X)
  353. return WPA_KEY_MGMT_IEEE8021X;
  354. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X)
  355. return WPA_KEY_MGMT_PSK;
  356. #ifdef CONFIG_IEEE80211R
  357. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_802_1X)
  358. return WPA_KEY_MGMT_FT_IEEE8021X;
  359. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_PSK)
  360. return WPA_KEY_MGMT_FT_PSK;
  361. #endif /* CONFIG_IEEE80211R */
  362. #ifdef CONFIG_IEEE80211W
  363. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SHA256)
  364. return WPA_KEY_MGMT_IEEE8021X_SHA256;
  365. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_PSK_SHA256)
  366. return WPA_KEY_MGMT_PSK_SHA256;
  367. #endif /* CONFIG_IEEE80211W */
  368. #ifdef CONFIG_SAE
  369. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_SAE)
  370. return WPA_KEY_MGMT_SAE;
  371. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_SAE)
  372. return WPA_KEY_MGMT_FT_SAE;
  373. #endif /* CONFIG_SAE */
  374. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SUITE_B)
  375. return WPA_KEY_MGMT_IEEE8021X_SUITE_B;
  376. return 0;
  377. }
  378. static int wpa_cipher_valid_group(int cipher)
  379. {
  380. return wpa_cipher_valid_pairwise(cipher) ||
  381. cipher == WPA_CIPHER_WEP104 ||
  382. cipher == WPA_CIPHER_WEP40 ||
  383. cipher == WPA_CIPHER_GTK_NOT_USED;
  384. }
  385. #ifdef CONFIG_IEEE80211W
  386. int wpa_cipher_valid_mgmt_group(int cipher)
  387. {
  388. return cipher == WPA_CIPHER_AES_128_CMAC ||
  389. cipher == WPA_CIPHER_BIP_GMAC_128 ||
  390. cipher == WPA_CIPHER_BIP_GMAC_256 ||
  391. cipher == WPA_CIPHER_BIP_CMAC_256;
  392. }
  393. #endif /* CONFIG_IEEE80211W */
  394. /**
  395. * wpa_parse_wpa_ie_rsn - Parse RSN IE
  396. * @rsn_ie: Buffer containing RSN IE
  397. * @rsn_ie_len: RSN IE buffer length (including IE number and length octets)
  398. * @data: Pointer to structure that will be filled in with parsed data
  399. * Returns: 0 on success, <0 on failure
  400. */
  401. int wpa_parse_wpa_ie_rsn(const u8 *rsn_ie, size_t rsn_ie_len,
  402. struct wpa_ie_data *data)
  403. {
  404. const struct rsn_ie_hdr *hdr;
  405. const u8 *pos;
  406. int left;
  407. int i, count;
  408. os_memset(data, 0, sizeof(*data));
  409. data->proto = WPA_PROTO_RSN;
  410. data->pairwise_cipher = WPA_CIPHER_CCMP;
  411. data->group_cipher = WPA_CIPHER_CCMP;
  412. data->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
  413. data->capabilities = 0;
  414. data->pmkid = NULL;
  415. data->num_pmkid = 0;
  416. #ifdef CONFIG_IEEE80211W
  417. data->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
  418. #else /* CONFIG_IEEE80211W */
  419. data->mgmt_group_cipher = 0;
  420. #endif /* CONFIG_IEEE80211W */
  421. if (rsn_ie_len == 0) {
  422. /* No RSN IE - fail silently */
  423. return -1;
  424. }
  425. if (rsn_ie_len < sizeof(struct rsn_ie_hdr)) {
  426. wpa_printf(MSG_DEBUG, "%s: ie len too short %lu",
  427. __func__, (unsigned long) rsn_ie_len);
  428. return -1;
  429. }
  430. hdr = (const struct rsn_ie_hdr *) rsn_ie;
  431. if (hdr->elem_id != WLAN_EID_RSN ||
  432. hdr->len != rsn_ie_len - 2 ||
  433. WPA_GET_LE16(hdr->version) != RSN_VERSION) {
  434. wpa_printf(MSG_DEBUG, "%s: malformed ie or unknown version",
  435. __func__);
  436. return -2;
  437. }
  438. pos = (const u8 *) (hdr + 1);
  439. left = rsn_ie_len - sizeof(*hdr);
  440. if (left >= RSN_SELECTOR_LEN) {
  441. data->group_cipher = rsn_selector_to_bitfield(pos);
  442. if (!wpa_cipher_valid_group(data->group_cipher)) {
  443. wpa_printf(MSG_DEBUG, "%s: invalid group cipher 0x%x",
  444. __func__, data->group_cipher);
  445. return -1;
  446. }
  447. pos += RSN_SELECTOR_LEN;
  448. left -= RSN_SELECTOR_LEN;
  449. } else if (left > 0) {
  450. wpa_printf(MSG_DEBUG, "%s: ie length mismatch, %u too much",
  451. __func__, left);
  452. return -3;
  453. }
  454. if (left >= 2) {
  455. data->pairwise_cipher = 0;
  456. count = WPA_GET_LE16(pos);
  457. pos += 2;
  458. left -= 2;
  459. if (count == 0 || left < count * RSN_SELECTOR_LEN) {
  460. wpa_printf(MSG_DEBUG, "%s: ie count botch (pairwise), "
  461. "count %u left %u", __func__, count, left);
  462. return -4;
  463. }
  464. for (i = 0; i < count; i++) {
  465. data->pairwise_cipher |= rsn_selector_to_bitfield(pos);
  466. pos += RSN_SELECTOR_LEN;
  467. left -= RSN_SELECTOR_LEN;
  468. }
  469. #ifdef CONFIG_IEEE80211W
  470. if (data->pairwise_cipher & WPA_CIPHER_AES_128_CMAC) {
  471. wpa_printf(MSG_DEBUG, "%s: AES-128-CMAC used as "
  472. "pairwise cipher", __func__);
  473. return -1;
  474. }
  475. #endif /* CONFIG_IEEE80211W */
  476. } else if (left == 1) {
  477. wpa_printf(MSG_DEBUG, "%s: ie too short (for key mgmt)",
  478. __func__);
  479. return -5;
  480. }
  481. if (left >= 2) {
  482. data->key_mgmt = 0;
  483. count = WPA_GET_LE16(pos);
  484. pos += 2;
  485. left -= 2;
  486. if (count == 0 || left < count * RSN_SELECTOR_LEN) {
  487. wpa_printf(MSG_DEBUG, "%s: ie count botch (key mgmt), "
  488. "count %u left %u", __func__, count, left);
  489. return -6;
  490. }
  491. for (i = 0; i < count; i++) {
  492. data->key_mgmt |= rsn_key_mgmt_to_bitfield(pos);
  493. pos += RSN_SELECTOR_LEN;
  494. left -= RSN_SELECTOR_LEN;
  495. }
  496. } else if (left == 1) {
  497. wpa_printf(MSG_DEBUG, "%s: ie too short (for capabilities)",
  498. __func__);
  499. return -7;
  500. }
  501. if (left >= 2) {
  502. data->capabilities = WPA_GET_LE16(pos);
  503. pos += 2;
  504. left -= 2;
  505. }
  506. if (left >= 2) {
  507. data->num_pmkid = WPA_GET_LE16(pos);
  508. pos += 2;
  509. left -= 2;
  510. if (left < (int) data->num_pmkid * PMKID_LEN) {
  511. wpa_printf(MSG_DEBUG, "%s: PMKID underflow "
  512. "(num_pmkid=%lu left=%d)",
  513. __func__, (unsigned long) data->num_pmkid,
  514. left);
  515. data->num_pmkid = 0;
  516. return -9;
  517. } else {
  518. data->pmkid = pos;
  519. pos += data->num_pmkid * PMKID_LEN;
  520. left -= data->num_pmkid * PMKID_LEN;
  521. }
  522. }
  523. #ifdef CONFIG_IEEE80211W
  524. if (left >= 4) {
  525. data->mgmt_group_cipher = rsn_selector_to_bitfield(pos);
  526. if (!wpa_cipher_valid_mgmt_group(data->mgmt_group_cipher)) {
  527. wpa_printf(MSG_DEBUG, "%s: Unsupported management "
  528. "group cipher 0x%x", __func__,
  529. data->mgmt_group_cipher);
  530. return -10;
  531. }
  532. pos += RSN_SELECTOR_LEN;
  533. left -= RSN_SELECTOR_LEN;
  534. }
  535. #endif /* CONFIG_IEEE80211W */
  536. if (left > 0) {
  537. wpa_hexdump(MSG_DEBUG,
  538. "wpa_parse_wpa_ie_rsn: ignore trailing bytes",
  539. pos, left);
  540. }
  541. return 0;
  542. }
  543. static int wpa_selector_to_bitfield(const u8 *s)
  544. {
  545. if (RSN_SELECTOR_GET(s) == WPA_CIPHER_SUITE_NONE)
  546. return WPA_CIPHER_NONE;
  547. if (RSN_SELECTOR_GET(s) == WPA_CIPHER_SUITE_WEP40)
  548. return WPA_CIPHER_WEP40;
  549. if (RSN_SELECTOR_GET(s) == WPA_CIPHER_SUITE_TKIP)
  550. return WPA_CIPHER_TKIP;
  551. if (RSN_SELECTOR_GET(s) == WPA_CIPHER_SUITE_CCMP)
  552. return WPA_CIPHER_CCMP;
  553. if (RSN_SELECTOR_GET(s) == WPA_CIPHER_SUITE_WEP104)
  554. return WPA_CIPHER_WEP104;
  555. return 0;
  556. }
  557. static int wpa_key_mgmt_to_bitfield(const u8 *s)
  558. {
  559. if (RSN_SELECTOR_GET(s) == WPA_AUTH_KEY_MGMT_UNSPEC_802_1X)
  560. return WPA_KEY_MGMT_IEEE8021X;
  561. if (RSN_SELECTOR_GET(s) == WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X)
  562. return WPA_KEY_MGMT_PSK;
  563. if (RSN_SELECTOR_GET(s) == WPA_AUTH_KEY_MGMT_NONE)
  564. return WPA_KEY_MGMT_WPA_NONE;
  565. return 0;
  566. }
  567. int wpa_parse_wpa_ie_wpa(const u8 *wpa_ie, size_t wpa_ie_len,
  568. struct wpa_ie_data *data)
  569. {
  570. const struct wpa_ie_hdr *hdr;
  571. const u8 *pos;
  572. int left;
  573. int i, count;
  574. os_memset(data, 0, sizeof(*data));
  575. data->proto = WPA_PROTO_WPA;
  576. data->pairwise_cipher = WPA_CIPHER_TKIP;
  577. data->group_cipher = WPA_CIPHER_TKIP;
  578. data->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
  579. data->capabilities = 0;
  580. data->pmkid = NULL;
  581. data->num_pmkid = 0;
  582. data->mgmt_group_cipher = 0;
  583. if (wpa_ie_len == 0) {
  584. /* No WPA IE - fail silently */
  585. return -1;
  586. }
  587. if (wpa_ie_len < sizeof(struct wpa_ie_hdr)) {
  588. wpa_printf(MSG_DEBUG, "%s: ie len too short %lu",
  589. __func__, (unsigned long) wpa_ie_len);
  590. return -1;
  591. }
  592. hdr = (const struct wpa_ie_hdr *) wpa_ie;
  593. if (hdr->elem_id != WLAN_EID_VENDOR_SPECIFIC ||
  594. hdr->len != wpa_ie_len - 2 ||
  595. RSN_SELECTOR_GET(hdr->oui) != WPA_OUI_TYPE ||
  596. WPA_GET_LE16(hdr->version) != WPA_VERSION) {
  597. wpa_printf(MSG_DEBUG, "%s: malformed ie or unknown version",
  598. __func__);
  599. return -2;
  600. }
  601. pos = (const u8 *) (hdr + 1);
  602. left = wpa_ie_len - sizeof(*hdr);
  603. if (left >= WPA_SELECTOR_LEN) {
  604. data->group_cipher = wpa_selector_to_bitfield(pos);
  605. pos += WPA_SELECTOR_LEN;
  606. left -= WPA_SELECTOR_LEN;
  607. } else if (left > 0) {
  608. wpa_printf(MSG_DEBUG, "%s: ie length mismatch, %u too much",
  609. __func__, left);
  610. return -3;
  611. }
  612. if (left >= 2) {
  613. data->pairwise_cipher = 0;
  614. count = WPA_GET_LE16(pos);
  615. pos += 2;
  616. left -= 2;
  617. if (count == 0 || left < count * WPA_SELECTOR_LEN) {
  618. wpa_printf(MSG_DEBUG, "%s: ie count botch (pairwise), "
  619. "count %u left %u", __func__, count, left);
  620. return -4;
  621. }
  622. for (i = 0; i < count; i++) {
  623. data->pairwise_cipher |= wpa_selector_to_bitfield(pos);
  624. pos += WPA_SELECTOR_LEN;
  625. left -= WPA_SELECTOR_LEN;
  626. }
  627. } else if (left == 1) {
  628. wpa_printf(MSG_DEBUG, "%s: ie too short (for key mgmt)",
  629. __func__);
  630. return -5;
  631. }
  632. if (left >= 2) {
  633. data->key_mgmt = 0;
  634. count = WPA_GET_LE16(pos);
  635. pos += 2;
  636. left -= 2;
  637. if (count == 0 || left < count * WPA_SELECTOR_LEN) {
  638. wpa_printf(MSG_DEBUG, "%s: ie count botch (key mgmt), "
  639. "count %u left %u", __func__, count, left);
  640. return -6;
  641. }
  642. for (i = 0; i < count; i++) {
  643. data->key_mgmt |= wpa_key_mgmt_to_bitfield(pos);
  644. pos += WPA_SELECTOR_LEN;
  645. left -= WPA_SELECTOR_LEN;
  646. }
  647. } else if (left == 1) {
  648. wpa_printf(MSG_DEBUG, "%s: ie too short (for capabilities)",
  649. __func__);
  650. return -7;
  651. }
  652. if (left >= 2) {
  653. data->capabilities = WPA_GET_LE16(pos);
  654. pos += 2;
  655. left -= 2;
  656. }
  657. if (left > 0) {
  658. wpa_hexdump(MSG_DEBUG,
  659. "wpa_parse_wpa_ie_wpa: ignore trailing bytes",
  660. pos, left);
  661. }
  662. return 0;
  663. }
  664. #ifdef CONFIG_IEEE80211R
  665. /**
  666. * wpa_derive_pmk_r0 - Derive PMK-R0 and PMKR0Name
  667. *
  668. * IEEE Std 802.11r-2008 - 8.5.1.5.3
  669. */
  670. void wpa_derive_pmk_r0(const u8 *xxkey, size_t xxkey_len,
  671. const u8 *ssid, size_t ssid_len,
  672. const u8 *mdid, const u8 *r0kh_id, size_t r0kh_id_len,
  673. const u8 *s0kh_id, u8 *pmk_r0, u8 *pmk_r0_name)
  674. {
  675. u8 buf[1 + WPA_MAX_SSID_LEN + MOBILITY_DOMAIN_ID_LEN + 1 +
  676. FT_R0KH_ID_MAX_LEN + ETH_ALEN];
  677. u8 *pos, r0_key_data[48], hash[32];
  678. const u8 *addr[2];
  679. size_t len[2];
  680. /*
  681. * R0-Key-Data = KDF-384(XXKey, "FT-R0",
  682. * SSIDlength || SSID || MDID || R0KHlength ||
  683. * R0KH-ID || S0KH-ID)
  684. * XXKey is either the second 256 bits of MSK or PSK.
  685. * PMK-R0 = L(R0-Key-Data, 0, 256)
  686. * PMK-R0Name-Salt = L(R0-Key-Data, 256, 128)
  687. */
  688. if (ssid_len > WPA_MAX_SSID_LEN || r0kh_id_len > FT_R0KH_ID_MAX_LEN)
  689. return;
  690. pos = buf;
  691. *pos++ = ssid_len;
  692. os_memcpy(pos, ssid, ssid_len);
  693. pos += ssid_len;
  694. os_memcpy(pos, mdid, MOBILITY_DOMAIN_ID_LEN);
  695. pos += MOBILITY_DOMAIN_ID_LEN;
  696. *pos++ = r0kh_id_len;
  697. os_memcpy(pos, r0kh_id, r0kh_id_len);
  698. pos += r0kh_id_len;
  699. os_memcpy(pos, s0kh_id, ETH_ALEN);
  700. pos += ETH_ALEN;
  701. sha256_prf(xxkey, xxkey_len, "FT-R0", buf, pos - buf,
  702. r0_key_data, sizeof(r0_key_data));
  703. os_memcpy(pmk_r0, r0_key_data, PMK_LEN);
  704. /*
  705. * PMKR0Name = Truncate-128(SHA-256("FT-R0N" || PMK-R0Name-Salt)
  706. */
  707. addr[0] = (const u8 *) "FT-R0N";
  708. len[0] = 6;
  709. addr[1] = r0_key_data + PMK_LEN;
  710. len[1] = 16;
  711. sha256_vector(2, addr, len, hash);
  712. os_memcpy(pmk_r0_name, hash, WPA_PMK_NAME_LEN);
  713. }
  714. /**
  715. * wpa_derive_pmk_r1_name - Derive PMKR1Name
  716. *
  717. * IEEE Std 802.11r-2008 - 8.5.1.5.4
  718. */
  719. void wpa_derive_pmk_r1_name(const u8 *pmk_r0_name, const u8 *r1kh_id,
  720. const u8 *s1kh_id, u8 *pmk_r1_name)
  721. {
  722. u8 hash[32];
  723. const u8 *addr[4];
  724. size_t len[4];
  725. /*
  726. * PMKR1Name = Truncate-128(SHA-256("FT-R1N" || PMKR0Name ||
  727. * R1KH-ID || S1KH-ID))
  728. */
  729. addr[0] = (const u8 *) "FT-R1N";
  730. len[0] = 6;
  731. addr[1] = pmk_r0_name;
  732. len[1] = WPA_PMK_NAME_LEN;
  733. addr[2] = r1kh_id;
  734. len[2] = FT_R1KH_ID_LEN;
  735. addr[3] = s1kh_id;
  736. len[3] = ETH_ALEN;
  737. sha256_vector(4, addr, len, hash);
  738. os_memcpy(pmk_r1_name, hash, WPA_PMK_NAME_LEN);
  739. }
  740. /**
  741. * wpa_derive_pmk_r1 - Derive PMK-R1 and PMKR1Name from PMK-R0
  742. *
  743. * IEEE Std 802.11r-2008 - 8.5.1.5.4
  744. */
  745. void wpa_derive_pmk_r1(const u8 *pmk_r0, const u8 *pmk_r0_name,
  746. const u8 *r1kh_id, const u8 *s1kh_id,
  747. u8 *pmk_r1, u8 *pmk_r1_name)
  748. {
  749. u8 buf[FT_R1KH_ID_LEN + ETH_ALEN];
  750. u8 *pos;
  751. /* PMK-R1 = KDF-256(PMK-R0, "FT-R1", R1KH-ID || S1KH-ID) */
  752. pos = buf;
  753. os_memcpy(pos, r1kh_id, FT_R1KH_ID_LEN);
  754. pos += FT_R1KH_ID_LEN;
  755. os_memcpy(pos, s1kh_id, ETH_ALEN);
  756. pos += ETH_ALEN;
  757. sha256_prf(pmk_r0, PMK_LEN, "FT-R1", buf, pos - buf, pmk_r1, PMK_LEN);
  758. wpa_derive_pmk_r1_name(pmk_r0_name, r1kh_id, s1kh_id, pmk_r1_name);
  759. }
  760. /**
  761. * wpa_pmk_r1_to_ptk - Derive PTK and PTKName from PMK-R1
  762. *
  763. * IEEE Std 802.11r-2008 - 8.5.1.5.5
  764. */
  765. void wpa_pmk_r1_to_ptk(const u8 *pmk_r1, const u8 *snonce, const u8 *anonce,
  766. const u8 *sta_addr, const u8 *bssid,
  767. const u8 *pmk_r1_name,
  768. u8 *ptk, size_t ptk_len, u8 *ptk_name)
  769. {
  770. u8 buf[2 * WPA_NONCE_LEN + 2 * ETH_ALEN];
  771. u8 *pos, hash[32];
  772. const u8 *addr[6];
  773. size_t len[6];
  774. /*
  775. * PTK = KDF-PTKLen(PMK-R1, "FT-PTK", SNonce || ANonce ||
  776. * BSSID || STA-ADDR)
  777. */
  778. pos = buf;
  779. os_memcpy(pos, snonce, WPA_NONCE_LEN);
  780. pos += WPA_NONCE_LEN;
  781. os_memcpy(pos, anonce, WPA_NONCE_LEN);
  782. pos += WPA_NONCE_LEN;
  783. os_memcpy(pos, bssid, ETH_ALEN);
  784. pos += ETH_ALEN;
  785. os_memcpy(pos, sta_addr, ETH_ALEN);
  786. pos += ETH_ALEN;
  787. sha256_prf(pmk_r1, PMK_LEN, "FT-PTK", buf, pos - buf, ptk, ptk_len);
  788. /*
  789. * PTKName = Truncate-128(SHA-256(PMKR1Name || "FT-PTKN" || SNonce ||
  790. * ANonce || BSSID || STA-ADDR))
  791. */
  792. addr[0] = pmk_r1_name;
  793. len[0] = WPA_PMK_NAME_LEN;
  794. addr[1] = (const u8 *) "FT-PTKN";
  795. len[1] = 7;
  796. addr[2] = snonce;
  797. len[2] = WPA_NONCE_LEN;
  798. addr[3] = anonce;
  799. len[3] = WPA_NONCE_LEN;
  800. addr[4] = bssid;
  801. len[4] = ETH_ALEN;
  802. addr[5] = sta_addr;
  803. len[5] = ETH_ALEN;
  804. sha256_vector(6, addr, len, hash);
  805. os_memcpy(ptk_name, hash, WPA_PMK_NAME_LEN);
  806. }
  807. #endif /* CONFIG_IEEE80211R */
  808. /**
  809. * rsn_pmkid - Calculate PMK identifier
  810. * @pmk: Pairwise master key
  811. * @pmk_len: Length of pmk in bytes
  812. * @aa: Authenticator address
  813. * @spa: Supplicant address
  814. * @pmkid: Buffer for PMKID
  815. * @use_sha256: Whether to use SHA256-based KDF
  816. *
  817. * IEEE Std 802.11i-2004 - 8.5.1.2 Pairwise key hierarchy
  818. * PMKID = HMAC-SHA1-128(PMK, "PMK Name" || AA || SPA)
  819. */
  820. void rsn_pmkid(const u8 *pmk, size_t pmk_len, const u8 *aa, const u8 *spa,
  821. u8 *pmkid, int use_sha256)
  822. {
  823. char *title = "PMK Name";
  824. const u8 *addr[3];
  825. const size_t len[3] = { 8, ETH_ALEN, ETH_ALEN };
  826. unsigned char hash[SHA256_MAC_LEN];
  827. addr[0] = (u8 *) title;
  828. addr[1] = aa;
  829. addr[2] = spa;
  830. #ifdef CONFIG_IEEE80211W
  831. if (use_sha256)
  832. hmac_sha256_vector(pmk, pmk_len, 3, addr, len, hash);
  833. else
  834. #endif /* CONFIG_IEEE80211W */
  835. hmac_sha1_vector(pmk, pmk_len, 3, addr, len, hash);
  836. os_memcpy(pmkid, hash, PMKID_LEN);
  837. }
  838. #ifdef CONFIG_SUITEB
  839. /**
  840. * rsn_pmkid_suite_b - Calculate PMK identifier for Suite B AKM
  841. * @kck: Key confirmation key
  842. * @kck_len: Length of kck in bytes
  843. * @aa: Authenticator address
  844. * @spa: Supplicant address
  845. * @pmkid: Buffer for PMKID
  846. * Returns: 0 on success, -1 on failure
  847. *
  848. * IEEE Std 802.11ac-2013 - 11.6.1.3 Pairwise key hierarchy
  849. * PMKID = Truncate(HMAC-SHA-256(KCK, "PMK Name" || AA || SPA))
  850. */
  851. int rsn_pmkid_suite_b(const u8 *kck, size_t kck_len, const u8 *aa,
  852. const u8 *spa, u8 *pmkid)
  853. {
  854. char *title = "PMK Name";
  855. const u8 *addr[3];
  856. const size_t len[3] = { 8, ETH_ALEN, ETH_ALEN };
  857. unsigned char hash[SHA256_MAC_LEN];
  858. addr[0] = (u8 *) title;
  859. addr[1] = aa;
  860. addr[2] = spa;
  861. if (hmac_sha256_vector(kck, kck_len, 3, addr, len, hash) < 0)
  862. return -1;
  863. os_memcpy(pmkid, hash, PMKID_LEN);
  864. return 0;
  865. }
  866. #endif /* CONFIG_SUITEB */
  867. /**
  868. * wpa_cipher_txt - Convert cipher suite to a text string
  869. * @cipher: Cipher suite (WPA_CIPHER_* enum)
  870. * Returns: Pointer to a text string of the cipher suite name
  871. */
  872. const char * wpa_cipher_txt(int cipher)
  873. {
  874. switch (cipher) {
  875. case WPA_CIPHER_NONE:
  876. return "NONE";
  877. case WPA_CIPHER_WEP40:
  878. return "WEP-40";
  879. case WPA_CIPHER_WEP104:
  880. return "WEP-104";
  881. case WPA_CIPHER_TKIP:
  882. return "TKIP";
  883. case WPA_CIPHER_CCMP:
  884. return "CCMP";
  885. case WPA_CIPHER_CCMP | WPA_CIPHER_TKIP:
  886. return "CCMP+TKIP";
  887. case WPA_CIPHER_GCMP:
  888. return "GCMP";
  889. case WPA_CIPHER_GCMP_256:
  890. return "GCMP-256";
  891. case WPA_CIPHER_CCMP_256:
  892. return "CCMP-256";
  893. case WPA_CIPHER_GTK_NOT_USED:
  894. return "GTK_NOT_USED";
  895. default:
  896. return "UNKNOWN";
  897. }
  898. }
  899. /**
  900. * wpa_key_mgmt_txt - Convert key management suite to a text string
  901. * @key_mgmt: Key management suite (WPA_KEY_MGMT_* enum)
  902. * @proto: WPA/WPA2 version (WPA_PROTO_*)
  903. * Returns: Pointer to a text string of the key management suite name
  904. */
  905. const char * wpa_key_mgmt_txt(int key_mgmt, int proto)
  906. {
  907. switch (key_mgmt) {
  908. case WPA_KEY_MGMT_IEEE8021X:
  909. if (proto == (WPA_PROTO_RSN | WPA_PROTO_WPA))
  910. return "WPA2+WPA/IEEE 802.1X/EAP";
  911. return proto == WPA_PROTO_RSN ?
  912. "WPA2/IEEE 802.1X/EAP" : "WPA/IEEE 802.1X/EAP";
  913. case WPA_KEY_MGMT_PSK:
  914. if (proto == (WPA_PROTO_RSN | WPA_PROTO_WPA))
  915. return "WPA2-PSK+WPA-PSK";
  916. return proto == WPA_PROTO_RSN ?
  917. "WPA2-PSK" : "WPA-PSK";
  918. case WPA_KEY_MGMT_NONE:
  919. return "NONE";
  920. case WPA_KEY_MGMT_IEEE8021X_NO_WPA:
  921. return "IEEE 802.1X (no WPA)";
  922. #ifdef CONFIG_IEEE80211R
  923. case WPA_KEY_MGMT_FT_IEEE8021X:
  924. return "FT-EAP";
  925. case WPA_KEY_MGMT_FT_PSK:
  926. return "FT-PSK";
  927. #endif /* CONFIG_IEEE80211R */
  928. #ifdef CONFIG_IEEE80211W
  929. case WPA_KEY_MGMT_IEEE8021X_SHA256:
  930. return "WPA2-EAP-SHA256";
  931. case WPA_KEY_MGMT_PSK_SHA256:
  932. return "WPA2-PSK-SHA256";
  933. #endif /* CONFIG_IEEE80211W */
  934. case WPA_KEY_MGMT_IEEE8021X_SUITE_B:
  935. return "WPA2-EAP-SUITE-B";
  936. default:
  937. return "UNKNOWN";
  938. }
  939. }
  940. u32 wpa_akm_to_suite(int akm)
  941. {
  942. if (akm & WPA_KEY_MGMT_FT_IEEE8021X)
  943. return WLAN_AKM_SUITE_FT_8021X;
  944. if (akm & WPA_KEY_MGMT_FT_PSK)
  945. return WLAN_AKM_SUITE_FT_PSK;
  946. if (akm & WPA_KEY_MGMT_IEEE8021X)
  947. return WLAN_AKM_SUITE_8021X;
  948. if (akm & WPA_KEY_MGMT_IEEE8021X_SHA256)
  949. return WLAN_AKM_SUITE_8021X_SHA256;
  950. if (akm & WPA_KEY_MGMT_IEEE8021X)
  951. return WLAN_AKM_SUITE_8021X;
  952. if (akm & WPA_KEY_MGMT_PSK_SHA256)
  953. return WLAN_AKM_SUITE_PSK_SHA256;
  954. if (akm & WPA_KEY_MGMT_PSK)
  955. return WLAN_AKM_SUITE_PSK;
  956. if (akm & WPA_KEY_MGMT_CCKM)
  957. return WLAN_AKM_SUITE_CCKM;
  958. if (akm & WPA_KEY_MGMT_OSEN)
  959. return WLAN_AKM_SUITE_OSEN;
  960. if (akm & WPA_KEY_MGMT_IEEE8021X_SUITE_B)
  961. return WLAN_AKM_SUITE_8021X_SUITE_B;
  962. return 0;
  963. }
  964. int wpa_compare_rsn_ie(int ft_initial_assoc,
  965. const u8 *ie1, size_t ie1len,
  966. const u8 *ie2, size_t ie2len)
  967. {
  968. if (ie1 == NULL || ie2 == NULL)
  969. return -1;
  970. if (ie1len == ie2len && os_memcmp(ie1, ie2, ie1len) == 0)
  971. return 0; /* identical IEs */
  972. #ifdef CONFIG_IEEE80211R
  973. if (ft_initial_assoc) {
  974. struct wpa_ie_data ie1d, ie2d;
  975. /*
  976. * The PMKID-List in RSN IE is different between Beacon/Probe
  977. * Response/(Re)Association Request frames and EAPOL-Key
  978. * messages in FT initial mobility domain association. Allow
  979. * for this, but verify that other parts of the RSN IEs are
  980. * identical.
  981. */
  982. if (wpa_parse_wpa_ie_rsn(ie1, ie1len, &ie1d) < 0 ||
  983. wpa_parse_wpa_ie_rsn(ie2, ie2len, &ie2d) < 0)
  984. return -1;
  985. if (ie1d.proto == ie2d.proto &&
  986. ie1d.pairwise_cipher == ie2d.pairwise_cipher &&
  987. ie1d.group_cipher == ie2d.group_cipher &&
  988. ie1d.key_mgmt == ie2d.key_mgmt &&
  989. ie1d.capabilities == ie2d.capabilities &&
  990. ie1d.mgmt_group_cipher == ie2d.mgmt_group_cipher)
  991. return 0;
  992. }
  993. #endif /* CONFIG_IEEE80211R */
  994. return -1;
  995. }
  996. #ifdef CONFIG_IEEE80211R
  997. int wpa_insert_pmkid(u8 *ies, size_t ies_len, const u8 *pmkid)
  998. {
  999. u8 *start, *end, *rpos, *rend;
  1000. int added = 0;
  1001. start = ies;
  1002. end = ies + ies_len;
  1003. while (start < end) {
  1004. if (*start == WLAN_EID_RSN)
  1005. break;
  1006. start += 2 + start[1];
  1007. }
  1008. if (start >= end) {
  1009. wpa_printf(MSG_ERROR, "FT: Could not find RSN IE in "
  1010. "IEs data");
  1011. return -1;
  1012. }
  1013. wpa_hexdump(MSG_DEBUG, "FT: RSN IE before modification",
  1014. start, 2 + start[1]);
  1015. /* Find start of PMKID-Count */
  1016. rpos = start + 2;
  1017. rend = rpos + start[1];
  1018. /* Skip Version and Group Data Cipher Suite */
  1019. rpos += 2 + 4;
  1020. /* Skip Pairwise Cipher Suite Count and List */
  1021. rpos += 2 + WPA_GET_LE16(rpos) * RSN_SELECTOR_LEN;
  1022. /* Skip AKM Suite Count and List */
  1023. rpos += 2 + WPA_GET_LE16(rpos) * RSN_SELECTOR_LEN;
  1024. if (rpos == rend) {
  1025. /* Add RSN Capabilities */
  1026. os_memmove(rpos + 2, rpos, end - rpos);
  1027. *rpos++ = 0;
  1028. *rpos++ = 0;
  1029. } else {
  1030. /* Skip RSN Capabilities */
  1031. rpos += 2;
  1032. if (rpos > rend) {
  1033. wpa_printf(MSG_ERROR, "FT: Could not parse RSN IE in "
  1034. "IEs data");
  1035. return -1;
  1036. }
  1037. }
  1038. if (rpos == rend) {
  1039. /* No PMKID-Count field included; add it */
  1040. os_memmove(rpos + 2 + PMKID_LEN, rpos, end - rpos);
  1041. WPA_PUT_LE16(rpos, 1);
  1042. rpos += 2;
  1043. os_memcpy(rpos, pmkid, PMKID_LEN);
  1044. added += 2 + PMKID_LEN;
  1045. start[1] += 2 + PMKID_LEN;
  1046. } else {
  1047. /* PMKID-Count was included; use it */
  1048. if (WPA_GET_LE16(rpos) != 0) {
  1049. wpa_printf(MSG_ERROR, "FT: Unexpected PMKID "
  1050. "in RSN IE in EAPOL-Key data");
  1051. return -1;
  1052. }
  1053. WPA_PUT_LE16(rpos, 1);
  1054. rpos += 2;
  1055. os_memmove(rpos + PMKID_LEN, rpos, end - rpos);
  1056. os_memcpy(rpos, pmkid, PMKID_LEN);
  1057. added += PMKID_LEN;
  1058. start[1] += PMKID_LEN;
  1059. }
  1060. wpa_hexdump(MSG_DEBUG, "FT: RSN IE after modification "
  1061. "(PMKID inserted)", start, 2 + start[1]);
  1062. return added;
  1063. }
  1064. #endif /* CONFIG_IEEE80211R */
  1065. int wpa_cipher_key_len(int cipher)
  1066. {
  1067. switch (cipher) {
  1068. case WPA_CIPHER_CCMP_256:
  1069. case WPA_CIPHER_GCMP_256:
  1070. case WPA_CIPHER_BIP_GMAC_256:
  1071. case WPA_CIPHER_BIP_CMAC_256:
  1072. return 32;
  1073. case WPA_CIPHER_CCMP:
  1074. case WPA_CIPHER_GCMP:
  1075. case WPA_CIPHER_AES_128_CMAC:
  1076. case WPA_CIPHER_BIP_GMAC_128:
  1077. return 16;
  1078. case WPA_CIPHER_TKIP:
  1079. return 32;
  1080. case WPA_CIPHER_WEP104:
  1081. return 13;
  1082. case WPA_CIPHER_WEP40:
  1083. return 5;
  1084. }
  1085. return 0;
  1086. }
  1087. int wpa_cipher_rsc_len(int cipher)
  1088. {
  1089. switch (cipher) {
  1090. case WPA_CIPHER_CCMP_256:
  1091. case WPA_CIPHER_GCMP_256:
  1092. case WPA_CIPHER_CCMP:
  1093. case WPA_CIPHER_GCMP:
  1094. case WPA_CIPHER_TKIP:
  1095. return 6;
  1096. case WPA_CIPHER_WEP104:
  1097. case WPA_CIPHER_WEP40:
  1098. return 0;
  1099. }
  1100. return 0;
  1101. }
  1102. int wpa_cipher_to_alg(int cipher)
  1103. {
  1104. switch (cipher) {
  1105. case WPA_CIPHER_CCMP_256:
  1106. return WPA_ALG_CCMP_256;
  1107. case WPA_CIPHER_GCMP_256:
  1108. return WPA_ALG_GCMP_256;
  1109. case WPA_CIPHER_CCMP:
  1110. return WPA_ALG_CCMP;
  1111. case WPA_CIPHER_GCMP:
  1112. return WPA_ALG_GCMP;
  1113. case WPA_CIPHER_TKIP:
  1114. return WPA_ALG_TKIP;
  1115. case WPA_CIPHER_WEP104:
  1116. case WPA_CIPHER_WEP40:
  1117. return WPA_ALG_WEP;
  1118. case WPA_CIPHER_AES_128_CMAC:
  1119. return WPA_ALG_IGTK;
  1120. case WPA_CIPHER_BIP_GMAC_128:
  1121. return WPA_ALG_BIP_GMAC_128;
  1122. case WPA_CIPHER_BIP_GMAC_256:
  1123. return WPA_ALG_BIP_GMAC_256;
  1124. case WPA_CIPHER_BIP_CMAC_256:
  1125. return WPA_ALG_BIP_CMAC_256;
  1126. }
  1127. return WPA_ALG_NONE;
  1128. }
  1129. int wpa_cipher_valid_pairwise(int cipher)
  1130. {
  1131. return cipher == WPA_CIPHER_CCMP_256 ||
  1132. cipher == WPA_CIPHER_GCMP_256 ||
  1133. cipher == WPA_CIPHER_CCMP ||
  1134. cipher == WPA_CIPHER_GCMP ||
  1135. cipher == WPA_CIPHER_TKIP;
  1136. }
  1137. u32 wpa_cipher_to_suite(int proto, int cipher)
  1138. {
  1139. if (cipher & WPA_CIPHER_CCMP_256)
  1140. return RSN_CIPHER_SUITE_CCMP_256;
  1141. if (cipher & WPA_CIPHER_GCMP_256)
  1142. return RSN_CIPHER_SUITE_GCMP_256;
  1143. if (cipher & WPA_CIPHER_CCMP)
  1144. return (proto == WPA_PROTO_RSN ?
  1145. RSN_CIPHER_SUITE_CCMP : WPA_CIPHER_SUITE_CCMP);
  1146. if (cipher & WPA_CIPHER_GCMP)
  1147. return RSN_CIPHER_SUITE_GCMP;
  1148. if (cipher & WPA_CIPHER_TKIP)
  1149. return (proto == WPA_PROTO_RSN ?
  1150. RSN_CIPHER_SUITE_TKIP : WPA_CIPHER_SUITE_TKIP);
  1151. if (cipher & WPA_CIPHER_WEP104)
  1152. return (proto == WPA_PROTO_RSN ?
  1153. RSN_CIPHER_SUITE_WEP104 : WPA_CIPHER_SUITE_WEP104);
  1154. if (cipher & WPA_CIPHER_WEP40)
  1155. return (proto == WPA_PROTO_RSN ?
  1156. RSN_CIPHER_SUITE_WEP40 : WPA_CIPHER_SUITE_WEP40);
  1157. if (cipher & WPA_CIPHER_NONE)
  1158. return (proto == WPA_PROTO_RSN ?
  1159. RSN_CIPHER_SUITE_NONE : WPA_CIPHER_SUITE_NONE);
  1160. if (cipher & WPA_CIPHER_GTK_NOT_USED)
  1161. return RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED;
  1162. if (cipher & WPA_CIPHER_AES_128_CMAC)
  1163. return RSN_CIPHER_SUITE_AES_128_CMAC;
  1164. if (cipher & WPA_CIPHER_BIP_GMAC_128)
  1165. return RSN_CIPHER_SUITE_BIP_GMAC_128;
  1166. if (cipher & WPA_CIPHER_BIP_GMAC_256)
  1167. return RSN_CIPHER_SUITE_BIP_GMAC_256;
  1168. if (cipher & WPA_CIPHER_BIP_CMAC_256)
  1169. return RSN_CIPHER_SUITE_BIP_CMAC_256;
  1170. return 0;
  1171. }
  1172. int rsn_cipher_put_suites(u8 *start, int ciphers)
  1173. {
  1174. u8 *pos = start;
  1175. if (ciphers & WPA_CIPHER_CCMP_256) {
  1176. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP_256);
  1177. pos += RSN_SELECTOR_LEN;
  1178. }
  1179. if (ciphers & WPA_CIPHER_GCMP_256) {
  1180. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_GCMP_256);
  1181. pos += RSN_SELECTOR_LEN;
  1182. }
  1183. if (ciphers & WPA_CIPHER_CCMP) {
  1184. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP);
  1185. pos += RSN_SELECTOR_LEN;
  1186. }
  1187. if (ciphers & WPA_CIPHER_GCMP) {
  1188. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_GCMP);
  1189. pos += RSN_SELECTOR_LEN;
  1190. }
  1191. if (ciphers & WPA_CIPHER_TKIP) {
  1192. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_TKIP);
  1193. pos += RSN_SELECTOR_LEN;
  1194. }
  1195. if (ciphers & WPA_CIPHER_NONE) {
  1196. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_NONE);
  1197. pos += RSN_SELECTOR_LEN;
  1198. }
  1199. return (pos - start) / RSN_SELECTOR_LEN;
  1200. }
  1201. int wpa_cipher_put_suites(u8 *start, int ciphers)
  1202. {
  1203. u8 *pos = start;
  1204. if (ciphers & WPA_CIPHER_CCMP) {
  1205. RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_CCMP);
  1206. pos += WPA_SELECTOR_LEN;
  1207. }
  1208. if (ciphers & WPA_CIPHER_TKIP) {
  1209. RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_TKIP);
  1210. pos += WPA_SELECTOR_LEN;
  1211. }
  1212. if (ciphers & WPA_CIPHER_NONE) {
  1213. RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_NONE);
  1214. pos += WPA_SELECTOR_LEN;
  1215. }
  1216. return (pos - start) / RSN_SELECTOR_LEN;
  1217. }
  1218. int wpa_pick_pairwise_cipher(int ciphers, int none_allowed)
  1219. {
  1220. if (ciphers & WPA_CIPHER_CCMP_256)
  1221. return WPA_CIPHER_CCMP_256;
  1222. if (ciphers & WPA_CIPHER_GCMP_256)
  1223. return WPA_CIPHER_GCMP_256;
  1224. if (ciphers & WPA_CIPHER_CCMP)
  1225. return WPA_CIPHER_CCMP;
  1226. if (ciphers & WPA_CIPHER_GCMP)
  1227. return WPA_CIPHER_GCMP;
  1228. if (ciphers & WPA_CIPHER_TKIP)
  1229. return WPA_CIPHER_TKIP;
  1230. if (none_allowed && (ciphers & WPA_CIPHER_NONE))
  1231. return WPA_CIPHER_NONE;
  1232. return -1;
  1233. }
  1234. int wpa_pick_group_cipher(int ciphers)
  1235. {
  1236. if (ciphers & WPA_CIPHER_CCMP_256)
  1237. return WPA_CIPHER_CCMP_256;
  1238. if (ciphers & WPA_CIPHER_GCMP_256)
  1239. return WPA_CIPHER_GCMP_256;
  1240. if (ciphers & WPA_CIPHER_CCMP)
  1241. return WPA_CIPHER_CCMP;
  1242. if (ciphers & WPA_CIPHER_GCMP)
  1243. return WPA_CIPHER_GCMP;
  1244. if (ciphers & WPA_CIPHER_GTK_NOT_USED)
  1245. return WPA_CIPHER_GTK_NOT_USED;
  1246. if (ciphers & WPA_CIPHER_TKIP)
  1247. return WPA_CIPHER_TKIP;
  1248. if (ciphers & WPA_CIPHER_WEP104)
  1249. return WPA_CIPHER_WEP104;
  1250. if (ciphers & WPA_CIPHER_WEP40)
  1251. return WPA_CIPHER_WEP40;
  1252. return -1;
  1253. }
  1254. int wpa_parse_cipher(const char *value)
  1255. {
  1256. int val = 0, last;
  1257. char *start, *end, *buf;
  1258. buf = os_strdup(value);
  1259. if (buf == NULL)
  1260. return -1;
  1261. start = buf;
  1262. while (*start != '\0') {
  1263. while (*start == ' ' || *start == '\t')
  1264. start++;
  1265. if (*start == '\0')
  1266. break;
  1267. end = start;
  1268. while (*end != ' ' && *end != '\t' && *end != '\0')
  1269. end++;
  1270. last = *end == '\0';
  1271. *end = '\0';
  1272. if (os_strcmp(start, "CCMP-256") == 0)
  1273. val |= WPA_CIPHER_CCMP_256;
  1274. else if (os_strcmp(start, "GCMP-256") == 0)
  1275. val |= WPA_CIPHER_GCMP_256;
  1276. else if (os_strcmp(start, "CCMP") == 0)
  1277. val |= WPA_CIPHER_CCMP;
  1278. else if (os_strcmp(start, "GCMP") == 0)
  1279. val |= WPA_CIPHER_GCMP;
  1280. else if (os_strcmp(start, "TKIP") == 0)
  1281. val |= WPA_CIPHER_TKIP;
  1282. else if (os_strcmp(start, "WEP104") == 0)
  1283. val |= WPA_CIPHER_WEP104;
  1284. else if (os_strcmp(start, "WEP40") == 0)
  1285. val |= WPA_CIPHER_WEP40;
  1286. else if (os_strcmp(start, "NONE") == 0)
  1287. val |= WPA_CIPHER_NONE;
  1288. else if (os_strcmp(start, "GTK_NOT_USED") == 0)
  1289. val |= WPA_CIPHER_GTK_NOT_USED;
  1290. else {
  1291. os_free(buf);
  1292. return -1;
  1293. }
  1294. if (last)
  1295. break;
  1296. start = end + 1;
  1297. }
  1298. os_free(buf);
  1299. return val;
  1300. }
  1301. int wpa_write_ciphers(char *start, char *end, int ciphers, const char *delim)
  1302. {
  1303. char *pos = start;
  1304. int ret;
  1305. if (ciphers & WPA_CIPHER_CCMP_256) {
  1306. ret = os_snprintf(pos, end - pos, "%sCCMP-256",
  1307. pos == start ? "" : delim);
  1308. if (ret < 0 || ret >= end - pos)
  1309. return -1;
  1310. pos += ret;
  1311. }
  1312. if (ciphers & WPA_CIPHER_GCMP_256) {
  1313. ret = os_snprintf(pos, end - pos, "%sGCMP-256",
  1314. pos == start ? "" : delim);
  1315. if (ret < 0 || ret >= end - pos)
  1316. return -1;
  1317. pos += ret;
  1318. }
  1319. if (ciphers & WPA_CIPHER_CCMP) {
  1320. ret = os_snprintf(pos, end - pos, "%sCCMP",
  1321. pos == start ? "" : delim);
  1322. if (ret < 0 || ret >= end - pos)
  1323. return -1;
  1324. pos += ret;
  1325. }
  1326. if (ciphers & WPA_CIPHER_GCMP) {
  1327. ret = os_snprintf(pos, end - pos, "%sGCMP",
  1328. pos == start ? "" : delim);
  1329. if (ret < 0 || ret >= end - pos)
  1330. return -1;
  1331. pos += ret;
  1332. }
  1333. if (ciphers & WPA_CIPHER_TKIP) {
  1334. ret = os_snprintf(pos, end - pos, "%sTKIP",
  1335. pos == start ? "" : delim);
  1336. if (ret < 0 || ret >= end - pos)
  1337. return -1;
  1338. pos += ret;
  1339. }
  1340. if (ciphers & WPA_CIPHER_WEP104) {
  1341. ret = os_snprintf(pos, end - pos, "%sWEP104",
  1342. pos == start ? "" : delim);
  1343. if (ret < 0 || ret >= end - pos)
  1344. return -1;
  1345. pos += ret;
  1346. }
  1347. if (ciphers & WPA_CIPHER_WEP40) {
  1348. ret = os_snprintf(pos, end - pos, "%sWEP40",
  1349. pos == start ? "" : delim);
  1350. if (ret < 0 || ret >= end - pos)
  1351. return -1;
  1352. pos += ret;
  1353. }
  1354. if (ciphers & WPA_CIPHER_NONE) {
  1355. ret = os_snprintf(pos, end - pos, "%sNONE",
  1356. pos == start ? "" : delim);
  1357. if (ret < 0 || ret >= end - pos)
  1358. return -1;
  1359. pos += ret;
  1360. }
  1361. return pos - start;
  1362. }
  1363. int wpa_select_ap_group_cipher(int wpa, int wpa_pairwise, int rsn_pairwise)
  1364. {
  1365. int pairwise = 0;
  1366. /* Select group cipher based on the enabled pairwise cipher suites */
  1367. if (wpa & 1)
  1368. pairwise |= wpa_pairwise;
  1369. if (wpa & 2)
  1370. pairwise |= rsn_pairwise;
  1371. if (pairwise & WPA_CIPHER_TKIP)
  1372. return WPA_CIPHER_TKIP;
  1373. if ((pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP)) == WPA_CIPHER_GCMP)
  1374. return WPA_CIPHER_GCMP;
  1375. if ((pairwise & (WPA_CIPHER_GCMP_256 | WPA_CIPHER_CCMP |
  1376. WPA_CIPHER_GCMP)) == WPA_CIPHER_GCMP_256)
  1377. return WPA_CIPHER_GCMP_256;
  1378. if ((pairwise & (WPA_CIPHER_CCMP_256 | WPA_CIPHER_CCMP |
  1379. WPA_CIPHER_GCMP)) == WPA_CIPHER_CCMP_256)
  1380. return WPA_CIPHER_CCMP_256;
  1381. return WPA_CIPHER_CCMP;
  1382. }