This commit is contained in:
Simon Rozman 2016-09-01 12:43:26 +02:00
parent 844b185887
commit 0959217ee3
5 changed files with 57 additions and 39 deletions

View File

@ -81,6 +81,11 @@ namespace eap
/// ///
enum diameter_avp_flags_t; enum diameter_avp_flags_t;
///
/// Diameter AVP header
///
struct diameter_avp_header;
/// ///
/// Diameter AVP /// Diameter AVP
/// ///
@ -423,15 +428,23 @@ inline void operator>>(_Inout_ eap::cursor_in &cursor, _Out_ GUID &val);
#ifndef htonll #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); inline unsigned __int64 htonll(unsigned __int64 val);
#endif #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 #pragma once
@ -625,12 +638,17 @@ namespace eap
#pragma pack(push) #pragma pack(push)
#pragma pack(1) #pragma pack(1)
struct diameter_avp
struct diameter_avp_header
{ {
unsigned char code[4]; ///< AVP Code unsigned char code[4]; ///< AVP Code
unsigned char flags; ///< AVP Flags unsigned char flags; ///< AVP Flags
unsigned char length[3]; ///< AVP Length unsigned char length[3]; ///< AVP Length
};
struct diameter_avp : public diameter_avp_header
{
#pragma warning(push) #pragma warning(push)
#pragma warning(disable: 4201) #pragma warning(disable: 4201)
union { union {
@ -642,6 +660,7 @@ namespace eap
}; };
#pragma warning(pop) #pragma warning(pop)
}; };
#pragma pack(pop) #pragma pack(pop)
@ -1093,4 +1112,13 @@ inline unsigned __int64 htonll(unsigned __int64 val)
#endif #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 #endif

View File

@ -72,7 +72,7 @@ eap::config* eap::config_method_pap::clone() const
eap_type_t eap::config_method_pap::get_method_id() const eap_type_t eap::config_method_pap::get_method_id() const
{ {
return eap_type_pap; return eap_type_legacy_pap;
} }

View File

@ -83,14 +83,14 @@ eap::credentials::source_t eap::credentials_pap::combine(
if (cred_cached) { if (cred_cached) {
// Using EAP service cached credentials. // Using EAP service cached credentials.
*this = *(credentials_pap*)cred_cached; *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; return source_cache;
} }
if (cfg.m_use_preshared) { if (cfg.m_use_preshared) {
// Using preshared credentials. // Using preshared credentials.
*this = *(credentials_pap*)cfg.m_preshared.get(); *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; return source_preshared;
} }
@ -101,7 +101,7 @@ eap::credentials::source_t eap::credentials_pap::combine(
// Using stored credentials. // Using stored credentials.
*this = std::move(cred_loaded); *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; return source_storage;
} catch (...) { } catch (...) {
// Not actually an error. // Not actually an error.

View File

@ -69,10 +69,10 @@ void eap::method_pap::process_request_packet(
assert(pReceivedPacket && dwReceivedPacketSize >= 4); assert(pReceivedPacket && dwReceivedPacketSize >= 4);
assert(pEapOutput); 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) { 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; m_phase = phase_init;
} }
@ -97,43 +97,33 @@ void eap::method_pap::process_request_packet(
size_password_outer; size_password_outer;
m_packet_res.m_code = EapCodeResponse; 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.clear();
m_packet_res.m_data.reserve( m_packet_res.m_data.reserve(
(size_identity_outer = (size_identity_outer =
4 + // Diameter AVP Code sizeof(diameter_avp_header) + // Diameter header
4 + // Diameter AVP Flags & Length size_identity) + // Identity
size_identity) + // Identity padding_identity + // Identity padding
padding_identity + // Identity padding
(size_password_outer = (size_password_outer =
4 + // Diameter AVP Code sizeof(diameter_avp_header) + // Diameter header
4 + // Diameter AVP Flags & Length size_password) + // Password
size_password) + // Password padding_password); // Password padding
padding_password); // Password padding
// Diameter AVP Code User-Name (0x00000001) // Diameter AVP Code User-Name (0x00000001)
m_packet_res.m_data.push_back(0x00); diameter_avp_header hdr;
m_packet_res.m_data.push_back(0x00); *(unsigned int*)hdr.code = htonl(0x00000001);
m_packet_res.m_data.push_back(0x00); hdr.flags = diameter_avp_flag_mandatory;
m_packet_res.m_data.push_back(0x01); 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));
// 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));
// Identity // 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(), identity_utf8.begin(), identity_utf8.end());
m_packet_res.m_data.insert(m_packet_res.m_data.end(), padding_identity, 0); m_packet_res.m_data.insert(m_packet_res.m_data.end(), padding_identity, 0);
// Diameter AVP Code User-Password (0x00000002) // Diameter AVP Code User-Password (0x00000002)
m_packet_res.m_data.push_back(0x00); *(unsigned int*)hdr.code = htonl(0x00000002);
m_packet_res.m_data.push_back(0x00); hton24((unsigned int)size_password_outer, hdr.length);
m_packet_res.m_data.push_back(0x00); m_packet_res.m_data.insert(m_packet_res.m_data.end(), (unsigned char*)&hdr, (unsigned char*)(&hdr + 1));
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));
// Password // Password
m_packet_res.m_data.insert(m_packet_res.m_data.end(), password_utf8.begin(), password_utf8.end()); 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. // Not fragmented.
if (size_packet <= size_packet_limit) { if (size_packet <= size_packet_limit) {
// No need to fragment the packet. // 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 { } else {
// But it should be fragmented. // But it should be fragmented.
throw com_runtime_error(TYPE_E_SIZETOOBIG, __FUNCTION__ " PAP message exceeds 64kB."); throw com_runtime_error(TYPE_E_SIZETOOBIG, __FUNCTION__ " PAP message exceeds 64kB.");
@ -190,7 +180,7 @@ void eap::method_pap::get_result(
switch (reason) { switch (reason) {
case EapPeerMethodResultSuccess: { 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; m_cfg.m_auth_failed = false;
ppResult->fIsSuccess = TRUE; ppResult->fIsSuccess = TRUE;
@ -202,7 +192,7 @@ void eap::method_pap::get_result(
case EapPeerMethodResultFailure: case EapPeerMethodResultFailure:
m_module.log_event( m_module.log_event(
m_phase_prev < phase_finished ? &EAPMETHOD_METHOD_FAILURE_INIT : &EAPMETHOD_METHOD_FAILURE, 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. // Mark credentials as failed, so GUI can re-prompt user.
// But be careful: do so only after credentials were actually tried. // But be careful: do so only after credentials were actually tried.

@ -1 +1 @@
Subproject commit b76203f95e90585e606b5cc7e4c22e1025c304d0 Subproject commit af2bb0a847d49aa546b8596b8c312aad6462e458