Home | History | Annotate | Download | only in rsn_supp

Lines Matching refs:sm

26 int wpa_derive_ptk_ft(struct wpa_sm *sm, const unsigned char *src_addr,
34 if (sm->xxkey_len == 0) {
40 wpa_derive_pmk_r0(sm->xxkey, sm->xxkey_len, sm->ssid,
41 sm->ssid_len, sm->mobility_domain,
42 sm->r0kh_id, sm->r0kh_id_len, sm->own_addr,
43 sm->pmk_r0, sm->pmk_r0_name);
44 wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R0", sm->pmk_r0, PMK_LEN);
46 sm->pmk_r0_name, WPA_PMK_NAME_LEN);
47 wpa_derive_pmk_r1(sm->pmk_r0, sm->pmk_r0_name, sm->r1kh_id,
48 sm->own_addr, sm->pmk_r1, pmk_r1_name);
49 wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R1", sm->pmk_r1, PMK_LEN);
51 wpa_pmk_r1_to_ptk(sm->pmk_r1, sm->snonce, anonce, sm->own_addr,
52 sm->bssid, pmk_r1_name,
63 * @sm: Pointer to WPA state machine data from wpa_sm_init()
70 int wpa_sm_set_ft_params(struct wpa_sm *sm, const u8 *mobility_domain,
74 if (sm && mobility_domain) {
77 os_memcpy(sm->mobility_domain, mobility_domain,
79 } else if (sm)
80 os_memset(sm->mobility_domain, 0, MOBILITY_DOMAIN_ID_LEN);
82 if (sm && r0kh_id) {
86 os_memcpy(sm->r0kh_id, r0kh_id, r0kh_id_len);
87 sm->r0kh_id_len = r0kh_id_len;
88 } else if (sm) {
92 * os_memset(sm->r0kh_id, 0, FT_R0KH_ID_LEN);
93 * sm->r0kh_id_len = 0;
97 if (sm && r1kh_id) {
99 os_memcpy(sm->r1kh_id, r1kh_id, FT_R1KH_ID_LEN);
100 } else if (sm)
101 os_memset(sm->r1kh_id, 0, FT_R1KH_ID_LEN);
109 * @sm: Pointer to WPA state machine data from wpa_sm_init()
119 static u8 * wpa_ft_gen_req_ies(struct wpa_sm *sm, size_t *len,
130 sm->ft_completed = 0;
133 2 + sm->r0kh_id_len + 100;
146 if (sm->group_cipher == WPA_CIPHER_CCMP)
148 else if (sm->group_cipher == WPA_CIPHER_TKIP)
152 sm->group_cipher);
163 if (sm->pairwise_cipher == WPA_CIPHER_CCMP)
165 else if (sm->pairwise_cipher == WPA_CIPHER_TKIP)
169 sm->pairwise_cipher);
180 if (sm->key_mgmt == WPA_KEY_MGMT_FT_IEEE8021X)
182 else if (sm->key_mgmt == WPA_KEY_MGMT_FT_PSK)
186 sm->key_mgmt);
195 if (sm->mgmt_group_cipher == WPA_CIPHER_AES_128_CMAC)
210 if (sm->mgmt_group_cipher == WPA_CIPHER_AES_128_CMAC) {
224 os_memcpy(mdie->mobility_domain, sm->mobility_domain,
234 os_memcpy(ftie->snonce, sm->snonce, WPA_NONCE_LEN);
239 *pos++ = sm->r0kh_id_len;
240 os_memcpy(pos, sm->r0kh_id, sm->r0kh_id_len);
241 pos += sm->r0kh_id_len;
257 if (wpa_ft_mic(kck, sm->own_addr, target_ap, 5,
393 static int wpa_ft_install_ptk(struct wpa_sm *sm, const u8 *bssid)
401 switch (sm->pairwise_cipher) {
412 sm->pairwise_cipher);
416 if (wpa_sm_set_key(sm, alg, bssid, 0, 1, null_rsc,
417 sizeof(null_rsc), (u8 *) sm->ptk.tk1, keylen) < 0) {
428 * @sm: Pointer to WPA state machine data from wpa_sm_init()
431 int wpa_ft_prepare_auth_request(struct wpa_sm *sm)
437 if (os_get_random(sm->snonce, WPA_NONCE_LEN)) {
442 ft_ies = wpa_ft_gen_req_ies(sm, &ft_ies_len, NULL, sm->pmk_r0_name,
443 NULL, sm->bssid);
445 wpa_sm_update_ft_ies(sm, sm->mobility_domain,
454 int wpa_ft_process_response(struct wpa_sm *sm, const u8 *ies, size_t ies_len,
469 if (!sm->over_the_ds_in_progress) {
475 if (os_memcmp(target_ap, sm->target_ap, ETH_ALEN) != 0) {
483 if (sm->key_mgmt != WPA_KEY_MGMT_FT_IEEE8021X &&
484 sm->key_mgmt != WPA_KEY_MGMT_FT_PSK) {
497 os_memcmp(mdie->mobility_domain, sm->mobility_domain,
514 if (parse.r0kh_id_len != sm->r0kh_id_len ||
515 os_memcmp(parse.r0kh_id, sm->r0kh_id, parse.r0kh_id_len) != 0) {
521 sm->r0kh_id, sm->r0kh_id_len);
531 os_memcmp(parse.rsn_pmkid, sm->pmk_r0_name, WPA_PMK_NAME_LEN)) {
537 os_memcpy(sm->r1kh_id, parse.r1kh_id, FT_R1KH_ID_LEN);
538 wpa_hexdump(MSG_DEBUG, "FT: R1KH-ID", sm->r1kh_id, FT_R1KH_ID_LEN);
539 wpa_hexdump(MSG_DEBUG, "FT: SNonce", sm->snonce, WPA_NONCE_LEN);
541 wpa_derive_pmk_r1(sm->pmk_r0, sm->pmk_r0_name, sm->r1kh_id,
542 sm->own_addr, sm->pmk_r1, sm->pmk_r1_name);
543 wpa_hexdump_key(MSG_DEBUG, "FT: PMK-R1", sm->pmk_r1, PMK_LEN);
545 sm->pmk_r1_name, WPA_PMK_NAME_LEN);
548 ptk_len = sm->pairwise_cipher == WPA_CIPHER_CCMP ? 48 : 64;
549 wpa_pmk_r1_to_ptk(sm->pmk_r1, sm->snonce, ftie->anonce, sm->own_addr,
550 bssid, sm->pmk_r1_name,
551 (u8 *) &sm->ptk, ptk_len, ptk_name);
553 (u8 *) &sm->ptk, ptk_len);
556 ft_ies = wpa_ft_gen_req_ies(sm, &ft_ies_len, ftie->anonce,
557 sm->pmk_r1_name, sm->ptk.kck, bssid);
559 wpa_sm_update_ft_ies(sm, sm->mobility_domain,
564 ret = wpa_ft_install_ptk(sm, bssid);
567 sm->ft_completed = 1;
572 os_memcpy(sm->bssid, target_ap, ETH_ALEN);
580 int wpa_ft_is_completed(struct wpa_sm *sm)
582 if (sm == NULL)
585 if (sm->key_mgmt != WPA_KEY_MGMT_FT_IEEE8021X &&
586 sm->key_mgmt != WPA_KEY_MGMT_FT_PSK)
589 return sm->ft_completed;
593 static int wpa_ft_process_gtk_subelem(struct wpa_sm *sm, const u8 *gtk_elem,
616 if (aes_unwrap(sm->ptk.kek, gtk_len / 8, gtk_elem + 10, gtk)) {
622 switch (sm->group_cipher) {
645 sm->group_cipher);
666 if (wpa_sm_set_key(sm, alg, (u8 *) "\xff\xff\xff\xff\xff\xff",
679 static int wpa_ft_process_igtk_subelem(struct wpa_sm *sm, const u8 *igtk_elem,
685 if (sm->mgmt_group_cipher != WPA_CIPHER_AES_128_CMAC)
707 if (aes_unwrap(sm->ptk.kek, WPA_IGTK_LEN / 8, igtk_elem + 9, igtk)) {
719 if (wpa_sm_set_key(sm, WPA_ALG_IGTK, (u8 *) "\xff\xff\xff\xff\xff\xff",
732 int wpa_ft_validate_reassoc_resp(struct wpa_sm *sm, const u8 *ies,
743 if (sm->key_mgmt != WPA_KEY_MGMT_FT_IEEE8021X &&
744 sm->key_mgmt != WPA_KEY_MGMT_FT_PSK) {
757 os_memcmp(mdie->mobility_domain, sm->mobility_domain,
774 if (parse.r0kh_id_len != sm->r0kh_id_len ||
775 os_memcmp(parse.r0kh_id, sm->r0kh_id, parse.r0kh_id_len) != 0) {
781 sm->r0kh_id, sm->r0kh_id_len);
790 if (os_memcmp(parse.r1kh_id, sm->r1kh_id, FT_R1KH_ID_LEN) != 0) {
797 os_memcmp(parse.rsn_pmkid, sm->pmk_r1_name, WPA_PMK_NAME_LEN)) {
813 if (wpa_ft_mic(sm->ptk.kck, sm->own_addr, src_addr, 6,
829 if (wpa_ft_process_gtk_subelem(sm, parse.gtk, parse.gtk_len) < 0)
833 if (wpa_ft_process_igtk_subelem(sm, parse.igtk, parse.igtk_len) < 0)
843 * @sm: Pointer to WPA state machine data from wpa_sm_init()
846 int wpa_ft_start_over_ds(struct wpa_sm *sm, const u8 *target_ap)
855 if (os_get_random(sm->snonce, WPA_NONCE_LEN)) {
860 ft_ies = wpa_ft_gen_req_ies(sm, &ft_ies_len, NULL, sm->pmk_r0_name,
863 sm->over_the_ds_in_progress = 1;
864 os_memcpy(sm->target_ap, target_ap, ETH_ALEN);
865 wpa_sm_send_ft_action(sm, 1, target_ap, ft_ies, ft_ies_len);