From c28170251eb54dbf64a9074a07fee377587425b2 Mon Sep 17 00:00:00 2001 From: Dmitry Shmidt Date: Wed, 2 Jul 2014 10:32:10 -0700 Subject: Cumulative patch from commit e376290c667e970d751acc916e0efe2ed16292ed e376290 HS 2.0R2: Add update_identifier field to network 5bc2857 Fix some sparse warnings about u16 vs. le16 42619d6 Fix CTRL-EVENT-REGDOM-CHANGE event init= value a520bf4 Mark function static 0cb79d3 dbus: Fix indentation level to match code logic 8f03ac9 Mark functions static 6891f0e Allow SCAN command to specify scan_ssid=1 SSIDs 18389ab WPS: Clear keys/PINs explicitly b7175b4 Clear hostapd configuration keys explicitly d1ecca6 HS 2.0 R2: Clear hs20-osu-client configuration keys explicitly 0a13e06 EAP server: Clear keying material on deinit f534ee0 EAP peer: Clear keying material on deinit 19c48da Clear wpa_supplicant configuration keys explicitly 28bfa29 EAP-AKA: Remove unnecessary dead increment 62493df EAP-GPSK: Avoid dead increment by checking pos pointer 164a453 FT: Debug print extra response data 70bfc77 PCSC: Debug print extra response data 5dbbf36 Interworking: Remove unnecessary dead increment a1e46f3 Check for no key_mgmt/proto/auth_alg entries in config writer 290ea6a Remove unnecessary tracking of first entry d3fa2bb WFD: Explicit limit for subelement length (CID 68127) 745ef18 HS 2.0: Verify assoc_req_ie buffer size for indication elements 0233dca SAE: Use os_memcmp_const() for hash/password comparisons 34ef46c WEP shared key: Use os_memcmp_const() for hash/password comparisons 3e4b77c EAP-GTC: Use os_memcmp_const() for hash/password comparisons a6eae3f EAP-MSCHAPv2: Use os_memcmp_const() for hash/password comparisons 30411b3 EAP-TTLS: Use os_memcmp_const() for hash/password comparisons a564d9c EAP-MD5: Use os_memcmp_const() for hash/password comparisons 4685482 EAP-PSK: Use os_memcmp_const() for hash/password comparisons cba0f86 EAP-PEAP: Use os_memcmp_const() for hash/password comparisons 7b1e745 EAP-LEAP: Use os_memcmp_const() for hash/password comparisons 8f92826 EAP-GPSK: Use os_memcmp_const() for hash/password comparisons e1550d4 EAP-PAX: Use os_memcmp_const() for hash/password comparisons c434503 EAP-FAST: Use os_memcmp_const() for hash/password comparisons dddf7bb EAP-EKE: Use os_memcmp_const() for hash/password comparisons dfb5608 EAP-SAKE: Use os_memcmp_const() for hash/password comparisons 05c79d6 EAP-SIM/AKA: Use os_memcmp_const() for hash/password comparisons 675ddad EAP-IKEv2: Use os_memcmp_const() for hash/password comparisons 2049a3c TLS: Use os_memcmp_const() for hash/password comparisons a79aea5 Milenage: Use os_memcmp_const() for hash/password comparisons 05f916e AES-GCM: Use os_memcmp_const() for hash/password comparisons 87a5c93 AES-CCM: Use os_memcmp_const() for hash/password comparisons 7c24f53 EAPOL supplicant: Use os_memcmp_const() for hash/password comparisons 870834a RSN authenticator: Use os_memcmp_const() for hash/password comparisons 0d15b69 RSN supplicant: Use os_memcmp_const() for hash/password comparisons 72619ce MACsec: Use os_memcmp_const() for hash/password comparisons c237195 RADIUS: Use os_memcmp_const() for hash/password comparisons ce9c9bc WPS: Use os_memcmp_const() for hash/password comparisons afc3c8b Add constant time memory comparison function os_memcmp_const ee352f1 EAP-pwd: Add explicit total length limit b2b8a4c EAP-SIM/AKA: Pass EAP type as argument to eap_sim_msg_finish() f107d00 PeerKey: Clean up EAPOL-Key Key Data processing 010fc5f dbus: Clean up array-array-type property getter Change-Id: I1dbe483be2678a7468e6955d70ea261f8e53b26d Signed-off-by: Dmitry Shmidt --- src/eap_common/eap_eke_common.c | 2 +- src/eap_common/eap_gpsk_common.c | 19 ++++++++----------- src/eap_common/eap_ikev2_common.c | 2 +- src/eap_common/eap_sim_common.c | 11 +++++------ src/eap_common/eap_sim_common.h | 3 ++- src/eap_common/ikev2_common.c | 2 +- 6 files changed, 18 insertions(+), 21 deletions(-) (limited to 'src/eap_common') diff --git a/src/eap_common/eap_eke_common.c b/src/eap_common/eap_eke_common.c index a62ac8e0..4dfdb3f9 100644 --- a/src/eap_common/eap_eke_common.c +++ b/src/eap_common/eap_eke_common.c @@ -692,7 +692,7 @@ int eap_eke_decrypt_prot(struct eap_eke_session *sess, if (eap_eke_mac(sess->mac, sess->ki, prot + block_size, prot_len - block_size - icv_len, icv) < 0) return -1; - if (os_memcmp(icv, prot + prot_len - icv_len, icv_len) != 0) { + if (os_memcmp_const(icv, prot + prot_len - icv_len, icv_len) != 0) { wpa_printf(MSG_INFO, "EAP-EKE: ICV mismatch in Prot() data"); return -1; } diff --git a/src/eap_common/eap_gpsk_common.c b/src/eap_common/eap_gpsk_common.c index 7a33215f..8c7ae27b 100644 --- a/src/eap_common/eap_gpsk_common.c +++ b/src/eap_common/eap_gpsk_common.c @@ -284,7 +284,6 @@ int eap_gpsk_derive_keys(const u8 *psk, size_t psk_len, int vendor, u8 *pk, size_t *pk_len) { u8 *seed, *pos; - size_t seed_len; int ret; wpa_printf(MSG_DEBUG, "EAP-GPSK: Deriving keys (%d:%d)", @@ -296,8 +295,7 @@ int eap_gpsk_derive_keys(const u8 *psk, size_t psk_len, int vendor, wpa_hexdump_key(MSG_DEBUG, "EAP-GPSK: PSK", psk, psk_len); /* Seed = RAND_Peer || ID_Peer || RAND_Server || ID_Server */ - seed_len = 2 * EAP_GPSK_RAND_LEN + id_server_len + id_peer_len; - seed = os_malloc(seed_len); + seed = os_malloc(2 * EAP_GPSK_RAND_LEN + id_server_len + id_peer_len); if (seed == NULL) { wpa_printf(MSG_DEBUG, "EAP-GPSK: Failed to allocate memory " "for key derivation"); @@ -313,17 +311,18 @@ int eap_gpsk_derive_keys(const u8 *psk, size_t psk_len, int vendor, pos += EAP_GPSK_RAND_LEN; os_memcpy(pos, id_server, id_server_len); pos += id_server_len; - wpa_hexdump(MSG_DEBUG, "EAP-GPSK: Seed", seed, seed_len); + wpa_hexdump(MSG_DEBUG, "EAP-GPSK: Seed", seed, pos - seed); switch (specifier) { case EAP_GPSK_CIPHER_AES: - ret = eap_gpsk_derive_keys_aes(psk, psk_len, seed, seed_len, + ret = eap_gpsk_derive_keys_aes(psk, psk_len, seed, pos - seed, msk, emsk, sk, sk_len, pk, pk_len); break; #ifdef EAP_GPSK_SHA256 case EAP_GPSK_CIPHER_SHA256: - ret = eap_gpsk_derive_keys_sha256(psk, psk_len, seed, seed_len, + ret = eap_gpsk_derive_keys_sha256(psk, psk_len, seed, + pos - seed, msk, emsk, sk, sk_len); break; #endif /* EAP_GPSK_SHA256 */ @@ -423,7 +422,6 @@ int eap_gpsk_derive_session_id(const u8 *psk, size_t psk_len, int vendor, { u8 *seed, *pos; u8 kdf_out[16]; - size_t seed_len; int ret; wpa_printf(MSG_DEBUG, "EAP-GPSK: Deriving Session ID(%d:%d)", @@ -441,8 +439,7 @@ int eap_gpsk_derive_session_id(const u8 *psk, size_t psk_len, int vendor, * Method-ID = GKDF-16 (zero, "Method ID" || EAP_Method_Type || * CSuite_Sel || inputString) */ - seed_len = 2 * EAP_GPSK_RAND_LEN + id_server_len + id_peer_len; - seed = os_malloc(seed_len); + seed = os_malloc(2 * EAP_GPSK_RAND_LEN + id_server_len + id_peer_len); if (seed == NULL) { wpa_printf(MSG_DEBUG, "EAP-GPSK: Failed to allocate memory " "for Session-Id derivation"); @@ -458,11 +455,11 @@ int eap_gpsk_derive_session_id(const u8 *psk, size_t psk_len, int vendor, pos += EAP_GPSK_RAND_LEN; os_memcpy(pos, id_server, id_server_len); pos += id_server_len; - wpa_hexdump(MSG_DEBUG, "EAP-GPSK: Seed", seed, seed_len); + wpa_hexdump(MSG_DEBUG, "EAP-GPSK: Seed", seed, pos - seed); ret = eap_gpsk_derive_mid_helper(specifier, kdf_out, sizeof(kdf_out), - psk, seed, seed_len, + psk, seed, pos - seed, method_type); sid[0] = method_type; diff --git a/src/eap_common/eap_ikev2_common.c b/src/eap_common/eap_ikev2_common.c index da9f3cc5..585c79c4 100644 --- a/src/eap_common/eap_ikev2_common.c +++ b/src/eap_common/eap_ikev2_common.c @@ -100,7 +100,7 @@ int eap_ikev2_validate_icv(int integ_alg, struct ikev2_keys *keys, return -1; } - if (os_memcmp(icv, end - icv_len, icv_len) != 0) { + if (os_memcmp_const(icv, end - icv_len, icv_len) != 0) { wpa_printf(MSG_INFO, "EAP-IKEV2: Invalid ICV"); wpa_hexdump(MSG_DEBUG, "EAP-IKEV2: Calculated ICV", icv, icv_len); diff --git a/src/eap_common/eap_sim_common.c b/src/eap_common/eap_sim_common.c index ae021858..2adc3b37 100644 --- a/src/eap_common/eap_sim_common.c +++ b/src/eap_common/eap_sim_common.c @@ -198,7 +198,7 @@ int eap_sim_verify_mac(const u8 *k_aut, const struct wpabuf *req, hmac, EAP_SIM_MAC_LEN); os_free(tmp); - return (os_memcmp(hmac, mac, EAP_SIM_MAC_LEN) == 0) ? 0 : 1; + return (os_memcmp_const(hmac, mac, EAP_SIM_MAC_LEN) == 0) ? 0 : 1; } @@ -393,7 +393,7 @@ int eap_sim_verify_mac_sha256(const u8 *k_aut, const struct wpabuf *req, hmac, EAP_SIM_MAC_LEN); os_free(tmp); - return (os_memcmp(hmac, mac, EAP_SIM_MAC_LEN) == 0) ? 0 : 1; + return (os_memcmp_const(hmac, mac, EAP_SIM_MAC_LEN) == 0) ? 0 : 1; } @@ -972,7 +972,6 @@ u8 * eap_sim_parse_encr(const u8 *k_encr, const u8 *encr_data, struct eap_sim_msg { struct wpabuf *buf; size_t mac, iv, encr; /* index from buf */ - int type; }; @@ -986,7 +985,6 @@ struct eap_sim_msg * eap_sim_msg_init(int code, int id, int type, int subtype) if (msg == NULL) return NULL; - msg->type = type; msg->buf = wpabuf_alloc(EAP_SIM_INIT_LEN); if (msg->buf == NULL) { os_free(msg); @@ -1006,7 +1004,8 @@ struct eap_sim_msg * eap_sim_msg_init(int code, int id, int type, int subtype) } -struct wpabuf * eap_sim_msg_finish(struct eap_sim_msg *msg, const u8 *k_aut, +struct wpabuf * eap_sim_msg_finish(struct eap_sim_msg *msg, int type, + const u8 *k_aut, const u8 *extra, size_t extra_len) { struct eap_hdr *eap; @@ -1019,7 +1018,7 @@ struct wpabuf * eap_sim_msg_finish(struct eap_sim_msg *msg, const u8 *k_aut, eap->length = host_to_be16(wpabuf_len(msg->buf)); #if defined(EAP_AKA_PRIME) || defined(EAP_SERVER_AKA_PRIME) - if (k_aut && msg->mac && msg->type == EAP_TYPE_AKA_PRIME) { + if (k_aut && msg->mac && type == EAP_TYPE_AKA_PRIME) { eap_sim_add_mac_sha256(k_aut, (u8 *) wpabuf_head(msg->buf), wpabuf_len(msg->buf), (u8 *) wpabuf_mhead(msg->buf) + diff --git a/src/eap_common/eap_sim_common.h b/src/eap_common/eap_sim_common.h index 6021bd2e..daeb0e2d 100644 --- a/src/eap_common/eap_sim_common.h +++ b/src/eap_common/eap_sim_common.h @@ -211,7 +211,8 @@ u8 * eap_sim_parse_encr(const u8 *k_encr, const u8 *encr_data, struct eap_sim_msg; struct eap_sim_msg * eap_sim_msg_init(int code, int id, int type, int subtype); -struct wpabuf * eap_sim_msg_finish(struct eap_sim_msg *msg, const u8 *k_aut, +struct wpabuf * eap_sim_msg_finish(struct eap_sim_msg *msg, int type, + const u8 *k_aut, const u8 *extra, size_t extra_len); void eap_sim_msg_free(struct eap_sim_msg *msg); u8 * eap_sim_msg_add_full(struct eap_sim_msg *msg, u8 attr, diff --git a/src/eap_common/ikev2_common.c b/src/eap_common/ikev2_common.c index b98a3e8e..3d4fb6f9 100644 --- a/src/eap_common/ikev2_common.c +++ b/src/eap_common/ikev2_common.c @@ -477,7 +477,7 @@ u8 * ikev2_decrypt_payload(int encr_id, int integ_id, "hash"); return NULL; } - if (os_memcmp(integ, hash, integ_alg->hash_len) != 0) { + if (os_memcmp_const(integ, hash, integ_alg->hash_len) != 0) { wpa_printf(MSG_INFO, "IKEV2: Incorrect Integrity Checksum " "Data"); return NULL; -- cgit v1.2.3