From 0959217ee32b5406487fa02de84e0974d34ff2bd Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Thu, 1 Sep 2016 12:43:26 +0200 Subject: [PATCH] Clean-up --- lib/EAPBase/include/EAP.h | 36 +++++++++++++++++++++++--- lib/PAP/src/Config.cpp | 2 +- lib/PAP/src/Credentials.cpp | 6 ++--- lib/PAP/src/Method.cpp | 50 +++++++++++++++---------------------- lib/WinStd | 2 +- 5 files changed, 57 insertions(+), 39 deletions(-) diff --git a/lib/EAPBase/include/EAP.h b/lib/EAPBase/include/EAP.h index 5d9c70a..e409603 100644 --- a/lib/EAPBase/include/EAP.h +++ b/lib/EAPBase/include/EAP.h @@ -81,6 +81,11 @@ namespace eap /// enum diameter_avp_flags_t; + /// + /// Diameter AVP header + /// + struct diameter_avp_header; + /// /// Diameter AVP /// @@ -423,15 +428,23 @@ inline void operator>>(_Inout_ eap::cursor_in &cursor, _Out_ GUID &val); #ifndef htonll /// -/// Convert host converts an unsigned __int64 from host to TCP/IP network byte order. +/// Converts an unsigned __int64 from host to TCP/IP network byte order. /// -/// \param[in] val A 64-bit unsigned number in host byte order. +/// \param[in] val A 64-bit unsigned number in host byte order /// -/// \returns The value in TCP/IP's network byte order. +/// \returns The value in TCP/IP's network byte order /// inline unsigned __int64 htonll(unsigned __int64 val); #endif +/// +/// Converts an 24-bit integer from host to TCP/IP network byte order. +/// +/// \param[in ] val A 24-bit unsigned number in host byte order +/// \param[out] out A 24-bit unsigned number in network byte order +/// +inline void hton24(_In_ unsigned int val, _Out_ unsigned char out[3]); + #pragma once @@ -625,12 +638,17 @@ namespace eap #pragma pack(push) #pragma pack(1) - struct diameter_avp + + struct diameter_avp_header { unsigned char code[4]; ///< AVP Code unsigned char flags; ///< AVP Flags unsigned char length[3]; ///< AVP Length + }; + + struct diameter_avp : public diameter_avp_header + { #pragma warning(push) #pragma warning(disable: 4201) union { @@ -642,6 +660,7 @@ namespace eap }; #pragma warning(pop) }; + #pragma pack(pop) @@ -1093,4 +1112,13 @@ inline unsigned __int64 htonll(unsigned __int64 val) #endif + +inline void hton24(_In_ unsigned int val, _Out_ unsigned char out[3]) +{ + assert(val <= 0xffffff); + out[0] = (val >> 16) & 0xff; + out[1] = (val >> 8) & 0xff; + out[2] = (val ) & 0xff; +} + #endif diff --git a/lib/PAP/src/Config.cpp b/lib/PAP/src/Config.cpp index 2e3fdca..5ea7537 100644 --- a/lib/PAP/src/Config.cpp +++ b/lib/PAP/src/Config.cpp @@ -72,7 +72,7 @@ eap::config* eap::config_method_pap::clone() const eap_type_t eap::config_method_pap::get_method_id() const { - return eap_type_pap; + return eap_type_legacy_pap; } diff --git a/lib/PAP/src/Credentials.cpp b/lib/PAP/src/Credentials.cpp index 1df5a5b..cd4e69e 100644 --- a/lib/PAP/src/Credentials.cpp +++ b/lib/PAP/src/Credentials.cpp @@ -83,14 +83,14 @@ eap::credentials::source_t eap::credentials_pap::combine( if (cred_cached) { // Using EAP service cached credentials. *this = *(credentials_pap*)cred_cached; - m_module.log_event(&EAPMETHOD_TRACE_EVT_CRED_CACHED1, event_data((unsigned int)eap_type_pap), event_data(credentials_pap::get_name()), event_data::blank); + m_module.log_event(&EAPMETHOD_TRACE_EVT_CRED_CACHED1, event_data((unsigned int)eap_type_legacy_pap), event_data(credentials_pap::get_name()), event_data::blank); return source_cache; } if (cfg.m_use_preshared) { // Using preshared credentials. *this = *(credentials_pap*)cfg.m_preshared.get(); - m_module.log_event(&EAPMETHOD_TRACE_EVT_CRED_PRESHARED1, event_data((unsigned int)eap_type_pap), event_data(credentials_pap::get_name()), event_data::blank); + m_module.log_event(&EAPMETHOD_TRACE_EVT_CRED_PRESHARED1, event_data((unsigned int)eap_type_legacy_pap), event_data(credentials_pap::get_name()), event_data::blank); return source_preshared; } @@ -101,7 +101,7 @@ eap::credentials::source_t eap::credentials_pap::combine( // Using stored credentials. *this = std::move(cred_loaded); - m_module.log_event(&EAPMETHOD_TRACE_EVT_CRED_STORED1, event_data((unsigned int)eap_type_pap), event_data(credentials_pap::get_name()), event_data::blank); + m_module.log_event(&EAPMETHOD_TRACE_EVT_CRED_STORED1, event_data((unsigned int)eap_type_legacy_pap), event_data(credentials_pap::get_name()), event_data::blank); return source_storage; } catch (...) { // Not actually an error. diff --git a/lib/PAP/src/Method.cpp b/lib/PAP/src/Method.cpp index 47d8dc0..d8b25e5 100644 --- a/lib/PAP/src/Method.cpp +++ b/lib/PAP/src/Method.cpp @@ -69,10 +69,10 @@ void eap::method_pap::process_request_packet( assert(pReceivedPacket && dwReceivedPacketSize >= 4); assert(pEapOutput); - m_module.log_event(&EAPMETHOD_PACKET_RECV, event_data((unsigned int)eap_type_pap), event_data((unsigned int)dwReceivedPacketSize - 4), event_data::blank); + m_module.log_event(&EAPMETHOD_PACKET_RECV, event_data((unsigned int)eap_type_legacy_pap), event_data((unsigned int)dwReceivedPacketSize - 4), event_data::blank); if (pReceivedPacket->Id == 0) { - m_module.log_event(&EAPMETHOD_METHOD_HANDSHAKE_START2, event_data((unsigned int)eap_type_pap), event_data::blank); + m_module.log_event(&EAPMETHOD_METHOD_HANDSHAKE_START2, event_data((unsigned int)eap_type_legacy_pap), event_data::blank); m_phase = phase_init; } @@ -97,43 +97,33 @@ void eap::method_pap::process_request_packet( size_password_outer; m_packet_res.m_code = EapCodeResponse; - m_packet_res.m_id = pReceivedPacket->Id; + m_packet_res.m_id = pReceivedPacket->Id; m_packet_res.m_data.clear(); m_packet_res.m_data.reserve( (size_identity_outer = - 4 + // Diameter AVP Code - 4 + // Diameter AVP Flags & Length - size_identity) + // Identity - padding_identity + // Identity padding + sizeof(diameter_avp_header) + // Diameter header + size_identity) + // Identity + padding_identity + // Identity padding (size_password_outer = - 4 + // Diameter AVP Code - 4 + // Diameter AVP Flags & Length - size_password) + // Password - padding_password); // Password padding + sizeof(diameter_avp_header) + // Diameter header + size_password) + // Password + padding_password); // Password padding // Diameter AVP Code User-Name (0x00000001) - m_packet_res.m_data.push_back(0x00); - m_packet_res.m_data.push_back(0x00); - m_packet_res.m_data.push_back(0x00); - m_packet_res.m_data.push_back(0x01); - - // Diameter AVP Flags & Length - unsigned int identity_hdr = htonl((diameter_avp_flag_mandatory << 24) | (unsigned int)size_identity_outer); - m_packet_res.m_data.insert(m_packet_res.m_data.end(), (unsigned char*)&identity_hdr, (unsigned char*)(&identity_hdr + 1)); + diameter_avp_header hdr; + *(unsigned int*)hdr.code = htonl(0x00000001); + hdr.flags = diameter_avp_flag_mandatory; + hton24((unsigned int)size_identity_outer, hdr.length); + m_packet_res.m_data.insert(m_packet_res.m_data.end(), (unsigned char*)&hdr, (unsigned char*)(&hdr + 1)); // Identity m_packet_res.m_data.insert(m_packet_res.m_data.end(), identity_utf8.begin(), identity_utf8.end()); m_packet_res.m_data.insert(m_packet_res.m_data.end(), padding_identity, 0); // Diameter AVP Code User-Password (0x00000002) - m_packet_res.m_data.push_back(0x00); - m_packet_res.m_data.push_back(0x00); - m_packet_res.m_data.push_back(0x00); - m_packet_res.m_data.push_back(0x02); - - // Diameter AVP Flags & Length - unsigned int password_hdr = htonl((diameter_avp_flag_mandatory << 24) | (unsigned int)size_password_outer); - m_packet_res.m_data.insert(m_packet_res.m_data.end(), (unsigned char*)&password_hdr, (unsigned char*)(&password_hdr + 1)); + *(unsigned int*)hdr.code = htonl(0x00000002); + hton24((unsigned int)size_password_outer, hdr.length); + m_packet_res.m_data.insert(m_packet_res.m_data.end(), (unsigned char*)&hdr, (unsigned char*)(&hdr + 1)); // Password m_packet_res.m_data.insert(m_packet_res.m_data.end(), password_utf8.begin(), password_utf8.end()); @@ -167,7 +157,7 @@ void eap::method_pap::get_response_packet( // Not fragmented. if (size_packet <= size_packet_limit) { // No need to fragment the packet. - m_module.log_event(&EAPMETHOD_PACKET_SEND, event_data((unsigned int)eap_type_pap), event_data((unsigned int)size_data), event_data::blank); + m_module.log_event(&EAPMETHOD_PACKET_SEND, event_data((unsigned int)eap_type_legacy_pap), event_data((unsigned int)size_data), event_data::blank); } else { // But it should be fragmented. throw com_runtime_error(TYPE_E_SIZETOOBIG, __FUNCTION__ " PAP message exceeds 64kB."); @@ -190,7 +180,7 @@ void eap::method_pap::get_result( switch (reason) { case EapPeerMethodResultSuccess: { - m_module.log_event(&EAPMETHOD_METHOD_SUCCESS, event_data((unsigned int)eap_type_pap), event_data::blank); + m_module.log_event(&EAPMETHOD_METHOD_SUCCESS, event_data((unsigned int)eap_type_legacy_pap), event_data::blank); m_cfg.m_auth_failed = false; ppResult->fIsSuccess = TRUE; @@ -202,7 +192,7 @@ void eap::method_pap::get_result( case EapPeerMethodResultFailure: m_module.log_event( m_phase_prev < phase_finished ? &EAPMETHOD_METHOD_FAILURE_INIT : &EAPMETHOD_METHOD_FAILURE, - event_data((unsigned int)eap_type_pap), event_data::blank); + event_data((unsigned int)eap_type_legacy_pap), event_data::blank); // Mark credentials as failed, so GUI can re-prompt user. // But be careful: do so only after credentials were actually tried. diff --git a/lib/WinStd b/lib/WinStd index b76203f..af2bb0a 160000 --- a/lib/WinStd +++ b/lib/WinStd @@ -1 +1 @@ -Subproject commit b76203f95e90585e606b5cc7e4c22e1025c304d0 +Subproject commit af2bb0a847d49aa546b8596b8c312aad6462e458