static void ieee802_1x_get_keys(struct eapol_test_data *e, struct radius_msg *msg, struct radius_msg *req, u8 *shared_secret, size_t shared_secret_len) { struct radius_ms_mppe_keys *keys; keys = radius_msg_get_ms_keys(msg, req, shared_secret, shared_secret_len); if (keys && keys->send == NULL && keys->recv == NULL) { os_free(keys); keys = radius_msg_get_cisco_keys(msg, req, shared_secret, shared_secret_len); } if (keys) { if (keys->send) { wpa_hexdump(MSG_DEBUG, "MS-MPPE-Send-Key (sign)", keys->send, keys->send_len); } if (keys->recv) { wpa_hexdump(MSG_DEBUG, "MS-MPPE-Recv-Key (crypt)", keys->recv, keys->recv_len); e->authenticator_pmk_len = keys->recv_len > PMK_LEN ? PMK_LEN : keys->recv_len; os_memcpy(e->authenticator_pmk, keys->recv, e->authenticator_pmk_len); } os_free(keys->send); os_free(keys->recv); os_free(keys); } }
static void ieee802_1x_get_keys(struct eapol_test_data *e, struct radius_msg *msg, struct radius_msg *req, const u8 *shared_secret, size_t shared_secret_len) { struct radius_ms_mppe_keys *keys; u8 *buf; size_t len; keys = radius_msg_get_ms_keys(msg, req, shared_secret, shared_secret_len); if (keys && keys->send == NULL && keys->recv == NULL) { os_free(keys); keys = radius_msg_get_cisco_keys(msg, req, shared_secret, shared_secret_len); } if (keys) { if (keys->send) { wpa_hexdump(MSG_DEBUG, "MS-MPPE-Send-Key (sign)", keys->send, keys->send_len); } if (keys->recv) { wpa_hexdump(MSG_DEBUG, "MS-MPPE-Recv-Key (crypt)", keys->recv, keys->recv_len); e->authenticator_pmk_len = keys->recv_len > PMK_LEN ? PMK_LEN : keys->recv_len; os_memcpy(e->authenticator_pmk, keys->recv, e->authenticator_pmk_len); if (e->authenticator_pmk_len == 16 && keys->send && keys->send_len == 16) { /* MS-CHAP-v2 derives 16 octet keys */ wpa_printf(MSG_DEBUG, "Use MS-MPPE-Send-Key " "to extend PMK to 32 octets"); os_memcpy(e->authenticator_pmk + e->authenticator_pmk_len, keys->send, keys->send_len); e->authenticator_pmk_len += keys->send_len; } } os_free(keys->send); os_free(keys->recv); os_free(keys); } if (radius_msg_get_attr_ptr(msg, RADIUS_ATTR_EAP_KEY_NAME, &buf, &len, NULL) == 0) { os_memcpy(e->authenticator_eap_key_name, buf, len); e->authenticator_eap_key_name_len = len; } else { e->authenticator_eap_key_name_len = 0; } }