wpa_common.c 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151
  1. /*
  2. * WPA/RSN - Shared functions for supplicant and authenticator
  3. * Copyright (c) 2002-2015, 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/sha384.h"
  14. #include "crypto/sha512.h"
  15. #include "crypto/aes_wrap.h"
  16. #include "crypto/crypto.h"
  17. #include "ieee802_11_defs.h"
  18. #include "defs.h"
  19. #include "wpa_common.h"
  20. static unsigned int wpa_kck_len(int akmp, size_t pmk_len)
  21. {
  22. switch (akmp) {
  23. case WPA_KEY_MGMT_IEEE8021X_SUITE_B_192:
  24. return 24;
  25. case WPA_KEY_MGMT_FILS_SHA256:
  26. case WPA_KEY_MGMT_FT_FILS_SHA256:
  27. case WPA_KEY_MGMT_FILS_SHA384:
  28. case WPA_KEY_MGMT_FT_FILS_SHA384:
  29. return 0;
  30. case WPA_KEY_MGMT_DPP:
  31. return pmk_len / 2;
  32. default:
  33. return 16;
  34. }
  35. }
  36. static unsigned int wpa_kek_len(int akmp, size_t pmk_len)
  37. {
  38. switch (akmp) {
  39. case WPA_KEY_MGMT_FILS_SHA384:
  40. case WPA_KEY_MGMT_FT_FILS_SHA384:
  41. return 64;
  42. case WPA_KEY_MGMT_IEEE8021X_SUITE_B_192:
  43. case WPA_KEY_MGMT_FILS_SHA256:
  44. case WPA_KEY_MGMT_FT_FILS_SHA256:
  45. return 32;
  46. case WPA_KEY_MGMT_DPP:
  47. return pmk_len <= 32 ? 16 : 32;
  48. default:
  49. return 16;
  50. }
  51. }
  52. unsigned int wpa_mic_len(int akmp, size_t pmk_len)
  53. {
  54. switch (akmp) {
  55. case WPA_KEY_MGMT_IEEE8021X_SUITE_B_192:
  56. return 24;
  57. case WPA_KEY_MGMT_FILS_SHA256:
  58. case WPA_KEY_MGMT_FILS_SHA384:
  59. case WPA_KEY_MGMT_FT_FILS_SHA256:
  60. case WPA_KEY_MGMT_FT_FILS_SHA384:
  61. return 0;
  62. case WPA_KEY_MGMT_DPP:
  63. return pmk_len / 2;
  64. default:
  65. return 16;
  66. }
  67. }
  68. /**
  69. * wpa_eapol_key_mic - Calculate EAPOL-Key MIC
  70. * @key: EAPOL-Key Key Confirmation Key (KCK)
  71. * @key_len: KCK length in octets
  72. * @akmp: WPA_KEY_MGMT_* used in key derivation
  73. * @ver: Key descriptor version (WPA_KEY_INFO_TYPE_*)
  74. * @buf: Pointer to the beginning of the EAPOL header (version field)
  75. * @len: Length of the EAPOL frame (from EAPOL header to the end of the frame)
  76. * @mic: Pointer to the buffer to which the EAPOL-Key MIC is written
  77. * Returns: 0 on success, -1 on failure
  78. *
  79. * Calculate EAPOL-Key MIC for an EAPOL-Key packet. The EAPOL-Key MIC field has
  80. * to be cleared (all zeroes) when calling this function.
  81. *
  82. * Note: 'IEEE Std 802.11i-2004 - 8.5.2 EAPOL-Key frames' has an error in the
  83. * description of the Key MIC calculation. It includes packet data from the
  84. * beginning of the EAPOL-Key header, not EAPOL header. This incorrect change
  85. * happened during final editing of the standard and the correct behavior is
  86. * defined in the last draft (IEEE 802.11i/D10).
  87. */
  88. int wpa_eapol_key_mic(const u8 *key, size_t key_len, int akmp, int ver,
  89. const u8 *buf, size_t len, u8 *mic)
  90. {
  91. u8 hash[SHA512_MAC_LEN];
  92. switch (ver) {
  93. #ifndef CONFIG_FIPS
  94. case WPA_KEY_INFO_TYPE_HMAC_MD5_RC4:
  95. wpa_printf(MSG_DEBUG, "WPA: EAPOL-Key MIC using HMAC-MD5");
  96. return hmac_md5(key, key_len, buf, len, mic);
  97. #endif /* CONFIG_FIPS */
  98. case WPA_KEY_INFO_TYPE_HMAC_SHA1_AES:
  99. wpa_printf(MSG_DEBUG, "WPA: EAPOL-Key MIC using HMAC-SHA1");
  100. if (hmac_sha1(key, key_len, buf, len, hash))
  101. return -1;
  102. os_memcpy(mic, hash, MD5_MAC_LEN);
  103. break;
  104. #if defined(CONFIG_IEEE80211R) || defined(CONFIG_IEEE80211W)
  105. case WPA_KEY_INFO_TYPE_AES_128_CMAC:
  106. wpa_printf(MSG_DEBUG, "WPA: EAPOL-Key MIC using AES-CMAC");
  107. return omac1_aes_128(key, buf, len, mic);
  108. #endif /* CONFIG_IEEE80211R || CONFIG_IEEE80211W */
  109. case WPA_KEY_INFO_TYPE_AKM_DEFINED:
  110. switch (akmp) {
  111. #ifdef CONFIG_HS20
  112. case WPA_KEY_MGMT_OSEN:
  113. wpa_printf(MSG_DEBUG,
  114. "WPA: EAPOL-Key MIC using AES-CMAC (AKM-defined - OSEN)");
  115. return omac1_aes_128(key, buf, len, mic);
  116. #endif /* CONFIG_HS20 */
  117. #ifdef CONFIG_SUITEB
  118. case WPA_KEY_MGMT_IEEE8021X_SUITE_B:
  119. wpa_printf(MSG_DEBUG,
  120. "WPA: EAPOL-Key MIC using HMAC-SHA256 (AKM-defined - Suite B)");
  121. if (hmac_sha256(key, key_len, buf, len, hash))
  122. return -1;
  123. os_memcpy(mic, hash, MD5_MAC_LEN);
  124. break;
  125. #endif /* CONFIG_SUITEB */
  126. #ifdef CONFIG_SUITEB192
  127. case WPA_KEY_MGMT_IEEE8021X_SUITE_B_192:
  128. wpa_printf(MSG_DEBUG,
  129. "WPA: EAPOL-Key MIC using HMAC-SHA384 (AKM-defined - Suite B 192-bit)");
  130. if (hmac_sha384(key, key_len, buf, len, hash))
  131. return -1;
  132. os_memcpy(mic, hash, 24);
  133. break;
  134. #endif /* CONFIG_SUITEB192 */
  135. #ifdef CONFIG_OWE
  136. case WPA_KEY_MGMT_OWE:
  137. wpa_printf(MSG_DEBUG,
  138. "WPA: EAPOL-Key MIC using HMAC-SHA256 (AKM-defined - OWE)");
  139. if (hmac_sha256(key, key_len, buf, len, hash))
  140. return -1;
  141. os_memcpy(mic, hash, MD5_MAC_LEN);
  142. break;
  143. #endif /* CONFIG_OWE */
  144. #ifdef CONFIG_DPP
  145. case WPA_KEY_MGMT_DPP:
  146. wpa_printf(MSG_DEBUG,
  147. "WPA: EAPOL-Key MIC using HMAC-SHA%u (AKM-defined - DPP)",
  148. (unsigned int) key_len * 8 * 2);
  149. if (key_len == 128 / 8) {
  150. if (hmac_sha256(key, key_len, buf, len, hash))
  151. return -1;
  152. } else if (key_len == 192 / 8) {
  153. if (hmac_sha384(key, key_len, buf, len, hash))
  154. return -1;
  155. } else if (key_len == 256 / 8) {
  156. if (hmac_sha256(key, key_len, buf, len, hash))
  157. return -1;
  158. } else {
  159. wpa_printf(MSG_INFO,
  160. "DPP: Unsupported KCK length: %u",
  161. (unsigned int) key_len);
  162. return -1;
  163. }
  164. os_memcpy(mic, hash, key_len / 8);
  165. break;
  166. #endif /* CONFIG_DPP */
  167. default:
  168. wpa_printf(MSG_DEBUG,
  169. "WPA: EAPOL-Key MIC algorithm not known (AKM-defined - akmp=0x%x)",
  170. akmp);
  171. return -1;
  172. }
  173. break;
  174. default:
  175. wpa_printf(MSG_DEBUG,
  176. "WPA: EAPOL-Key MIC algorithm not known (ver=%d)",
  177. ver);
  178. return -1;
  179. }
  180. return 0;
  181. }
  182. /**
  183. * wpa_pmk_to_ptk - Calculate PTK from PMK, addresses, and nonces
  184. * @pmk: Pairwise master key
  185. * @pmk_len: Length of PMK
  186. * @label: Label to use in derivation
  187. * @addr1: AA or SA
  188. * @addr2: SA or AA
  189. * @nonce1: ANonce or SNonce
  190. * @nonce2: SNonce or ANonce
  191. * @ptk: Buffer for pairwise transient key
  192. * @akmp: Negotiated AKM
  193. * @cipher: Negotiated pairwise cipher
  194. * Returns: 0 on success, -1 on failure
  195. *
  196. * IEEE Std 802.11i-2004 - 8.5.1.2 Pairwise key hierarchy
  197. * PTK = PRF-X(PMK, "Pairwise key expansion",
  198. * Min(AA, SA) || Max(AA, SA) ||
  199. * Min(ANonce, SNonce) || Max(ANonce, SNonce))
  200. *
  201. * STK = PRF-X(SMK, "Peer key expansion",
  202. * Min(MAC_I, MAC_P) || Max(MAC_I, MAC_P) ||
  203. * Min(INonce, PNonce) || Max(INonce, PNonce))
  204. */
  205. int wpa_pmk_to_ptk(const u8 *pmk, size_t pmk_len, const char *label,
  206. const u8 *addr1, const u8 *addr2,
  207. const u8 *nonce1, const u8 *nonce2,
  208. struct wpa_ptk *ptk, int akmp, int cipher)
  209. {
  210. u8 data[2 * ETH_ALEN + 2 * WPA_NONCE_LEN];
  211. u8 tmp[WPA_KCK_MAX_LEN + WPA_KEK_MAX_LEN + WPA_TK_MAX_LEN];
  212. size_t ptk_len;
  213. if (os_memcmp(addr1, addr2, ETH_ALEN) < 0) {
  214. os_memcpy(data, addr1, ETH_ALEN);
  215. os_memcpy(data + ETH_ALEN, addr2, ETH_ALEN);
  216. } else {
  217. os_memcpy(data, addr2, ETH_ALEN);
  218. os_memcpy(data + ETH_ALEN, addr1, ETH_ALEN);
  219. }
  220. if (os_memcmp(nonce1, nonce2, WPA_NONCE_LEN) < 0) {
  221. os_memcpy(data + 2 * ETH_ALEN, nonce1, WPA_NONCE_LEN);
  222. os_memcpy(data + 2 * ETH_ALEN + WPA_NONCE_LEN, nonce2,
  223. WPA_NONCE_LEN);
  224. } else {
  225. os_memcpy(data + 2 * ETH_ALEN, nonce2, WPA_NONCE_LEN);
  226. os_memcpy(data + 2 * ETH_ALEN + WPA_NONCE_LEN, nonce1,
  227. WPA_NONCE_LEN);
  228. }
  229. ptk->kck_len = wpa_kck_len(akmp, pmk_len);
  230. ptk->kek_len = wpa_kek_len(akmp, pmk_len);
  231. ptk->tk_len = wpa_cipher_key_len(cipher);
  232. ptk_len = ptk->kck_len + ptk->kek_len + ptk->tk_len;
  233. if (wpa_key_mgmt_sha384(akmp)) {
  234. #if defined(CONFIG_SUITEB192) || defined(CONFIG_FILS)
  235. wpa_printf(MSG_DEBUG, "WPA: PTK derivation using PRF(SHA384)");
  236. if (sha384_prf(pmk, pmk_len, label, data, sizeof(data),
  237. tmp, ptk_len) < 0)
  238. return -1;
  239. #else /* CONFIG_SUITEB192 || CONFIG_FILS */
  240. return -1;
  241. #endif /* CONFIG_SUITEB192 || CONFIG_FILS */
  242. } else if (wpa_key_mgmt_sha256(akmp) || akmp == WPA_KEY_MGMT_OWE) {
  243. #ifdef CONFIG_IEEE80211W
  244. wpa_printf(MSG_DEBUG, "WPA: PTK derivation using PRF(SHA256)");
  245. if (sha256_prf(pmk, pmk_len, label, data, sizeof(data),
  246. tmp, ptk_len) < 0)
  247. return -1;
  248. #else /* CONFIG_IEEE80211W */
  249. return -1;
  250. #endif /* CONFIG_IEEE80211W */
  251. #ifdef CONFIG_DPP
  252. } else if (akmp == WPA_KEY_MGMT_DPP && pmk_len == 32) {
  253. wpa_printf(MSG_DEBUG, "WPA: PTK derivation using PRF(SHA256)");
  254. if (sha256_prf(pmk, pmk_len, label, data, sizeof(data),
  255. tmp, ptk_len) < 0)
  256. return -1;
  257. } else if (akmp == WPA_KEY_MGMT_DPP && pmk_len == 48) {
  258. wpa_printf(MSG_DEBUG, "WPA: PTK derivation using PRF(SHA384)");
  259. if (sha384_prf(pmk, pmk_len, label, data, sizeof(data),
  260. tmp, ptk_len) < 0)
  261. return -1;
  262. } else if (akmp == WPA_KEY_MGMT_DPP && pmk_len == 64) {
  263. wpa_printf(MSG_DEBUG, "WPA: PTK derivation using PRF(SHA512)");
  264. if (sha512_prf(pmk, pmk_len, label, data, sizeof(data),
  265. tmp, ptk_len) < 0)
  266. return -1;
  267. } else if (akmp == WPA_KEY_MGMT_DPP) {
  268. wpa_printf(MSG_INFO, "DPP: Unknown PMK length %u",
  269. (unsigned int) pmk_len);
  270. return -1;
  271. #endif /* CONFIG_DPP */
  272. } else {
  273. wpa_printf(MSG_DEBUG, "WPA: PTK derivation using PRF(SHA1)");
  274. if (sha1_prf(pmk, pmk_len, label, data, sizeof(data), tmp,
  275. ptk_len) < 0)
  276. return -1;
  277. }
  278. wpa_printf(MSG_DEBUG, "WPA: PTK derivation - A1=" MACSTR " A2=" MACSTR,
  279. MAC2STR(addr1), MAC2STR(addr2));
  280. wpa_hexdump(MSG_DEBUG, "WPA: Nonce1", nonce1, WPA_NONCE_LEN);
  281. wpa_hexdump(MSG_DEBUG, "WPA: Nonce2", nonce2, WPA_NONCE_LEN);
  282. wpa_hexdump_key(MSG_DEBUG, "WPA: PMK", pmk, pmk_len);
  283. wpa_hexdump_key(MSG_DEBUG, "WPA: PTK", tmp, ptk_len);
  284. os_memcpy(ptk->kck, tmp, ptk->kck_len);
  285. wpa_hexdump_key(MSG_DEBUG, "WPA: KCK", ptk->kck, ptk->kck_len);
  286. os_memcpy(ptk->kek, tmp + ptk->kck_len, ptk->kek_len);
  287. wpa_hexdump_key(MSG_DEBUG, "WPA: KEK", ptk->kek, ptk->kek_len);
  288. os_memcpy(ptk->tk, tmp + ptk->kck_len + ptk->kek_len, ptk->tk_len);
  289. wpa_hexdump_key(MSG_DEBUG, "WPA: TK", ptk->tk, ptk->tk_len);
  290. os_memset(tmp, 0, sizeof(tmp));
  291. return 0;
  292. }
  293. #ifdef CONFIG_FILS
  294. int fils_rmsk_to_pmk(int akmp, const u8 *rmsk, size_t rmsk_len,
  295. const u8 *snonce, const u8 *anonce, const u8 *dh_ss,
  296. size_t dh_ss_len, u8 *pmk, size_t *pmk_len)
  297. {
  298. u8 nonces[2 * FILS_NONCE_LEN];
  299. const u8 *addr[2];
  300. size_t len[2];
  301. size_t num_elem;
  302. int res;
  303. /* PMK = HMAC-Hash(SNonce || ANonce, rMSK [ || DHss ]) */
  304. wpa_printf(MSG_DEBUG, "FILS: rMSK to PMK derivation");
  305. if (wpa_key_mgmt_sha384(akmp))
  306. *pmk_len = SHA384_MAC_LEN;
  307. else if (wpa_key_mgmt_sha256(akmp))
  308. *pmk_len = SHA256_MAC_LEN;
  309. else
  310. return -1;
  311. wpa_hexdump_key(MSG_DEBUG, "FILS: rMSK", rmsk, rmsk_len);
  312. wpa_hexdump(MSG_DEBUG, "FILS: SNonce", snonce, FILS_NONCE_LEN);
  313. wpa_hexdump(MSG_DEBUG, "FILS: ANonce", anonce, FILS_NONCE_LEN);
  314. wpa_hexdump(MSG_DEBUG, "FILS: DHss", dh_ss, dh_ss_len);
  315. os_memcpy(nonces, snonce, FILS_NONCE_LEN);
  316. os_memcpy(&nonces[FILS_NONCE_LEN], anonce, FILS_NONCE_LEN);
  317. addr[0] = rmsk;
  318. len[0] = rmsk_len;
  319. num_elem = 1;
  320. if (dh_ss) {
  321. addr[1] = dh_ss;
  322. len[1] = dh_ss_len;
  323. num_elem++;
  324. }
  325. if (wpa_key_mgmt_sha384(akmp))
  326. res = hmac_sha384_vector(nonces, 2 * FILS_NONCE_LEN, num_elem,
  327. addr, len, pmk);
  328. else
  329. res = hmac_sha256_vector(nonces, 2 * FILS_NONCE_LEN, num_elem,
  330. addr, len, pmk);
  331. if (res == 0)
  332. wpa_hexdump_key(MSG_DEBUG, "FILS: PMK", pmk, *pmk_len);
  333. return res;
  334. }
  335. int fils_pmkid_erp(int akmp, const u8 *reauth, size_t reauth_len,
  336. u8 *pmkid)
  337. {
  338. const u8 *addr[1];
  339. size_t len[1];
  340. u8 hash[SHA384_MAC_LEN];
  341. int res;
  342. /* PMKID = Truncate-128(Hash(EAP-Initiate/Reauth)) */
  343. addr[0] = reauth;
  344. len[0] = reauth_len;
  345. if (wpa_key_mgmt_sha384(akmp))
  346. res = sha384_vector(1, addr, len, hash);
  347. else if (wpa_key_mgmt_sha256(akmp))
  348. res = sha256_vector(1, addr, len, hash);
  349. else
  350. return -1;
  351. if (res)
  352. return res;
  353. os_memcpy(pmkid, hash, PMKID_LEN);
  354. wpa_hexdump(MSG_DEBUG, "FILS: PMKID", pmkid, PMKID_LEN);
  355. return 0;
  356. }
  357. int fils_pmk_to_ptk(const u8 *pmk, size_t pmk_len, const u8 *spa, const u8 *aa,
  358. const u8 *snonce, const u8 *anonce, struct wpa_ptk *ptk,
  359. u8 *ick, size_t *ick_len, int akmp, int cipher,
  360. u8 *fils_ft, size_t *fils_ft_len)
  361. {
  362. u8 data[2 * ETH_ALEN + 2 * FILS_NONCE_LEN];
  363. u8 tmp[FILS_ICK_MAX_LEN + WPA_KEK_MAX_LEN + WPA_TK_MAX_LEN +
  364. FILS_FT_MAX_LEN];
  365. size_t key_data_len;
  366. const char *label = "FILS PTK Derivation";
  367. /*
  368. * FILS-Key-Data = PRF-X(PMK, "FILS PTK Derivation",
  369. * SPA || AA || SNonce || ANonce)
  370. * ICK = L(FILS-Key-Data, 0, ICK_bits)
  371. * KEK = L(FILS-Key-Data, ICK_bits, KEK_bits)
  372. * TK = L(FILS-Key-Data, ICK_bits + KEK_bits, TK_bits)
  373. * If doing FT initial mobility domain association:
  374. * FILS-FT = L(FILS-Key-Data, ICK_bits + KEK_bits + TK_bits,
  375. * FILS-FT_bits)
  376. */
  377. os_memcpy(data, spa, ETH_ALEN);
  378. os_memcpy(data + ETH_ALEN, aa, ETH_ALEN);
  379. os_memcpy(data + 2 * ETH_ALEN, snonce, FILS_NONCE_LEN);
  380. os_memcpy(data + 2 * ETH_ALEN + FILS_NONCE_LEN, anonce, FILS_NONCE_LEN);
  381. ptk->kck_len = 0;
  382. ptk->kek_len = wpa_kek_len(akmp, pmk_len);
  383. ptk->tk_len = wpa_cipher_key_len(cipher);
  384. if (wpa_key_mgmt_sha384(akmp))
  385. *ick_len = 48;
  386. else if (wpa_key_mgmt_sha256(akmp))
  387. *ick_len = 32;
  388. else
  389. return -1;
  390. key_data_len = *ick_len + ptk->kek_len + ptk->tk_len;
  391. if (fils_ft && fils_ft_len) {
  392. if (akmp == WPA_KEY_MGMT_FT_FILS_SHA256) {
  393. *fils_ft_len = 32;
  394. } else if (akmp == WPA_KEY_MGMT_FT_FILS_SHA384) {
  395. *fils_ft_len = 48;
  396. } else {
  397. *fils_ft_len = 0;
  398. fils_ft = NULL;
  399. }
  400. key_data_len += *fils_ft_len;
  401. }
  402. if (wpa_key_mgmt_sha384(akmp)) {
  403. wpa_printf(MSG_DEBUG, "FILS: PTK derivation using PRF(SHA384)");
  404. if (sha384_prf(pmk, pmk_len, label, data, sizeof(data),
  405. tmp, key_data_len) < 0)
  406. return -1;
  407. } else {
  408. wpa_printf(MSG_DEBUG, "FILS: PTK derivation using PRF(SHA256)");
  409. if (sha256_prf(pmk, pmk_len, label, data, sizeof(data),
  410. tmp, key_data_len) < 0)
  411. return -1;
  412. }
  413. wpa_printf(MSG_DEBUG, "FILS: PTK derivation - SPA=" MACSTR
  414. " AA=" MACSTR, MAC2STR(spa), MAC2STR(aa));
  415. wpa_hexdump(MSG_DEBUG, "FILS: SNonce", snonce, FILS_NONCE_LEN);
  416. wpa_hexdump(MSG_DEBUG, "FILS: ANonce", anonce, FILS_NONCE_LEN);
  417. wpa_hexdump_key(MSG_DEBUG, "FILS: PMK", pmk, pmk_len);
  418. wpa_hexdump_key(MSG_DEBUG, "FILS: FILS-Key-Data", tmp, key_data_len);
  419. os_memcpy(ick, tmp, *ick_len);
  420. wpa_hexdump_key(MSG_DEBUG, "FILS: ICK", ick, *ick_len);
  421. os_memcpy(ptk->kek, tmp + *ick_len, ptk->kek_len);
  422. wpa_hexdump_key(MSG_DEBUG, "FILS: KEK", ptk->kek, ptk->kek_len);
  423. os_memcpy(ptk->tk, tmp + *ick_len + ptk->kek_len, ptk->tk_len);
  424. wpa_hexdump_key(MSG_DEBUG, "FILS: TK", ptk->tk, ptk->tk_len);
  425. if (fils_ft && fils_ft_len) {
  426. os_memcpy(fils_ft, tmp + *ick_len + ptk->kek_len + ptk->tk_len,
  427. *fils_ft_len);
  428. wpa_hexdump_key(MSG_DEBUG, "FILS: FILS-FT",
  429. fils_ft, *fils_ft_len);
  430. }
  431. os_memset(tmp, 0, sizeof(tmp));
  432. return 0;
  433. }
  434. int fils_key_auth_sk(const u8 *ick, size_t ick_len, const u8 *snonce,
  435. const u8 *anonce, const u8 *sta_addr, const u8 *bssid,
  436. const u8 *g_sta, size_t g_sta_len,
  437. const u8 *g_ap, size_t g_ap_len,
  438. int akmp, u8 *key_auth_sta, u8 *key_auth_ap,
  439. size_t *key_auth_len)
  440. {
  441. const u8 *addr[6];
  442. size_t len[6];
  443. size_t num_elem = 4;
  444. int res;
  445. wpa_printf(MSG_DEBUG, "FILS: Key-Auth derivation: STA-MAC=" MACSTR
  446. " AP-BSSID=" MACSTR, MAC2STR(sta_addr), MAC2STR(bssid));
  447. wpa_hexdump_key(MSG_DEBUG, "FILS: ICK", ick, ick_len);
  448. wpa_hexdump(MSG_DEBUG, "FILS: SNonce", snonce, FILS_NONCE_LEN);
  449. wpa_hexdump(MSG_DEBUG, "FILS: ANonce", anonce, FILS_NONCE_LEN);
  450. wpa_hexdump(MSG_DEBUG, "FILS: gSTA", g_sta, g_sta_len);
  451. wpa_hexdump(MSG_DEBUG, "FILS: gAP", g_ap, g_ap_len);
  452. /*
  453. * For (Re)Association Request frame (STA->AP):
  454. * Key-Auth = HMAC-Hash(ICK, SNonce || ANonce || STA-MAC || AP-BSSID
  455. * [ || gSTA || gAP ])
  456. */
  457. addr[0] = snonce;
  458. len[0] = FILS_NONCE_LEN;
  459. addr[1] = anonce;
  460. len[1] = FILS_NONCE_LEN;
  461. addr[2] = sta_addr;
  462. len[2] = ETH_ALEN;
  463. addr[3] = bssid;
  464. len[3] = ETH_ALEN;
  465. if (g_sta && g_ap_len && g_ap && g_ap_len) {
  466. addr[4] = g_sta;
  467. len[4] = g_sta_len;
  468. addr[5] = g_ap;
  469. len[5] = g_ap_len;
  470. num_elem = 6;
  471. }
  472. if (wpa_key_mgmt_sha384(akmp)) {
  473. *key_auth_len = 48;
  474. res = hmac_sha384_vector(ick, ick_len, num_elem, addr, len,
  475. key_auth_sta);
  476. } else if (wpa_key_mgmt_sha256(akmp)) {
  477. *key_auth_len = 32;
  478. res = hmac_sha256_vector(ick, ick_len, num_elem, addr, len,
  479. key_auth_sta);
  480. } else {
  481. return -1;
  482. }
  483. if (res < 0)
  484. return res;
  485. /*
  486. * For (Re)Association Response frame (AP->STA):
  487. * Key-Auth = HMAC-Hash(ICK, ANonce || SNonce || AP-BSSID || STA-MAC
  488. * [ || gAP || gSTA ])
  489. */
  490. addr[0] = anonce;
  491. addr[1] = snonce;
  492. addr[2] = bssid;
  493. addr[3] = sta_addr;
  494. if (g_sta && g_ap_len && g_ap && g_ap_len) {
  495. addr[4] = g_ap;
  496. len[4] = g_ap_len;
  497. addr[5] = g_sta;
  498. len[5] = g_sta_len;
  499. }
  500. if (wpa_key_mgmt_sha384(akmp))
  501. res = hmac_sha384_vector(ick, ick_len, num_elem, addr, len,
  502. key_auth_ap);
  503. else if (wpa_key_mgmt_sha256(akmp))
  504. res = hmac_sha256_vector(ick, ick_len, num_elem, addr, len,
  505. key_auth_ap);
  506. if (res < 0)
  507. return res;
  508. wpa_hexdump(MSG_DEBUG, "FILS: Key-Auth (STA)",
  509. key_auth_sta, *key_auth_len);
  510. wpa_hexdump(MSG_DEBUG, "FILS: Key-Auth (AP)",
  511. key_auth_ap, *key_auth_len);
  512. return 0;
  513. }
  514. #endif /* CONFIG_FILS */
  515. #ifdef CONFIG_IEEE80211R
  516. int wpa_ft_mic(const u8 *kck, size_t kck_len, const u8 *sta_addr,
  517. const u8 *ap_addr, u8 transaction_seqnum,
  518. const u8 *mdie, size_t mdie_len,
  519. const u8 *ftie, size_t ftie_len,
  520. const u8 *rsnie, size_t rsnie_len,
  521. const u8 *ric, size_t ric_len, u8 *mic)
  522. {
  523. const u8 *addr[9];
  524. size_t len[9];
  525. size_t i, num_elem = 0;
  526. u8 zero_mic[16];
  527. if (kck_len != 16) {
  528. wpa_printf(MSG_WARNING, "FT: Unsupported KCK length %u",
  529. (unsigned int) kck_len);
  530. return -1;
  531. }
  532. addr[num_elem] = sta_addr;
  533. len[num_elem] = ETH_ALEN;
  534. num_elem++;
  535. addr[num_elem] = ap_addr;
  536. len[num_elem] = ETH_ALEN;
  537. num_elem++;
  538. addr[num_elem] = &transaction_seqnum;
  539. len[num_elem] = 1;
  540. num_elem++;
  541. if (rsnie) {
  542. addr[num_elem] = rsnie;
  543. len[num_elem] = rsnie_len;
  544. num_elem++;
  545. }
  546. if (mdie) {
  547. addr[num_elem] = mdie;
  548. len[num_elem] = mdie_len;
  549. num_elem++;
  550. }
  551. if (ftie) {
  552. if (ftie_len < 2 + sizeof(struct rsn_ftie))
  553. return -1;
  554. /* IE hdr and mic_control */
  555. addr[num_elem] = ftie;
  556. len[num_elem] = 2 + 2;
  557. num_elem++;
  558. /* MIC field with all zeros */
  559. os_memset(zero_mic, 0, sizeof(zero_mic));
  560. addr[num_elem] = zero_mic;
  561. len[num_elem] = sizeof(zero_mic);
  562. num_elem++;
  563. /* Rest of FTIE */
  564. addr[num_elem] = ftie + 2 + 2 + 16;
  565. len[num_elem] = ftie_len - (2 + 2 + 16);
  566. num_elem++;
  567. }
  568. if (ric) {
  569. addr[num_elem] = ric;
  570. len[num_elem] = ric_len;
  571. num_elem++;
  572. }
  573. for (i = 0; i < num_elem; i++)
  574. wpa_hexdump(MSG_MSGDUMP, "FT: MIC data", addr[i], len[i]);
  575. if (omac1_aes_128_vector(kck, num_elem, addr, len, mic))
  576. return -1;
  577. return 0;
  578. }
  579. static int wpa_ft_parse_ftie(const u8 *ie, size_t ie_len,
  580. struct wpa_ft_ies *parse)
  581. {
  582. const u8 *end, *pos;
  583. parse->ftie = ie;
  584. parse->ftie_len = ie_len;
  585. pos = ie + sizeof(struct rsn_ftie);
  586. end = ie + ie_len;
  587. while (end - pos >= 2) {
  588. u8 id, len;
  589. id = *pos++;
  590. len = *pos++;
  591. if (len > end - pos)
  592. break;
  593. switch (id) {
  594. case FTIE_SUBELEM_R1KH_ID:
  595. if (len != FT_R1KH_ID_LEN) {
  596. wpa_printf(MSG_DEBUG,
  597. "FT: Invalid R1KH-ID length in FTIE: %d",
  598. len);
  599. return -1;
  600. }
  601. parse->r1kh_id = pos;
  602. break;
  603. case FTIE_SUBELEM_GTK:
  604. parse->gtk = pos;
  605. parse->gtk_len = len;
  606. break;
  607. case FTIE_SUBELEM_R0KH_ID:
  608. if (len < 1 || len > FT_R0KH_ID_MAX_LEN) {
  609. wpa_printf(MSG_DEBUG,
  610. "FT: Invalid R0KH-ID length in FTIE: %d",
  611. len);
  612. return -1;
  613. }
  614. parse->r0kh_id = pos;
  615. parse->r0kh_id_len = len;
  616. break;
  617. #ifdef CONFIG_IEEE80211W
  618. case FTIE_SUBELEM_IGTK:
  619. parse->igtk = pos;
  620. parse->igtk_len = len;
  621. break;
  622. #endif /* CONFIG_IEEE80211W */
  623. }
  624. pos += len;
  625. }
  626. return 0;
  627. }
  628. int wpa_ft_parse_ies(const u8 *ies, size_t ies_len,
  629. struct wpa_ft_ies *parse)
  630. {
  631. const u8 *end, *pos;
  632. struct wpa_ie_data data;
  633. int ret;
  634. const struct rsn_ftie *ftie;
  635. int prot_ie_count = 0;
  636. os_memset(parse, 0, sizeof(*parse));
  637. if (ies == NULL)
  638. return 0;
  639. pos = ies;
  640. end = ies + ies_len;
  641. while (end - pos >= 2) {
  642. u8 id, len;
  643. id = *pos++;
  644. len = *pos++;
  645. if (len > end - pos)
  646. break;
  647. switch (id) {
  648. case WLAN_EID_RSN:
  649. parse->rsn = pos;
  650. parse->rsn_len = len;
  651. ret = wpa_parse_wpa_ie_rsn(parse->rsn - 2,
  652. parse->rsn_len + 2,
  653. &data);
  654. if (ret < 0) {
  655. wpa_printf(MSG_DEBUG, "FT: Failed to parse "
  656. "RSN IE: %d", ret);
  657. return -1;
  658. }
  659. if (data.num_pmkid == 1 && data.pmkid)
  660. parse->rsn_pmkid = data.pmkid;
  661. parse->key_mgmt = data.key_mgmt;
  662. parse->pairwise_cipher = data.pairwise_cipher;
  663. break;
  664. case WLAN_EID_MOBILITY_DOMAIN:
  665. if (len < sizeof(struct rsn_mdie))
  666. return -1;
  667. parse->mdie = pos;
  668. parse->mdie_len = len;
  669. break;
  670. case WLAN_EID_FAST_BSS_TRANSITION:
  671. if (len < sizeof(*ftie))
  672. return -1;
  673. ftie = (const struct rsn_ftie *) pos;
  674. prot_ie_count = ftie->mic_control[1];
  675. if (wpa_ft_parse_ftie(pos, len, parse) < 0)
  676. return -1;
  677. break;
  678. case WLAN_EID_TIMEOUT_INTERVAL:
  679. if (len != 5)
  680. break;
  681. parse->tie = pos;
  682. parse->tie_len = len;
  683. break;
  684. case WLAN_EID_RIC_DATA:
  685. if (parse->ric == NULL)
  686. parse->ric = pos - 2;
  687. break;
  688. }
  689. pos += len;
  690. }
  691. if (prot_ie_count == 0)
  692. return 0; /* no MIC */
  693. /*
  694. * Check that the protected IE count matches with IEs included in the
  695. * frame.
  696. */
  697. if (parse->rsn)
  698. prot_ie_count--;
  699. if (parse->mdie)
  700. prot_ie_count--;
  701. if (parse->ftie)
  702. prot_ie_count--;
  703. if (prot_ie_count < 0) {
  704. wpa_printf(MSG_DEBUG, "FT: Some required IEs not included in "
  705. "the protected IE count");
  706. return -1;
  707. }
  708. if (prot_ie_count == 0 && parse->ric) {
  709. wpa_printf(MSG_DEBUG, "FT: RIC IE(s) in the frame, but not "
  710. "included in protected IE count");
  711. return -1;
  712. }
  713. /* Determine the end of the RIC IE(s) */
  714. if (parse->ric) {
  715. pos = parse->ric;
  716. while (end - pos >= 2 && 2 + pos[1] <= end - pos &&
  717. prot_ie_count) {
  718. prot_ie_count--;
  719. pos += 2 + pos[1];
  720. }
  721. parse->ric_len = pos - parse->ric;
  722. }
  723. if (prot_ie_count) {
  724. wpa_printf(MSG_DEBUG, "FT: %d protected IEs missing from "
  725. "frame", (int) prot_ie_count);
  726. return -1;
  727. }
  728. return 0;
  729. }
  730. #endif /* CONFIG_IEEE80211R */
  731. static int rsn_selector_to_bitfield(const u8 *s)
  732. {
  733. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_NONE)
  734. return WPA_CIPHER_NONE;
  735. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_TKIP)
  736. return WPA_CIPHER_TKIP;
  737. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_CCMP)
  738. return WPA_CIPHER_CCMP;
  739. #ifdef CONFIG_IEEE80211W
  740. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_AES_128_CMAC)
  741. return WPA_CIPHER_AES_128_CMAC;
  742. #endif /* CONFIG_IEEE80211W */
  743. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_GCMP)
  744. return WPA_CIPHER_GCMP;
  745. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_CCMP_256)
  746. return WPA_CIPHER_CCMP_256;
  747. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_GCMP_256)
  748. return WPA_CIPHER_GCMP_256;
  749. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_BIP_GMAC_128)
  750. return WPA_CIPHER_BIP_GMAC_128;
  751. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_BIP_GMAC_256)
  752. return WPA_CIPHER_BIP_GMAC_256;
  753. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_BIP_CMAC_256)
  754. return WPA_CIPHER_BIP_CMAC_256;
  755. if (RSN_SELECTOR_GET(s) == RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED)
  756. return WPA_CIPHER_GTK_NOT_USED;
  757. return 0;
  758. }
  759. static int rsn_key_mgmt_to_bitfield(const u8 *s)
  760. {
  761. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_UNSPEC_802_1X)
  762. return WPA_KEY_MGMT_IEEE8021X;
  763. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X)
  764. return WPA_KEY_MGMT_PSK;
  765. #ifdef CONFIG_IEEE80211R
  766. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_802_1X)
  767. return WPA_KEY_MGMT_FT_IEEE8021X;
  768. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_PSK)
  769. return WPA_KEY_MGMT_FT_PSK;
  770. #endif /* CONFIG_IEEE80211R */
  771. #ifdef CONFIG_IEEE80211W
  772. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SHA256)
  773. return WPA_KEY_MGMT_IEEE8021X_SHA256;
  774. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_PSK_SHA256)
  775. return WPA_KEY_MGMT_PSK_SHA256;
  776. #endif /* CONFIG_IEEE80211W */
  777. #ifdef CONFIG_SAE
  778. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_SAE)
  779. return WPA_KEY_MGMT_SAE;
  780. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_SAE)
  781. return WPA_KEY_MGMT_FT_SAE;
  782. #endif /* CONFIG_SAE */
  783. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SUITE_B)
  784. return WPA_KEY_MGMT_IEEE8021X_SUITE_B;
  785. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192)
  786. return WPA_KEY_MGMT_IEEE8021X_SUITE_B_192;
  787. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FILS_SHA256)
  788. return WPA_KEY_MGMT_FILS_SHA256;
  789. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FILS_SHA384)
  790. return WPA_KEY_MGMT_FILS_SHA384;
  791. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_FILS_SHA256)
  792. return WPA_KEY_MGMT_FT_FILS_SHA256;
  793. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_FT_FILS_SHA384)
  794. return WPA_KEY_MGMT_FT_FILS_SHA384;
  795. #ifdef CONFIG_OWE
  796. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_OWE)
  797. return WPA_KEY_MGMT_OWE;
  798. #endif /* CONFIG_OWE */
  799. #ifdef CONFIG_DPP
  800. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_DPP)
  801. return WPA_KEY_MGMT_DPP;
  802. #endif /* CONFIG_DPP */
  803. if (RSN_SELECTOR_GET(s) == RSN_AUTH_KEY_MGMT_OSEN)
  804. return WPA_KEY_MGMT_OSEN;
  805. return 0;
  806. }
  807. int wpa_cipher_valid_group(int cipher)
  808. {
  809. return wpa_cipher_valid_pairwise(cipher) ||
  810. cipher == WPA_CIPHER_GTK_NOT_USED;
  811. }
  812. #ifdef CONFIG_IEEE80211W
  813. int wpa_cipher_valid_mgmt_group(int cipher)
  814. {
  815. return cipher == WPA_CIPHER_AES_128_CMAC ||
  816. cipher == WPA_CIPHER_BIP_GMAC_128 ||
  817. cipher == WPA_CIPHER_BIP_GMAC_256 ||
  818. cipher == WPA_CIPHER_BIP_CMAC_256;
  819. }
  820. #endif /* CONFIG_IEEE80211W */
  821. /**
  822. * wpa_parse_wpa_ie_rsn - Parse RSN IE
  823. * @rsn_ie: Buffer containing RSN IE
  824. * @rsn_ie_len: RSN IE buffer length (including IE number and length octets)
  825. * @data: Pointer to structure that will be filled in with parsed data
  826. * Returns: 0 on success, <0 on failure
  827. */
  828. int wpa_parse_wpa_ie_rsn(const u8 *rsn_ie, size_t rsn_ie_len,
  829. struct wpa_ie_data *data)
  830. {
  831. const u8 *pos;
  832. int left;
  833. int i, count;
  834. os_memset(data, 0, sizeof(*data));
  835. data->proto = WPA_PROTO_RSN;
  836. data->pairwise_cipher = WPA_CIPHER_CCMP;
  837. data->group_cipher = WPA_CIPHER_CCMP;
  838. data->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
  839. data->capabilities = 0;
  840. data->pmkid = NULL;
  841. data->num_pmkid = 0;
  842. #ifdef CONFIG_IEEE80211W
  843. data->mgmt_group_cipher = WPA_CIPHER_AES_128_CMAC;
  844. #else /* CONFIG_IEEE80211W */
  845. data->mgmt_group_cipher = 0;
  846. #endif /* CONFIG_IEEE80211W */
  847. if (rsn_ie_len == 0) {
  848. /* No RSN IE - fail silently */
  849. return -1;
  850. }
  851. if (rsn_ie_len < sizeof(struct rsn_ie_hdr)) {
  852. wpa_printf(MSG_DEBUG, "%s: ie len too short %lu",
  853. __func__, (unsigned long) rsn_ie_len);
  854. return -1;
  855. }
  856. if (rsn_ie_len >= 6 && rsn_ie[1] >= 4 &&
  857. rsn_ie[1] == rsn_ie_len - 2 &&
  858. WPA_GET_BE32(&rsn_ie[2]) == OSEN_IE_VENDOR_TYPE) {
  859. pos = rsn_ie + 6;
  860. left = rsn_ie_len - 6;
  861. data->proto = WPA_PROTO_OSEN;
  862. } else {
  863. const struct rsn_ie_hdr *hdr;
  864. hdr = (const struct rsn_ie_hdr *) rsn_ie;
  865. if (hdr->elem_id != WLAN_EID_RSN ||
  866. hdr->len != rsn_ie_len - 2 ||
  867. WPA_GET_LE16(hdr->version) != RSN_VERSION) {
  868. wpa_printf(MSG_DEBUG, "%s: malformed ie or unknown version",
  869. __func__);
  870. return -2;
  871. }
  872. pos = (const u8 *) (hdr + 1);
  873. left = rsn_ie_len - sizeof(*hdr);
  874. }
  875. if (left >= RSN_SELECTOR_LEN) {
  876. data->group_cipher = rsn_selector_to_bitfield(pos);
  877. if (!wpa_cipher_valid_group(data->group_cipher)) {
  878. wpa_printf(MSG_DEBUG,
  879. "%s: invalid group cipher 0x%x (%08x)",
  880. __func__, data->group_cipher,
  881. WPA_GET_BE32(pos));
  882. return -1;
  883. }
  884. pos += RSN_SELECTOR_LEN;
  885. left -= RSN_SELECTOR_LEN;
  886. } else if (left > 0) {
  887. wpa_printf(MSG_DEBUG, "%s: ie length mismatch, %u too much",
  888. __func__, left);
  889. return -3;
  890. }
  891. if (left >= 2) {
  892. data->pairwise_cipher = 0;
  893. count = WPA_GET_LE16(pos);
  894. pos += 2;
  895. left -= 2;
  896. if (count == 0 || count > left / RSN_SELECTOR_LEN) {
  897. wpa_printf(MSG_DEBUG, "%s: ie count botch (pairwise), "
  898. "count %u left %u", __func__, count, left);
  899. return -4;
  900. }
  901. for (i = 0; i < count; i++) {
  902. data->pairwise_cipher |= rsn_selector_to_bitfield(pos);
  903. pos += RSN_SELECTOR_LEN;
  904. left -= RSN_SELECTOR_LEN;
  905. }
  906. #ifdef CONFIG_IEEE80211W
  907. if (data->pairwise_cipher & WPA_CIPHER_AES_128_CMAC) {
  908. wpa_printf(MSG_DEBUG, "%s: AES-128-CMAC used as "
  909. "pairwise cipher", __func__);
  910. return -1;
  911. }
  912. #endif /* CONFIG_IEEE80211W */
  913. } else if (left == 1) {
  914. wpa_printf(MSG_DEBUG, "%s: ie too short (for key mgmt)",
  915. __func__);
  916. return -5;
  917. }
  918. if (left >= 2) {
  919. data->key_mgmt = 0;
  920. count = WPA_GET_LE16(pos);
  921. pos += 2;
  922. left -= 2;
  923. if (count == 0 || count > left / RSN_SELECTOR_LEN) {
  924. wpa_printf(MSG_DEBUG, "%s: ie count botch (key mgmt), "
  925. "count %u left %u", __func__, count, left);
  926. return -6;
  927. }
  928. for (i = 0; i < count; i++) {
  929. data->key_mgmt |= rsn_key_mgmt_to_bitfield(pos);
  930. pos += RSN_SELECTOR_LEN;
  931. left -= RSN_SELECTOR_LEN;
  932. }
  933. } else if (left == 1) {
  934. wpa_printf(MSG_DEBUG, "%s: ie too short (for capabilities)",
  935. __func__);
  936. return -7;
  937. }
  938. if (left >= 2) {
  939. data->capabilities = WPA_GET_LE16(pos);
  940. pos += 2;
  941. left -= 2;
  942. }
  943. if (left >= 2) {
  944. u16 num_pmkid = WPA_GET_LE16(pos);
  945. pos += 2;
  946. left -= 2;
  947. if (num_pmkid > (unsigned int) left / PMKID_LEN) {
  948. wpa_printf(MSG_DEBUG, "%s: PMKID underflow "
  949. "(num_pmkid=%u left=%d)",
  950. __func__, num_pmkid, left);
  951. data->num_pmkid = 0;
  952. return -9;
  953. } else {
  954. data->num_pmkid = num_pmkid;
  955. data->pmkid = pos;
  956. pos += data->num_pmkid * PMKID_LEN;
  957. left -= data->num_pmkid * PMKID_LEN;
  958. }
  959. }
  960. #ifdef CONFIG_IEEE80211W
  961. if (left >= 4) {
  962. data->mgmt_group_cipher = rsn_selector_to_bitfield(pos);
  963. if (!wpa_cipher_valid_mgmt_group(data->mgmt_group_cipher)) {
  964. wpa_printf(MSG_DEBUG,
  965. "%s: Unsupported management group cipher 0x%x (%08x)",
  966. __func__, data->mgmt_group_cipher,
  967. WPA_GET_BE32(pos));
  968. return -10;
  969. }
  970. pos += RSN_SELECTOR_LEN;
  971. left -= RSN_SELECTOR_LEN;
  972. }
  973. #endif /* CONFIG_IEEE80211W */
  974. if (left > 0) {
  975. wpa_hexdump(MSG_DEBUG,
  976. "wpa_parse_wpa_ie_rsn: ignore trailing bytes",
  977. pos, left);
  978. }
  979. return 0;
  980. }
  981. static int wpa_selector_to_bitfield(const u8 *s)
  982. {
  983. if (RSN_SELECTOR_GET(s) == WPA_CIPHER_SUITE_NONE)
  984. return WPA_CIPHER_NONE;
  985. if (RSN_SELECTOR_GET(s) == WPA_CIPHER_SUITE_TKIP)
  986. return WPA_CIPHER_TKIP;
  987. if (RSN_SELECTOR_GET(s) == WPA_CIPHER_SUITE_CCMP)
  988. return WPA_CIPHER_CCMP;
  989. return 0;
  990. }
  991. static int wpa_key_mgmt_to_bitfield(const u8 *s)
  992. {
  993. if (RSN_SELECTOR_GET(s) == WPA_AUTH_KEY_MGMT_UNSPEC_802_1X)
  994. return WPA_KEY_MGMT_IEEE8021X;
  995. if (RSN_SELECTOR_GET(s) == WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X)
  996. return WPA_KEY_MGMT_PSK;
  997. if (RSN_SELECTOR_GET(s) == WPA_AUTH_KEY_MGMT_NONE)
  998. return WPA_KEY_MGMT_WPA_NONE;
  999. return 0;
  1000. }
  1001. int wpa_parse_wpa_ie_wpa(const u8 *wpa_ie, size_t wpa_ie_len,
  1002. struct wpa_ie_data *data)
  1003. {
  1004. const struct wpa_ie_hdr *hdr;
  1005. const u8 *pos;
  1006. int left;
  1007. int i, count;
  1008. os_memset(data, 0, sizeof(*data));
  1009. data->proto = WPA_PROTO_WPA;
  1010. data->pairwise_cipher = WPA_CIPHER_TKIP;
  1011. data->group_cipher = WPA_CIPHER_TKIP;
  1012. data->key_mgmt = WPA_KEY_MGMT_IEEE8021X;
  1013. data->capabilities = 0;
  1014. data->pmkid = NULL;
  1015. data->num_pmkid = 0;
  1016. data->mgmt_group_cipher = 0;
  1017. if (wpa_ie_len < sizeof(struct wpa_ie_hdr)) {
  1018. wpa_printf(MSG_DEBUG, "%s: ie len too short %lu",
  1019. __func__, (unsigned long) wpa_ie_len);
  1020. return -1;
  1021. }
  1022. hdr = (const struct wpa_ie_hdr *) wpa_ie;
  1023. if (hdr->elem_id != WLAN_EID_VENDOR_SPECIFIC ||
  1024. hdr->len != wpa_ie_len - 2 ||
  1025. RSN_SELECTOR_GET(hdr->oui) != WPA_OUI_TYPE ||
  1026. WPA_GET_LE16(hdr->version) != WPA_VERSION) {
  1027. wpa_printf(MSG_DEBUG, "%s: malformed ie or unknown version",
  1028. __func__);
  1029. return -2;
  1030. }
  1031. pos = (const u8 *) (hdr + 1);
  1032. left = wpa_ie_len - sizeof(*hdr);
  1033. if (left >= WPA_SELECTOR_LEN) {
  1034. data->group_cipher = wpa_selector_to_bitfield(pos);
  1035. pos += WPA_SELECTOR_LEN;
  1036. left -= WPA_SELECTOR_LEN;
  1037. } else if (left > 0) {
  1038. wpa_printf(MSG_DEBUG, "%s: ie length mismatch, %u too much",
  1039. __func__, left);
  1040. return -3;
  1041. }
  1042. if (left >= 2) {
  1043. data->pairwise_cipher = 0;
  1044. count = WPA_GET_LE16(pos);
  1045. pos += 2;
  1046. left -= 2;
  1047. if (count == 0 || count > left / WPA_SELECTOR_LEN) {
  1048. wpa_printf(MSG_DEBUG, "%s: ie count botch (pairwise), "
  1049. "count %u left %u", __func__, count, left);
  1050. return -4;
  1051. }
  1052. for (i = 0; i < count; i++) {
  1053. data->pairwise_cipher |= wpa_selector_to_bitfield(pos);
  1054. pos += WPA_SELECTOR_LEN;
  1055. left -= WPA_SELECTOR_LEN;
  1056. }
  1057. } else if (left == 1) {
  1058. wpa_printf(MSG_DEBUG, "%s: ie too short (for key mgmt)",
  1059. __func__);
  1060. return -5;
  1061. }
  1062. if (left >= 2) {
  1063. data->key_mgmt = 0;
  1064. count = WPA_GET_LE16(pos);
  1065. pos += 2;
  1066. left -= 2;
  1067. if (count == 0 || count > left / WPA_SELECTOR_LEN) {
  1068. wpa_printf(MSG_DEBUG, "%s: ie count botch (key mgmt), "
  1069. "count %u left %u", __func__, count, left);
  1070. return -6;
  1071. }
  1072. for (i = 0; i < count; i++) {
  1073. data->key_mgmt |= wpa_key_mgmt_to_bitfield(pos);
  1074. pos += WPA_SELECTOR_LEN;
  1075. left -= WPA_SELECTOR_LEN;
  1076. }
  1077. } else if (left == 1) {
  1078. wpa_printf(MSG_DEBUG, "%s: ie too short (for capabilities)",
  1079. __func__);
  1080. return -7;
  1081. }
  1082. if (left >= 2) {
  1083. data->capabilities = WPA_GET_LE16(pos);
  1084. pos += 2;
  1085. left -= 2;
  1086. }
  1087. if (left > 0) {
  1088. wpa_hexdump(MSG_DEBUG,
  1089. "wpa_parse_wpa_ie_wpa: ignore trailing bytes",
  1090. pos, left);
  1091. }
  1092. return 0;
  1093. }
  1094. #ifdef CONFIG_IEEE80211R
  1095. /**
  1096. * wpa_derive_pmk_r0 - Derive PMK-R0 and PMKR0Name
  1097. *
  1098. * IEEE Std 802.11r-2008 - 8.5.1.5.3
  1099. */
  1100. int wpa_derive_pmk_r0(const u8 *xxkey, size_t xxkey_len,
  1101. const u8 *ssid, size_t ssid_len,
  1102. const u8 *mdid, const u8 *r0kh_id, size_t r0kh_id_len,
  1103. const u8 *s0kh_id, u8 *pmk_r0, u8 *pmk_r0_name)
  1104. {
  1105. u8 buf[1 + SSID_MAX_LEN + MOBILITY_DOMAIN_ID_LEN + 1 +
  1106. FT_R0KH_ID_MAX_LEN + ETH_ALEN];
  1107. u8 *pos, r0_key_data[48], hash[32];
  1108. const u8 *addr[2];
  1109. size_t len[2];
  1110. /*
  1111. * R0-Key-Data = KDF-384(XXKey, "FT-R0",
  1112. * SSIDlength || SSID || MDID || R0KHlength ||
  1113. * R0KH-ID || S0KH-ID)
  1114. * XXKey is either the second 256 bits of MSK or PSK.
  1115. * PMK-R0 = L(R0-Key-Data, 0, 256)
  1116. * PMK-R0Name-Salt = L(R0-Key-Data, 256, 128)
  1117. */
  1118. if (ssid_len > SSID_MAX_LEN || r0kh_id_len > FT_R0KH_ID_MAX_LEN)
  1119. return -1;
  1120. pos = buf;
  1121. *pos++ = ssid_len;
  1122. os_memcpy(pos, ssid, ssid_len);
  1123. pos += ssid_len;
  1124. os_memcpy(pos, mdid, MOBILITY_DOMAIN_ID_LEN);
  1125. pos += MOBILITY_DOMAIN_ID_LEN;
  1126. *pos++ = r0kh_id_len;
  1127. os_memcpy(pos, r0kh_id, r0kh_id_len);
  1128. pos += r0kh_id_len;
  1129. os_memcpy(pos, s0kh_id, ETH_ALEN);
  1130. pos += ETH_ALEN;
  1131. if (sha256_prf(xxkey, xxkey_len, "FT-R0", buf, pos - buf,
  1132. r0_key_data, sizeof(r0_key_data)) < 0)
  1133. return -1;
  1134. os_memcpy(pmk_r0, r0_key_data, PMK_LEN);
  1135. /*
  1136. * PMKR0Name = Truncate-128(SHA-256("FT-R0N" || PMK-R0Name-Salt)
  1137. */
  1138. addr[0] = (const u8 *) "FT-R0N";
  1139. len[0] = 6;
  1140. addr[1] = r0_key_data + PMK_LEN;
  1141. len[1] = 16;
  1142. if (sha256_vector(2, addr, len, hash) < 0)
  1143. return -1;
  1144. os_memcpy(pmk_r0_name, hash, WPA_PMK_NAME_LEN);
  1145. return 0;
  1146. }
  1147. /**
  1148. * wpa_derive_pmk_r1_name - Derive PMKR1Name
  1149. *
  1150. * IEEE Std 802.11r-2008 - 8.5.1.5.4
  1151. */
  1152. int wpa_derive_pmk_r1_name(const u8 *pmk_r0_name, const u8 *r1kh_id,
  1153. const u8 *s1kh_id, u8 *pmk_r1_name)
  1154. {
  1155. u8 hash[32];
  1156. const u8 *addr[4];
  1157. size_t len[4];
  1158. /*
  1159. * PMKR1Name = Truncate-128(SHA-256("FT-R1N" || PMKR0Name ||
  1160. * R1KH-ID || S1KH-ID))
  1161. */
  1162. addr[0] = (const u8 *) "FT-R1N";
  1163. len[0] = 6;
  1164. addr[1] = pmk_r0_name;
  1165. len[1] = WPA_PMK_NAME_LEN;
  1166. addr[2] = r1kh_id;
  1167. len[2] = FT_R1KH_ID_LEN;
  1168. addr[3] = s1kh_id;
  1169. len[3] = ETH_ALEN;
  1170. if (sha256_vector(4, addr, len, hash) < 0)
  1171. return -1;
  1172. os_memcpy(pmk_r1_name, hash, WPA_PMK_NAME_LEN);
  1173. return 0;
  1174. }
  1175. /**
  1176. * wpa_derive_pmk_r1 - Derive PMK-R1 and PMKR1Name from PMK-R0
  1177. *
  1178. * IEEE Std 802.11r-2008 - 8.5.1.5.4
  1179. */
  1180. int wpa_derive_pmk_r1(const u8 *pmk_r0, const u8 *pmk_r0_name,
  1181. const u8 *r1kh_id, const u8 *s1kh_id,
  1182. u8 *pmk_r1, u8 *pmk_r1_name)
  1183. {
  1184. u8 buf[FT_R1KH_ID_LEN + ETH_ALEN];
  1185. u8 *pos;
  1186. /* PMK-R1 = KDF-256(PMK-R0, "FT-R1", R1KH-ID || S1KH-ID) */
  1187. pos = buf;
  1188. os_memcpy(pos, r1kh_id, FT_R1KH_ID_LEN);
  1189. pos += FT_R1KH_ID_LEN;
  1190. os_memcpy(pos, s1kh_id, ETH_ALEN);
  1191. pos += ETH_ALEN;
  1192. if (sha256_prf(pmk_r0, PMK_LEN, "FT-R1", buf, pos - buf,
  1193. pmk_r1, PMK_LEN) < 0)
  1194. return -1;
  1195. return wpa_derive_pmk_r1_name(pmk_r0_name, r1kh_id, s1kh_id,
  1196. pmk_r1_name);
  1197. }
  1198. /**
  1199. * wpa_pmk_r1_to_ptk - Derive PTK and PTKName from PMK-R1
  1200. *
  1201. * IEEE Std 802.11r-2008 - 8.5.1.5.5
  1202. */
  1203. int wpa_pmk_r1_to_ptk(const u8 *pmk_r1, const u8 *snonce, const u8 *anonce,
  1204. const u8 *sta_addr, const u8 *bssid,
  1205. const u8 *pmk_r1_name,
  1206. struct wpa_ptk *ptk, u8 *ptk_name, int akmp, int cipher)
  1207. {
  1208. u8 buf[2 * WPA_NONCE_LEN + 2 * ETH_ALEN];
  1209. u8 *pos, hash[32];
  1210. const u8 *addr[6];
  1211. size_t len[6];
  1212. u8 tmp[WPA_KCK_MAX_LEN + WPA_KEK_MAX_LEN + WPA_TK_MAX_LEN];
  1213. size_t ptk_len;
  1214. /*
  1215. * PTK = KDF-PTKLen(PMK-R1, "FT-PTK", SNonce || ANonce ||
  1216. * BSSID || STA-ADDR)
  1217. */
  1218. pos = buf;
  1219. os_memcpy(pos, snonce, WPA_NONCE_LEN);
  1220. pos += WPA_NONCE_LEN;
  1221. os_memcpy(pos, anonce, WPA_NONCE_LEN);
  1222. pos += WPA_NONCE_LEN;
  1223. os_memcpy(pos, bssid, ETH_ALEN);
  1224. pos += ETH_ALEN;
  1225. os_memcpy(pos, sta_addr, ETH_ALEN);
  1226. pos += ETH_ALEN;
  1227. ptk->kck_len = wpa_kck_len(akmp, PMK_LEN);
  1228. ptk->kek_len = wpa_kek_len(akmp, PMK_LEN);
  1229. ptk->tk_len = wpa_cipher_key_len(cipher);
  1230. ptk_len = ptk->kck_len + ptk->kek_len + ptk->tk_len;
  1231. if (sha256_prf(pmk_r1, PMK_LEN, "FT-PTK", buf, pos - buf,
  1232. tmp, ptk_len) < 0)
  1233. return -1;
  1234. /*
  1235. * PTKName = Truncate-128(SHA-256(PMKR1Name || "FT-PTKN" || SNonce ||
  1236. * ANonce || BSSID || STA-ADDR))
  1237. */
  1238. addr[0] = pmk_r1_name;
  1239. len[0] = WPA_PMK_NAME_LEN;
  1240. addr[1] = (const u8 *) "FT-PTKN";
  1241. len[1] = 7;
  1242. addr[2] = snonce;
  1243. len[2] = WPA_NONCE_LEN;
  1244. addr[3] = anonce;
  1245. len[3] = WPA_NONCE_LEN;
  1246. addr[4] = bssid;
  1247. len[4] = ETH_ALEN;
  1248. addr[5] = sta_addr;
  1249. len[5] = ETH_ALEN;
  1250. if (sha256_vector(6, addr, len, hash) < 0)
  1251. return -1;
  1252. os_memcpy(ptk_name, hash, WPA_PMK_NAME_LEN);
  1253. os_memcpy(ptk->kck, tmp, ptk->kck_len);
  1254. os_memcpy(ptk->kek, tmp + ptk->kck_len, ptk->kek_len);
  1255. os_memcpy(ptk->tk, tmp + ptk->kck_len + ptk->kek_len, ptk->tk_len);
  1256. wpa_hexdump_key(MSG_DEBUG, "FT: KCK", ptk->kck, ptk->kck_len);
  1257. wpa_hexdump_key(MSG_DEBUG, "FT: KEK", ptk->kek, ptk->kek_len);
  1258. wpa_hexdump_key(MSG_DEBUG, "FT: TK", ptk->tk, ptk->tk_len);
  1259. wpa_hexdump(MSG_DEBUG, "FT: PTKName", ptk_name, WPA_PMK_NAME_LEN);
  1260. os_memset(tmp, 0, sizeof(tmp));
  1261. return 0;
  1262. }
  1263. #endif /* CONFIG_IEEE80211R */
  1264. /**
  1265. * rsn_pmkid - Calculate PMK identifier
  1266. * @pmk: Pairwise master key
  1267. * @pmk_len: Length of pmk in bytes
  1268. * @aa: Authenticator address
  1269. * @spa: Supplicant address
  1270. * @pmkid: Buffer for PMKID
  1271. * @use_sha256: Whether to use SHA256-based KDF
  1272. *
  1273. * IEEE Std 802.11i-2004 - 8.5.1.2 Pairwise key hierarchy
  1274. * PMKID = HMAC-SHA1-128(PMK, "PMK Name" || AA || SPA)
  1275. */
  1276. void rsn_pmkid(const u8 *pmk, size_t pmk_len, const u8 *aa, const u8 *spa,
  1277. u8 *pmkid, int use_sha256)
  1278. {
  1279. char *title = "PMK Name";
  1280. const u8 *addr[3];
  1281. const size_t len[3] = { 8, ETH_ALEN, ETH_ALEN };
  1282. unsigned char hash[SHA256_MAC_LEN];
  1283. addr[0] = (u8 *) title;
  1284. addr[1] = aa;
  1285. addr[2] = spa;
  1286. #ifdef CONFIG_IEEE80211W
  1287. if (use_sha256)
  1288. hmac_sha256_vector(pmk, pmk_len, 3, addr, len, hash);
  1289. else
  1290. #endif /* CONFIG_IEEE80211W */
  1291. hmac_sha1_vector(pmk, pmk_len, 3, addr, len, hash);
  1292. os_memcpy(pmkid, hash, PMKID_LEN);
  1293. }
  1294. #ifdef CONFIG_SUITEB
  1295. /**
  1296. * rsn_pmkid_suite_b - Calculate PMK identifier for Suite B AKM
  1297. * @kck: Key confirmation key
  1298. * @kck_len: Length of kck in bytes
  1299. * @aa: Authenticator address
  1300. * @spa: Supplicant address
  1301. * @pmkid: Buffer for PMKID
  1302. * Returns: 0 on success, -1 on failure
  1303. *
  1304. * IEEE Std 802.11ac-2013 - 11.6.1.3 Pairwise key hierarchy
  1305. * PMKID = Truncate(HMAC-SHA-256(KCK, "PMK Name" || AA || SPA))
  1306. */
  1307. int rsn_pmkid_suite_b(const u8 *kck, size_t kck_len, const u8 *aa,
  1308. const u8 *spa, u8 *pmkid)
  1309. {
  1310. char *title = "PMK Name";
  1311. const u8 *addr[3];
  1312. const size_t len[3] = { 8, ETH_ALEN, ETH_ALEN };
  1313. unsigned char hash[SHA256_MAC_LEN];
  1314. addr[0] = (u8 *) title;
  1315. addr[1] = aa;
  1316. addr[2] = spa;
  1317. if (hmac_sha256_vector(kck, kck_len, 3, addr, len, hash) < 0)
  1318. return -1;
  1319. os_memcpy(pmkid, hash, PMKID_LEN);
  1320. return 0;
  1321. }
  1322. #endif /* CONFIG_SUITEB */
  1323. #ifdef CONFIG_SUITEB192
  1324. /**
  1325. * rsn_pmkid_suite_b_192 - Calculate PMK identifier for Suite B AKM
  1326. * @kck: Key confirmation key
  1327. * @kck_len: Length of kck in bytes
  1328. * @aa: Authenticator address
  1329. * @spa: Supplicant address
  1330. * @pmkid: Buffer for PMKID
  1331. * Returns: 0 on success, -1 on failure
  1332. *
  1333. * IEEE Std 802.11ac-2013 - 11.6.1.3 Pairwise key hierarchy
  1334. * PMKID = Truncate(HMAC-SHA-384(KCK, "PMK Name" || AA || SPA))
  1335. */
  1336. int rsn_pmkid_suite_b_192(const u8 *kck, size_t kck_len, const u8 *aa,
  1337. const u8 *spa, u8 *pmkid)
  1338. {
  1339. char *title = "PMK Name";
  1340. const u8 *addr[3];
  1341. const size_t len[3] = { 8, ETH_ALEN, ETH_ALEN };
  1342. unsigned char hash[SHA384_MAC_LEN];
  1343. addr[0] = (u8 *) title;
  1344. addr[1] = aa;
  1345. addr[2] = spa;
  1346. if (hmac_sha384_vector(kck, kck_len, 3, addr, len, hash) < 0)
  1347. return -1;
  1348. os_memcpy(pmkid, hash, PMKID_LEN);
  1349. return 0;
  1350. }
  1351. #endif /* CONFIG_SUITEB192 */
  1352. /**
  1353. * wpa_cipher_txt - Convert cipher suite to a text string
  1354. * @cipher: Cipher suite (WPA_CIPHER_* enum)
  1355. * Returns: Pointer to a text string of the cipher suite name
  1356. */
  1357. const char * wpa_cipher_txt(int cipher)
  1358. {
  1359. switch (cipher) {
  1360. case WPA_CIPHER_NONE:
  1361. return "NONE";
  1362. case WPA_CIPHER_WEP40:
  1363. return "WEP-40";
  1364. case WPA_CIPHER_WEP104:
  1365. return "WEP-104";
  1366. case WPA_CIPHER_TKIP:
  1367. return "TKIP";
  1368. case WPA_CIPHER_CCMP:
  1369. return "CCMP";
  1370. case WPA_CIPHER_CCMP | WPA_CIPHER_TKIP:
  1371. return "CCMP+TKIP";
  1372. case WPA_CIPHER_GCMP:
  1373. return "GCMP";
  1374. case WPA_CIPHER_GCMP_256:
  1375. return "GCMP-256";
  1376. case WPA_CIPHER_CCMP_256:
  1377. return "CCMP-256";
  1378. case WPA_CIPHER_AES_128_CMAC:
  1379. return "BIP";
  1380. case WPA_CIPHER_BIP_GMAC_128:
  1381. return "BIP-GMAC-128";
  1382. case WPA_CIPHER_BIP_GMAC_256:
  1383. return "BIP-GMAC-256";
  1384. case WPA_CIPHER_BIP_CMAC_256:
  1385. return "BIP-CMAC-256";
  1386. case WPA_CIPHER_GTK_NOT_USED:
  1387. return "GTK_NOT_USED";
  1388. default:
  1389. return "UNKNOWN";
  1390. }
  1391. }
  1392. /**
  1393. * wpa_key_mgmt_txt - Convert key management suite to a text string
  1394. * @key_mgmt: Key management suite (WPA_KEY_MGMT_* enum)
  1395. * @proto: WPA/WPA2 version (WPA_PROTO_*)
  1396. * Returns: Pointer to a text string of the key management suite name
  1397. */
  1398. const char * wpa_key_mgmt_txt(int key_mgmt, int proto)
  1399. {
  1400. switch (key_mgmt) {
  1401. case WPA_KEY_MGMT_IEEE8021X:
  1402. if (proto == (WPA_PROTO_RSN | WPA_PROTO_WPA))
  1403. return "WPA2+WPA/IEEE 802.1X/EAP";
  1404. return proto == WPA_PROTO_RSN ?
  1405. "WPA2/IEEE 802.1X/EAP" : "WPA/IEEE 802.1X/EAP";
  1406. case WPA_KEY_MGMT_PSK:
  1407. if (proto == (WPA_PROTO_RSN | WPA_PROTO_WPA))
  1408. return "WPA2-PSK+WPA-PSK";
  1409. return proto == WPA_PROTO_RSN ?
  1410. "WPA2-PSK" : "WPA-PSK";
  1411. case WPA_KEY_MGMT_NONE:
  1412. return "NONE";
  1413. case WPA_KEY_MGMT_WPA_NONE:
  1414. return "WPA-NONE";
  1415. case WPA_KEY_MGMT_IEEE8021X_NO_WPA:
  1416. return "IEEE 802.1X (no WPA)";
  1417. #ifdef CONFIG_IEEE80211R
  1418. case WPA_KEY_MGMT_FT_IEEE8021X:
  1419. return "FT-EAP";
  1420. case WPA_KEY_MGMT_FT_PSK:
  1421. return "FT-PSK";
  1422. #endif /* CONFIG_IEEE80211R */
  1423. #ifdef CONFIG_IEEE80211W
  1424. case WPA_KEY_MGMT_IEEE8021X_SHA256:
  1425. return "WPA2-EAP-SHA256";
  1426. case WPA_KEY_MGMT_PSK_SHA256:
  1427. return "WPA2-PSK-SHA256";
  1428. #endif /* CONFIG_IEEE80211W */
  1429. case WPA_KEY_MGMT_WPS:
  1430. return "WPS";
  1431. case WPA_KEY_MGMT_SAE:
  1432. return "SAE";
  1433. case WPA_KEY_MGMT_FT_SAE:
  1434. return "FT-SAE";
  1435. case WPA_KEY_MGMT_OSEN:
  1436. return "OSEN";
  1437. case WPA_KEY_MGMT_IEEE8021X_SUITE_B:
  1438. return "WPA2-EAP-SUITE-B";
  1439. case WPA_KEY_MGMT_IEEE8021X_SUITE_B_192:
  1440. return "WPA2-EAP-SUITE-B-192";
  1441. case WPA_KEY_MGMT_FILS_SHA256:
  1442. return "FILS-SHA256";
  1443. case WPA_KEY_MGMT_FILS_SHA384:
  1444. return "FILS-SHA384";
  1445. case WPA_KEY_MGMT_FT_FILS_SHA256:
  1446. return "FT-FILS-SHA256";
  1447. case WPA_KEY_MGMT_FT_FILS_SHA384:
  1448. return "FT-FILS-SHA384";
  1449. case WPA_KEY_MGMT_OWE:
  1450. return "OWE";
  1451. case WPA_KEY_MGMT_DPP:
  1452. return "DPP";
  1453. default:
  1454. return "UNKNOWN";
  1455. }
  1456. }
  1457. u32 wpa_akm_to_suite(int akm)
  1458. {
  1459. if (akm & WPA_KEY_MGMT_FT_IEEE8021X)
  1460. return RSN_AUTH_KEY_MGMT_FT_802_1X;
  1461. if (akm & WPA_KEY_MGMT_FT_PSK)
  1462. return RSN_AUTH_KEY_MGMT_FT_PSK;
  1463. if (akm & WPA_KEY_MGMT_IEEE8021X_SHA256)
  1464. return RSN_AUTH_KEY_MGMT_802_1X_SHA256;
  1465. if (akm & WPA_KEY_MGMT_IEEE8021X)
  1466. return RSN_AUTH_KEY_MGMT_UNSPEC_802_1X;
  1467. if (akm & WPA_KEY_MGMT_PSK_SHA256)
  1468. return RSN_AUTH_KEY_MGMT_PSK_SHA256;
  1469. if (akm & WPA_KEY_MGMT_PSK)
  1470. return RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X;
  1471. if (akm & WPA_KEY_MGMT_CCKM)
  1472. return RSN_AUTH_KEY_MGMT_CCKM;
  1473. if (akm & WPA_KEY_MGMT_OSEN)
  1474. return RSN_AUTH_KEY_MGMT_OSEN;
  1475. if (akm & WPA_KEY_MGMT_IEEE8021X_SUITE_B)
  1476. return RSN_AUTH_KEY_MGMT_802_1X_SUITE_B;
  1477. if (akm & WPA_KEY_MGMT_IEEE8021X_SUITE_B_192)
  1478. return RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192;
  1479. if (akm & WPA_KEY_MGMT_FILS_SHA256)
  1480. return RSN_AUTH_KEY_MGMT_FILS_SHA256;
  1481. if (akm & WPA_KEY_MGMT_FILS_SHA384)
  1482. return RSN_AUTH_KEY_MGMT_FILS_SHA384;
  1483. if (akm & WPA_KEY_MGMT_FT_FILS_SHA256)
  1484. return RSN_AUTH_KEY_MGMT_FT_FILS_SHA256;
  1485. if (akm & WPA_KEY_MGMT_FT_FILS_SHA384)
  1486. return RSN_AUTH_KEY_MGMT_FT_FILS_SHA384;
  1487. return 0;
  1488. }
  1489. int wpa_compare_rsn_ie(int ft_initial_assoc,
  1490. const u8 *ie1, size_t ie1len,
  1491. const u8 *ie2, size_t ie2len)
  1492. {
  1493. if (ie1 == NULL || ie2 == NULL)
  1494. return -1;
  1495. if (ie1len == ie2len && os_memcmp(ie1, ie2, ie1len) == 0)
  1496. return 0; /* identical IEs */
  1497. #ifdef CONFIG_IEEE80211R
  1498. if (ft_initial_assoc) {
  1499. struct wpa_ie_data ie1d, ie2d;
  1500. /*
  1501. * The PMKID-List in RSN IE is different between Beacon/Probe
  1502. * Response/(Re)Association Request frames and EAPOL-Key
  1503. * messages in FT initial mobility domain association. Allow
  1504. * for this, but verify that other parts of the RSN IEs are
  1505. * identical.
  1506. */
  1507. if (wpa_parse_wpa_ie_rsn(ie1, ie1len, &ie1d) < 0 ||
  1508. wpa_parse_wpa_ie_rsn(ie2, ie2len, &ie2d) < 0)
  1509. return -1;
  1510. if (ie1d.proto == ie2d.proto &&
  1511. ie1d.pairwise_cipher == ie2d.pairwise_cipher &&
  1512. ie1d.group_cipher == ie2d.group_cipher &&
  1513. ie1d.key_mgmt == ie2d.key_mgmt &&
  1514. ie1d.capabilities == ie2d.capabilities &&
  1515. ie1d.mgmt_group_cipher == ie2d.mgmt_group_cipher)
  1516. return 0;
  1517. }
  1518. #endif /* CONFIG_IEEE80211R */
  1519. return -1;
  1520. }
  1521. #if defined(CONFIG_IEEE80211R) || defined(CONFIG_FILS)
  1522. int wpa_insert_pmkid(u8 *ies, size_t *ies_len, const u8 *pmkid)
  1523. {
  1524. u8 *start, *end, *rpos, *rend;
  1525. int added = 0;
  1526. start = ies;
  1527. end = ies + *ies_len;
  1528. while (start < end) {
  1529. if (*start == WLAN_EID_RSN)
  1530. break;
  1531. start += 2 + start[1];
  1532. }
  1533. if (start >= end) {
  1534. wpa_printf(MSG_ERROR, "FT: Could not find RSN IE in "
  1535. "IEs data");
  1536. return -1;
  1537. }
  1538. wpa_hexdump(MSG_DEBUG, "FT: RSN IE before modification",
  1539. start, 2 + start[1]);
  1540. /* Find start of PMKID-Count */
  1541. rpos = start + 2;
  1542. rend = rpos + start[1];
  1543. /* Skip Version and Group Data Cipher Suite */
  1544. rpos += 2 + 4;
  1545. /* Skip Pairwise Cipher Suite Count and List */
  1546. rpos += 2 + WPA_GET_LE16(rpos) * RSN_SELECTOR_LEN;
  1547. /* Skip AKM Suite Count and List */
  1548. rpos += 2 + WPA_GET_LE16(rpos) * RSN_SELECTOR_LEN;
  1549. if (rpos == rend) {
  1550. /* Add RSN Capabilities */
  1551. os_memmove(rpos + 2, rpos, end - rpos);
  1552. *rpos++ = 0;
  1553. *rpos++ = 0;
  1554. added += 2;
  1555. start[1] += 2;
  1556. rend = rpos;
  1557. } else {
  1558. /* Skip RSN Capabilities */
  1559. rpos += 2;
  1560. if (rpos > rend) {
  1561. wpa_printf(MSG_ERROR, "FT: Could not parse RSN IE in "
  1562. "IEs data");
  1563. return -1;
  1564. }
  1565. }
  1566. if (rpos == rend) {
  1567. /* No PMKID-Count field included; add it */
  1568. os_memmove(rpos + 2 + PMKID_LEN, rpos, end + added - rpos);
  1569. WPA_PUT_LE16(rpos, 1);
  1570. rpos += 2;
  1571. os_memcpy(rpos, pmkid, PMKID_LEN);
  1572. added += 2 + PMKID_LEN;
  1573. start[1] += 2 + PMKID_LEN;
  1574. } else {
  1575. u16 num_pmkid;
  1576. if (rend - rpos < 2)
  1577. return -1;
  1578. num_pmkid = WPA_GET_LE16(rpos);
  1579. /* PMKID-Count was included; use it */
  1580. if (num_pmkid != 0) {
  1581. u8 *after;
  1582. if (num_pmkid * PMKID_LEN > rend - rpos - 2)
  1583. return -1;
  1584. /*
  1585. * PMKID may have been included in RSN IE in
  1586. * (Re)Association Request frame, so remove the old
  1587. * PMKID(s) first before adding the new one.
  1588. */
  1589. wpa_printf(MSG_DEBUG,
  1590. "FT: Remove %u old PMKID(s) from RSN IE",
  1591. num_pmkid);
  1592. after = rpos + 2 + num_pmkid * PMKID_LEN;
  1593. os_memmove(rpos + 2, after, rend - after);
  1594. start[1] -= num_pmkid * PMKID_LEN;
  1595. added -= num_pmkid * PMKID_LEN;
  1596. }
  1597. WPA_PUT_LE16(rpos, 1);
  1598. rpos += 2;
  1599. os_memmove(rpos + PMKID_LEN, rpos, end + added - rpos);
  1600. os_memcpy(rpos, pmkid, PMKID_LEN);
  1601. added += PMKID_LEN;
  1602. start[1] += PMKID_LEN;
  1603. }
  1604. wpa_hexdump(MSG_DEBUG, "FT: RSN IE after modification "
  1605. "(PMKID inserted)", start, 2 + start[1]);
  1606. *ies_len += added;
  1607. return 0;
  1608. }
  1609. #endif /* CONFIG_IEEE80211R || CONFIG_FILS */
  1610. int wpa_cipher_key_len(int cipher)
  1611. {
  1612. switch (cipher) {
  1613. case WPA_CIPHER_CCMP_256:
  1614. case WPA_CIPHER_GCMP_256:
  1615. case WPA_CIPHER_BIP_GMAC_256:
  1616. case WPA_CIPHER_BIP_CMAC_256:
  1617. return 32;
  1618. case WPA_CIPHER_CCMP:
  1619. case WPA_CIPHER_GCMP:
  1620. case WPA_CIPHER_AES_128_CMAC:
  1621. case WPA_CIPHER_BIP_GMAC_128:
  1622. return 16;
  1623. case WPA_CIPHER_TKIP:
  1624. return 32;
  1625. }
  1626. return 0;
  1627. }
  1628. int wpa_cipher_rsc_len(int cipher)
  1629. {
  1630. switch (cipher) {
  1631. case WPA_CIPHER_CCMP_256:
  1632. case WPA_CIPHER_GCMP_256:
  1633. case WPA_CIPHER_CCMP:
  1634. case WPA_CIPHER_GCMP:
  1635. case WPA_CIPHER_TKIP:
  1636. return 6;
  1637. }
  1638. return 0;
  1639. }
  1640. enum wpa_alg wpa_cipher_to_alg(int cipher)
  1641. {
  1642. switch (cipher) {
  1643. case WPA_CIPHER_CCMP_256:
  1644. return WPA_ALG_CCMP_256;
  1645. case WPA_CIPHER_GCMP_256:
  1646. return WPA_ALG_GCMP_256;
  1647. case WPA_CIPHER_CCMP:
  1648. return WPA_ALG_CCMP;
  1649. case WPA_CIPHER_GCMP:
  1650. return WPA_ALG_GCMP;
  1651. case WPA_CIPHER_TKIP:
  1652. return WPA_ALG_TKIP;
  1653. case WPA_CIPHER_AES_128_CMAC:
  1654. return WPA_ALG_IGTK;
  1655. case WPA_CIPHER_BIP_GMAC_128:
  1656. return WPA_ALG_BIP_GMAC_128;
  1657. case WPA_CIPHER_BIP_GMAC_256:
  1658. return WPA_ALG_BIP_GMAC_256;
  1659. case WPA_CIPHER_BIP_CMAC_256:
  1660. return WPA_ALG_BIP_CMAC_256;
  1661. }
  1662. return WPA_ALG_NONE;
  1663. }
  1664. int wpa_cipher_valid_pairwise(int cipher)
  1665. {
  1666. return cipher == WPA_CIPHER_CCMP_256 ||
  1667. cipher == WPA_CIPHER_GCMP_256 ||
  1668. cipher == WPA_CIPHER_CCMP ||
  1669. cipher == WPA_CIPHER_GCMP ||
  1670. cipher == WPA_CIPHER_TKIP;
  1671. }
  1672. u32 wpa_cipher_to_suite(int proto, int cipher)
  1673. {
  1674. if (cipher & WPA_CIPHER_CCMP_256)
  1675. return RSN_CIPHER_SUITE_CCMP_256;
  1676. if (cipher & WPA_CIPHER_GCMP_256)
  1677. return RSN_CIPHER_SUITE_GCMP_256;
  1678. if (cipher & WPA_CIPHER_CCMP)
  1679. return (proto == WPA_PROTO_RSN ?
  1680. RSN_CIPHER_SUITE_CCMP : WPA_CIPHER_SUITE_CCMP);
  1681. if (cipher & WPA_CIPHER_GCMP)
  1682. return RSN_CIPHER_SUITE_GCMP;
  1683. if (cipher & WPA_CIPHER_TKIP)
  1684. return (proto == WPA_PROTO_RSN ?
  1685. RSN_CIPHER_SUITE_TKIP : WPA_CIPHER_SUITE_TKIP);
  1686. if (cipher & WPA_CIPHER_NONE)
  1687. return (proto == WPA_PROTO_RSN ?
  1688. RSN_CIPHER_SUITE_NONE : WPA_CIPHER_SUITE_NONE);
  1689. if (cipher & WPA_CIPHER_GTK_NOT_USED)
  1690. return RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED;
  1691. if (cipher & WPA_CIPHER_AES_128_CMAC)
  1692. return RSN_CIPHER_SUITE_AES_128_CMAC;
  1693. if (cipher & WPA_CIPHER_BIP_GMAC_128)
  1694. return RSN_CIPHER_SUITE_BIP_GMAC_128;
  1695. if (cipher & WPA_CIPHER_BIP_GMAC_256)
  1696. return RSN_CIPHER_SUITE_BIP_GMAC_256;
  1697. if (cipher & WPA_CIPHER_BIP_CMAC_256)
  1698. return RSN_CIPHER_SUITE_BIP_CMAC_256;
  1699. return 0;
  1700. }
  1701. int rsn_cipher_put_suites(u8 *start, int ciphers)
  1702. {
  1703. u8 *pos = start;
  1704. if (ciphers & WPA_CIPHER_CCMP_256) {
  1705. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP_256);
  1706. pos += RSN_SELECTOR_LEN;
  1707. }
  1708. if (ciphers & WPA_CIPHER_GCMP_256) {
  1709. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_GCMP_256);
  1710. pos += RSN_SELECTOR_LEN;
  1711. }
  1712. if (ciphers & WPA_CIPHER_CCMP) {
  1713. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP);
  1714. pos += RSN_SELECTOR_LEN;
  1715. }
  1716. if (ciphers & WPA_CIPHER_GCMP) {
  1717. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_GCMP);
  1718. pos += RSN_SELECTOR_LEN;
  1719. }
  1720. if (ciphers & WPA_CIPHER_TKIP) {
  1721. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_TKIP);
  1722. pos += RSN_SELECTOR_LEN;
  1723. }
  1724. if (ciphers & WPA_CIPHER_NONE) {
  1725. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_NONE);
  1726. pos += RSN_SELECTOR_LEN;
  1727. }
  1728. return (pos - start) / RSN_SELECTOR_LEN;
  1729. }
  1730. int wpa_cipher_put_suites(u8 *start, int ciphers)
  1731. {
  1732. u8 *pos = start;
  1733. if (ciphers & WPA_CIPHER_CCMP) {
  1734. RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_CCMP);
  1735. pos += WPA_SELECTOR_LEN;
  1736. }
  1737. if (ciphers & WPA_CIPHER_TKIP) {
  1738. RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_TKIP);
  1739. pos += WPA_SELECTOR_LEN;
  1740. }
  1741. if (ciphers & WPA_CIPHER_NONE) {
  1742. RSN_SELECTOR_PUT(pos, WPA_CIPHER_SUITE_NONE);
  1743. pos += WPA_SELECTOR_LEN;
  1744. }
  1745. return (pos - start) / RSN_SELECTOR_LEN;
  1746. }
  1747. int wpa_pick_pairwise_cipher(int ciphers, int none_allowed)
  1748. {
  1749. if (ciphers & WPA_CIPHER_CCMP_256)
  1750. return WPA_CIPHER_CCMP_256;
  1751. if (ciphers & WPA_CIPHER_GCMP_256)
  1752. return WPA_CIPHER_GCMP_256;
  1753. if (ciphers & WPA_CIPHER_CCMP)
  1754. return WPA_CIPHER_CCMP;
  1755. if (ciphers & WPA_CIPHER_GCMP)
  1756. return WPA_CIPHER_GCMP;
  1757. if (ciphers & WPA_CIPHER_TKIP)
  1758. return WPA_CIPHER_TKIP;
  1759. if (none_allowed && (ciphers & WPA_CIPHER_NONE))
  1760. return WPA_CIPHER_NONE;
  1761. return -1;
  1762. }
  1763. int wpa_pick_group_cipher(int ciphers)
  1764. {
  1765. if (ciphers & WPA_CIPHER_CCMP_256)
  1766. return WPA_CIPHER_CCMP_256;
  1767. if (ciphers & WPA_CIPHER_GCMP_256)
  1768. return WPA_CIPHER_GCMP_256;
  1769. if (ciphers & WPA_CIPHER_CCMP)
  1770. return WPA_CIPHER_CCMP;
  1771. if (ciphers & WPA_CIPHER_GCMP)
  1772. return WPA_CIPHER_GCMP;
  1773. if (ciphers & WPA_CIPHER_GTK_NOT_USED)
  1774. return WPA_CIPHER_GTK_NOT_USED;
  1775. if (ciphers & WPA_CIPHER_TKIP)
  1776. return WPA_CIPHER_TKIP;
  1777. return -1;
  1778. }
  1779. int wpa_parse_cipher(const char *value)
  1780. {
  1781. int val = 0, last;
  1782. char *start, *end, *buf;
  1783. buf = os_strdup(value);
  1784. if (buf == NULL)
  1785. return -1;
  1786. start = buf;
  1787. while (*start != '\0') {
  1788. while (*start == ' ' || *start == '\t')
  1789. start++;
  1790. if (*start == '\0')
  1791. break;
  1792. end = start;
  1793. while (*end != ' ' && *end != '\t' && *end != '\0')
  1794. end++;
  1795. last = *end == '\0';
  1796. *end = '\0';
  1797. if (os_strcmp(start, "CCMP-256") == 0)
  1798. val |= WPA_CIPHER_CCMP_256;
  1799. else if (os_strcmp(start, "GCMP-256") == 0)
  1800. val |= WPA_CIPHER_GCMP_256;
  1801. else if (os_strcmp(start, "CCMP") == 0)
  1802. val |= WPA_CIPHER_CCMP;
  1803. else if (os_strcmp(start, "GCMP") == 0)
  1804. val |= WPA_CIPHER_GCMP;
  1805. else if (os_strcmp(start, "TKIP") == 0)
  1806. val |= WPA_CIPHER_TKIP;
  1807. else if (os_strcmp(start, "WEP104") == 0)
  1808. val |= WPA_CIPHER_WEP104;
  1809. else if (os_strcmp(start, "WEP40") == 0)
  1810. val |= WPA_CIPHER_WEP40;
  1811. else if (os_strcmp(start, "NONE") == 0)
  1812. val |= WPA_CIPHER_NONE;
  1813. else if (os_strcmp(start, "GTK_NOT_USED") == 0)
  1814. val |= WPA_CIPHER_GTK_NOT_USED;
  1815. else {
  1816. os_free(buf);
  1817. return -1;
  1818. }
  1819. if (last)
  1820. break;
  1821. start = end + 1;
  1822. }
  1823. os_free(buf);
  1824. return val;
  1825. }
  1826. int wpa_write_ciphers(char *start, char *end, int ciphers, const char *delim)
  1827. {
  1828. char *pos = start;
  1829. int ret;
  1830. if (ciphers & WPA_CIPHER_CCMP_256) {
  1831. ret = os_snprintf(pos, end - pos, "%sCCMP-256",
  1832. pos == start ? "" : delim);
  1833. if (os_snprintf_error(end - pos, ret))
  1834. return -1;
  1835. pos += ret;
  1836. }
  1837. if (ciphers & WPA_CIPHER_GCMP_256) {
  1838. ret = os_snprintf(pos, end - pos, "%sGCMP-256",
  1839. pos == start ? "" : delim);
  1840. if (os_snprintf_error(end - pos, ret))
  1841. return -1;
  1842. pos += ret;
  1843. }
  1844. if (ciphers & WPA_CIPHER_CCMP) {
  1845. ret = os_snprintf(pos, end - pos, "%sCCMP",
  1846. pos == start ? "" : delim);
  1847. if (os_snprintf_error(end - pos, ret))
  1848. return -1;
  1849. pos += ret;
  1850. }
  1851. if (ciphers & WPA_CIPHER_GCMP) {
  1852. ret = os_snprintf(pos, end - pos, "%sGCMP",
  1853. pos == start ? "" : delim);
  1854. if (os_snprintf_error(end - pos, ret))
  1855. return -1;
  1856. pos += ret;
  1857. }
  1858. if (ciphers & WPA_CIPHER_TKIP) {
  1859. ret = os_snprintf(pos, end - pos, "%sTKIP",
  1860. pos == start ? "" : delim);
  1861. if (os_snprintf_error(end - pos, ret))
  1862. return -1;
  1863. pos += ret;
  1864. }
  1865. if (ciphers & WPA_CIPHER_NONE) {
  1866. ret = os_snprintf(pos, end - pos, "%sNONE",
  1867. pos == start ? "" : delim);
  1868. if (os_snprintf_error(end - pos, ret))
  1869. return -1;
  1870. pos += ret;
  1871. }
  1872. return pos - start;
  1873. }
  1874. int wpa_select_ap_group_cipher(int wpa, int wpa_pairwise, int rsn_pairwise)
  1875. {
  1876. int pairwise = 0;
  1877. /* Select group cipher based on the enabled pairwise cipher suites */
  1878. if (wpa & 1)
  1879. pairwise |= wpa_pairwise;
  1880. if (wpa & 2)
  1881. pairwise |= rsn_pairwise;
  1882. if (pairwise & WPA_CIPHER_TKIP)
  1883. return WPA_CIPHER_TKIP;
  1884. if ((pairwise & (WPA_CIPHER_CCMP | WPA_CIPHER_GCMP)) == WPA_CIPHER_GCMP)
  1885. return WPA_CIPHER_GCMP;
  1886. if ((pairwise & (WPA_CIPHER_GCMP_256 | WPA_CIPHER_CCMP |
  1887. WPA_CIPHER_GCMP)) == WPA_CIPHER_GCMP_256)
  1888. return WPA_CIPHER_GCMP_256;
  1889. if ((pairwise & (WPA_CIPHER_CCMP_256 | WPA_CIPHER_CCMP |
  1890. WPA_CIPHER_GCMP)) == WPA_CIPHER_CCMP_256)
  1891. return WPA_CIPHER_CCMP_256;
  1892. return WPA_CIPHER_CCMP;
  1893. }
  1894. #ifdef CONFIG_FILS
  1895. int fils_domain_name_hash(const char *domain, u8 *hash)
  1896. {
  1897. char buf[255], *wpos = buf;
  1898. const char *pos = domain;
  1899. size_t len;
  1900. const u8 *addr[1];
  1901. u8 mac[SHA256_MAC_LEN];
  1902. for (len = 0; len < sizeof(buf) && *pos; len++) {
  1903. if (isalpha(*pos) && isupper(*pos))
  1904. *wpos++ = tolower(*pos);
  1905. else
  1906. *wpos++ = *pos;
  1907. pos++;
  1908. }
  1909. addr[0] = (const u8 *) buf;
  1910. if (sha256_vector(1, addr, &len, mac) < 0)
  1911. return -1;
  1912. os_memcpy(hash, mac, 2);
  1913. return 0;
  1914. }
  1915. #endif /* CONFIG_FILS */