peerkey.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182
  1. /*
  2. * WPA Supplicant - PeerKey for Direct Link Setup (DLS)
  3. * Copyright (c) 2006-2008, Jouni Malinen <j@w1.fi>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. *
  9. * Alternatively, this software may be distributed under the terms of BSD
  10. * license.
  11. *
  12. * See README and COPYING for more details.
  13. */
  14. #include "includes.h"
  15. #ifdef CONFIG_PEERKEY
  16. #include "common.h"
  17. #include "sha1.h"
  18. #include "sha256.h"
  19. #include "eloop.h"
  20. #include "wpa.h"
  21. #include "wpa_i.h"
  22. #include "wpa_ie.h"
  23. #include "ieee802_11_defs.h"
  24. #include "peerkey.h"
  25. static u8 * wpa_add_ie(u8 *pos, const u8 *ie, size_t ie_len)
  26. {
  27. os_memcpy(pos, ie, ie_len);
  28. return pos + ie_len;
  29. }
  30. static u8 * wpa_add_kde(u8 *pos, u32 kde, const u8 *data, size_t data_len)
  31. {
  32. *pos++ = WLAN_EID_VENDOR_SPECIFIC;
  33. *pos++ = RSN_SELECTOR_LEN + data_len;
  34. RSN_SELECTOR_PUT(pos, kde);
  35. pos += RSN_SELECTOR_LEN;
  36. os_memcpy(pos, data, data_len);
  37. pos += data_len;
  38. return pos;
  39. }
  40. static void wpa_supplicant_smk_timeout(void *eloop_ctx, void *timeout_ctx)
  41. {
  42. #if 0
  43. struct wpa_sm *sm = eloop_ctx;
  44. struct wpa_peerkey *peerkey = timeout_ctx;
  45. #endif
  46. /* TODO: time out SMK and any STK that was generated using this SMK */
  47. }
  48. static void wpa_supplicant_peerkey_free(struct wpa_sm *sm,
  49. struct wpa_peerkey *peerkey)
  50. {
  51. eloop_cancel_timeout(wpa_supplicant_smk_timeout, sm, peerkey);
  52. os_free(peerkey);
  53. }
  54. static int wpa_supplicant_send_smk_error(struct wpa_sm *sm, const u8 *dst,
  55. const u8 *peer,
  56. u16 mui, u16 error_type, int ver)
  57. {
  58. size_t rlen;
  59. struct wpa_eapol_key *err;
  60. struct rsn_error_kde error;
  61. u8 *rbuf, *pos;
  62. size_t kde_len;
  63. u16 key_info;
  64. kde_len = 2 + RSN_SELECTOR_LEN + sizeof(error);
  65. if (peer)
  66. kde_len += 2 + RSN_SELECTOR_LEN + ETH_ALEN;
  67. rbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY,
  68. NULL, sizeof(*err) + kde_len, &rlen,
  69. (void *) &err);
  70. if (rbuf == NULL)
  71. return -1;
  72. err->type = EAPOL_KEY_TYPE_RSN;
  73. key_info = ver | WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_MIC |
  74. WPA_KEY_INFO_SECURE | WPA_KEY_INFO_ERROR |
  75. WPA_KEY_INFO_REQUEST;
  76. WPA_PUT_BE16(err->key_info, key_info);
  77. WPA_PUT_BE16(err->key_length, 0);
  78. os_memcpy(err->replay_counter, sm->request_counter,
  79. WPA_REPLAY_COUNTER_LEN);
  80. inc_byte_array(sm->request_counter, WPA_REPLAY_COUNTER_LEN);
  81. WPA_PUT_BE16(err->key_data_length, (u16) kde_len);
  82. pos = (u8 *) (err + 1);
  83. if (peer) {
  84. /* Peer MAC Address KDE */
  85. pos = wpa_add_kde(pos, RSN_KEY_DATA_MAC_ADDR, peer, ETH_ALEN);
  86. }
  87. /* Error KDE */
  88. error.mui = host_to_be16(mui);
  89. error.error_type = host_to_be16(error_type);
  90. wpa_add_kde(pos, RSN_KEY_DATA_ERROR, (u8 *) &error, sizeof(error));
  91. if (peer) {
  92. wpa_printf(MSG_DEBUG, "RSN: Sending EAPOL-Key SMK Error (peer "
  93. MACSTR " mui %d error_type %d)",
  94. MAC2STR(peer), mui, error_type);
  95. } else {
  96. wpa_printf(MSG_DEBUG, "RSN: Sending EAPOL-Key SMK Error "
  97. "(mui %d error_type %d)", mui, error_type);
  98. }
  99. wpa_eapol_key_send(sm, sm->ptk.kck, ver, dst, ETH_P_EAPOL,
  100. rbuf, rlen, err->key_mic);
  101. return 0;
  102. }
  103. static int wpa_supplicant_send_smk_m3(struct wpa_sm *sm,
  104. const unsigned char *src_addr,
  105. const struct wpa_eapol_key *key,
  106. int ver, struct wpa_peerkey *peerkey)
  107. {
  108. size_t rlen;
  109. struct wpa_eapol_key *reply;
  110. u8 *rbuf, *pos;
  111. size_t kde_len;
  112. u16 key_info;
  113. /* KDEs: Peer RSN IE, Initiator MAC Address, Initiator Nonce */
  114. kde_len = peerkey->rsnie_p_len +
  115. 2 + RSN_SELECTOR_LEN + ETH_ALEN +
  116. 2 + RSN_SELECTOR_LEN + WPA_NONCE_LEN;
  117. rbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY,
  118. NULL, sizeof(*reply) + kde_len, &rlen,
  119. (void *) &reply);
  120. if (rbuf == NULL)
  121. return -1;
  122. reply->type = EAPOL_KEY_TYPE_RSN;
  123. key_info = ver | WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_MIC |
  124. WPA_KEY_INFO_SECURE;
  125. WPA_PUT_BE16(reply->key_info, key_info);
  126. WPA_PUT_BE16(reply->key_length, 0);
  127. os_memcpy(reply->replay_counter, key->replay_counter,
  128. WPA_REPLAY_COUNTER_LEN);
  129. os_memcpy(reply->key_nonce, peerkey->pnonce, WPA_NONCE_LEN);
  130. WPA_PUT_BE16(reply->key_data_length, (u16) kde_len);
  131. pos = (u8 *) (reply + 1);
  132. /* Peer RSN IE */
  133. pos = wpa_add_ie(pos, peerkey->rsnie_p, peerkey->rsnie_p_len);
  134. /* Initiator MAC Address KDE */
  135. pos = wpa_add_kde(pos, RSN_KEY_DATA_MAC_ADDR, peerkey->addr, ETH_ALEN);
  136. /* Initiator Nonce */
  137. wpa_add_kde(pos, RSN_KEY_DATA_NONCE, peerkey->inonce, WPA_NONCE_LEN);
  138. wpa_printf(MSG_DEBUG, "RSN: Sending EAPOL-Key SMK M3");
  139. wpa_eapol_key_send(sm, sm->ptk.kck, ver, src_addr, ETH_P_EAPOL,
  140. rbuf, rlen, reply->key_mic);
  141. return 0;
  142. }
  143. static int wpa_supplicant_process_smk_m2(
  144. struct wpa_sm *sm, const unsigned char *src_addr,
  145. const struct wpa_eapol_key *key, size_t extra_len, int ver)
  146. {
  147. struct wpa_peerkey *peerkey;
  148. struct wpa_eapol_ie_parse kde;
  149. struct wpa_ie_data ie;
  150. int cipher;
  151. struct rsn_ie_hdr *hdr;
  152. u8 *pos;
  153. wpa_printf(MSG_DEBUG, "RSN: Received SMK M2");
  154. if (!sm->peerkey_enabled || sm->proto != WPA_PROTO_RSN) {
  155. wpa_printf(MSG_INFO, "RSN: SMK handshake not allowed for "
  156. "the current network");
  157. return -1;
  158. }
  159. if (wpa_supplicant_parse_ies((const u8 *) (key + 1), extra_len, &kde) <
  160. 0) {
  161. wpa_printf(MSG_INFO, "RSN: Failed to parse KDEs in SMK M2");
  162. return -1;
  163. }
  164. if (kde.rsn_ie == NULL || kde.mac_addr == NULL ||
  165. kde.mac_addr_len < ETH_ALEN) {
  166. wpa_printf(MSG_INFO, "RSN: No RSN IE or MAC address KDE in "
  167. "SMK M2");
  168. return -1;
  169. }
  170. wpa_printf(MSG_DEBUG, "RSN: SMK M2 - SMK initiator " MACSTR,
  171. MAC2STR(kde.mac_addr));
  172. if (kde.rsn_ie_len > PEERKEY_MAX_IE_LEN) {
  173. wpa_printf(MSG_INFO, "RSN: Too long Initiator RSN IE in SMK "
  174. "M2");
  175. return -1;
  176. }
  177. if (wpa_parse_wpa_ie_rsn(kde.rsn_ie, kde.rsn_ie_len, &ie) < 0) {
  178. wpa_printf(MSG_INFO, "RSN: Failed to parse RSN IE in SMK M2");
  179. return -1;
  180. }
  181. cipher = ie.pairwise_cipher & sm->allowed_pairwise_cipher;
  182. if (cipher & WPA_CIPHER_CCMP) {
  183. wpa_printf(MSG_DEBUG, "RSN: Using CCMP for PeerKey");
  184. cipher = WPA_CIPHER_CCMP;
  185. } else if (cipher & WPA_CIPHER_TKIP) {
  186. wpa_printf(MSG_DEBUG, "RSN: Using TKIP for PeerKey");
  187. cipher = WPA_CIPHER_TKIP;
  188. } else {
  189. wpa_printf(MSG_INFO, "RSN: No acceptable cipher in SMK M2");
  190. wpa_supplicant_send_smk_error(sm, src_addr, kde.mac_addr,
  191. STK_MUI_SMK, STK_ERR_CPHR_NS,
  192. ver);
  193. return -1;
  194. }
  195. /* TODO: find existing entry and if found, use that instead of adding
  196. * a new one; how to handle the case where both ends initiate at the
  197. * same time? */
  198. peerkey = os_zalloc(sizeof(*peerkey));
  199. if (peerkey == NULL)
  200. return -1;
  201. os_memcpy(peerkey->addr, kde.mac_addr, ETH_ALEN);
  202. os_memcpy(peerkey->inonce, key->key_nonce, WPA_NONCE_LEN);
  203. os_memcpy(peerkey->rsnie_i, kde.rsn_ie, kde.rsn_ie_len);
  204. peerkey->rsnie_i_len = kde.rsn_ie_len;
  205. peerkey->cipher = cipher;
  206. #ifdef CONFIG_IEEE80211W
  207. if (ie.key_mgmt & (WPA_KEY_MGMT_IEEE8021X_SHA256 |
  208. WPA_KEY_MGMT_PSK_SHA256))
  209. peerkey->use_sha256 = 1;
  210. #endif /* CONFIG_IEEE80211W */
  211. if (os_get_random(peerkey->pnonce, WPA_NONCE_LEN)) {
  212. wpa_msg(sm->ctx->ctx, MSG_WARNING,
  213. "WPA: Failed to get random data for PNonce");
  214. wpa_supplicant_peerkey_free(sm, peerkey);
  215. return -1;
  216. }
  217. hdr = (struct rsn_ie_hdr *) peerkey->rsnie_p;
  218. hdr->elem_id = WLAN_EID_RSN;
  219. WPA_PUT_LE16(hdr->version, RSN_VERSION);
  220. pos = (u8 *) (hdr + 1);
  221. /* Group Suite can be anything for SMK RSN IE; receiver will just
  222. * ignore it. */
  223. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP);
  224. pos += RSN_SELECTOR_LEN;
  225. /* Include only the selected cipher in pairwise cipher suite */
  226. WPA_PUT_LE16(pos, 1);
  227. pos += 2;
  228. if (cipher == WPA_CIPHER_CCMP)
  229. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP);
  230. else if (cipher == WPA_CIPHER_TKIP)
  231. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_TKIP);
  232. pos += RSN_SELECTOR_LEN;
  233. hdr->len = (pos - peerkey->rsnie_p) - 2;
  234. peerkey->rsnie_p_len = pos - peerkey->rsnie_p;
  235. wpa_hexdump(MSG_DEBUG, "WPA: RSN IE for SMK handshake",
  236. peerkey->rsnie_p, peerkey->rsnie_p_len);
  237. wpa_supplicant_send_smk_m3(sm, src_addr, key, ver, peerkey);
  238. peerkey->next = sm->peerkey;
  239. sm->peerkey = peerkey;
  240. return 0;
  241. }
  242. /**
  243. * rsn_smkid - Derive SMK identifier
  244. * @smk: Station master key (32 bytes)
  245. * @pnonce: Peer Nonce
  246. * @mac_p: Peer MAC address
  247. * @inonce: Initiator Nonce
  248. * @mac_i: Initiator MAC address
  249. * @use_sha256: Whether to use SHA256-based KDF
  250. *
  251. * 8.5.1.4 Station to station (STK) key hierarchy
  252. * SMKID = HMAC-SHA1-128(SMK, "SMK Name" || PNonce || MAC_P || INonce || MAC_I)
  253. */
  254. static void rsn_smkid(const u8 *smk, const u8 *pnonce, const u8 *mac_p,
  255. const u8 *inonce, const u8 *mac_i, u8 *smkid,
  256. int use_sha256)
  257. {
  258. char *title = "SMK Name";
  259. const u8 *addr[5];
  260. const size_t len[5] = { 8, WPA_NONCE_LEN, ETH_ALEN, WPA_NONCE_LEN,
  261. ETH_ALEN };
  262. unsigned char hash[SHA256_MAC_LEN];
  263. addr[0] = (u8 *) title;
  264. addr[1] = pnonce;
  265. addr[2] = mac_p;
  266. addr[3] = inonce;
  267. addr[4] = mac_i;
  268. #ifdef CONFIG_IEEE80211W
  269. if (use_sha256)
  270. hmac_sha256_vector(smk, PMK_LEN, 5, addr, len, hash);
  271. else
  272. #endif /* CONFIG_IEEE80211W */
  273. hmac_sha1_vector(smk, PMK_LEN, 5, addr, len, hash);
  274. os_memcpy(smkid, hash, PMKID_LEN);
  275. }
  276. static void wpa_supplicant_send_stk_1_of_4(struct wpa_sm *sm,
  277. struct wpa_peerkey *peerkey)
  278. {
  279. size_t mlen;
  280. struct wpa_eapol_key *msg;
  281. u8 *mbuf;
  282. size_t kde_len;
  283. u16 key_info, ver;
  284. kde_len = 2 + RSN_SELECTOR_LEN + PMKID_LEN;
  285. mbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY, NULL,
  286. sizeof(*msg) + kde_len, &mlen,
  287. (void *) &msg);
  288. if (mbuf == NULL)
  289. return;
  290. msg->type = EAPOL_KEY_TYPE_RSN;
  291. if (peerkey->cipher == WPA_CIPHER_CCMP)
  292. ver = WPA_KEY_INFO_TYPE_HMAC_SHA1_AES;
  293. else
  294. ver = WPA_KEY_INFO_TYPE_HMAC_MD5_RC4;
  295. key_info = ver | WPA_KEY_INFO_KEY_TYPE | WPA_KEY_INFO_ACK;
  296. WPA_PUT_BE16(msg->key_info, key_info);
  297. if (peerkey->cipher == WPA_CIPHER_CCMP)
  298. WPA_PUT_BE16(msg->key_length, 16);
  299. else
  300. WPA_PUT_BE16(msg->key_length, 32);
  301. os_memcpy(msg->replay_counter, peerkey->replay_counter,
  302. WPA_REPLAY_COUNTER_LEN);
  303. inc_byte_array(peerkey->replay_counter, WPA_REPLAY_COUNTER_LEN);
  304. WPA_PUT_BE16(msg->key_data_length, kde_len);
  305. wpa_add_kde((u8 *) (msg + 1), RSN_KEY_DATA_PMKID,
  306. peerkey->smkid, PMKID_LEN);
  307. if (os_get_random(peerkey->inonce, WPA_NONCE_LEN)) {
  308. wpa_msg(sm->ctx->ctx, MSG_WARNING,
  309. "RSN: Failed to get random data for INonce (STK)");
  310. os_free(mbuf);
  311. return;
  312. }
  313. wpa_hexdump(MSG_DEBUG, "RSN: INonce for STK 4-Way Handshake",
  314. peerkey->inonce, WPA_NONCE_LEN);
  315. os_memcpy(msg->key_nonce, peerkey->inonce, WPA_NONCE_LEN);
  316. wpa_printf(MSG_DEBUG, "RSN: Sending EAPOL-Key STK 1/4 to " MACSTR,
  317. MAC2STR(peerkey->addr));
  318. wpa_eapol_key_send(sm, NULL, ver, peerkey->addr, ETH_P_EAPOL,
  319. mbuf, mlen, NULL);
  320. }
  321. static void wpa_supplicant_send_stk_3_of_4(struct wpa_sm *sm,
  322. struct wpa_peerkey *peerkey)
  323. {
  324. size_t mlen;
  325. struct wpa_eapol_key *msg;
  326. u8 *mbuf, *pos;
  327. size_t kde_len;
  328. u16 key_info, ver;
  329. be32 lifetime;
  330. kde_len = peerkey->rsnie_i_len +
  331. 2 + RSN_SELECTOR_LEN + sizeof(lifetime);
  332. mbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY, NULL,
  333. sizeof(*msg) + kde_len, &mlen,
  334. (void *) &msg);
  335. if (mbuf == NULL)
  336. return;
  337. msg->type = EAPOL_KEY_TYPE_RSN;
  338. if (peerkey->cipher == WPA_CIPHER_CCMP)
  339. ver = WPA_KEY_INFO_TYPE_HMAC_SHA1_AES;
  340. else
  341. ver = WPA_KEY_INFO_TYPE_HMAC_MD5_RC4;
  342. key_info = ver | WPA_KEY_INFO_KEY_TYPE | WPA_KEY_INFO_ACK |
  343. WPA_KEY_INFO_MIC | WPA_KEY_INFO_SECURE;
  344. WPA_PUT_BE16(msg->key_info, key_info);
  345. if (peerkey->cipher == WPA_CIPHER_CCMP)
  346. WPA_PUT_BE16(msg->key_length, 16);
  347. else
  348. WPA_PUT_BE16(msg->key_length, 32);
  349. os_memcpy(msg->replay_counter, peerkey->replay_counter,
  350. WPA_REPLAY_COUNTER_LEN);
  351. inc_byte_array(peerkey->replay_counter, WPA_REPLAY_COUNTER_LEN);
  352. WPA_PUT_BE16(msg->key_data_length, kde_len);
  353. pos = (u8 *) (msg + 1);
  354. pos = wpa_add_ie(pos, peerkey->rsnie_i, peerkey->rsnie_i_len);
  355. lifetime = host_to_be32(peerkey->lifetime);
  356. wpa_add_kde(pos, RSN_KEY_DATA_LIFETIME,
  357. (u8 *) &lifetime, sizeof(lifetime));
  358. os_memcpy(msg->key_nonce, peerkey->inonce, WPA_NONCE_LEN);
  359. wpa_printf(MSG_DEBUG, "RSN: Sending EAPOL-Key STK 3/4 to " MACSTR,
  360. MAC2STR(peerkey->addr));
  361. wpa_eapol_key_send(sm, peerkey->stk.kck, ver, peerkey->addr,
  362. ETH_P_EAPOL, mbuf, mlen, msg->key_mic);
  363. }
  364. static int wpa_supplicant_process_smk_m4(struct wpa_peerkey *peerkey,
  365. struct wpa_eapol_ie_parse *kde)
  366. {
  367. wpa_printf(MSG_DEBUG, "RSN: Received SMK M4 (Initiator " MACSTR ")",
  368. MAC2STR(kde->mac_addr));
  369. if (os_memcmp(kde->smk + PMK_LEN, peerkey->pnonce, WPA_NONCE_LEN) != 0)
  370. {
  371. wpa_printf(MSG_INFO, "RSN: PNonce in SMK KDE does not "
  372. "match with the one used in SMK M3");
  373. return -1;
  374. }
  375. if (os_memcmp(kde->nonce, peerkey->inonce, WPA_NONCE_LEN) != 0) {
  376. wpa_printf(MSG_INFO, "RSN: INonce in SMK M4 did not "
  377. "match with the one received in SMK M2");
  378. return -1;
  379. }
  380. return 0;
  381. }
  382. static int wpa_supplicant_process_smk_m5(struct wpa_sm *sm,
  383. const unsigned char *src_addr,
  384. const struct wpa_eapol_key *key,
  385. int ver,
  386. struct wpa_peerkey *peerkey,
  387. struct wpa_eapol_ie_parse *kde)
  388. {
  389. int cipher;
  390. struct wpa_ie_data ie;
  391. wpa_printf(MSG_DEBUG, "RSN: Received SMK M5 (Peer " MACSTR ")",
  392. MAC2STR(kde->mac_addr));
  393. if (kde->rsn_ie == NULL || kde->rsn_ie_len > PEERKEY_MAX_IE_LEN ||
  394. wpa_parse_wpa_ie_rsn(kde->rsn_ie, kde->rsn_ie_len, &ie) < 0) {
  395. wpa_printf(MSG_INFO, "RSN: No RSN IE in SMK M5");
  396. /* TODO: abort negotiation */
  397. return -1;
  398. }
  399. if (os_memcmp(key->key_nonce, peerkey->inonce, WPA_NONCE_LEN) != 0) {
  400. wpa_printf(MSG_INFO, "RSN: Key Nonce in SMK M5 does "
  401. "not match with INonce used in SMK M1");
  402. return -1;
  403. }
  404. if (os_memcmp(kde->smk + PMK_LEN, peerkey->inonce, WPA_NONCE_LEN) != 0)
  405. {
  406. wpa_printf(MSG_INFO, "RSN: INonce in SMK KDE does not "
  407. "match with the one used in SMK M1");
  408. return -1;
  409. }
  410. os_memcpy(peerkey->rsnie_p, kde->rsn_ie, kde->rsn_ie_len);
  411. peerkey->rsnie_p_len = kde->rsn_ie_len;
  412. os_memcpy(peerkey->pnonce, kde->nonce, WPA_NONCE_LEN);
  413. cipher = ie.pairwise_cipher & sm->allowed_pairwise_cipher;
  414. if (cipher & WPA_CIPHER_CCMP) {
  415. wpa_printf(MSG_DEBUG, "RSN: Using CCMP for PeerKey");
  416. peerkey->cipher = WPA_CIPHER_CCMP;
  417. } else if (cipher & WPA_CIPHER_TKIP) {
  418. wpa_printf(MSG_DEBUG, "RSN: Using TKIP for PeerKey");
  419. peerkey->cipher = WPA_CIPHER_TKIP;
  420. } else {
  421. wpa_printf(MSG_INFO, "RSN: SMK Peer STA " MACSTR " selected "
  422. "unacceptable cipher", MAC2STR(kde->mac_addr));
  423. wpa_supplicant_send_smk_error(sm, src_addr, kde->mac_addr,
  424. STK_MUI_SMK, STK_ERR_CPHR_NS,
  425. ver);
  426. /* TODO: abort negotiation */
  427. return -1;
  428. }
  429. return 0;
  430. }
  431. static int wpa_supplicant_process_smk_m45(
  432. struct wpa_sm *sm, const unsigned char *src_addr,
  433. const struct wpa_eapol_key *key, size_t extra_len, int ver)
  434. {
  435. struct wpa_peerkey *peerkey;
  436. struct wpa_eapol_ie_parse kde;
  437. u32 lifetime;
  438. struct os_time now;
  439. if (!sm->peerkey_enabled || sm->proto != WPA_PROTO_RSN) {
  440. wpa_printf(MSG_DEBUG, "RSN: SMK handshake not allowed for "
  441. "the current network");
  442. return -1;
  443. }
  444. if (wpa_supplicant_parse_ies((const u8 *) (key + 1), extra_len, &kde) <
  445. 0) {
  446. wpa_printf(MSG_INFO, "RSN: Failed to parse KDEs in SMK M4/M5");
  447. return -1;
  448. }
  449. if (kde.mac_addr == NULL || kde.mac_addr_len < ETH_ALEN ||
  450. kde.nonce == NULL || kde.nonce_len < WPA_NONCE_LEN ||
  451. kde.smk == NULL || kde.smk_len < PMK_LEN + WPA_NONCE_LEN ||
  452. kde.lifetime == NULL || kde.lifetime_len < 4) {
  453. wpa_printf(MSG_INFO, "RSN: No MAC Address, Nonce, SMK, or "
  454. "Lifetime KDE in SMK M4/M5");
  455. return -1;
  456. }
  457. for (peerkey = sm->peerkey; peerkey; peerkey = peerkey->next) {
  458. if (os_memcmp(peerkey->addr, kde.mac_addr, ETH_ALEN) == 0 &&
  459. os_memcmp(peerkey->initiator ? peerkey->inonce :
  460. peerkey->pnonce,
  461. key->key_nonce, WPA_NONCE_LEN) == 0)
  462. break;
  463. }
  464. if (peerkey == NULL) {
  465. wpa_printf(MSG_INFO, "RSN: No matching SMK handshake found "
  466. "for SMK M4/M5: peer " MACSTR,
  467. MAC2STR(kde.mac_addr));
  468. return -1;
  469. }
  470. if (peerkey->initiator) {
  471. if (wpa_supplicant_process_smk_m5(sm, src_addr, key, ver,
  472. peerkey, &kde) < 0)
  473. return -1;
  474. } else {
  475. if (wpa_supplicant_process_smk_m4(peerkey, &kde) < 0)
  476. return -1;
  477. }
  478. os_memcpy(peerkey->smk, kde.smk, PMK_LEN);
  479. peerkey->smk_complete = 1;
  480. wpa_hexdump_key(MSG_DEBUG, "RSN: SMK", peerkey->smk, PMK_LEN);
  481. lifetime = WPA_GET_BE32(kde.lifetime);
  482. wpa_printf(MSG_DEBUG, "RSN: SMK lifetime %u seconds", lifetime);
  483. if (lifetime > 1000000000)
  484. lifetime = 1000000000; /* avoid overflowing expiration time */
  485. peerkey->lifetime = lifetime;
  486. os_get_time(&now);
  487. peerkey->expiration = now.sec + lifetime;
  488. eloop_register_timeout(lifetime, 0, wpa_supplicant_smk_timeout,
  489. sm, peerkey);
  490. if (peerkey->initiator) {
  491. rsn_smkid(peerkey->smk, peerkey->pnonce, peerkey->addr,
  492. peerkey->inonce, sm->own_addr, peerkey->smkid,
  493. peerkey->use_sha256);
  494. wpa_supplicant_send_stk_1_of_4(sm, peerkey);
  495. } else {
  496. rsn_smkid(peerkey->smk, peerkey->pnonce, sm->own_addr,
  497. peerkey->inonce, peerkey->addr, peerkey->smkid,
  498. peerkey->use_sha256);
  499. }
  500. wpa_hexdump(MSG_DEBUG, "RSN: SMKID", peerkey->smkid, PMKID_LEN);
  501. return 0;
  502. }
  503. static int wpa_supplicant_process_smk_error(
  504. struct wpa_sm *sm, const unsigned char *src_addr,
  505. const struct wpa_eapol_key *key, size_t extra_len)
  506. {
  507. struct wpa_eapol_ie_parse kde;
  508. struct rsn_error_kde error;
  509. u8 peer[ETH_ALEN];
  510. u16 error_type;
  511. wpa_printf(MSG_DEBUG, "RSN: Received SMK Error");
  512. if (!sm->peerkey_enabled || sm->proto != WPA_PROTO_RSN) {
  513. wpa_printf(MSG_DEBUG, "RSN: SMK handshake not allowed for "
  514. "the current network");
  515. return -1;
  516. }
  517. if (wpa_supplicant_parse_ies((const u8 *) (key + 1), extra_len, &kde) <
  518. 0) {
  519. wpa_printf(MSG_INFO, "RSN: Failed to parse KDEs in SMK Error");
  520. return -1;
  521. }
  522. if (kde.error == NULL || kde.error_len < sizeof(error)) {
  523. wpa_printf(MSG_INFO, "RSN: No Error KDE in SMK Error");
  524. return -1;
  525. }
  526. if (kde.mac_addr && kde.mac_addr_len >= ETH_ALEN)
  527. os_memcpy(peer, kde.mac_addr, ETH_ALEN);
  528. os_memcpy(&error, kde.error, sizeof(error));
  529. error_type = be_to_host16(error.error_type);
  530. wpa_msg(sm->ctx->ctx, MSG_INFO,
  531. "RSN: SMK Error KDE received: MUI %d error_type %d peer "
  532. MACSTR,
  533. be_to_host16(error.mui), error_type,
  534. MAC2STR(peer));
  535. if (kde.mac_addr &&
  536. (error_type == STK_ERR_STA_NR || error_type == STK_ERR_STA_NRSN ||
  537. error_type == STK_ERR_CPHR_NS)) {
  538. struct wpa_peerkey *peerkey;
  539. for (peerkey = sm->peerkey; peerkey; peerkey = peerkey->next) {
  540. if (os_memcmp(peerkey->addr, kde.mac_addr, ETH_ALEN) ==
  541. 0)
  542. break;
  543. }
  544. if (peerkey == NULL) {
  545. wpa_printf(MSG_DEBUG, "RSN: No matching SMK handshake "
  546. "found for SMK Error");
  547. return -1;
  548. }
  549. /* TODO: abort SMK/STK handshake and remove all related keys */
  550. }
  551. return 0;
  552. }
  553. static void wpa_supplicant_process_stk_1_of_4(struct wpa_sm *sm,
  554. struct wpa_peerkey *peerkey,
  555. const struct wpa_eapol_key *key,
  556. u16 ver)
  557. {
  558. struct wpa_eapol_ie_parse ie;
  559. const u8 *kde;
  560. size_t len, kde_buf_len;
  561. struct wpa_ptk *stk;
  562. u8 buf[8], *kde_buf, *pos;
  563. be32 lifetime;
  564. wpa_printf(MSG_DEBUG, "RSN: RX message 1 of STK 4-Way Handshake from "
  565. MACSTR " (ver=%d)", MAC2STR(peerkey->addr), ver);
  566. os_memset(&ie, 0, sizeof(ie));
  567. /* RSN: msg 1/4 should contain SMKID for the selected SMK */
  568. kde = (const u8 *) (key + 1);
  569. len = WPA_GET_BE16(key->key_data_length);
  570. wpa_hexdump(MSG_DEBUG, "RSN: msg 1/4 key data", kde, len);
  571. if (wpa_supplicant_parse_ies(kde, len, &ie) < 0 || ie.pmkid == NULL) {
  572. wpa_printf(MSG_DEBUG, "RSN: No SMKID in STK 1/4");
  573. return;
  574. }
  575. if (os_memcmp(ie.pmkid, peerkey->smkid, PMKID_LEN) != 0) {
  576. wpa_hexdump(MSG_DEBUG, "RSN: Unknown SMKID in STK 1/4",
  577. ie.pmkid, PMKID_LEN);
  578. return;
  579. }
  580. if (os_get_random(peerkey->pnonce, WPA_NONCE_LEN)) {
  581. wpa_msg(sm->ctx->ctx, MSG_WARNING,
  582. "RSN: Failed to get random data for PNonce");
  583. return;
  584. }
  585. wpa_hexdump(MSG_DEBUG, "WPA: Renewed PNonce",
  586. peerkey->pnonce, WPA_NONCE_LEN);
  587. /* Calculate STK which will be stored as a temporary STK until it has
  588. * been verified when processing message 3/4. */
  589. stk = &peerkey->tstk;
  590. wpa_pmk_to_ptk(peerkey->smk, PMK_LEN, "Peer key expansion",
  591. sm->own_addr, peerkey->addr,
  592. peerkey->pnonce, key->key_nonce,
  593. (u8 *) stk, sizeof(*stk),
  594. peerkey->use_sha256);
  595. /* Supplicant: swap tx/rx Mic keys */
  596. os_memcpy(buf, stk->u.auth.tx_mic_key, 8);
  597. os_memcpy(stk->u.auth.tx_mic_key, stk->u.auth.rx_mic_key, 8);
  598. os_memcpy(stk->u.auth.rx_mic_key, buf, 8);
  599. peerkey->tstk_set = 1;
  600. kde_buf_len = peerkey->rsnie_p_len +
  601. 2 + RSN_SELECTOR_LEN + sizeof(lifetime) +
  602. 2 + RSN_SELECTOR_LEN + PMKID_LEN;
  603. kde_buf = os_malloc(kde_buf_len);
  604. if (kde_buf == NULL)
  605. return;
  606. pos = kde_buf;
  607. pos = wpa_add_ie(pos, peerkey->rsnie_p, peerkey->rsnie_p_len);
  608. lifetime = host_to_be32(peerkey->lifetime);
  609. pos = wpa_add_kde(pos, RSN_KEY_DATA_LIFETIME,
  610. (u8 *) &lifetime, sizeof(lifetime));
  611. wpa_add_kde(pos, RSN_KEY_DATA_PMKID, peerkey->smkid, PMKID_LEN);
  612. if (wpa_supplicant_send_2_of_4(sm, peerkey->addr, key, ver,
  613. peerkey->pnonce, kde_buf, kde_buf_len,
  614. stk)) {
  615. os_free(kde_buf);
  616. return;
  617. }
  618. os_free(kde_buf);
  619. os_memcpy(peerkey->inonce, key->key_nonce, WPA_NONCE_LEN);
  620. }
  621. static void wpa_supplicant_update_smk_lifetime(struct wpa_sm *sm,
  622. struct wpa_peerkey *peerkey,
  623. struct wpa_eapol_ie_parse *kde)
  624. {
  625. u32 lifetime;
  626. struct os_time now;
  627. if (kde->lifetime == NULL || kde->lifetime_len < sizeof(lifetime))
  628. return;
  629. lifetime = WPA_GET_BE32(kde->lifetime);
  630. if (lifetime >= peerkey->lifetime) {
  631. wpa_printf(MSG_DEBUG, "RSN: Peer used SMK lifetime %u seconds "
  632. "which is larger than or equal to own value %u "
  633. "seconds - ignored", lifetime, peerkey->lifetime);
  634. return;
  635. }
  636. wpa_printf(MSG_DEBUG, "RSN: Peer used shorter SMK lifetime %u seconds "
  637. "(own was %u seconds) - updated",
  638. lifetime, peerkey->lifetime);
  639. peerkey->lifetime = lifetime;
  640. os_get_time(&now);
  641. peerkey->expiration = now.sec + lifetime;
  642. eloop_cancel_timeout(wpa_supplicant_smk_timeout, sm, peerkey);
  643. eloop_register_timeout(lifetime, 0, wpa_supplicant_smk_timeout,
  644. sm, peerkey);
  645. }
  646. static void wpa_supplicant_process_stk_2_of_4(struct wpa_sm *sm,
  647. struct wpa_peerkey *peerkey,
  648. const struct wpa_eapol_key *key,
  649. u16 ver)
  650. {
  651. struct wpa_eapol_ie_parse kde;
  652. const u8 *keydata;
  653. size_t len;
  654. wpa_printf(MSG_DEBUG, "RSN: RX message 2 of STK 4-Way Handshake from "
  655. MACSTR " (ver=%d)", MAC2STR(peerkey->addr), ver);
  656. os_memset(&kde, 0, sizeof(kde));
  657. /* RSN: msg 2/4 should contain SMKID for the selected SMK and RSN IE
  658. * from the peer. It may also include Lifetime KDE. */
  659. keydata = (const u8 *) (key + 1);
  660. len = WPA_GET_BE16(key->key_data_length);
  661. wpa_hexdump(MSG_DEBUG, "RSN: msg 2/4 key data", keydata, len);
  662. if (wpa_supplicant_parse_ies(keydata, len, &kde) < 0 ||
  663. kde.pmkid == NULL || kde.rsn_ie == NULL) {
  664. wpa_printf(MSG_DEBUG, "RSN: No SMKID or RSN IE in STK 2/4");
  665. return;
  666. }
  667. if (os_memcmp(kde.pmkid, peerkey->smkid, PMKID_LEN) != 0) {
  668. wpa_hexdump(MSG_DEBUG, "RSN: Unknown SMKID in STK 2/4",
  669. kde.pmkid, PMKID_LEN);
  670. return;
  671. }
  672. if (kde.rsn_ie_len != peerkey->rsnie_p_len ||
  673. os_memcmp(kde.rsn_ie, peerkey->rsnie_p, kde.rsn_ie_len) != 0) {
  674. wpa_printf(MSG_INFO, "RSN: Peer RSN IE in SMK and STK "
  675. "handshakes did not match");
  676. wpa_hexdump(MSG_DEBUG, "RSN: Peer RSN IE in SMK handshake",
  677. peerkey->rsnie_p, peerkey->rsnie_p_len);
  678. wpa_hexdump(MSG_DEBUG, "RSN: Peer RSN IE in STK handshake",
  679. kde.rsn_ie, kde.rsn_ie_len);
  680. return;
  681. }
  682. wpa_supplicant_update_smk_lifetime(sm, peerkey, &kde);
  683. wpa_supplicant_send_stk_3_of_4(sm, peerkey);
  684. os_memcpy(peerkey->pnonce, key->key_nonce, WPA_NONCE_LEN);
  685. }
  686. static void wpa_supplicant_process_stk_3_of_4(struct wpa_sm *sm,
  687. struct wpa_peerkey *peerkey,
  688. const struct wpa_eapol_key *key,
  689. u16 ver)
  690. {
  691. struct wpa_eapol_ie_parse kde;
  692. const u8 *keydata;
  693. size_t len, key_len;
  694. const u8 *_key;
  695. u8 key_buf[32], rsc[6];
  696. wpa_printf(MSG_DEBUG, "RSN: RX message 3 of STK 4-Way Handshake from "
  697. MACSTR " (ver=%d)", MAC2STR(peerkey->addr), ver);
  698. os_memset(&kde, 0, sizeof(kde));
  699. /* RSN: msg 3/4 should contain Initiator RSN IE. It may also include
  700. * Lifetime KDE. */
  701. keydata = (const u8 *) (key + 1);
  702. len = WPA_GET_BE16(key->key_data_length);
  703. wpa_hexdump(MSG_DEBUG, "RSN: msg 3/4 key data", keydata, len);
  704. if (wpa_supplicant_parse_ies(keydata, len, &kde) < 0) {
  705. wpa_printf(MSG_DEBUG, "RSN: Failed to parse key data in "
  706. "STK 3/4");
  707. return;
  708. }
  709. if (kde.rsn_ie_len != peerkey->rsnie_i_len ||
  710. os_memcmp(kde.rsn_ie, peerkey->rsnie_i, kde.rsn_ie_len) != 0) {
  711. wpa_printf(MSG_INFO, "RSN: Initiator RSN IE in SMK and STK "
  712. "handshakes did not match");
  713. wpa_hexdump(MSG_DEBUG, "RSN: Initiator RSN IE in SMK "
  714. "handshake",
  715. peerkey->rsnie_i, peerkey->rsnie_i_len);
  716. wpa_hexdump(MSG_DEBUG, "RSN: Initiator RSN IE in STK "
  717. "handshake",
  718. kde.rsn_ie, kde.rsn_ie_len);
  719. return;
  720. }
  721. if (os_memcmp(peerkey->inonce, key->key_nonce, WPA_NONCE_LEN) != 0) {
  722. wpa_printf(MSG_WARNING, "RSN: INonce from message 1 of STK "
  723. "4-Way Handshake differs from 3 of STK 4-Way "
  724. "Handshake - drop packet (src=" MACSTR ")",
  725. MAC2STR(peerkey->addr));
  726. return;
  727. }
  728. wpa_supplicant_update_smk_lifetime(sm, peerkey, &kde);
  729. if (wpa_supplicant_send_4_of_4(sm, peerkey->addr, key, ver,
  730. WPA_GET_BE16(key->key_info),
  731. NULL, 0, &peerkey->stk))
  732. return;
  733. _key = (u8 *) peerkey->stk.tk1;
  734. if (peerkey->cipher == WPA_CIPHER_TKIP) {
  735. /* Swap Tx/Rx keys for Michael MIC */
  736. os_memcpy(key_buf, _key, 16);
  737. os_memcpy(key_buf + 16, peerkey->stk.u.auth.rx_mic_key, 8);
  738. os_memcpy(key_buf + 24, peerkey->stk.u.auth.tx_mic_key, 8);
  739. _key = key_buf;
  740. key_len = 32;
  741. } else
  742. key_len = 16;
  743. os_memset(rsc, 0, 6);
  744. if (wpa_sm_set_key(sm, peerkey->cipher, peerkey->addr, 0, 1,
  745. rsc, sizeof(rsc), _key, key_len) < 0) {
  746. wpa_printf(MSG_WARNING, "RSN: Failed to set STK to the "
  747. "driver.");
  748. return;
  749. }
  750. }
  751. static void wpa_supplicant_process_stk_4_of_4(struct wpa_sm *sm,
  752. struct wpa_peerkey *peerkey,
  753. const struct wpa_eapol_key *key,
  754. u16 ver)
  755. {
  756. u8 rsc[6];
  757. wpa_printf(MSG_DEBUG, "RSN: RX message 4 of STK 4-Way Handshake from "
  758. MACSTR " (ver=%d)", MAC2STR(peerkey->addr), ver);
  759. os_memset(rsc, 0, 6);
  760. if (wpa_sm_set_key(sm, peerkey->cipher, peerkey->addr, 0, 1,
  761. rsc, sizeof(rsc), (u8 *) peerkey->stk.tk1,
  762. peerkey->cipher == WPA_CIPHER_TKIP ? 32 : 16) < 0) {
  763. wpa_printf(MSG_WARNING, "RSN: Failed to set STK to the "
  764. "driver.");
  765. return;
  766. }
  767. }
  768. /**
  769. * peerkey_verify_eapol_key_mic - Verify PeerKey MIC
  770. * @sm: Pointer to WPA state machine data from wpa_sm_init()
  771. * @peerkey: Pointer to the PeerKey data for the peer
  772. * @key: Pointer to the EAPOL-Key frame header
  773. * @ver: Version bits from EAPOL-Key Key Info
  774. * @buf: Pointer to the beginning of EAPOL-Key frame
  775. * @len: Length of the EAPOL-Key frame
  776. * Returns: 0 on success, -1 on failure
  777. */
  778. int peerkey_verify_eapol_key_mic(struct wpa_sm *sm,
  779. struct wpa_peerkey *peerkey,
  780. struct wpa_eapol_key *key, u16 ver,
  781. const u8 *buf, size_t len)
  782. {
  783. u8 mic[16];
  784. int ok = 0;
  785. if (peerkey->initiator && !peerkey->stk_set) {
  786. wpa_pmk_to_ptk(peerkey->smk, PMK_LEN, "Peer key expansion",
  787. sm->own_addr, peerkey->addr,
  788. peerkey->inonce, key->key_nonce,
  789. (u8 *) &peerkey->stk, sizeof(peerkey->stk),
  790. peerkey->use_sha256);
  791. peerkey->stk_set = 1;
  792. }
  793. os_memcpy(mic, key->key_mic, 16);
  794. if (peerkey->tstk_set) {
  795. os_memset(key->key_mic, 0, 16);
  796. wpa_eapol_key_mic(peerkey->tstk.kck, ver, buf, len,
  797. key->key_mic);
  798. if (os_memcmp(mic, key->key_mic, 16) != 0) {
  799. wpa_printf(MSG_WARNING, "RSN: Invalid EAPOL-Key MIC "
  800. "when using TSTK - ignoring TSTK");
  801. } else {
  802. ok = 1;
  803. peerkey->tstk_set = 0;
  804. peerkey->stk_set = 1;
  805. os_memcpy(&peerkey->stk, &peerkey->tstk,
  806. sizeof(peerkey->stk));
  807. }
  808. }
  809. if (!ok && peerkey->stk_set) {
  810. os_memset(key->key_mic, 0, 16);
  811. wpa_eapol_key_mic(peerkey->stk.kck, ver, buf, len,
  812. key->key_mic);
  813. if (os_memcmp(mic, key->key_mic, 16) != 0) {
  814. wpa_printf(MSG_WARNING, "RSN: Invalid EAPOL-Key MIC "
  815. "- dropping packet");
  816. return -1;
  817. }
  818. ok = 1;
  819. }
  820. if (!ok) {
  821. wpa_printf(MSG_WARNING, "RSN: Could not verify EAPOL-Key MIC "
  822. "- dropping packet");
  823. return -1;
  824. }
  825. os_memcpy(peerkey->replay_counter, key->replay_counter,
  826. WPA_REPLAY_COUNTER_LEN);
  827. peerkey->replay_counter_set = 1;
  828. return 0;
  829. }
  830. /**
  831. * wpa_sm_stkstart - Send EAPOL-Key Request for STK handshake (STK M1)
  832. * @sm: Pointer to WPA state machine data from wpa_sm_init()
  833. * @peer: MAC address of the peer STA
  834. * Returns: 0 on success, or -1 on failure
  835. *
  836. * Send an EAPOL-Key Request to the current authenticator to start STK
  837. * handshake with the peer.
  838. */
  839. int wpa_sm_stkstart(struct wpa_sm *sm, const u8 *peer)
  840. {
  841. size_t rlen, kde_len;
  842. struct wpa_eapol_key *req;
  843. int key_info, ver;
  844. u8 bssid[ETH_ALEN], *rbuf, *pos, *count_pos;
  845. u16 count;
  846. struct rsn_ie_hdr *hdr;
  847. struct wpa_peerkey *peerkey;
  848. struct wpa_ie_data ie;
  849. if (sm->proto != WPA_PROTO_RSN || !sm->ptk_set || !sm->peerkey_enabled)
  850. return -1;
  851. if (sm->ap_rsn_ie &&
  852. wpa_parse_wpa_ie_rsn(sm->ap_rsn_ie, sm->ap_rsn_ie_len, &ie) == 0 &&
  853. !(ie.capabilities & WPA_CAPABILITY_PEERKEY_ENABLED)) {
  854. wpa_printf(MSG_DEBUG, "RSN: Current AP does not support STK");
  855. return -1;
  856. }
  857. if (sm->pairwise_cipher == WPA_CIPHER_CCMP)
  858. ver = WPA_KEY_INFO_TYPE_HMAC_SHA1_AES;
  859. else
  860. ver = WPA_KEY_INFO_TYPE_HMAC_MD5_RC4;
  861. if (wpa_sm_get_bssid(sm, bssid) < 0) {
  862. wpa_printf(MSG_WARNING, "Failed to read BSSID for EAPOL-Key "
  863. "SMK M1");
  864. return -1;
  865. }
  866. /* TODO: find existing entry and if found, use that instead of adding
  867. * a new one */
  868. peerkey = os_zalloc(sizeof(*peerkey));
  869. if (peerkey == NULL)
  870. return -1;
  871. peerkey->initiator = 1;
  872. os_memcpy(peerkey->addr, peer, ETH_ALEN);
  873. #ifdef CONFIG_IEEE80211W
  874. if (wpa_key_mgmt_sha256(sm->key_mgmt))
  875. peerkey->use_sha256 = 1;
  876. #endif /* CONFIG_IEEE80211W */
  877. /* SMK M1:
  878. * EAPOL-Key(S=1, M=1, A=0, I=0, K=0, SM=1, KeyRSC=0, Nonce=INonce,
  879. * MIC=MIC, DataKDs=(RSNIE_I, MAC_P KDE))
  880. */
  881. hdr = (struct rsn_ie_hdr *) peerkey->rsnie_i;
  882. hdr->elem_id = WLAN_EID_RSN;
  883. WPA_PUT_LE16(hdr->version, RSN_VERSION);
  884. pos = (u8 *) (hdr + 1);
  885. /* Group Suite can be anything for SMK RSN IE; receiver will just
  886. * ignore it. */
  887. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP);
  888. pos += RSN_SELECTOR_LEN;
  889. count_pos = pos;
  890. pos += 2;
  891. count = 0;
  892. if (sm->allowed_pairwise_cipher & WPA_CIPHER_CCMP) {
  893. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_CCMP);
  894. pos += RSN_SELECTOR_LEN;
  895. count++;
  896. }
  897. if (sm->allowed_pairwise_cipher & WPA_CIPHER_TKIP) {
  898. RSN_SELECTOR_PUT(pos, RSN_CIPHER_SUITE_TKIP);
  899. pos += RSN_SELECTOR_LEN;
  900. count++;
  901. }
  902. WPA_PUT_LE16(count_pos, count);
  903. hdr->len = (pos - peerkey->rsnie_i) - 2;
  904. peerkey->rsnie_i_len = pos - peerkey->rsnie_i;
  905. wpa_hexdump(MSG_DEBUG, "WPA: RSN IE for SMK handshake",
  906. peerkey->rsnie_i, peerkey->rsnie_i_len);
  907. kde_len = peerkey->rsnie_i_len + 2 + RSN_SELECTOR_LEN + ETH_ALEN;
  908. rbuf = wpa_sm_alloc_eapol(sm, IEEE802_1X_TYPE_EAPOL_KEY, NULL,
  909. sizeof(*req) + kde_len, &rlen,
  910. (void *) &req);
  911. if (rbuf == NULL) {
  912. wpa_supplicant_peerkey_free(sm, peerkey);
  913. return -1;
  914. }
  915. req->type = EAPOL_KEY_TYPE_RSN;
  916. key_info = WPA_KEY_INFO_SMK_MESSAGE | WPA_KEY_INFO_MIC |
  917. WPA_KEY_INFO_SECURE | WPA_KEY_INFO_REQUEST | ver;
  918. WPA_PUT_BE16(req->key_info, key_info);
  919. WPA_PUT_BE16(req->key_length, 0);
  920. os_memcpy(req->replay_counter, sm->request_counter,
  921. WPA_REPLAY_COUNTER_LEN);
  922. inc_byte_array(sm->request_counter, WPA_REPLAY_COUNTER_LEN);
  923. if (os_get_random(peerkey->inonce, WPA_NONCE_LEN)) {
  924. wpa_msg(sm->ctx->ctx, MSG_WARNING,
  925. "WPA: Failed to get random data for INonce");
  926. os_free(rbuf);
  927. wpa_supplicant_peerkey_free(sm, peerkey);
  928. return -1;
  929. }
  930. os_memcpy(req->key_nonce, peerkey->inonce, WPA_NONCE_LEN);
  931. wpa_hexdump(MSG_DEBUG, "WPA: INonce for SMK handshake",
  932. req->key_nonce, WPA_NONCE_LEN);
  933. WPA_PUT_BE16(req->key_data_length, (u16) kde_len);
  934. pos = (u8 *) (req + 1);
  935. /* Initiator RSN IE */
  936. pos = wpa_add_ie(pos, peerkey->rsnie_i, peerkey->rsnie_i_len);
  937. /* Peer MAC address KDE */
  938. wpa_add_kde(pos, RSN_KEY_DATA_MAC_ADDR, peer, ETH_ALEN);
  939. wpa_printf(MSG_INFO, "RSN: Sending EAPOL-Key SMK M1 Request (peer "
  940. MACSTR ")", MAC2STR(peer));
  941. wpa_eapol_key_send(sm, sm->ptk.kck, ver, bssid, ETH_P_EAPOL,
  942. rbuf, rlen, req->key_mic);
  943. peerkey->next = sm->peerkey;
  944. sm->peerkey = peerkey;
  945. return 0;
  946. }
  947. /**
  948. * peerkey_deinit - Free PeerKey values
  949. * @sm: Pointer to WPA state machine data from wpa_sm_init()
  950. */
  951. void peerkey_deinit(struct wpa_sm *sm)
  952. {
  953. struct wpa_peerkey *prev, *peerkey = sm->peerkey;
  954. while (peerkey) {
  955. prev = peerkey;
  956. peerkey = peerkey->next;
  957. os_free(prev);
  958. }
  959. }
  960. void peerkey_rx_eapol_4way(struct wpa_sm *sm, struct wpa_peerkey *peerkey,
  961. struct wpa_eapol_key *key, u16 key_info, u16 ver)
  962. {
  963. if ((key_info & (WPA_KEY_INFO_MIC | WPA_KEY_INFO_ACK)) ==
  964. (WPA_KEY_INFO_MIC | WPA_KEY_INFO_ACK)) {
  965. /* 3/4 STK 4-Way Handshake */
  966. wpa_supplicant_process_stk_3_of_4(sm, peerkey, key, ver);
  967. } else if (key_info & WPA_KEY_INFO_ACK) {
  968. /* 1/4 STK 4-Way Handshake */
  969. wpa_supplicant_process_stk_1_of_4(sm, peerkey, key, ver);
  970. } else if (key_info & WPA_KEY_INFO_SECURE) {
  971. /* 4/4 STK 4-Way Handshake */
  972. wpa_supplicant_process_stk_4_of_4(sm, peerkey, key, ver);
  973. } else {
  974. /* 2/4 STK 4-Way Handshake */
  975. wpa_supplicant_process_stk_2_of_4(sm, peerkey, key, ver);
  976. }
  977. }
  978. void peerkey_rx_eapol_smk(struct wpa_sm *sm, const u8 *src_addr,
  979. struct wpa_eapol_key *key, size_t extra_len,
  980. u16 key_info, u16 ver)
  981. {
  982. if (key_info & WPA_KEY_INFO_ERROR) {
  983. /* SMK Error */
  984. wpa_supplicant_process_smk_error(sm, src_addr, key, extra_len);
  985. } else if (key_info & WPA_KEY_INFO_ACK) {
  986. /* SMK M2 */
  987. wpa_supplicant_process_smk_m2(sm, src_addr, key, extra_len,
  988. ver);
  989. } else {
  990. /* SMK M4 or M5 */
  991. wpa_supplicant_process_smk_m45(sm, src_addr, key, extra_len,
  992. ver);
  993. }
  994. }
  995. #endif /* CONFIG_PEERKEY */