From 45546eee39e2d33be338934fd5c3a0657ad22dd6 Mon Sep 17 00:00:00 2001 From: Matias Fontanini Date: Tue, 8 Dec 2015 08:36:24 -0800 Subject: [PATCH] Fix RSNInformation issues on big endian architectures --- include/tins/rsn_information.h | 8 +++++--- src/rsn_information.cpp | 36 +++++++++++++++++++--------------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/include/tins/rsn_information.h b/include/tins/rsn_information.h index 72822cf..9094691 100644 --- a/include/tins/rsn_information.h +++ b/include/tins/rsn_information.h @@ -147,19 +147,21 @@ public: * \brief Getter for the group suite field. * \return The group suite field. */ - CypherSuites group_suite() const { return _group_suite; } + CypherSuites group_suite() const { + return static_cast(Endian::le_to_host(_group_suite)); + } /** * \brief Getter for the version field. * \return The version field. */ - uint16_t version() const { return _version; } + uint16_t version() const { return Endian::le_to_host(_version); } /** * \brief Getter for the capabilities field. * \return The version field. */ - uint16_t capabilities() const { return _capabilities; } + uint16_t capabilities() const { return Endian::le_to_host(_capabilities); } /** * \brief Getter for the pairwise cypher suite list. diff --git a/src/rsn_information.cpp b/src/rsn_information.cpp index 6e86a3e..9bf5ccb 100644 --- a/src/rsn_information.cpp +++ b/src/rsn_information.cpp @@ -68,19 +68,21 @@ void RSNInformation::init(const uint8_t *buffer, uint32_t total_sz) { total_sz -= sizeof(uint16_t); std::memcpy(&uint32_t_buffer, buffer, sizeof(uint32_t)); - group_suite((RSNInformation::CypherSuites)uint32_t_buffer); + group_suite((RSNInformation::CypherSuites)Endian::le_to_host(uint32_t_buffer)); buffer += sizeof(uint32_t); total_sz -= sizeof(uint32_t); std::memcpy(&uint16_t_buffer, buffer, sizeof(uint16_t)); + uint16_t_buffer = Endian::le_to_host(uint16_t_buffer); buffer += sizeof(uint16_t); total_sz -= sizeof(uint16_t); - if(uint16_t_buffer * sizeof(uint32_t) > total_sz) + if(uint16_t_buffer * sizeof(uint32_t) > total_sz) throw malformed_packet(); total_sz -= uint16_t_buffer * sizeof(uint32_t); while(uint16_t_buffer--) { std::memcpy(&uint32_t_buffer, buffer, sizeof(uint32_t)); + uint32_t_buffer = Endian::le_to_host(uint32_t_buffer); add_pairwise_cypher((RSNInformation::CypherSuites)uint32_t_buffer); buffer += sizeof(uint32_t); } @@ -89,12 +91,14 @@ void RSNInformation::init(const uint8_t *buffer, uint32_t total_sz) { std::memcpy(&uint16_t_buffer, buffer, sizeof(uint16_t)); buffer += sizeof(uint16_t); total_sz -= sizeof(uint16_t); + uint16_t_buffer = Endian::le_to_host(uint16_t_buffer); + if(uint16_t_buffer * sizeof(uint32_t) > total_sz) throw malformed_packet(); total_sz -= uint16_t_buffer * sizeof(uint32_t); while(uint16_t_buffer--) { std::memcpy(&uint32_t_buffer, buffer, sizeof(uint32_t)); - add_akm_cypher((RSNInformation::AKMSuites)uint32_t_buffer); + add_akm_cypher((RSNInformation::AKMSuites)Endian::le_to_host(uint32_t_buffer)); buffer += sizeof(uint32_t); } check_size(total_sz); @@ -112,15 +116,15 @@ void RSNInformation::add_akm_cypher(AKMSuites akm) { } void RSNInformation::group_suite(CypherSuites group) { - _group_suite = group; + _group_suite = static_cast(Endian::host_to_le(group)); } void RSNInformation::version(uint16_t ver) { - _version = ver; + _version = Endian::host_to_le(ver); } void RSNInformation::capabilities(uint16_t cap) { - _capabilities = cap; + _capabilities = Endian::host_to_le(cap); } RSNInformation::serialization_type RSNInformation::serialize() const { @@ -128,30 +132,30 @@ RSNInformation::serialization_type RSNInformation::serialize() const { size += (sizeof(uint16_t) << 1); // 2 lists count. size += sizeof(uint32_t) * (_akm_cyphers.size() + _pairwise_cyphers.size()); - const size_t pairwise_cyphers_size = _pairwise_cyphers.size(); - const size_t akm_cyphers_size = _akm_cyphers.size(); - uint16_t capabilities = Endian::host_to_le(_capabilities); - uint16_t version = Endian::host_to_le(_version); + const uint16_t pairwise_cyphers_size = Endian::host_to_le(_pairwise_cyphers.size()); + const uint16_t akm_cyphers_size = Endian::host_to_le(_akm_cyphers.size()); serialization_type buffer(size); serialization_type::value_type *ptr = &buffer[0]; - std::memcpy(ptr, &version, sizeof(version)); + std::memcpy(ptr, &_version, sizeof(_version)); ptr += sizeof(uint16_t); std::memcpy(ptr, &_group_suite, sizeof(uint32_t)); ptr += sizeof(uint32_t); - std::memcpy(ptr, &pairwise_cyphers_size, sizeof(uint16_t)); + std::memcpy(ptr, &pairwise_cyphers_size, sizeof(pairwise_cyphers_size)); ptr += sizeof(uint16_t); for(cyphers_type::const_iterator it = _pairwise_cyphers.begin(); it != _pairwise_cyphers.end(); ++it) { - std::memcpy(ptr, &*it, sizeof(uint32_t)); + const uint32_t value = Endian::host_to_le(*it); + std::memcpy(ptr, &value, sizeof(uint32_t)); ptr += sizeof(uint32_t); } - std::memcpy(ptr, &akm_cyphers_size, sizeof(uint16_t)); + std::memcpy(ptr, &akm_cyphers_size, sizeof(akm_cyphers_size)); ptr += sizeof(uint16_t); for(akm_type::const_iterator it = _akm_cyphers.begin(); it != _akm_cyphers.end(); ++it) { - std::memcpy(ptr, &*it, sizeof(uint32_t)); + const uint32_t value = Endian::host_to_le(*it); + std::memcpy(ptr, &value, sizeof(uint32_t)); ptr += sizeof(uint32_t); } - std::memcpy(ptr, &capabilities, sizeof(uint16_t)); + std::memcpy(ptr, &_capabilities, sizeof(uint16_t)); return buffer; }