Common PAP and MSCHAPv2 code merged in intermediate base class method_noneap
This commit is contained in:
parent
a8070e9bba
commit
7a3d4e0947
@ -24,6 +24,11 @@ namespace eap
|
|||||||
/// EAP and non-EAP method base class
|
/// EAP and non-EAP method base class
|
||||||
///
|
///
|
||||||
class method;
|
class method;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Non-EAP method base class
|
||||||
|
///
|
||||||
|
class method_noneap;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
@ -134,4 +139,51 @@ namespace eap
|
|||||||
credentials &m_cred; ///< User credentials
|
credentials &m_cred; ///< User credentials
|
||||||
std::vector<winstd::eap_attr> m_eap_attr; ///< EAP attributes
|
std::vector<winstd::eap_attr> m_eap_attr; ///< EAP attributes
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class method_noneap : public method
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
/// Constructs an EAP method
|
||||||
|
///
|
||||||
|
/// \param[in] mod EAP module to use for global services
|
||||||
|
/// \param[in] cfg Method configuration
|
||||||
|
/// \param[in] cred User credentials
|
||||||
|
///
|
||||||
|
method_noneap(_In_ module &module, _In_ config_method_with_cred &cfg, _In_ credentials &cred);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Moves an EAP method
|
||||||
|
///
|
||||||
|
/// \param[in] other EAP method to move from
|
||||||
|
///
|
||||||
|
method_noneap(_Inout_ method_noneap &&other);
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Moves an EAP method
|
||||||
|
///
|
||||||
|
/// \param[in] other EAP method to move from
|
||||||
|
///
|
||||||
|
/// \returns Reference to this object
|
||||||
|
///
|
||||||
|
method_noneap& operator=(_Inout_ method_noneap &&other);
|
||||||
|
|
||||||
|
/// \name Packet processing
|
||||||
|
/// @{
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Obtains a response packet from the EAP method.
|
||||||
|
///
|
||||||
|
/// \sa [EapPeerGetResponsePacket function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363610.aspx)
|
||||||
|
///
|
||||||
|
virtual void get_response_packet(
|
||||||
|
_Inout_bytecap_(*dwSendPacketSize) void *pSendPacket,
|
||||||
|
_Inout_ DWORD *pdwSendPacketSize);
|
||||||
|
|
||||||
|
/// @}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
sanitizing_blob m_packet_res; ///< Response packet
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
@ -74,3 +74,48 @@ void eap::method::begin_session(
|
|||||||
void eap::method::end_session()
|
void eap::method::end_session()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
// eap::method_noneap
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
eap::method_noneap::method_noneap(_In_ module &module, _In_ config_method_with_cred &cfg, _In_ credentials &cred) : method(module, cfg, cred)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
eap::method_noneap::method_noneap(_Inout_ method_noneap &&other) :
|
||||||
|
m_packet_res(std::move(other.m_packet_res)),
|
||||||
|
method (std::move(other ))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
eap::method_noneap& eap::method_noneap::operator=(_Inout_ method_noneap &&other)
|
||||||
|
{
|
||||||
|
if (this != std::addressof(other)) {
|
||||||
|
assert(std::addressof(m_cred) == std::addressof(other.m_cred)); // Move method with same credentials only!
|
||||||
|
(method&)*this = std::move(other );
|
||||||
|
m_packet_res = std::move(other.m_packet_res);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void eap::method_noneap::get_response_packet(
|
||||||
|
_Inout_bytecap_(*dwSendPacketSize) void *pSendPacket,
|
||||||
|
_Inout_ DWORD *pdwSendPacketSize)
|
||||||
|
{
|
||||||
|
assert(pdwSendPacketSize);
|
||||||
|
assert(pSendPacket);
|
||||||
|
|
||||||
|
size_t size_packet = m_packet_res.size();
|
||||||
|
if (size_packet > *pdwSendPacketSize)
|
||||||
|
throw invalid_argument(string_printf(__FUNCTION__ " This method does not support packet fragmentation, but the data size is too big to fit in one packet (packet: %u, maximum: %u).", size_packet, *pdwSendPacketSize).c_str());
|
||||||
|
|
||||||
|
memcpy(pSendPacket, m_packet_res.data(), size_packet);
|
||||||
|
*pdwSendPacketSize = (DWORD)size_packet;
|
||||||
|
m_packet_res.clear();
|
||||||
|
}
|
||||||
|
@ -37,7 +37,7 @@ namespace eap
|
|||||||
|
|
||||||
namespace eap
|
namespace eap
|
||||||
{
|
{
|
||||||
class method_mschapv2 : public method
|
class method_mschapv2 : public method_noneap
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
///
|
///
|
||||||
@ -89,15 +89,6 @@ namespace eap
|
|||||||
_In_ DWORD dwReceivedPacketSize,
|
_In_ DWORD dwReceivedPacketSize,
|
||||||
_Inout_ EapPeerMethodOutput *pEapOutput);
|
_Inout_ EapPeerMethodOutput *pEapOutput);
|
||||||
|
|
||||||
///
|
|
||||||
/// Obtains a response packet from the EAP method.
|
|
||||||
///
|
|
||||||
/// \sa [EapPeerGetResponsePacket function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363610.aspx)
|
|
||||||
///
|
|
||||||
virtual void get_response_packet(
|
|
||||||
_Inout_bytecap_(*dwSendPacketSize) void *pSendPacket,
|
|
||||||
_Inout_ DWORD *pdwSendPacketSize);
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Obtains the result of an authentication session from the EAP method.
|
/// Obtains the result of an authentication session from the EAP method.
|
||||||
///
|
///
|
||||||
@ -112,8 +103,6 @@ namespace eap
|
|||||||
protected:
|
protected:
|
||||||
credentials_mschapv2 &m_cred; ///< EAP-TLS user credentials
|
credentials_mschapv2 &m_cred; ///< EAP-TLS user credentials
|
||||||
|
|
||||||
sanitizing_blob m_packet_res; ///< Response packet
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
phase_unknown = -1, ///< Unknown phase
|
phase_unknown = -1, ///< Unknown phase
|
||||||
phase_init = 0, ///< Handshake initialize
|
phase_init = 0, ///< Handshake initialize
|
||||||
|
@ -32,17 +32,16 @@ eap::method_mschapv2::method_mschapv2(_In_ module &module, _In_ config_method_ms
|
|||||||
m_cred(cred),
|
m_cred(cred),
|
||||||
m_phase(phase_unknown),
|
m_phase(phase_unknown),
|
||||||
m_phase_prev(phase_unknown),
|
m_phase_prev(phase_unknown),
|
||||||
method(module, cfg, cred)
|
method_noneap(module, cfg, cred)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
eap::method_mschapv2::method_mschapv2(_Inout_ method_mschapv2 &&other) :
|
eap::method_mschapv2::method_mschapv2(_Inout_ method_mschapv2 &&other) :
|
||||||
m_cred ( other.m_cred ),
|
m_cred ( other.m_cred ),
|
||||||
m_packet_res(std::move(other.m_packet_res)),
|
m_phase (std::move(other.m_phase )),
|
||||||
m_phase (std::move(other.m_phase )),
|
m_phase_prev (std::move(other.m_phase_prev)),
|
||||||
m_phase_prev(std::move(other.m_phase_prev)),
|
method_noneap(std::move(other ))
|
||||||
method (std::move(other ))
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,10 +50,9 @@ eap::method_mschapv2& eap::method_mschapv2::operator=(_Inout_ method_mschapv2 &&
|
|||||||
{
|
{
|
||||||
if (this != std::addressof(other)) {
|
if (this != std::addressof(other)) {
|
||||||
assert(std::addressof(m_cred) == std::addressof(other.m_cred)); // Move method with same credentials only!
|
assert(std::addressof(m_cred) == std::addressof(other.m_cred)); // Move method with same credentials only!
|
||||||
(method&)*this = std::move(other );
|
(method_noneap&)*this = std::move(other );
|
||||||
m_packet_res = std::move(other.m_packet_res);
|
m_phase = std::move(other.m_phase );
|
||||||
m_phase = std::move(other.m_phase );
|
m_phase_prev = std::move(other.m_phase_prev);
|
||||||
m_phase_prev = std::move(other.m_phase_prev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@ -67,7 +65,7 @@ void eap::method_mschapv2::begin_session(
|
|||||||
_In_ HANDLE hTokenImpersonateUser,
|
_In_ HANDLE hTokenImpersonateUser,
|
||||||
_In_opt_ DWORD dwMaxSendPacketSize)
|
_In_opt_ DWORD dwMaxSendPacketSize)
|
||||||
{
|
{
|
||||||
method::begin_session(dwFlags, pAttributeArray, hTokenImpersonateUser, dwMaxSendPacketSize);
|
method_noneap::begin_session(dwFlags, pAttributeArray, hTokenImpersonateUser, dwMaxSendPacketSize);
|
||||||
|
|
||||||
m_module.log_event(&EAPMETHOD_METHOD_HANDSHAKE_START2, event_data((unsigned int)eap_type_legacy_mschapv2), event_data::blank);
|
m_module.log_event(&EAPMETHOD_METHOD_HANDSHAKE_START2, event_data((unsigned int)eap_type_legacy_mschapv2), event_data::blank);
|
||||||
m_phase = phase_init;
|
m_phase = phase_init;
|
||||||
@ -148,23 +146,6 @@ void eap::method_mschapv2::process_request_packet(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void eap::method_mschapv2::get_response_packet(
|
|
||||||
_Inout_bytecap_(*dwSendPacketSize) void *pSendPacket,
|
|
||||||
_Inout_ DWORD *pdwSendPacketSize)
|
|
||||||
{
|
|
||||||
assert(pdwSendPacketSize);
|
|
||||||
assert(pSendPacket);
|
|
||||||
|
|
||||||
size_t size_packet = m_packet_res.size();
|
|
||||||
if (size_packet > *pdwSendPacketSize)
|
|
||||||
throw invalid_argument(string_printf(__FUNCTION__ " This method does not support packet fragmentation, but the data size is too big to fit in one packet (packet: %u, maximum: %u).", size_packet, *pdwSendPacketSize).c_str());
|
|
||||||
|
|
||||||
memcpy(pSendPacket, m_packet_res.data(), size_packet);
|
|
||||||
*pdwSendPacketSize = (DWORD)size_packet;
|
|
||||||
m_packet_res.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void eap::method_mschapv2::get_result(
|
void eap::method_mschapv2::get_result(
|
||||||
_In_ EapPeerMethodResultReason reason,
|
_In_ EapPeerMethodResultReason reason,
|
||||||
_Inout_ EapPeerMethodResult *ppResult)
|
_Inout_ EapPeerMethodResult *ppResult)
|
||||||
|
@ -37,7 +37,7 @@ namespace eap
|
|||||||
|
|
||||||
namespace eap
|
namespace eap
|
||||||
{
|
{
|
||||||
class method_pap : public method
|
class method_pap : public method_noneap
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
///
|
///
|
||||||
@ -89,15 +89,6 @@ namespace eap
|
|||||||
_In_ DWORD dwReceivedPacketSize,
|
_In_ DWORD dwReceivedPacketSize,
|
||||||
_Inout_ EapPeerMethodOutput *pEapOutput);
|
_Inout_ EapPeerMethodOutput *pEapOutput);
|
||||||
|
|
||||||
///
|
|
||||||
/// Obtains a response packet from the EAP method.
|
|
||||||
///
|
|
||||||
/// \sa [EapPeerGetResponsePacket function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363610.aspx)
|
|
||||||
///
|
|
||||||
virtual void get_response_packet(
|
|
||||||
_Inout_bytecap_(*dwSendPacketSize) void *pSendPacket,
|
|
||||||
_Inout_ DWORD *pdwSendPacketSize);
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Obtains the result of an authentication session from the EAP method.
|
/// Obtains the result of an authentication session from the EAP method.
|
||||||
///
|
///
|
||||||
@ -112,8 +103,6 @@ namespace eap
|
|||||||
protected:
|
protected:
|
||||||
credentials_pap &m_cred; ///< EAP-TLS user credentials
|
credentials_pap &m_cred; ///< EAP-TLS user credentials
|
||||||
|
|
||||||
sanitizing_blob m_packet_res; ///< Response packet
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
phase_unknown = -1, ///< Unknown phase
|
phase_unknown = -1, ///< Unknown phase
|
||||||
phase_init = 0, ///< Handshake initialize
|
phase_init = 0, ///< Handshake initialize
|
||||||
|
@ -32,17 +32,16 @@ eap::method_pap::method_pap(_In_ module &module, _In_ config_method_pap &cfg, _I
|
|||||||
m_cred(cred),
|
m_cred(cred),
|
||||||
m_phase(phase_unknown),
|
m_phase(phase_unknown),
|
||||||
m_phase_prev(phase_unknown),
|
m_phase_prev(phase_unknown),
|
||||||
method(module, cfg, cred)
|
method_noneap(module, cfg, cred)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
eap::method_pap::method_pap(_Inout_ method_pap &&other) :
|
eap::method_pap::method_pap(_Inout_ method_pap &&other) :
|
||||||
m_cred ( other.m_cred ),
|
m_cred ( other.m_cred ),
|
||||||
m_packet_res(std::move(other.m_packet_res)),
|
m_phase (std::move(other.m_phase )),
|
||||||
m_phase (std::move(other.m_phase )),
|
m_phase_prev (std::move(other.m_phase_prev)),
|
||||||
m_phase_prev(std::move(other.m_phase_prev)),
|
method_noneap(std::move(other ))
|
||||||
method (std::move(other ))
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,10 +50,9 @@ eap::method_pap& eap::method_pap::operator=(_Inout_ method_pap &&other)
|
|||||||
{
|
{
|
||||||
if (this != std::addressof(other)) {
|
if (this != std::addressof(other)) {
|
||||||
assert(std::addressof(m_cred) == std::addressof(other.m_cred)); // Move method with same credentials only!
|
assert(std::addressof(m_cred) == std::addressof(other.m_cred)); // Move method with same credentials only!
|
||||||
(method&)*this = std::move(other );
|
(method_noneap&)*this = std::move(other );
|
||||||
m_packet_res = std::move(other.m_packet_res);
|
m_phase = std::move(other.m_phase );
|
||||||
m_phase = std::move(other.m_phase );
|
m_phase_prev = std::move(other.m_phase_prev);
|
||||||
m_phase_prev = std::move(other.m_phase_prev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
@ -67,7 +65,7 @@ void eap::method_pap::begin_session(
|
|||||||
_In_ HANDLE hTokenImpersonateUser,
|
_In_ HANDLE hTokenImpersonateUser,
|
||||||
_In_opt_ DWORD dwMaxSendPacketSize)
|
_In_opt_ DWORD dwMaxSendPacketSize)
|
||||||
{
|
{
|
||||||
method::begin_session(dwFlags, pAttributeArray, hTokenImpersonateUser, dwMaxSendPacketSize);
|
method_noneap::begin_session(dwFlags, pAttributeArray, hTokenImpersonateUser, dwMaxSendPacketSize);
|
||||||
|
|
||||||
m_module.log_event(&EAPMETHOD_METHOD_HANDSHAKE_START2, event_data((unsigned int)eap_type_legacy_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;
|
||||||
@ -148,23 +146,6 @@ void eap::method_pap::process_request_packet(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void eap::method_pap::get_response_packet(
|
|
||||||
_Inout_bytecap_(*dwSendPacketSize) void *pSendPacket,
|
|
||||||
_Inout_ DWORD *pdwSendPacketSize)
|
|
||||||
{
|
|
||||||
assert(pdwSendPacketSize);
|
|
||||||
assert(pSendPacket);
|
|
||||||
|
|
||||||
size_t size_packet = m_packet_res.size();
|
|
||||||
if (size_packet > *pdwSendPacketSize)
|
|
||||||
throw invalid_argument(string_printf(__FUNCTION__ " This method does not support packet fragmentation, but the data size is too big to fit in one packet (packet: %u, maximum: %u).", size_packet, *pdwSendPacketSize).c_str());
|
|
||||||
|
|
||||||
memcpy(pSendPacket, m_packet_res.data(), size_packet);
|
|
||||||
*pdwSendPacketSize = (DWORD)size_packet;
|
|
||||||
m_packet_res.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void eap::method_pap::get_result(
|
void eap::method_pap::get_result(
|
||||||
_In_ EapPeerMethodResultReason reason,
|
_In_ EapPeerMethodResultReason reason,
|
||||||
_Inout_ EapPeerMethodResult *ppResult)
|
_Inout_ EapPeerMethodResult *ppResult)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user