aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-06-11 15:42:54 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-06-11 15:42:54 +0000
commit0691e79adb176400842b7f55fe980ed3da79bcdc (patch)
tree0e80812da590dc9d901c4cba6a8ad7db672b4cec
parent0a9914ba7b5f3ec7de6470055d4a05dcda751770 (diff)
parent37a3652d1e3e7b7724d7e0a7c68197c396979d97 (diff)
downloadwpa_supplicant_8-0691e79adb176400842b7f55fe980ed3da79bcdc.tar.gz
Snap for 8712302 from 37a3652d1e3e7b7724d7e0a7c68197c396979d97 to tm-frc-conscrypt-releaset_frc_con_330443020android13-frc-conscrypt-release
Change-Id: I297554d19731c8ae5b3f52d4629577d25ab74466
-rw-r--r--src/eap_peer/eap_aka.c12
-rw-r--r--src/eap_peer/eap_sim.c12
-rw-r--r--wpa_supplicant/aidl/aidl.cpp8
-rw-r--r--wpa_supplicant/aidl/aidl.h4
-rw-r--r--wpa_supplicant/aidl/aidl_manager.cpp11
-rw-r--r--wpa_supplicant/aidl/aidl_manager.h2
-rw-r--r--wpa_supplicant/aidl/sta_network.cpp39
-rw-r--r--wpa_supplicant/aidl/sta_network.h4
-rw-r--r--wpa_supplicant/events.c4
-rw-r--r--wpa_supplicant/notify.c10
-rw-r--r--wpa_supplicant/notify.h1
11 files changed, 86 insertions, 21 deletions
diff --git a/src/eap_peer/eap_aka.c b/src/eap_peer/eap_aka.c
index 8c475f13..ee7010d4 100644
--- a/src/eap_peer/eap_aka.c
+++ b/src/eap_peer/eap_aka.c
@@ -385,6 +385,7 @@ static int eap_aka_learn_ids(struct eap_sm *sm, struct eap_aka_data *data,
size_t identity_len = 0;
const u8 *realm = NULL;
size_t realm_len = 0;
+ struct eap_peer_config *config = eap_get_config(sm);
wpa_hexdump_ascii(MSG_DEBUG,
"EAP-AKA: (encr) AT_NEXT_PSEUDONYM",
@@ -400,6 +401,17 @@ static int eap_aka_learn_ids(struct eap_sm *sm, struct eap_aka_data *data,
break;
}
}
+ // If no realm from the permanent identity, look for the
+ // realm of the anonymous identity.
+ if (realm_len == 0 && config && config->anonymous_identity
+ && config->anonymous_identity_len > 0) {
+ for (realm = config->anonymous_identity,
+ realm_len = config->anonymous_identity_len;
+ realm_len > 0; realm_len--, realm++) {
+ if (*realm == '@')
+ break;
+ }
+ }
data->pseudonym = os_malloc(attr->next_pseudonym_len +
realm_len);
if (data->pseudonym == NULL) {
diff --git a/src/eap_peer/eap_sim.c b/src/eap_peer/eap_sim.c
index 09866277..de423e8b 100644
--- a/src/eap_peer/eap_sim.c
+++ b/src/eap_peer/eap_sim.c
@@ -407,6 +407,7 @@ static int eap_sim_learn_ids(struct eap_sm *sm, struct eap_sim_data *data,
size_t identity_len = 0;
const u8 *realm = NULL;
size_t realm_len = 0;
+ struct eap_peer_config *config = eap_get_config(sm);
wpa_hexdump_ascii(MSG_DEBUG,
"EAP-SIM: (encr) AT_NEXT_PSEUDONYM",
@@ -422,6 +423,17 @@ static int eap_sim_learn_ids(struct eap_sm *sm, struct eap_sim_data *data,
break;
}
}
+ // If no realm from the permanent identity, look for the
+ // realm of the anonymous identity.
+ if (realm_len == 0 && config && config->anonymous_identity
+ && config->anonymous_identity_len > 0) {
+ for (realm = config->anonymous_identity,
+ realm_len = config->anonymous_identity_len;
+ realm_len > 0; realm_len--, realm++) {
+ if (*realm == '@')
+ break;
+ }
+ }
data->pseudonym = os_malloc(attr->next_pseudonym_len +
realm_len);
if (data->pseudonym == NULL) {
diff --git a/wpa_supplicant/aidl/aidl.cpp b/wpa_supplicant/aidl/aidl.cpp
index 1add3df4..a7945cc6 100644
--- a/wpa_supplicant/aidl/aidl.cpp
+++ b/wpa_supplicant/aidl/aidl.cpp
@@ -923,7 +923,7 @@ void wpas_aidl_notify_network_not_found(struct wpa_supplicant *wpa_s)
aidl_manager->notifyNetworkNotFound(wpa_s);
}
-void wpas_aidl_notify_bss_freq_changed(struct wpa_supplicant *wpa_s)
+void wpas_aidl_notify_frequency_changed(struct wpa_supplicant *wpa_s, int frequency)
{
if (!wpa_s)
return;
@@ -932,10 +932,10 @@ void wpas_aidl_notify_bss_freq_changed(struct wpa_supplicant *wpa_s)
if (!aidl_manager)
return;
- wpa_printf(MSG_DEBUG, "Notify %s frequency changed to %d",
- wpa_s->ifname, wpa_s->assoc_freq);
+ wpa_printf(MSG_INFO, "Notify %s frequency changed to %d",
+ wpa_s->ifname, frequency);
- aidl_manager->notifyBssFreqChanged(wpa_s);
+ aidl_manager->notifyFrequencyChanged(wpa_s, frequency);
}
void wpas_aidl_notify_ceritification(struct wpa_supplicant *wpa_s,
diff --git a/wpa_supplicant/aidl/aidl.h b/wpa_supplicant/aidl/aidl.h
index d9ab7bd2..2f3c7a05 100644
--- a/wpa_supplicant/aidl/aidl.h
+++ b/wpa_supplicant/aidl/aidl.h
@@ -126,7 +126,7 @@ extern "C"
void wpas_aidl_notify_transition_disable(
struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, u8 bitmap);
void wpas_aidl_notify_network_not_found(struct wpa_supplicant *wpa_s);
- void wpas_aidl_notify_bss_freq_changed(struct wpa_supplicant *wpa_s);
+ void wpas_aidl_notify_frequency_changed(struct wpa_supplicant *wpa_s, int frequency);
void wpas_aidl_notify_ceritification(struct wpa_supplicant *wpa_s,
int depth, const char *subject,
const char *altsubject[],
@@ -293,7 +293,7 @@ static void wpas_aidl_notify_transition_disable(struct wpa_supplicant *wpa_s,
{}
static void wpas_aidl_notify_network_not_found(struct wpa_supplicant *wpa_s)
{}
-void wpas_aidl_notify_bss_freq_changed(struct wpa_supplicant *wpa_s)
+void wpas_aidl_notify_frequency_changed(struct wpa_supplicant *wpa_s, int frequency)
{}
void wpas_aidl_notify_ceritification(struct wpa_supplicant *wpa_s,
int depth, const char *subject,
diff --git a/wpa_supplicant/aidl/aidl_manager.cpp b/wpa_supplicant/aidl/aidl_manager.cpp
index ac7b8e84..da90c389 100644
--- a/wpa_supplicant/aidl/aidl_manager.cpp
+++ b/wpa_supplicant/aidl/aidl_manager.cpp
@@ -1905,7 +1905,7 @@ void AidlManager::notifyNetworkNotFound(struct wpa_supplicant *wpa_s)
callWithEachStaIfaceCallback(misc_utils::charBufToString(wpa_s->ifname), func);
}
-void AidlManager::notifyBssFreqChanged(struct wpa_supplicant *wpa_group_s)
+void AidlManager::notifyFrequencyChanged(struct wpa_supplicant *wpa_group_s, int frequency)
{
if (!wpa_group_s || !wpa_group_s->parent)
return;
@@ -1913,18 +1913,15 @@ void AidlManager::notifyBssFreqChanged(struct wpa_supplicant *wpa_group_s)
// For group notifications, need to use the parent iface for callbacks.
struct wpa_supplicant *wpa_s = getTargetP2pIfaceForGroup(wpa_group_s);
if (!wpa_s) {
- wpa_printf(MSG_INFO, "Drop BSS frequency changed event");
+ wpa_printf(MSG_INFO, "Drop frequency changed event");
return;
}
- uint32_t aidl_freq = wpa_group_s->current_bss
- ? wpa_group_s->current_bss->freq
- : wpa_group_s->assoc_freq;
-
const std::function<
ndk::ScopedAStatus(std::shared_ptr<ISupplicantP2pIfaceCallback>)>
func = std::bind(&ISupplicantP2pIfaceCallback::onGroupFrequencyChanged,
- std::placeholders::_1, misc_utils::charBufToString(wpa_group_s->ifname), aidl_freq);
+ std::placeholders::_1, misc_utils::charBufToString(wpa_group_s->ifname),
+ frequency);
callWithEachP2pIfaceCallback(misc_utils::charBufToString(wpa_s->ifname), func);
}
diff --git a/wpa_supplicant/aidl/aidl_manager.h b/wpa_supplicant/aidl/aidl_manager.h
index 6acacf56..1ed6899c 100644
--- a/wpa_supplicant/aidl/aidl_manager.h
+++ b/wpa_supplicant/aidl/aidl_manager.h
@@ -143,7 +143,7 @@ public:
struct wpa_ssid *ssid,
u8 bitmap);
void notifyNetworkNotFound(struct wpa_supplicant *wpa_s);
- void notifyBssFreqChanged(struct wpa_supplicant *wpa_s);
+ void notifyFrequencyChanged(struct wpa_supplicant *wpa_s, int frequency);
void notifyCertification(struct wpa_supplicant *wpa_s,
int depth, const char *subject,
const char *altsubject[],
diff --git a/wpa_supplicant/aidl/sta_network.cpp b/wpa_supplicant/aidl/sta_network.cpp
index 88e7b74c..fe4a7604 100644
--- a/wpa_supplicant/aidl/sta_network.cpp
+++ b/wpa_supplicant/aidl/sta_network.cpp
@@ -1242,11 +1242,24 @@ ndk::ScopedAStatus StaNetwork::setEapAnonymousIdentityInternal(
const std::vector<uint8_t> &identity)
{
struct wpa_ssid *wpa_ssid = retrieveNetworkPtr();
- if (setByteArrayFieldAndResetState(
+ // If current supplicant pseudonym is the prefix of new pseudonym,
+ // the credential is not changed, just update the decoration.
+ // As a result, no need to reset the state.
+ // The decorated identity will have a postfix like
+ // @mncXXX.mccYYY.3gppnetwork.org, so the length will be always
+ // greater than the current one.
+ bool resetState = wpa_ssid->eap.anonymous_identity == NULL
+ || wpa_ssid->eap.anonymous_identity_len == 0
+ || identity.size() == 0
+ || wpa_ssid->eap.anonymous_identity_len >= identity.size()
+ || os_strncmp((char *) identity.data(),
+ (char *) wpa_ssid->eap.anonymous_identity,
+ wpa_ssid->eap.anonymous_identity_len) != 0;
+ if (setByteArrayField(
identity.data(), identity.size(),
&(wpa_ssid->eap.anonymous_identity),
&(wpa_ssid->eap.anonymous_identity_len),
- "eap anonymous_identity")) {
+ "eap anonymous_identity", resetState)) {
return createStatus(SupplicantStatusCode::FAILURE_UNKNOWN);
}
return ndk::ScopedAStatus::ok();
@@ -2385,9 +2398,9 @@ int StaNetwork::setStringKeyFieldAndResetState(
* field in |wpa_ssid| structure instance for this network.
* This function frees any existing data in these fields.
*/
-int StaNetwork::setByteArrayFieldAndResetState(
+int StaNetwork::setByteArrayField(
const uint8_t *value, const size_t value_len, uint8_t **to_update_field,
- size_t *to_update_field_len, const char *hexdump_prefix)
+ size_t *to_update_field_len, const char *hexdump_prefix, bool resetState)
{
if (*to_update_field) {
os_free(*to_update_field);
@@ -2402,11 +2415,27 @@ int StaNetwork::setByteArrayFieldAndResetState(
wpa_hexdump_ascii(
MSG_MSGDUMP, hexdump_prefix, *to_update_field,
*to_update_field_len);
- resetInternalStateAfterParamsUpdate();
+
+ if (resetState) {
+ resetInternalStateAfterParamsUpdate();
+ }
return 0;
}
/**
+ * Helper function to set value in a string field with a corresponding length
+ * field in |wpa_ssid| structure instance for this network.
+ * This function frees any existing data in these fields.
+ */
+int StaNetwork::setByteArrayFieldAndResetState(
+ const uint8_t *value, const size_t value_len, uint8_t **to_update_field,
+ size_t *to_update_field_len, const char *hexdump_prefix)
+{
+ return setByteArrayField(value, value_len, to_update_field,
+ to_update_field_len, hexdump_prefix, true);
+}
+
+/**
* Helper function to set value in a string key field with a corresponding
* length field in |wpa_ssid| structue instance for this network.
* This function frees any existing data in these fields.
diff --git a/wpa_supplicant/aidl/sta_network.h b/wpa_supplicant/aidl/sta_network.h
index 51056690..524f44a4 100644
--- a/wpa_supplicant/aidl/sta_network.h
+++ b/wpa_supplicant/aidl/sta_network.h
@@ -327,6 +327,10 @@ private:
void setFastTransitionKeyMgmt(uint32_t &key_mgmt_mask);
void resetFastTransitionKeyMgmt(uint32_t &key_mgmt_mask);
ndk::ScopedAStatus setEapErpInternal(bool enable);
+ int setByteArrayField(
+ const uint8_t* value, const size_t value_len,
+ uint8_t** to_update_field, size_t* to_update_field_len,
+ const char* hexdump_prefix, bool resetState);
// Reference to the global wpa_struct. This is assumed to be valid
// for the lifetime of the process.
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index b724eec0..0003d1f5 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -5345,6 +5345,10 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
if (event == EVENT_CH_SWITCH_STARTED)
break;
+ if (wpa_s->assoc_freq && data->ch_switch.freq &&
+ (int) wpa_s->assoc_freq != data->ch_switch.freq) {
+ wpas_notify_frequency_changed(wpa_s, data->ch_switch.freq);
+ }
wpa_s->assoc_freq = data->ch_switch.freq;
wpa_s->current_ssid->frequency = data->ch_switch.freq;
if (wpa_s->current_bss &&
diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c
index 4c305186..c52e88fd 100644
--- a/wpa_supplicant/notify.c
+++ b/wpa_supplicant/notify.c
@@ -472,8 +472,6 @@ void wpas_notify_bss_freq_changed(struct wpa_supplicant *wpa_s,
return;
wpas_dbus_bss_signal_prop_changed(wpa_s, WPAS_DBUS_BSS_PROP_FREQ, id);
-
- wpas_aidl_notify_bss_freq_changed(wpa_s);
}
@@ -1321,3 +1319,11 @@ void wpas_notify_qos_policy_request(struct wpa_supplicant *wpa_s,
wpas_aidl_notify_qos_policy_request(wpa_s, policies, num_policies);
}
+
+void wpas_notify_frequency_changed(struct wpa_supplicant *wpa_s, int frequency)
+{
+ if (!wpa_s)
+ return;
+
+ wpas_aidl_notify_frequency_changed(wpa_s, frequency);
+}
diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h
index f7000171..996be846 100644
--- a/wpa_supplicant/notify.h
+++ b/wpa_supplicant/notify.h
@@ -217,5 +217,6 @@ void wpas_notify_open_ssl_failure(struct wpa_supplicant *wpa_s,
void wpas_notify_qos_policy_reset(struct wpa_supplicant *wpa_s);
void wpas_notify_qos_policy_request(struct wpa_supplicant *wpa_s,
struct dscp_policy_data *policies, int num_policies);
+void wpas_notify_frequency_changed(struct wpa_supplicant *wpa_s, int frequency);
#endif /* NOTIFY_H */