mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-11-25 17:59:25 +01:00
eapol: Add utility to find GTK KDEs
This commit is contained in:
parent
b1ca41b476
commit
7f9b8117fd
@ -136,6 +136,7 @@ unit_test_mpdu_LDADD = ell/libell-internal.la
|
|||||||
unit_test_eapol_SOURCES = unit/test-eapol.c \
|
unit_test_eapol_SOURCES = unit/test-eapol.c \
|
||||||
src/sha1.h src/sha1.c \
|
src/sha1.h src/sha1.c \
|
||||||
src/crypto.h src/crypto.c \
|
src/crypto.h src/crypto.c \
|
||||||
|
src/ie.h src/ie.c \
|
||||||
src/eapol.h src/eapol.c
|
src/eapol.h src/eapol.c
|
||||||
unit_test_eapol_LDADD = ell/libell-internal.la
|
unit_test_eapol_LDADD = ell/libell-internal.la
|
||||||
|
|
||||||
|
44
src/eapol.c
44
src/eapol.c
@ -30,6 +30,7 @@
|
|||||||
#include "sha1.h"
|
#include "sha1.h"
|
||||||
#include "crypto.h"
|
#include "crypto.h"
|
||||||
#include "eapol.h"
|
#include "eapol.h"
|
||||||
|
#include "ie.h"
|
||||||
|
|
||||||
struct l_hashmap *state_machines;
|
struct l_hashmap *state_machines;
|
||||||
eapol_tx_packet_func_t tx_packet = NULL;
|
eapol_tx_packet_func_t tx_packet = NULL;
|
||||||
@ -531,6 +532,38 @@ fail:
|
|||||||
l_free(step2);
|
l_free(step2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const uint8_t *eapol_find_gtk_kde(const uint8_t *data, size_t data_len,
|
||||||
|
size_t *out_gtk_len)
|
||||||
|
{
|
||||||
|
static const unsigned char gtk_oui[] = { 0x00, 0x0f, 0xac, 0x01 };
|
||||||
|
struct ie_tlv_iter iter;
|
||||||
|
const uint8_t *gtk;
|
||||||
|
unsigned int len;
|
||||||
|
|
||||||
|
ie_tlv_iter_init(&iter, data, data_len);
|
||||||
|
|
||||||
|
while (ie_tlv_iter_next(&iter)) {
|
||||||
|
if (ie_tlv_iter_get_tag(&iter) != IE_TYPE_VENDOR_SPECIFIC)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
len = ie_tlv_iter_get_length(&iter);
|
||||||
|
if (len < 4) /* Take care of padding */
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Check OUI */
|
||||||
|
gtk = ie_tlv_iter_get_data(&iter);
|
||||||
|
if (memcmp(gtk, gtk_oui, 4))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (out_gtk_len)
|
||||||
|
*out_gtk_len = len - 4;
|
||||||
|
|
||||||
|
return gtk + 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void eapol_handle_ptk_3_of_4(int ifindex, struct eapol_sm *sm,
|
static void eapol_handle_ptk_3_of_4(int ifindex, struct eapol_sm *sm,
|
||||||
const struct eapol_key *ek,
|
const struct eapol_key *ek,
|
||||||
const uint8_t *decrypted_key_data,
|
const uint8_t *decrypted_key_data,
|
||||||
@ -539,6 +572,8 @@ static void eapol_handle_ptk_3_of_4(int ifindex, struct eapol_sm *sm,
|
|||||||
struct crypto_ptk *ptk = (struct crypto_ptk *) sm->ptk;
|
struct crypto_ptk *ptk = (struct crypto_ptk *) sm->ptk;
|
||||||
struct eapol_key *step4;
|
struct eapol_key *step4;
|
||||||
uint8_t mic[16];
|
uint8_t mic[16];
|
||||||
|
const uint8_t *gtk;
|
||||||
|
size_t gtk_len;
|
||||||
|
|
||||||
if (!eapol_verify_ptk_3_of_4(ek))
|
if (!eapol_verify_ptk_3_of_4(ek))
|
||||||
return;
|
return;
|
||||||
@ -565,6 +600,15 @@ static void eapol_handle_ptk_3_of_4(int ifindex, struct eapol_sm *sm,
|
|||||||
* Supplicant uses the pairwise cipher suite specified in the second
|
* Supplicant uses the pairwise cipher suite specified in the second
|
||||||
* RSNE or deauthenticates."
|
* RSNE or deauthenticates."
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: If group_cipher was negotiated, find the GTK and install it
|
||||||
|
*/
|
||||||
|
gtk = eapol_find_gtk_kde(decrypted_key_data, decrypted_key_data_size,
|
||||||
|
>k_len);
|
||||||
|
if (!gtk)
|
||||||
|
return;
|
||||||
|
|
||||||
step4 = eapol_create_ptk_4_of_4(protocol_version,
|
step4 = eapol_create_ptk_4_of_4(protocol_version,
|
||||||
ek->key_descriptor_version,
|
ek->key_descriptor_version,
|
||||||
sm->replay_counter);
|
sm->replay_counter);
|
||||||
|
Loading…
Reference in New Issue
Block a user