]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
SAE: Add generation of the confirm message fields
authorJouni Malinen <j@w1.fi>
Sun, 30 Dec 2012 20:28:57 +0000 (22:28 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 12 Jan 2013 15:51:52 +0000 (17:51 +0200)
Signed-hostap: Jouni Malinen <j@w1.fi>

src/ap/ieee802_11.c
src/common/sae.c
src/common/sae.h
wpa_supplicant/sme.c

index 506b781abe3e927c77bc2ad052b764e2693b54c0..8deb3f358c2310712e175c508f4a62c3babbe677 100644 (file)
@@ -355,13 +355,11 @@ static struct wpabuf * auth_build_sae_confirm(struct hostapd_data *hapd,
 {
        struct wpabuf *buf;
 
-       buf = wpabuf_alloc(2);
+       buf = wpabuf_alloc(SAE_CONFIRM_MAX_LEN);
        if (buf == NULL)
                return NULL;
 
-       wpabuf_put_le16(buf, sta->sae->send_confirm);
-       sta->sae->send_confirm++;
-       /* TODO: Confirm */
+       sae_write_confirm(sta->sae, buf);
 
        return buf;
 }
index e628d4694d3ad874cafb8abb3d49b39d16cbbddd..0adf0c011676d464728e2950dd39cd32973d9673 100644 (file)
@@ -542,3 +542,35 @@ u16 sae_parse_commit(struct sae_data *sae, const u8 *data, size_t len)
 
        return WLAN_STATUS_SUCCESS;
 }
+
+
+void sae_write_confirm(struct sae_data *sae, struct wpabuf *buf)
+{
+       const u8 *sc;
+       const u8 *addr[5];
+       size_t len[5];
+
+       /* Send-Confirm */
+       sc = wpabuf_put(buf, 0);
+       wpabuf_put_le16(buf, sae->send_confirm);
+       sae->send_confirm++;
+
+       /* Confirm
+        * CN(key, X, Y, Z, ...) =
+        *    HMAC-SHA256(key, D2OS(X) || D2OS(Y) || D2OS(Z) | ...)
+        * confirm = CN(KCK, send-confirm, commit-scalar, COMMIT-ELEMENT,
+        *              peer-commit-scalar, PEER-COMMIT-ELEMENT)
+        */
+       addr[0] = sc;
+       len[0] = 2;
+       addr[1] = sae->own_commit_scalar;
+       len[1] = 32;
+       addr[2] = sae->own_commit_element;
+       len[2] = 2 * 32;
+       addr[3] = sae->peer_commit_scalar;
+       len[3] = 32;
+       addr[4] = sae->peer_commit_element;
+       len[4] = 2 * 32;
+       hmac_sha256_vector(sae->kck, sizeof(sae->kck), 5, addr, len,
+                          wpabuf_put(buf, SHA256_MAC_LEN));
+}
index 4f689ed092b71f2868ef7d925bcdfbeddc031427..7b5a1241cf7eec959a83ac07ef6ebfd5cff24f9b 100644 (file)
@@ -10,6 +10,7 @@
 #define SAE_H
 
 #define SAE_COMMIT_MAX_LEN (2 + 3 * 32)
+#define SAE_CONFIRM_MAX_LEN (2 + 32)
 
 struct sae_data {
        enum { SAE_INIT, SAE_COMMIT, SAE_CONFIRM } state;
@@ -30,5 +31,6 @@ int sae_prepare_commit(const u8 *addr1, const u8 *addr2,
 int sae_process_commit(struct sae_data *sae);
 void sae_write_commit(struct sae_data *sae, struct wpabuf *buf);
 u16 sae_parse_commit(struct sae_data *sae, const u8 *data, size_t len);
+void sae_write_confirm(struct sae_data *sae, struct wpabuf *buf);
 
 #endif /* SAE_H */
index a5a90b5f8839a4de5d9c7ddb6fcb5e31f5181a20..a4a29dc9e18ac54cf5d83c821a0974255fbc633e 100644 (file)
@@ -77,15 +77,13 @@ static struct wpabuf * sme_auth_build_sae_confirm(struct wpa_supplicant *wpa_s)
 {
        struct wpabuf *buf;
 
-       buf = wpabuf_alloc(4 + 2);
+       buf = wpabuf_alloc(4 + SAE_CONFIRM_MAX_LEN);
        if (buf == NULL)
                return NULL;
 
        wpabuf_put_le16(buf, 2); /* Transaction seq# */
        wpabuf_put_le16(buf, WLAN_STATUS_SUCCESS);
-       wpabuf_put_le16(buf, wpa_s->sme.sae.send_confirm);
-       wpa_s->sme.sae.send_confirm++;
-       /* TODO: Confirm */
+       sae_write_confirm(&wpa_s->sme.sae, buf);
 
        return buf;
 }