From 5027bd3d0b8db27887f7c3010fc7608bb9c90c3a Mon Sep 17 00:00:00 2001 From: James Prestwood Date: Tue, 5 Mar 2019 09:12:30 -0800 Subject: [PATCH] ftutil: add associate parser Helper to obtain RSNE, MDE, and FTE from associate frame. --- src/ftutil.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/ftutil.h | 4 ++++ 2 files changed, 52 insertions(+) diff --git a/src/ftutil.c b/src/ftutil.c index e32d7e94..2dc1f045 100644 --- a/src/ftutil.c +++ b/src/ftutil.c @@ -32,6 +32,7 @@ #include "src/handshake.h" #include "src/crypto.h" #include "src/ftutil.h" +#include "src/mpdu.h" /* * Calculate the MIC field of the FTE and write it directly to that FTE, @@ -140,3 +141,50 @@ bool ft_parse_authentication_resp_frame(const uint8_t *data, size_t len, return true; } + +bool ft_parse_associate_resp_frame(const uint8_t *frame, size_t frame_len, + uint16_t *out_status, const uint8_t **rsne, + const uint8_t **mde, const uint8_t **fte) +{ + const struct mmpdu_header *mpdu; + const struct mmpdu_association_response *body; + struct ie_tlv_iter iter; + + mpdu = mpdu_validate(frame, frame_len); + if (!mpdu) + return false; + + body = mmpdu_body(mpdu); + + ie_tlv_iter_init(&iter, body->ies, (const uint8_t *) mpdu + frame_len - + body->ies); + + while (ie_tlv_iter_next(&iter)) { + switch (ie_tlv_iter_get_tag(&iter)) { + case IE_TYPE_RSN: + if (*rsne) + return false; + + *rsne = ie_tlv_iter_get_data(&iter) - 2; + break; + + case IE_TYPE_MOBILITY_DOMAIN: + if (*mde) + return false; + + *mde = ie_tlv_iter_get_data(&iter) - 2; + break; + + case IE_TYPE_FAST_BSS_TRANSITION: + if (*fte) + return false; + + *fte = ie_tlv_iter_get_data(&iter) - 2; + break; + } + } + + *out_status = body->status_code; + + return true; +} diff --git a/src/ftutil.h b/src/ftutil.h index 23194c90..d4a56265 100644 --- a/src/ftutil.h +++ b/src/ftutil.h @@ -33,3 +33,7 @@ bool ft_parse_authentication_resp_frame(const uint8_t *data, size_t len, const uint8_t *addr3, uint16_t auth_seq, uint16_t *out_status, const uint8_t **out_ies, size_t *out_ies_len); + +bool ft_parse_associate_resp_frame(const uint8_t *frame, size_t frame_len, + uint16_t *out_status, const uint8_t **rsne, + const uint8_t **mde, const uint8_t **fte);