Updated through tag hostap_2_5 from git://w1.fi/hostap.git
[mech_eap.git] / libeap / src / ap / peerkey_auth.c
index f68c479..efc1d7e 100644 (file)
@@ -2,14 +2,8 @@
  * hostapd - PeerKey for Direct Link Setup (DLS)
  * Copyright (c) 2006-2009, Jouni Malinen <j@w1.fi>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
  */
 
 #include "utils/includes.h"
@@ -18,6 +12,7 @@
 #include "utils/eloop.h"
 #include "crypto/sha1.h"
 #include "crypto/sha256.h"
+#include "crypto/random.h"
 #include "wpa_auth.h"
 #include "wpa_auth_i.h"
 #include "wpa_auth_ie.h"
@@ -84,15 +79,15 @@ static void wpa_smk_send_error(struct wpa_authenticator *wpa_auth,
 
 
 void wpa_smk_m1(struct wpa_authenticator *wpa_auth,
-               struct wpa_state_machine *sm, struct wpa_eapol_key *key)
+               struct wpa_state_machine *sm, struct wpa_eapol_key *key,
+               const u8 *key_data, size_t key_data_len)
 {
        struct wpa_eapol_ie_parse kde;
        struct wpa_stsl_search search;
        u8 *buf, *pos;
        size_t buf_len;
 
-       if (wpa_parse_kde_ies((const u8 *) (key + 1),
-                             WPA_GET_BE16(key->key_data_length), &kde) < 0) {
+       if (wpa_parse_kde_ies(key_data, key_data_len, &kde) < 0) {
                wpa_printf(MSG_INFO, "RSN: Failed to parse KDEs in SMK M1");
                return;
        }
@@ -226,8 +221,8 @@ static void wpa_send_smk_m5(struct wpa_authenticator *wpa_auth,
                return;
 
        /* Peer RSN IE */
-       os_memcpy(buf, kde->rsn_ie, kde->rsn_ie_len);
-       pos = buf + kde->rsn_ie_len;
+       os_memcpy(pos, kde->rsn_ie, kde->rsn_ie_len);
+       pos += kde->rsn_ie_len;
 
        /* Peer MAC Address */
        pos = wpa_add_kde(pos, RSN_KEY_DATA_MAC_ADDR, peer, ETH_ALEN, NULL, 0);
@@ -258,14 +253,14 @@ static void wpa_send_smk_m5(struct wpa_authenticator *wpa_auth,
 
 
 void wpa_smk_m3(struct wpa_authenticator *wpa_auth,
-               struct wpa_state_machine *sm, struct wpa_eapol_key *key)
+               struct wpa_state_machine *sm, struct wpa_eapol_key *key,
+               const u8 *key_data, size_t key_data_len)
 {
        struct wpa_eapol_ie_parse kde;
        struct wpa_stsl_search search;
        u8 smk[32], buf[ETH_ALEN + 8 + 2 * WPA_NONCE_LEN], *pos;
 
-       if (wpa_parse_kde_ies((const u8 *) (key + 1),
-                             WPA_GET_BE16(key->key_data_length), &kde) < 0) {
+       if (wpa_parse_kde_ies(key_data, key_data_len, &kde) < 0) {
                wpa_printf(MSG_INFO, "RSN: Failed to parse KDEs in SMK M3");
                return;
        }
@@ -294,7 +289,7 @@ void wpa_smk_m3(struct wpa_authenticator *wpa_auth,
                return;
        }
 
-       if (os_get_random(smk, PMK_LEN)) {
+       if (random_get_bytes(smk, PMK_LEN)) {
                wpa_printf(MSG_DEBUG, "RSN: Failed to generate SMK");
                return;
        }
@@ -329,15 +324,15 @@ void wpa_smk_m3(struct wpa_authenticator *wpa_auth,
 
 
 void wpa_smk_error(struct wpa_authenticator *wpa_auth,
-                  struct wpa_state_machine *sm, struct wpa_eapol_key *key)
+                  struct wpa_state_machine *sm,
+                  const u8 *key_data, size_t key_data_len)
 {
        struct wpa_eapol_ie_parse kde;
        struct wpa_stsl_search search;
        struct rsn_error_kde error;
        u16 mui, error_type;
 
-       if (wpa_parse_kde_ies((const u8 *) (key + 1),
-                             WPA_GET_BE16(key->key_data_length), &kde) < 0) {
+       if (wpa_parse_kde_ies(key_data, key_data_len, &kde) < 0) {
                wpa_printf(MSG_INFO, "RSN: Failed to parse KDEs in SMK Error");
                return;
        }