diff --git a/.gitignore b/.gitignore
index 39021c37..3a2bb0db 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
/*.opensdf
/*.suo
/*.sdf
+/doc
/ipch
diff --git a/CredWrite/CredWrite.props b/CredWrite/CredWrite.props
index b20e0cda..2a3442e2 100644
--- a/CredWrite/CredWrite.props
+++ b/CredWrite/CredWrite.props
@@ -7,8 +7,7 @@
- ..\EAPMethods\EAPMethodEvents\temp\EAPMethodEvents.$(Platform).$(Configuration).$(PlatformToolset);..\lib\WinStd\include;%(AdditionalIncludeDirectories)
- EAPMETHOD_TYPE=0;%(PreprocessorDefinitions)
+ ..\lib\Events\build\temp\Events.$(Platform).$(Configuration).$(PlatformToolset);..\lib\WinStd\include;%(AdditionalIncludeDirectories)
diff --git a/CredWrite/CredWrite.rc b/CredWrite/CredWrite.rc
index 3b5e8ac7..5e0e0259 100644
Binary files a/CredWrite/CredWrite.rc and b/CredWrite/CredWrite.rc differ
diff --git a/CredWrite/CredWrite.vcxproj b/CredWrite/CredWrite.vcxproj
index d7397912..a95ec396 100644
--- a/CredWrite/CredWrite.vcxproj
+++ b/CredWrite/CredWrite.vcxproj
@@ -86,8 +86,6 @@
-
-
Create
@@ -100,9 +98,15 @@
-
+
+ {ad6816a0-9600-4e01-8c49-39d03d1e791f}
+
+
{d63f24bd-92a0-4d6b-8b69-ed947e4d2b1b}
+
+ {36b0cf8a-7794-46c3-8099-825ba962b4c7}
+
{47399d91-7eb9-41de-b521-514ba5db0c43}
diff --git a/CredWrite/CredWrite.vcxproj.filters b/CredWrite/CredWrite.vcxproj.filters
index d59c8f14..21c5de5d 100644
--- a/CredWrite/CredWrite.vcxproj.filters
+++ b/CredWrite/CredWrite.vcxproj.filters
@@ -26,12 +26,6 @@
Source Files
-
- Source Files
-
-
- Source Files
-
diff --git a/CredWrite/Main.cpp b/CredWrite/Main.cpp
index c1544d70..a5809980 100644
--- a/CredWrite/Main.cpp
+++ b/CredWrite/Main.cpp
@@ -20,12 +20,10 @@
#include "StdAfx.h"
-#pragma comment(lib, "Crypt32.lib")
-
using namespace std;
using namespace winstd;
-eap::module g_module;
+eap::module g_module(eap::type_undefined);
static int CredWrite()
diff --git a/CredWrite/StdAfx.h b/CredWrite/StdAfx.h
index 810573e6..33ee1450 100644
--- a/CredWrite/StdAfx.h
+++ b/CredWrite/StdAfx.h
@@ -20,17 +20,30 @@
#pragma once
-#include "../include/Version.h"
-
-#include "../EAPMethods/include/EAP.h"
-#include "../EAPMethods/include/PAP.h"
+#include "../lib/PAP/include/Credentials.h"
+#include "../lib/EAPBase/include/Module.h"
+#include
#include
-#include
-#include
#include
-#include
#include
+#include // Must include after
+#include
#include
+
+//#include "../include/Version.h"
+//
+//#include "../EAPMethods/include/EAP.h"
+//#include "../EAPMethods/include/PAP.h"
+//
+//#include
+//#include
+//#include
+//#include
+//
+//#include
+//#include
+//
+//#include
diff --git a/EAPMethods/Doxyfile b/Doxyfile
similarity index 97%
rename from EAPMethods/Doxyfile
rename to Doxyfile
index 9a2bda5d..68af5859 100644
--- a/EAPMethods/Doxyfile
+++ b/Doxyfile
@@ -1,4 +1,4 @@
-# Doxyfile 1.8.7
+# Doxyfile 1.8.7
# This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project.
@@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8
# title of most generated pages and in a few other places.
# The default value is: My Project.
-PROJECT_NAME = "EAPModules"
+PROJECT_NAME = "GÉANTLink"
# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
# could be handy for archiving the generated documentation or if some version
@@ -44,7 +44,7 @@ PROJECT_NUMBER =
# for a project that appears at the top of each page and should give viewer a
# quick idea about the purpose of the project. Keep the description short.
-PROJECT_BRIEF = "EAP Modules"
+PROJECT_BRIEF = "EAP Supplicant for Windows"
# With the PROJECT_LOGO tag one can specify an logo or icon that is included in
# the documentation. The maximum height of the logo should not exceed 55 pixels
@@ -718,7 +718,7 @@ WARN_IF_UNDOCUMENTED = YES
# markup commands wrongly.
# The default value is: YES.
-WARN_IF_DOC_ERROR = YES
+WARN_IF_DOC_ERROR = NO
# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
# are documented, but have no documentation for their parameters or return
@@ -726,7 +726,7 @@ WARN_IF_DOC_ERROR = YES
# documentation, but not about the absence of documentation.
# The default value is: NO.
-WARN_NO_PARAMDOC = NO
+WARN_NO_PARAMDOC = YES
# The WARN_FORMAT tag determines the format of the warning messages that doxygen
# can produce. The string should contain the $file, $line, and $text tags, which
@@ -789,7 +789,11 @@ RECURSIVE = YES
# Note that relative paths are relative to the directory from which doxygen is
# run.
-EXCLUDE = res
+EXCLUDE = \
+ lib\EAPBase_UI\res \
+ lib\TLS_UI\res \
+ lib\TTLS_UI\res \
+ lib\WinStd
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
diff --git a/EAPMethods/.gitignore b/EAPMethods/.gitignore
deleted file mode 100644
index 5df58667..00000000
--- a/EAPMethods/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/doc
diff --git a/EAPMethods/EAPMethodEvents/EAPMethodEvents.props b/EAPMethods/EAPMethodEvents/EAPMethodEvents.props
deleted file mode 100644
index 2dcbd893..00000000
--- a/EAPMethods/EAPMethodEvents/EAPMethodEvents.props
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/EAPMethods/EAPTTLS/EAPTTLS.rc b/EAPMethods/EAPTTLS/EAPTTLS.rc
index 8d0ff957..5a67fc9e 100644
Binary files a/EAPMethods/EAPTTLS/EAPTTLS.rc and b/EAPMethods/EAPTTLS/EAPTTLS.rc differ
diff --git a/EAPMethods/EAPTTLS/EAPTTLS.vcxproj b/EAPMethods/EAPTTLS/EAPTTLS.vcxproj
index e0a9c94e..7b4d7426 100644
--- a/EAPMethods/EAPTTLS/EAPTTLS.vcxproj
+++ b/EAPMethods/EAPTTLS/EAPTTLS.vcxproj
@@ -79,20 +79,10 @@
-
-
-
-
-
-
-
-
-
-
Create
Create
@@ -104,12 +94,24 @@
-
- {47399d91-7eb9-41de-b521-514ba5db0c43}
+
+ {ad6816a0-9600-4e01-8c49-39d03d1e791f}
-
+
{d63f24bd-92a0-4d6b-8b69-ed947e4d2b1b}
+
+ {36b0cf8a-7794-46c3-8099-825ba962b4c7}
+
+
+ {4d40cb8a-812e-4f12-b23a-31af743878e8}
+
+
+ {ee0ef0d9-a475-4038-8637-5754724f65b0}
+
+
+ {47399d91-7eb9-41de-b521-514ba5db0c43}
+
diff --git a/EAPMethods/EAPTTLS/EAPTTLS.vcxproj.filters b/EAPMethods/EAPTTLS/EAPTTLS.vcxproj.filters
index 63595775..c8b78e03 100644
--- a/EAPMethods/EAPTTLS/EAPTTLS.vcxproj.filters
+++ b/EAPMethods/EAPTTLS/EAPTTLS.vcxproj.filters
@@ -18,24 +18,6 @@
Header Files
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
@@ -44,18 +26,6 @@
Source Files
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
diff --git a/EAPMethods/EAPTTLS/StdAfx.h b/EAPMethods/EAPTTLS/StdAfx.h
index 061f3745..5cb56715 100644
--- a/EAPMethods/EAPTTLS/StdAfx.h
+++ b/EAPMethods/EAPTTLS/StdAfx.h
@@ -20,31 +20,5 @@
#pragma once
-#include "../../include/Version.h"
-
-#include "../include/EAP.h"
-#include "../include/EAPSerial.h"
-#include "../include/TLS.h"
-#include "../include/TTLS.h"
-#include "../include/EAPXML.h"
-#include "../include/PAP.h"
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-
-#include
-
-#pragma comment(lib, "Crypt32.lib")
+#include "../../lib/TTLS/include/Module.h"
+#include "../../lib/TTLS/include/Session.h"
diff --git a/EAPMethods/EAPTTLSUI/EAPTTLSUI.rc b/EAPMethods/EAPTTLSUI/EAPTTLSUI.rc
index 3a7ae39e..5a664cf4 100644
Binary files a/EAPMethods/EAPTTLSUI/EAPTTLSUI.rc and b/EAPMethods/EAPTTLSUI/EAPTTLSUI.rc differ
diff --git a/EAPMethods/EAPTTLSUI/EAPTTLSUI.vcxproj b/EAPMethods/EAPTTLSUI/EAPTTLSUI.vcxproj
index f886e91d..fa44721b 100644
--- a/EAPMethods/EAPTTLSUI/EAPTTLSUI.vcxproj
+++ b/EAPMethods/EAPTTLSUI/EAPTTLSUI.vcxproj
@@ -79,33 +79,10 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Create
Create
@@ -117,18 +94,39 @@
-
- {47399d91-7eb9-41de-b521-514ba5db0c43}
+
+ {ad6816a0-9600-4e01-8c49-39d03d1e791f}
+
+
+ {d4b54856-be1f-4937-a8f7-495125be76be}
-
+
{d63f24bd-92a0-4d6b-8b69-ed947e4d2b1b}
+
+ {36b0cf8a-7794-46c3-8099-825ba962b4c7}
+
+
+ {3d309c2e-64ab-4bc4-a16d-468571a2bc1a}
+
+
+ {4d40cb8a-812e-4f12-b23a-31af743878e8}
+
+
+ {9a25c261-8ade-4938-8393-e857ef0e37e9}
+
+
+ {ee0ef0d9-a475-4038-8637-5754724f65b0}
+
+
+ {42f0f0f4-c928-4860-a4e4-94991c2c3d90}
+
+
+ {47399d91-7eb9-41de-b521-514ba5db0c43}
+
-
-
-
diff --git a/EAPMethods/EAPTTLSUI/EAPTTLSUI.vcxproj.filters b/EAPMethods/EAPTTLSUI/EAPTTLSUI.vcxproj.filters
index 07f53281..38ad857f 100644
--- a/EAPMethods/EAPTTLSUI/EAPTTLSUI.vcxproj.filters
+++ b/EAPMethods/EAPTTLSUI/EAPTTLSUI.vcxproj.filters
@@ -13,97 +13,19 @@
{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
- {51f0404d-9280-4fcc-8138-5d1f815ce568}
-
-
- {9befee7a-5dff-41dd-b080-4e26ccb19a7f}
-
-
- {0ec1840b-101c-415a-91c6-2c7eb4530c15}
-
Header Files
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files\wx
-
-
- Header Files\wx
-
-
- Header Files\wx
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
-
- Header Files
-
Source Files
-
- Source Files
-
-
- Source Files\wx
-
-
- Source Files\wx
-
-
- Source Files\wx
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
-
- Source Files
-
Source Files
-
- Source Files
-
@@ -114,14 +36,5 @@
Source Files
-
- Resource Files\wx
-
-
- Resource Files\wx
-
-
- Resource Files\wx
-
\ No newline at end of file
diff --git a/EAPMethods/EAPTTLSUI/StdAfx.h b/EAPMethods/EAPTTLSUI/StdAfx.h
index aeba08bd..7e63e6f7 100644
--- a/EAPMethods/EAPTTLSUI/StdAfx.h
+++ b/EAPMethods/EAPTTLSUI/StdAfx.h
@@ -18,48 +18,6 @@
along with GÉANTLink. If not, see .
*/
-#define _CRT_SECURE_NO_WARNINGS
-
#pragma once
-#include "../../include/Version.h"
-
-#include "../include/EAP.h"
-#include "../include/EAP_UI.h"
-#include "../include/EAPSerial.h"
-#include "../include/EAPXML.h"
-#include "../include/TLS.h"
-#include "../include/TLS_UI.h"
-#include "../include/TTLS.h"
-#include "../include/TTLS_UI.h"
-#include "../include/PAP.h"
-#include "../include/PAP_UI.h"
-
-#include "../res/wxTLS_UI.h"
-#include "../res/wxTTLS_UI.h"
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-
-#pragma comment(lib, "Crypt32.lib")
+#include "../../lib/TTLS_UI/include/Module.h"
diff --git a/EAPMethods/MSIBuild/Makefile b/EAPMethods/MSIBuild/Makefile
index 5c19d7ef..f5c59026 100644
Binary files a/EAPMethods/MSIBuild/Makefile and b/EAPMethods/MSIBuild/Makefile differ
diff --git a/EAPMethods/build/Common.props b/EAPMethods/build/Common.props
index 028593da..1754f6fa 100644
--- a/EAPMethods/build/Common.props
+++ b/EAPMethods/build/Common.props
@@ -8,11 +8,8 @@
- $(ProjectDir);..\EAPMethodEvents\temp\EAPMethodEvents.$(Platform).$(Configuration).$(PlatformToolset);..\include;..\..\lib\WinStd\include;%(AdditionalIncludeDirectories)
+ $(ProjectDir);..\..\lib\Events\build\temp\Events.$(Platform).$(Configuration).$(PlatformToolset);..\include;..\..\lib\WinStd\include;%(AdditionalIncludeDirectories)
-
- temp\EAPMethodEvents.$(Platform).$(Configuration).$(PlatformToolset);%(AdditionalIncludeDirectories)
-
\ No newline at end of file
diff --git a/EAPMethods/include/EAP.h b/EAPMethods/include/EAP.h
deleted file mode 100644
index 55b90c53..00000000
--- a/EAPMethods/include/EAP.h
+++ /dev/null
@@ -1,1583 +0,0 @@
-/*
- Copyright 2015-2016 Amebis
- Copyright 2016 GÉANT
-
- This file is part of GÉANTLink.
-
- GÉANTLink is free software: you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- GÉANTLink is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GÉANTLink. If not, see .
-*/
-
-#define IDR_EAP_KEY_PUBLIC 1
-#define IDR_EAP_KEY_PRIVATE 2
-
-#if !defined(RC_INVOKED) && !defined(MIDL_PASS)
-
-#include
-#include
-#include
-#include
-
-#include
-extern "C" {
-#include
-}
-
-#include
-#include
-#include
-#include
-
-#include
-#include "EAPSerial.h"
-#include "EAPXML.h"
-
-
-namespace eap
-{
- enum type_t;
-
- class session;
-
- class config;
- class config_method;
- template class config_provider;
- template class config_providers;
- typedef config_method config_pass;
-
- class credentials;
- class credentials_pass;
-
- class module;
- template class peer_base;
- template class peer;
-}
-
-namespace eapserial
-{
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_method &val);
- inline size_t get_pk_size(const eap::config_method &val);
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_method &val);
-
- template inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_provider<_Tmeth> &val);
- template inline size_t get_pk_size(const eap::config_provider<_Tmeth> &val);
- template inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_provider<_Tmeth> &val);
-
- template inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_providers<_Tprov> &val);
- template inline size_t get_pk_size(const eap::config_providers<_Tprov> &val);
- template inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_providers<_Tprov> &val);
-
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::credentials &val);
- inline size_t get_pk_size(const eap::credentials &val);
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::credentials &val);
-
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::credentials_pass &val);
- inline size_t get_pk_size(const eap::credentials_pass &val);
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::credentials_pass &val);
-}
-
-#pragma once
-
-
-#define ETW_ERROR(kw, f, ...) m_ep.write(TRACE_LEVEL_ERROR , kw, _T(__FUNCTION__) _T(" ") f, ##__VA_ARGS__)
-#define ETW_WARNING(kw, f, ...) m_ep.write(TRACE_LEVEL_WARNING , kw, _T(__FUNCTION__) _T(" ") f, ##__VA_ARGS__)
-#define ETW_INFO(kw, f, ...) m_ep.write(TRACE_LEVEL_INFORMATION, kw, _T(__FUNCTION__) _T(" ") f, ##__VA_ARGS__)
-#define ETW_VERBOSE(kw, f, ...) m_ep.write(TRACE_LEVEL_VERBOSE , kw, _T(__FUNCTION__) _T(" ") f, ##__VA_ARGS__)
-#define ETW_FN_VOID winstd::event_fn_auto < &EAPMETHOD_TRACE_EVT_FN_CALL, &EAPMETHOD_TRACE_EVT_FN_RETURN > _event_auto(m_ep, __FUNCTION__)
-#define ETW_FN_DWORD(res) winstd::event_fn_auto_ret _event_auto(m_ep, __FUNCTION__, res)
-#define ETW_FN_HRESULT(res) winstd::event_fn_auto_ret _event_auto(m_ep, __FUNCTION__, res)
-
-
-namespace eap
-{
- ///
- /// EAP method numbers
- ///
- /// \sa [Extensible Authentication Protocol (EAP) Registry (Chapter: Method Types)](https://www.iana.org/assignments/eap-numbers/eap-numbers.xhtml#eap-numbers-4)
- ///
- enum type_t {
- type_tls = 13,
- type_ttls = 21,
- type_peap = 25,
- type_mschapv2 = 26,
- type_pap = 192, // Not actually an EAP method (moved to the Unassigned area)
- };
-
-
- ///
- /// EAP session
- ///
- class session
- {
- public:
- ///
- /// Constructs a session
- ///
- session();
-
- ///
- /// Destructs the session
- ///
- virtual ~session();
-
- /// \name Session start/end
- /// @{
-
- ///
- /// Starts an EAP authentication session on the peer EAPHost using the EAP method.
- ///
- /// \sa [EapPeerBeginSession function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363600.aspx)
- ///
- virtual DWORD begin(
- _In_ DWORD dwFlags,
- _In_ const EapAttributes *pAttributeArray,
- _In_ HANDLE hTokenImpersonateUser,
- _In_ DWORD dwConnectionDataSize,
- _In_count_(dwConnectionDataSize) const BYTE *pConnectionData,
- _In_ DWORD dwUserDataSize,
- _In_count_(dwUserDataSize) const BYTE *pUserData,
- _In_ DWORD dwMaxSendPacketSize,
- _Out_ EAP_ERROR **ppEapError);
-
- ///
- /// Ends an EAP authentication session for the EAP method.
- ///
- /// \sa [EapPeerEndSession function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363604.aspx)
- ///
- virtual DWORD end(_Out_ EAP_ERROR **ppEapError);
-
- /// @}
-
- /// \name Packet processing
- /// @{
-
- ///
- /// Processes a packet received by EAPHost from a supplicant.
- ///
- /// \sa [EapPeerProcessRequestPacket function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363621.aspx)
- ///
- virtual DWORD process_request_packet(
- _In_ DWORD dwReceivedPacketSize,
- _In_bytecount_(dwReceivedPacketSize) const EapPacket *pReceivedPacket,
- _Out_ EapPeerMethodOutput *pEapOutput,
- _Out_ EAP_ERROR **ppEapError);
-
- ///
- /// Obtains a response packet from the EAP method.
- ///
- /// \sa [EapPeerGetResponsePacket function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363610.aspx)
- ///
- virtual DWORD get_response_packet(
- _Inout_ DWORD *pdwSendPacketSize,
- _Inout_bytecap_(*dwSendPacketSize) EapPacket *pSendPacket,
- _Out_ EAP_ERROR **ppEapError);
-
- ///
- /// Obtains the result of an authentication session from the EAP method.
- ///
- /// \sa [EapPeerGetResult function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363611.aspx)
- ///
- virtual DWORD get_result(_In_ EapPeerMethodResultReason reason, _Out_ EapPeerMethodResult *ppResult, _Out_ EAP_ERROR **ppEapError);
-
- /// @}
-
- /// \name UI interaction
- /// @{
-
- ///
- /// Obtains the user interface context from the EAP method.
- ///
- /// \note This function is always followed by the `EapPeerInvokeInteractiveUI()` function, which is followed by the `EapPeerSetUIContext()` function.
- ///
- /// \sa [EapPeerGetUIContext function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363612.aspx)
- ///
- virtual DWORD get_ui_context(
- _Out_ DWORD *pdwUIContextDataSize,
- _Out_ BYTE **ppUIContextData,
- _Out_ EAP_ERROR **ppEapError);
-
- ///
- /// Provides a user interface context to the EAP method.
- ///
- /// \note This function is called after the UI has been raised through the `EapPeerGetUIContext()` function.
- ///
- /// \sa [EapPeerSetUIContext function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363626.aspx)
- ///
- virtual DWORD set_ui_context(
- _In_ DWORD dwUIContextDataSize,
- _In_count_(dwUIContextDataSize) const BYTE *pUIContextData,
- _In_ const EapPeerMethodOutput *pEapOutput,
- _Out_ EAP_ERROR **ppEapError);
-
- /// @}
-
- /// \name Response attributes
- /// @{
-
- ///
- /// Obtains an array of EAP response attributes from the EAP method.
- ///
- /// \sa [EapPeerGetResponseAttributes function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363609.aspx)
- ///
- virtual DWORD get_response_attributes(_Out_ EapAttributes *pAttribs, _Out_ EAP_ERROR **ppEapError);
-
- ///
- /// Provides an updated array of EAP response attributes to the EAP method.
- ///
- /// \sa [EapPeerSetResponseAttributes function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363625.aspx)
- ///
- virtual DWORD set_response_attributes(const _In_ EapAttributes *pAttribs, _Out_ EapPeerMethodOutput *pEapOutput, _Out_ EAP_ERROR **ppEapError);
-
- /// @}
- };
-
-
- ///
- /// Base class for configuration storage
- ///
- class config
- {
- public:
- ///
- /// Constructs configuration
- ///
- /// \param[in] mod Reference of the EAP module to use for global services
- ///
- config(_In_ module &mod);
-
- ///
- /// Copies configuration
- ///
- /// \param[in] other Configuration to copy from
- ///
- config(_In_ const config &other);
-
- ///
- /// Moves configuration
- ///
- /// \param[in] other Configuration to move from
- ///
- config(_Inout_ config &&other);
-
- ///
- /// Destructs configuration
- ///
- virtual ~config();
-
- ///
- /// Copies configuration
- ///
- /// \param[in] other Configuration to copy from
- ///
- /// \returns Reference to this object
- ///
- config& operator=(_In_ const config &other);
-
- ///
- /// Moves configuration
- ///
- /// \param[in] other Configuration to move from
- ///
- /// \returns Reference to this object
- ///
- config& operator=(_Inout_ config &&other);
-
- ///
- /// Clones this configuration
- ///
- /// \returns Pointer to cloned configuration
- ///
- virtual config* clone() const = 0;
-
- /// \name XML configuration management
- /// @{
-
- ///
- /// Save configuration to XML document
- ///
- /// \param[in] pDoc XML document
- /// \param[in] pConfigRoot Suggested root element for saving configuration
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const = 0;
-
- ///
- /// Load configuration from XML document
- ///
- /// \param[in] pConfigRoot Root element for loading configuration
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) = 0;
-
- /// @}
-
- public:
- module &m_module; ///< Reference of the EAP module
- };
-
-
- ///
- /// Base class for method configuration storage
- ///
- class config_method : public config
- {
- public:
- ///
- /// Constructs configuration
- ///
- /// \param[in] mod Reference of the EAP module to use for global services
- ///
- config_method(_In_ module &mod);
-
- ///
- /// Copies configuration
- ///
- /// \param[in] other Configuration to copy from
- ///
- config_method(_In_ const config_method &other);
-
- ///
- /// Moves configuration
- ///
- /// \param[in] other Configuration to move from
- ///
- config_method(_Inout_ config_method &&other);
-
- ///
- /// Copies configuration
- ///
- /// \param[in] other Configuration to copy from
- ///
- /// \returns Reference to this object
- ///
- config_method& operator=(_In_ const config_method &other);
-
- ///
- /// Moves configuration
- ///
- /// \param[in] other Configuration to move from
- ///
- /// \returns Reference to this object
- ///
- config_method& operator=(_Inout_ config_method &&other);
-
- /// \name XML configuration management
- /// @{
-
- ///
- /// Save configuration to XML document
- ///
- /// \param[in] pDoc XML document
- /// \param[in] pConfigRoot Suggested root element for saving configuration
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const;
-
- ///
- /// Load configuration from XML document
- ///
- /// \param[in] pConfigRoot Root element for loading configuration
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError);
-
- /// @}
-
- ///
- /// Returns EAP method type of this configuration
- ///
- /// \returns One of `eap::type_t` constants.
- ///
- virtual type_t get_method_id() = 0;
-
- public:
- bool m_allow_save; ///< Are credentials allowed to be saved to Windows Credential Manager?
- std::wstring m_anonymous_identity; ///< Anonymous identity
- };
-
-
- ///
- /// Provider configuration
- ///
- template
- class config_provider : public config
- {
- public:
- ///
- /// Constructs configuration
- ///
- /// \param[in] mod Reference of the EAP module to use for global services
- ///
- config_provider(_In_ module &mod) : config(mod)
- {
- }
-
- ///
- /// Copies configuration
- ///
- /// \param[in] other Configuration to copy from
- ///
- config_provider(_In_ const config_provider &other) :
- m_id(other.m_id),
- m_lbl_alt_credential(other.m_lbl_alt_credential),
- m_lbl_alt_identity(other.m_lbl_alt_identity),
- m_lbl_alt_password(other.m_lbl_alt_password),
- m_methods(other.m_methods),
- config(other)
- {
- }
-
- ///
- /// Moves configuration
- ///
- /// \param[in] other Configuration to move from
- ///
- config_provider(_Inout_ config_provider &&other) :
- m_id(std::move(other.m_id)),
- m_lbl_alt_credential(std::move(other.m_lbl_alt_credential)),
- m_lbl_alt_identity(std::move(other.m_lbl_alt_identity)),
- m_lbl_alt_password(std::move(other.m_lbl_alt_password)),
- m_methods(std::move(other.m_methods)),
- config(std::move(other))
- {
- }
-
- ///
- /// Copies configuration
- ///
- /// \param[in] other Configuration to copy from
- ///
- /// \returns Reference to this object
- ///
- config_provider& operator=(_In_ const config_provider &other)
- {
- if (this != &other) {
- (config&)*this = other;
- m_id = other.m_id;
- m_lbl_alt_credential = other.m_lbl_alt_credential;
- m_lbl_alt_identity = other.m_lbl_alt_identity;
- m_lbl_alt_password = other.m_lbl_alt_password;
- m_methods = other.m_methods;
- }
-
- return *this;
- }
-
- ///
- /// Moves configuration
- ///
- /// \param[in] other Configuration to move from
- ///
- /// \returns Reference to this object
- ///
- config_provider& operator=(_Inout_ config_provider &&other)
- {
- if (this != &other) {
- (config&&)*this = std::move(other);
- m_id = std::move(other.m_id);
- m_lbl_alt_credential = std::move(other.m_lbl_alt_credential);
- m_lbl_alt_identity = std::move(other.m_lbl_alt_identity);
- m_lbl_alt_password = std::move(other.m_lbl_alt_password);
- m_methods = std::move(other.m_methods);
- }
-
- return *this;
- }
-
- ///
- /// Clones configuration
- ///
- /// \returns Pointer to cloned configuration
- ///
- virtual config* clone() const { return new config_provider<_Tmeth>(*this); }
-
- /// \name XML configuration management
- /// @{
-
- ///
- /// Save configuration to XML document
- ///
- /// \param[in] pDoc XML document
- /// \param[in] pConfigRoot Suggested root element for saving configuration
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const
- {
- const winstd::bstr bstrNamespace(L"urn:ietf:params:xml:ns:yang:ietf-eap-metadata");
- DWORD dwResult;
- HRESULT hr;
-
- //
- if (!m_id.empty())
- if ((dwResult = eapxml::put_element_value(pDoc, pConfigRoot, winstd::bstr(L"ID"), bstrNamespace, winstd::bstr(m_id))) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
- return dwResult;
- }
-
- //
- winstd::com_obj pXmlElProviderInfo;
- if ((dwResult = eapxml::create_element(pDoc, pConfigRoot, winstd::bstr(L"eap-metadata:ProviderInfo"), winstd::bstr(L"ProviderInfo"), bstrNamespace, &pXmlElProviderInfo)) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
- return dwResult;
- }
-
- // /
- if (!m_lbl_alt_credential.empty())
- if ((dwResult = eapxml::put_element_value(pDoc, pXmlElProviderInfo, winstd::bstr(L"CredentialPrompt"), bstrNamespace, winstd::bstr(m_lbl_alt_credential))) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
- return dwResult;
- }
-
- // /
- if (!m_lbl_alt_identity.empty())
- if ((dwResult = eapxml::put_element_value(pDoc, pXmlElProviderInfo, winstd::bstr(L"UserNameLabel"), bstrNamespace, winstd::bstr(m_lbl_alt_identity))) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
- return dwResult;
- }
-
- // /
- if (!m_lbl_alt_password.empty())
- if ((dwResult = eapxml::put_element_value(pDoc, pXmlElProviderInfo, winstd::bstr(L"PasswordLabel"), bstrNamespace, winstd::bstr(m_lbl_alt_password))) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
- return dwResult;
- }
-
- //
- winstd::com_obj pXmlElAuthenticationMethods;
- if ((dwResult = eapxml::create_element(pDoc, pConfigRoot, winstd::bstr(L"eap-metadata:AuthenticationMethods"), winstd::bstr(L"AuthenticationMethods"), bstrNamespace, &pXmlElAuthenticationMethods)) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
- return dwResult;
- }
-
- for (std::list<_Tmeth>::const_iterator method = m_methods.cbegin(), method_end = m_methods.cend(); method != method_end; ++method) {
- //
- winstd::com_obj pXmlElAuthenticationMethod;
- if ((dwResult = eapxml::create_element(pDoc, winstd::bstr(L"AuthenticationMethod"), bstrNamespace, &pXmlElAuthenticationMethod))) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
- return dwResult;
- }
-
- // /...
- if ((dwResult = method->save(pDoc, pXmlElAuthenticationMethod, ppEapError)) != ERROR_SUCCESS)
- return dwResult;
-
- if (FAILED(hr = pXmlElAuthenticationMethods->appendChild(pXmlElAuthenticationMethod, NULL))) {
- *ppEapError = m_module.make_error(dwResult = HRESULT_CODE(hr), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error appending element."), NULL);
- return dwResult;
- }
- }
-
- return dwResult;
- }
-
-
- ///
- /// Load configuration from XML document
- ///
- /// \param[in] pConfigRoot Root element for loading configuration
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError)
- {
- assert(pConfigRoot);
- assert(ppEapError);
- DWORD dwResult;
- std::wstring lang;
- LoadString(m_module.m_instance, 2, lang);
-
- //
- m_id.clear();
- eapxml::get_element_value(pConfigRoot, winstd::bstr(L"eap-metadata:ID"), m_id);
-
- //
- m_lbl_alt_credential.clear();
- m_lbl_alt_identity.clear();
- m_lbl_alt_password.clear();
- winstd::com_obj pXmlElProviderInfo;
- if (eapxml::select_element(pConfigRoot, winstd::bstr(L"eap-metadata:ProviderInfo"), &pXmlElProviderInfo) == ERROR_SUCCESS) {
- //
- eapxml::get_element_localized(pXmlElProviderInfo, winstd::bstr(L"eap-metadata:CredentialPrompt"), lang.c_str(), m_lbl_alt_credential);
-
- //
- eapxml::get_element_localized(pXmlElProviderInfo, winstd::bstr(L"eap-metadata:UserNameLabel"), lang.c_str(), m_lbl_alt_identity);
-
- //
- eapxml::get_element_localized(pXmlElProviderInfo, winstd::bstr(L"eap-metadata:PasswordLabel"), lang.c_str(), m_lbl_alt_password);
- }
-
- // Iterate authentication methods ().
- m_methods.clear();
- winstd::com_obj pXmlListMethods;
- if ((dwResult = eapxml::select_nodes(pConfigRoot, winstd::bstr(L"eap-metadata:AuthenticationMethods/eap-metadata:AuthenticationMethod"), &pXmlListMethods)) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult = ERROR_NOT_FOUND, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error selecting / elements."), NULL);
- return dwResult;
- }
- long lCount = 0;
- pXmlListMethods->get_length(&lCount);
- for (long i = 0; i < lCount; i++) {
- winstd::com_obj pXmlElMethod;
- pXmlListMethods->get_item(i, &pXmlElMethod);
-
- _Tmeth cfg(m_module);
-
- // Check EAP method type ().
- DWORD dwMethodID;
- if (eapxml::get_element_value(pXmlElMethod, winstd::bstr(L"eap-metadata:EAPMethod"), &dwMethodID) == ERROR_SUCCESS) {
- if ((type_t)dwMethodID != cfg.get_method_id()) {
- // Wrong type.
- continue;
- }
- }
-
- // Load configuration.
- dwResult = cfg.load(pXmlElMethod, ppEapError);
- if (dwResult != ERROR_SUCCESS)
- return dwResult;
-
- // Add configuration to the list.
- m_methods.push_back(std::move(cfg));
- }
-
- return ERROR_SUCCESS;
- }
-
- /// @}
-
- public:
- std::wstring m_id; ///< Profile ID
- winstd::tstring m_lbl_alt_credential; ///< Alternative label for credential prompt
- winstd::tstring m_lbl_alt_identity; ///< Alternative label for identity prompt
- winstd::tstring m_lbl_alt_password; ///< Alternative label for password prompt
- std::list<_Tmeth> m_methods; ///< List of method configurations
- };
-
-
- ///
- /// Providers configuration
- ///
- template
- class config_providers : public config
- {
- public:
- ///
- /// Constructs configuration
- ///
- /// \param[in] mod Reference of the EAP module to use for global services
- ///
- config_providers(_In_ module &mod) : config(mod)
- {
- }
-
- ///
- /// Copies configuration
- ///
- /// \param[in] other Configuration to copy from
- ///
- config_providers(_In_ const config_providers &other) :
- m_providers(other.m_providers),
- config(other)
- {
- }
-
- ///
- /// Moves configuration
- ///
- /// \param[in] other Configuration to move from
- ///
- config_providers(_Inout_ config_providers &&other) :
- m_providers(std::move(other.m_providers)),
- config(std::move(other))
- {
- }
-
- ///
- /// Copies configuration
- ///
- /// \param[in] other Configuration to copy from
- ///
- /// \returns Reference to this object
- ///
- config_providers& operator=(_In_ const config_providers &other)
- {
- if (this != &other) {
- (config&)*this = other;
- m_providers = other.m_providers;
- }
-
- return *this;
- }
-
- ///
- /// Moves configuration
- ///
- /// \param[in] other Configuration to move from
- ///
- /// \returns Reference to this object
- ///
- config_providers& operator=(_Inout_ config_providers &&other)
- {
- if (this != &other) {
- (config&&)*this = std::move(other);
- m_providers = std::move(other.m_providers);
- }
-
- return *this;
- }
-
- ///
- /// Clones configuration
- ///
- /// \returns Pointer to cloned configuration
- ///
- virtual config* clone() const { return new config_providers<_Tprov>(*this); }
-
- /// \name XML configuration management
- /// @{
-
- ///
- /// Save configuration to XML document
- ///
- /// \param[in] pDoc XML document
- /// \param[in] pConfigRoot Suggested root element for saving configuration
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const
- {
- const winstd::bstr bstrNamespace(L"urn:ietf:params:xml:ns:yang:ietf-eap-metadata");
- DWORD dwResult;
- HRESULT hr;
-
- // Select node.
- winstd::com_obj pXmlElIdentityProviderList;
- if ((dwResult = eapxml::select_node(pConfigRoot, winstd::bstr(L"eap-metadata:EAPIdentityProviderList"), &pXmlElIdentityProviderList)) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult = ERROR_NOT_FOUND, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error selecting element."), NULL);
- return dwResult;
- }
-
- for (std::list<_Tprov>::const_iterator provider = m_providers.cbegin(), provider_end = m_providers.cend(); provider != provider_end; ++provider) {
- //
- winstd::com_obj pXmlElIdentityProvider;
- if ((dwResult = eapxml::create_element(pDoc, winstd::bstr(L"EAPIdentityProvider"), bstrNamespace, &pXmlElIdentityProvider))) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
- return dwResult;
- }
-
- // /...
- if ((dwResult = provider->save(pDoc, pXmlElIdentityProvider, ppEapError)) != ERROR_SUCCESS)
- return dwResult;
-
- if (FAILED(hr = pXmlElIdentityProviderList->appendChild(pXmlElIdentityProvider, NULL))) {
- *ppEapError = m_module.make_error(dwResult = HRESULT_CODE(hr), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error appending element."), NULL);
- return dwResult;
- }
- }
-
- return dwResult;
- }
-
-
- ///
- /// Load configuration from XML document
- ///
- /// \param[in] pConfigRoot Root element for loading configuration
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError)
- {
- assert(pConfigRoot);
- assert(ppEapError);
- DWORD dwResult;
-
- // Iterate authentication providers ().
- winstd::com_obj pXmlListProviders;
- if ((dwResult = eapxml::select_nodes(pConfigRoot, winstd::bstr(L"eap-metadata:EAPIdentityProviderList/eap-metadata:EAPIdentityProvider"), &pXmlListProviders)) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult = ERROR_NOT_FOUND, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error selecting elements."), NULL);
- return dwResult;
- }
- long lCount = 0;
- pXmlListProviders->get_length(&lCount);
- for (long i = 0; i < lCount; i++) {
- winstd::com_obj pXmlElProvider;
- pXmlListProviders->get_item(i, &pXmlElProvider);
-
- _Tprov prov(m_module);
-
- // Load provider.
- dwResult = prov.load(pXmlElProvider, ppEapError);
- if (dwResult != ERROR_SUCCESS)
- return dwResult;
-
- // Add provider to the list.
- m_providers.push_back(std::move(prov));
- }
-
- return dwResult;
- }
-
- /// @}
-
- public:
- std::list<_Tprov> m_providers; ///< List of provider configurations
- };
-
-
- ///
- /// Base class for method credential storage
- ///
- class credentials : public config
- {
- public:
- ///
- /// Constructs credentials
- ///
- /// \param[in] mod Reference of the EAP module to use for global services
- ///
- credentials(_In_ module &mod);
-
- ///
- /// Copies credentials
- ///
- /// \param[in] other Credentials to copy from
- ///
- credentials(_In_ const credentials &other);
-
- ///
- /// Moves credentials
- ///
- /// \param[in] other Credentials to move from
- ///
- credentials(_Inout_ credentials &&other);
-
- ///
- /// Copies credentials
- ///
- /// \param[in] other Credentials to copy from
- ///
- /// \returns Reference to this object
- ///
- credentials& operator=(_In_ const credentials &other);
-
- ///
- /// Moves credentials
- ///
- /// \param[in] other Configuration to move from
- ///
- /// \returns Reference to this object
- ///
- credentials& operator=(_Inout_ credentials &&other);
-
- ///
- /// Resets credentials
- ///
- virtual void clear();
-
- ///
- /// Test credentials if blank
- ///
- virtual bool empty() const;
-
- /// \name XML credentials management
- /// @{
-
- ///
- /// Save credentials to XML document
- ///
- /// \param[in] pDoc XML document
- /// \param[in] pConfigRoot Suggested root element for saving credentials
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns Always returns \c ERROR_NOT_SUPPORTED, as credentials are non-exportable.
- ///
- virtual DWORD save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const;
-
- /// @}
-
- /// \name Storage
- /// @{
-
- ///
- /// Save credentials to Windows Credential Manager
- ///
- /// \param[in] pszTargetName The name in Windows Credential Manager to store credentials as
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD store(_In_ LPCTSTR pszTargetName, _Out_ EAP_ERROR **ppEapError) const = 0;
-
- ///
- /// Retrieve credentials from Windows Credential Manager
- ///
- /// \param[in] pszTargetName The name in Windows Credential Manager to retrieve credentials from
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD retrieve(_In_ LPCTSTR pszTargetName, _Out_ EAP_ERROR **ppEapError) = 0;
-
- ///
- /// Return target suffix for Windows Credential Manager credential name
- ///
- virtual LPCTSTR target_suffix() const = 0;
-
- ///
- /// Returns target name for Windows Credential Manager credential name
- ///
- /// \param[in] pszTargetName The name in Windows Credential Manager to retrieve credentials from
- ///
- /// \returns Final target name to store/retrieve credentials in Windows Credential Manager
- ///
- inline winstd::tstring target_name(_In_ LPCTSTR pszTargetName) const
- {
- winstd::tstring target_name(_T(PRODUCT_NAME_STR) _T("/"));
- target_name += pszTargetName;
- target_name += _T('/');
- target_name += target_suffix();
- assert(target_name.length() < CRED_MAX_GENERIC_TARGET_NAME_LENGTH);
- return target_name;
- }
-
- /// @}
-
- public:
- std::wstring m_identity; ///< Identity (username\@domain, certificate name etc.)
- };
-
-
- ///
- /// Password based method credentials
- ///
- class credentials_pass : public credentials
- {
- public:
- ///
- /// Constructs credentials
- ///
- /// \param[in] mod Reference of the EAP module to use for global services
- ///
- credentials_pass(_In_ module &mod);
-
- ///
- /// Copies credentials
- ///
- /// \param[in] other Credentials to copy from
- ///
- credentials_pass(_In_ const credentials_pass &other);
-
- ///
- /// Moves credentials
- ///
- /// \param[in] other Credentials to move from
- ///
- credentials_pass(_Inout_ credentials_pass &&other);
-
- ///
- /// Copies credentials
- ///
- /// \param[in] other Credentials to copy from
- ///
- /// \returns Reference to this object
- ///
- credentials_pass& operator=(_In_ const credentials_pass &other);
-
- ///
- /// Moves credentials
- ///
- /// \param[in] other Credentials to move from
- ///
- /// \returns Reference to this object
- ///
- credentials_pass& operator=(_Inout_ credentials_pass &&other);
-
- ///
- /// Resets credentials
- ///
- virtual void clear();
-
- ///
- /// Test credentials if blank
- ///
- virtual bool empty() const;
-
- /// \name XML configuration management
- /// @{
-
- ///
- /// Load credentials from XML document
- ///
- /// \param[in] pConfigRoot Root element for loading credentials
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError);
-
- /// @}
-
- /// \name Storage
- /// @{
-
- ///
- /// Save credentials to Windows Credential Manager
- ///
- /// \param[in] pszTargetName The name in Windows Credential Manager to store credentials as
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD store(_In_ LPCTSTR pszTargetName, _Out_ EAP_ERROR **ppEapError) const;
-
- ///
- /// Retrieve credentials from Windows Credential Manager
- ///
- /// \param[in] pszTargetName The name in Windows Credential Manager to retrieve credentials from
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD retrieve(_In_ LPCTSTR pszTargetName, _Out_ EAP_ERROR **ppEapError);
-
- /// @}
-
- public:
- winstd::sanitizing_wstring m_password; ///< Password
- };
-
-
- ///
- /// EAP module base class
- ///
- /// Provides basic services to EAP methods.
- ///
- class module
- {
- public:
- module();
- virtual ~module();
-
- ///
- /// Allocate a EAP_ERROR and fill it according to dwErrorCode
- ///
- EAP_ERROR* make_error(_In_ DWORD dwErrorCode, _In_ DWORD dwReasonCode, _In_ LPCGUID pRootCauseGuid, _In_ LPCGUID pRepairGuid, _In_ LPCGUID pHelpLinkGuid, _In_z_ LPCWSTR pszRootCauseString, _In_z_ LPCWSTR pszRepairString) const;
-
- ///
- /// Allocate BLOB
- ///
- BYTE* alloc_memory(_In_ size_t size);
-
- ///
- /// Free BLOB allocated with this peer
- ///
- void free_memory(_In_ BYTE *ptr);
-
- ///
- /// Free EAP_ERROR allocated with `make_error()` method
- ///
- void free_error_memory(_In_ EAP_ERROR *err);
-
- public:
- HINSTANCE m_instance; ///< Windows module instance
-
- protected:
- winstd::heap m_heap; ///< Heap
- mutable winstd::event_provider m_ep; ///< Event Provider
- };
-
-
- ///
- /// EAP peer base class
- ///
- /// A group of methods all EAP peers must or should implement.
- ///
- template
- class peer_base : public module
- {
- public:
- ///
- /// Configuration data type
- ///
- typedef config_providers > config_type;
-
- ///
- /// Identity data type
- ///
- typedef _Tid identity_type;
-
- ///
- /// Interactive request data type
- ///
- typedef _Tint interactive_request_type;
-
- ///
- /// Interactive response data type
- ///
- typedef _Tintres interactive_response_type;
-
- public:
- ///
- /// Constructor
- ///
- peer_base() : module() {}
- };
-
-
- ///
- /// EAP peer base class
- ///
- /// A group of methods all EAP peers must or should implement.
- ///
- template
- class peer : public peer_base<_Tcfg, _Tid, _Tint, _Tintres>
- {
- public:
- peer() : peer_base<_Tcfg, _Tid, _Tint, _Tintres>() {}
-
- ///
- /// Initializes an EAP peer method for EAPHost.
- ///
- /// \sa [EapPeerGetInfo function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363613.aspx)
- ///
- virtual DWORD initialize(_Out_ EAP_ERROR **ppEapError) = 0;
-
- ///
- /// Shuts down the EAP method and prepares to unload its corresponding DLL.
- ///
- /// \sa [EapPeerShutdown function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363627.aspx)
- ///
- virtual DWORD shutdown(_Out_ EAP_ERROR **ppEapError) = 0;
-
- ///
- /// Returns the user data and user identity after being called by EAPHost.
- ///
- /// \sa [EapPeerGetIdentity function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363607.aspx)
- ///
- virtual DWORD get_identity(
- _In_ DWORD dwFlags,
- _In_ DWORD dwConnectionDataSize,
- _In_count_(dwConnectionDataSize) const BYTE *pConnectionData,
- _In_ DWORD dwUserDataSize,
- _In_count_(dwUserDataSize) const BYTE *pUserData,
- _In_ HANDLE hTokenImpersonateUser,
- _Out_ BOOL *pfInvokeUI,
- _Out_ DWORD *pdwUserDataOutSize,
- _Out_ BYTE **ppUserDataOut,
- _Out_ WCHAR **ppwszIdentity,
- _Out_ EAP_ERROR **ppEapError) = 0;
-
- ///
- /// Defines the implementation of an EAP method-specific function that retrieves the properties of an EAP method given the connection and user data.
- ///
- /// \sa [EapPeerGetMethodProperties function](https://msdn.microsoft.com/en-us/library/windows/desktop/hh706636.aspx)
- ///
- virtual DWORD get_method_properties(
- _In_ DWORD dwVersion,
- _In_ DWORD dwFlags,
- _In_ HANDLE hUserImpersonationToken,
- _In_ DWORD dwEapConnDataSize,
- _In_count_(dwEapConnDataSize) const BYTE *pEapConnData,
- _In_ DWORD dwUserDataSize,
- _In_count_(dwUserDataSize) const BYTE *pUserData,
- _Out_ EAP_METHOD_PROPERTY_ARRAY *pMethodPropertyArray,
- _Out_ EAP_ERROR **ppEapError) const = 0;
-
- ///
- /// Defines the implementation of an EAP method-specific function that obtains the EAP Single-Sign-On (SSO) credential input fields for an EAP method.
- ///
- /// \sa [EapPeerQueryCredentialInputFields function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363622.aspx)
- ///
- virtual DWORD query_credential_input_fields(
- _In_ HANDLE hUserImpersonationToken,
- _In_ DWORD dwFlags,
- _In_ DWORD dwEapConnDataSize,
- _In_count_(dwEapConnDataSize) const BYTE *pEapConnData,
- _Out_ EAP_CONFIG_INPUT_FIELD_ARRAY *pEapConfigInputFieldsArray,
- _Out_ EAP_ERROR **ppEapError) const
- {
- UNREFERENCED_PARAMETER(hUserImpersonationToken);
- UNREFERENCED_PARAMETER(dwFlags);
- UNREFERENCED_PARAMETER(dwEapConnDataSize);
- UNREFERENCED_PARAMETER(pEapConnData);
- UNREFERENCED_PARAMETER(pEapConfigInputFieldsArray);
- UNREFERENCED_PARAMETER(ppEapError);
-
- DWORD dwResult = ERROR_NOT_SUPPORTED;
- ETW_FN_DWORD(dwResult);
- return dwResult;
- }
-
- ///
- /// Defines the implementation of an EAP method function that obtains the user BLOB data provided in an interactive Single-Sign-On (SSO) UI raised on the supplicant.
- ///
- /// \sa [EapPeerQueryUserBlobFromCredentialInputFields function](https://msdn.microsoft.com/en-us/library/windows/desktop/bb204697.aspx)
- ///
- virtual DWORD query_user_blob_from_credential_input_fields(
- _In_ HANDLE hUserImpersonationToken,
- _In_ DWORD dwFlags,
- _In_ DWORD dwEapConnDataSize,
- _In_count_(dwEapConnDataSize) const BYTE *pEapConnData,
- _In_ const EAP_CONFIG_INPUT_FIELD_ARRAY *pEapConfigInputFieldArray,
- _Inout_ DWORD *pdwUsersBlobSize,
- _Inout_ BYTE **ppUserBlob,
- _Out_ EAP_ERROR **ppEapError) const
- {
- UNREFERENCED_PARAMETER(hUserImpersonationToken);
- UNREFERENCED_PARAMETER(dwFlags);
- UNREFERENCED_PARAMETER(dwEapConnDataSize);
- UNREFERENCED_PARAMETER(pEapConnData);
- UNREFERENCED_PARAMETER(pEapConfigInputFieldArray);
- UNREFERENCED_PARAMETER(pdwUsersBlobSize);
- UNREFERENCED_PARAMETER(ppUserBlob);
- UNREFERENCED_PARAMETER(ppEapError);
-
- DWORD dwResult = ERROR_NOT_SUPPORTED;
- ETW_FN_DWORD(dwResult);
- return dwResult;
- }
-
- ///
- /// Defines the implementation of an EAP method API that provides the input fields for interactive UI components to be raised on the supplicant.
- ///
- /// \sa [EapPeerQueryInteractiveUIInputFields function](https://msdn.microsoft.com/en-us/library/windows/desktop/bb204695.aspx)
- ///
- virtual DWORD query_interactive_ui_input_fields(
- _In_ DWORD dwVersion,
- _In_ DWORD dwFlags,
- _In_ DWORD dwUIContextDataSize,
- _In_count_(dwUIContextDataSize) const BYTE *pUIContextData,
- _Out_ EAP_INTERACTIVE_UI_DATA *pEapInteractiveUIData,
- _Out_ EAP_ERROR **ppEapError,
- _Inout_ LPVOID *pvReserved) const
- {
- UNREFERENCED_PARAMETER(dwVersion);
- UNREFERENCED_PARAMETER(dwFlags);
- UNREFERENCED_PARAMETER(dwUIContextDataSize);
- UNREFERENCED_PARAMETER(pUIContextData);
- UNREFERENCED_PARAMETER(pEapInteractiveUIData);
- UNREFERENCED_PARAMETER(ppEapError);
- UNREFERENCED_PARAMETER(pvReserved);
-
- DWORD dwResult = ERROR_NOT_SUPPORTED;
- ETW_FN_DWORD(dwResult);
- return dwResult;
- }
-
- ///
- /// Converts user information into a user BLOB that can be consumed by EAPHost run-time functions.
- ///
- /// \sa [EapPeerQueryUIBlobFromInteractiveUIInputFields function](https://msdn.microsoft.com/en-us/library/windows/desktop/bb204696.aspx)
- ///
- virtual DWORD query_ui_blob_from_interactive_ui_input_fields(
- _In_ DWORD dwVersion,
- _In_ DWORD dwFlags,
- _In_ DWORD dwUIContextDataSize,
- _In_count_(dwUIContextDataSize) const BYTE *pUIContextData,
- _In_ const EAP_INTERACTIVE_UI_DATA *pEapInteractiveUIData,
- _Out_ DWORD *pdwDataFromInteractiveUISize,
- _Out_ BYTE **ppDataFromInteractiveUI,
- _Out_ EAP_ERROR **ppEapError,
- _Inout_ LPVOID *ppvReserved) const
- {
- UNREFERENCED_PARAMETER(dwVersion);
- UNREFERENCED_PARAMETER(dwFlags);
- UNREFERENCED_PARAMETER(dwUIContextDataSize);
- UNREFERENCED_PARAMETER(pUIContextData);
- UNREFERENCED_PARAMETER(pEapInteractiveUIData);
- UNREFERENCED_PARAMETER(pdwDataFromInteractiveUISize);
- UNREFERENCED_PARAMETER(ppDataFromInteractiveUI);
- UNREFERENCED_PARAMETER(ppEapError);
- UNREFERENCED_PARAMETER(ppvReserved);
-
- DWORD dwResult = ERROR_NOT_SUPPORTED;
- ETW_FN_DWORD(dwResult);
- return dwResult;
- }
- };
-}
-
-
-namespace eapserial
-{
- ///
- /// Packs a method configuration
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[in] val Configuration to pack
- ///
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_method &val)
- {
- pack(cursor, val.m_allow_save );
- pack(cursor, val.m_anonymous_identity);
- }
-
-
- ///
- /// Returns packed size of a method configuration
- ///
- /// \param[in] val Configuration to pack
- ///
- /// \returns Size of data when packed (in bytes)
- ///
- inline size_t get_pk_size(const eap::config_method &val)
- {
- return
- get_pk_size(val.m_allow_save ) +
- get_pk_size(val.m_anonymous_identity);
- }
-
-
- ///
- /// Unpacks a method configuration
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[out] val Configuration to unpack to
- ///
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_method &val)
- {
- unpack(cursor, val.m_allow_save );
- unpack(cursor, val.m_anonymous_identity);
- }
-
-
- ///
- /// Packs a provider configuration
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[in] val Configuration to pack
- ///
- template
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_provider<_Tmeth> &val)
- {
- pack(cursor, val.m_id );
- pack(cursor, val.m_lbl_alt_credential);
- pack(cursor, val.m_lbl_alt_identity );
- pack(cursor, val.m_lbl_alt_password );
- pack(cursor, val.m_methods );
- }
-
-
- ///
- /// Returns packed size of a provider configuration
- ///
- /// \param[in] val Configuration to pack
- ///
- /// \returns Size of data when packed (in bytes)
- ///
- template
- inline size_t get_pk_size(const eap::config_provider<_Tmeth> &val)
- {
- return
- get_pk_size(val.m_id ) +
- get_pk_size(val.m_lbl_alt_credential) +
- get_pk_size(val.m_lbl_alt_identity ) +
- get_pk_size(val.m_lbl_alt_password ) +
- get_pk_size(val.m_methods );
- }
-
-
- ///
- /// Unpacks a provider configuration
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[out] val Configuration to unpack to
- ///
- template
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_provider<_Tmeth> &val)
- {
- unpack(cursor, val.m_id );
- unpack(cursor, val.m_lbl_alt_credential);
- unpack(cursor, val.m_lbl_alt_identity );
- unpack(cursor, val.m_lbl_alt_password );
-
- std::list<_Tmeth>::size_type count = *(const std::list<_Tmeth>::size_type*&)cursor;
- cursor += sizeof(std::list<_Tmeth>::size_type);
- val.m_methods.clear();
- for (std::list<_Tmeth>::size_type i = 0; i < count; i++) {
- _Tmeth el(val.m_module);
- unpack(cursor, el);
- val.m_methods.push_back(std::move(el));
- }
- }
-
-
- ///
- /// Packs a providers configuration
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[in] val Configuration to pack
- ///
- template
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_providers<_Tprov> &val)
- {
- pack(cursor, val.m_providers);
- }
-
-
- ///
- /// Returns packed size of a providers configuration
- ///
- /// \param[in] val Configuration to pack
- ///
- /// \returns Size of data when packed (in bytes)
- ///
- template
- inline size_t get_pk_size(const eap::config_providers<_Tprov> &val)
- {
- return get_pk_size(val.m_providers);
- }
-
-
- ///
- /// Unpacks a providers configuration
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[out] val Configuration to unpack to
- ///
- template
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_providers<_Tprov> &val)
- {
- std::list<_Tprov>::size_type count = *(const std::list<_Tprov>::size_type*&)cursor;
- cursor += sizeof(std::list<_Tprov>::size_type);
- val.m_providers.clear();
- for (std::list<_Tprov>::size_type i = 0; i < count; i++) {
- _Tprov el(val.m_module);
- unpack(cursor, el);
- val.m_providers.push_back(std::move(el));
- }
- }
-
-
- ///
- /// Packs a method credentials
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[in] val Credentials to pack
- ///
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::credentials &val)
- {
- pack(cursor, (const eap::config&)val);
- pack(cursor, val.m_identity );
- }
-
-
- ///
- /// Returns packed size of a method credentials
- ///
- /// \param[in] val Credentials to pack
- ///
- /// \returns Size of data when packed (in bytes)
- ///
- inline size_t get_pk_size(const eap::credentials &val)
- {
- return
- get_pk_size((const eap::config&)val) +
- get_pk_size(val.m_identity );
- }
-
-
- ///
- /// Unpacks a method credentials
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[out] val Credentials to unpack to
- ///
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::credentials &val)
- {
- unpack(cursor, (eap::config&)val);
- unpack(cursor, val.m_identity );
- }
-
-
- ///
- /// Packs a password based method credentials
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[in] val Credentials to pack
- ///
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::credentials_pass &val)
- {
- pack(cursor, (const eap::credentials&)val);
- pack(cursor, val.m_password );
- }
-
-
- ///
- /// Returns packed size of a password based method credentials
- ///
- /// \param[in] val Credentials to pack
- ///
- /// \returns Size of data when packed (in bytes)
- ///
- inline size_t get_pk_size(const eap::credentials_pass &val)
- {
- return
- get_pk_size((const eap::credentials&)val) +
- get_pk_size(val.m_password );
- }
-
-
- ///
- /// Unpacks a password based method credentials
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[out] val Credentials to unpack to
- ///
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::credentials_pass &val)
- {
- unpack(cursor, (eap::credentials&)val);
- unpack(cursor, val.m_password );
- }
-}
-
-#endif
diff --git a/EAPMethods/include/TTLS.h b/EAPMethods/include/TTLS.h
deleted file mode 100644
index 0ba3fb2b..00000000
--- a/EAPMethods/include/TTLS.h
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- Copyright 2015-2016 Amebis
- Copyright 2016 GÉANT
-
- This file is part of GÉANTLink.
-
- GÉANTLink is free software: you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- GÉANTLink is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GÉANTLink. If not, see .
-*/
-
-#include "EAP.h"
-#include "EAPSerial.h"
-#include "TLS.h"
-#include "PAP.h"
-
-#include
-
-
-namespace eap
-{
- class config_ttls;
- class credentials_ttls;
- class session_ttls;
- class peer_ttls;
-}
-
-namespace eapserial
-{
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_ttls &val);
- inline size_t get_pk_size(const eap::config_ttls &val);
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_ttls &val);
-}
-
-#pragma once
-
-
-namespace eap
-{
- ///
- /// TTLS configuration
- ///
- class config_ttls : public config_tls
- {
- public:
- ///
- /// Constructs configuration
- ///
- /// \param[in] mod Reference of the EAP module to use for global services
- ///
- config_ttls(_In_ module &mod);
-
- ///
- /// Copies configuration
- ///
- /// \param[in] other Configuration to copy from
- ///
- config_ttls(const _In_ config_ttls &other);
-
- ///
- /// Moves configuration
- ///
- /// \param[in] other Configuration to move from
- ///
- config_ttls(_Inout_ config_ttls &&other);
-
- ///
- /// Destructs configuration
- ///
- virtual ~config_ttls();
-
- ///
- /// Copies configuration
- ///
- /// \param[in] other Configuration to copy from
- ///
- /// \returns Reference to this object
- ///
- config_ttls& operator=(const _In_ config_ttls &other);
-
- ///
- /// Moves configuration
- ///
- /// \param[in] other Configuration to move from
- ///
- /// \returns Reference to this object
- ///
- config_ttls& operator=(_Inout_ config_ttls &&other);
-
- ///
- /// Clones configuration
- ///
- /// \returns Pointer to cloned configuration
- ///
- virtual config* clone() const { return new config_ttls(*this); }
-
- /// \name XML configuration management
- /// @{
-
- ///
- /// Save configuration to XML document
- ///
- /// \param[in] pDoc XML document
- /// \param[in] pConfigRoot Suggested root element for saving configuration
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const;
-
- ///
- /// Load configuration from XML document
- ///
- /// \param[in] pConfigRoot Root element for loading configuration
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError);
-
- /// @}
-
- ///
- /// Returns EAP method type of this configuration
- ///
- /// \returns `eap::type_ttls`
- ///
- virtual eap::type_t get_method_id() { return eap::type_ttls; }
-
- public:
- config_method *m_inner; ///< Inner authentication configuration
- };
-
-
- ///
- /// TTLS credentials
- ///
- class credentials_ttls : public credentials_tls
- {
- public:
- ///
- /// Constructs credentials
- ///
- /// \param[in] mod Reference of the EAP module to use for global services
- ///
- credentials_ttls(_In_ module &mod);
-
- ///
- /// Copies credentials
- ///
- /// \param[in] other Credentials to copy from
- ///
- credentials_ttls(_In_ const credentials_ttls &other);
-
- ///
- /// Moves credentials
- ///
- /// \param[in] other Credentials to move from
- ///
- credentials_ttls(_Inout_ credentials_ttls &&other);
-
- ///
- /// Copies credentials
- ///
- /// \param[in] other Credentials to copy from
- ///
- /// \returns Reference to this object
- ///
- credentials_ttls& operator=(_In_ const credentials_ttls &other);
-
- ///
- /// Moves credentials
- ///
- /// \param[in] other Credentials to move from
- ///
- /// \returns Reference to this object
- ///
- credentials_ttls& operator=(_Inout_ credentials_ttls &&other);
-
- ///
- /// Clones credentials
- ///
- /// \returns Pointer to cloned credentials
- ///
- virtual config* clone() const { return new credentials_ttls(*this); }
-
- ///
- /// Resets credentials
- ///
- virtual void clear();
-
- ///
- /// Test credentials if blank
- ///
- virtual bool empty() const;
-
- /// \name XML credentials management
- /// @{
-
- ///
- /// Load credentials from XML document
- ///
- /// \param[in] pConfigRoot Root element for loading credentials
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError);
-
- /// @}
-
- /// \name Storage
- /// @{
-
- ///
- /// Save credentials to Windows Credential Manager
- ///
- /// \param[in] pszTargetName The name in Windows Credential Manager to store credentials as
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD store(_In_ LPCTSTR pszTargetName, _Out_ EAP_ERROR **ppEapError) const;
-
- ///
- /// Retrieve credentials from Windows Credential Manager
- ///
- /// \param[in] pszTargetName The name in Windows Credential Manager to retrieve credentials from
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
- ///
- /// \returns
- /// - \c ERROR_SUCCESS if succeeded
- /// - error code otherwise
- ///
- virtual DWORD retrieve(_In_ LPCTSTR pszTargetName, _Out_ EAP_ERROR **ppEapError);
-
- /// @}
-
- public:
- credentials *m_inner; ///< Inner credentials
- };
-
-
- ///
- /// TTLS session
- ///
- class session_ttls : public session
- {
- public:
- ///
- /// Constructor
- ///
- session_ttls();
- };
-
-
- ///
- /// TTLS peer
- ///
- class peer_ttls : public peer
- {
- public:
- ///
- /// Constructor
- ///
- peer_ttls();
-
- ///
- /// Initializes an EAP peer method for EAPHost.
- ///
- /// \sa [EapPeerGetInfo function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363613.aspx)
- ///
- virtual DWORD initialize(_Out_ EAP_ERROR **ppEapError);
-
- ///
- /// Shuts down the EAP method and prepares to unload its corresponding DLL.
- ///
- /// \sa [EapPeerShutdown function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363627.aspx)
- ///
- virtual DWORD shutdown(_Out_ EAP_ERROR **ppEapError);
-
- ///
- /// Returns the user data and user identity after being called by EAPHost.
- ///
- /// \sa [EapPeerGetIdentity function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363607.aspx)
- ///
- virtual DWORD get_identity(
- _In_ DWORD dwFlags,
- _In_ DWORD dwConnectionDataSize,
- _In_count_(dwConnectionDataSize) const BYTE *pConnectionData,
- _In_ DWORD dwUserDataSize,
- _In_count_(dwUserDataSize) const BYTE *pUserData,
- _In_ HANDLE hTokenImpersonateUser,
- _Out_ BOOL *pfInvokeUI,
- _Out_ DWORD *pdwUserDataOutSize,
- _Out_ BYTE **ppUserDataOut,
- _Out_ WCHAR **ppwszIdentity,
- _Out_ EAP_ERROR **ppEapError);
-
- ///
- /// Defines the implementation of an EAP method-specific function that retrieves the properties of an EAP method given the connection and user data.
- ///
- /// \sa [EapPeerGetMethodProperties function](https://msdn.microsoft.com/en-us/library/windows/desktop/hh706636.aspx)
- ///
- virtual DWORD get_method_properties(
- _In_ DWORD dwVersion,
- _In_ DWORD dwFlags,
- _In_ HANDLE hUserImpersonationToken,
- _In_ DWORD dwEapConnDataSize,
- _In_count_(dwEapConnDataSize) const BYTE *pEapConnData,
- _In_ DWORD dwUserDataSize,
- _In_count_(dwUserDataSize) const BYTE *pUserData,
- _Out_ EAP_METHOD_PROPERTY_ARRAY *pMethodPropertyArray,
- _Out_ EAP_ERROR **ppEapError) const;
- };
-}
-
-
-namespace eapserial
-{
- ///
- /// Packs a TTLS based method configuration
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[in] val Configuration to pack
- ///
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_ttls &val)
- {
- pack(cursor, (const eap::config_tls&)val);
- if (val.m_inner) {
- if (dynamic_cast(val.m_inner)) {
- pack(cursor, (unsigned char)eap::type_pap);
- pack(cursor, (const eap::config_pap&)*val.m_inner);
- } else {
- assert(0); // Unsupported inner authentication method type.
- pack(cursor, (unsigned char)0);
- }
- } else
- pack(cursor, (unsigned char)0);
- }
-
-
- ///
- /// Returns packed size of a TTLS based method configuration
- ///
- /// \param[in] val Configuration to pack
- ///
- /// \returns Size of data when packed (in bytes)
- ///
- inline size_t get_pk_size(const eap::config_ttls &val)
- {
- size_t size_inner = sizeof(unsigned char);
- if (val.m_inner) {
- if (dynamic_cast(val.m_inner))
- size_inner += get_pk_size((const eap::config_pap&)*val.m_inner);
- else
- assert(0); // Unsupported inner authentication method type.
- }
-
- return
- get_pk_size((const eap::config_tls&)val) +
- size_inner;
- }
-
-
- ///
- /// Unpacks a TTLS based method configuration
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[out] val Configuration to unpack to
- ///
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_ttls &val)
- {
- unpack(cursor, (eap::config_tls&)val);
-
- assert(!val.m_inner);
- unsigned char eap_type;
- unpack(cursor, eap_type);
- switch (eap_type) {
- case eap::type_pap:
- val.m_inner = new eap::config_pap(val.m_module);
- unpack(cursor, (eap::config_pap&)*val.m_inner);
- break;
- case 0 : break;
- default : assert(0); // Unsupported inner authentication method type.
- }
- }
-}
diff --git a/EAPMethods/locale/EAPMethods.pot b/EAPMethods/locale/EAPMethods.pot
index 0085aa5d..4961da6a 100644
--- a/EAPMethods/locale/EAPMethods.pot
+++ b/EAPMethods/locale/EAPMethods.pot
@@ -2,7 +2,7 @@
msgid ""
msgstr ""
"Project-Id-Version: EAPMethods\n"
-"POT-Creation-Date: 2016-06-09 15:19+0200\n"
+"POT-Creation-Date: 2016-06-10 12:06+0200\n"
"PO-Revision-Date: 2016-06-02 12:27+0200\n"
"Last-Translator: Simon Rozman \n"
"Language-Team: Amebis, d. o. o., Kamnik \n"
@@ -10,295 +10,332 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.8\n"
-"X-Poedit-Basepath: ..\n"
+"X-Poedit-Basepath: ../..\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Language: en_US\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: _\n"
-"X-Poedit-SearchPath-0: res\n"
-"X-Poedit-SearchPath-1: MSIBuild\n"
-"X-Poedit-SearchPath-2: src\n"
-"X-Poedit-SearchPath-3: include\n"
+"X-Poedit-SearchPath-0: lib/EAPBase_UI\n"
+"X-Poedit-SearchPath-1: lib/PAP_UI\n"
+"X-Poedit-SearchPath-2: lib/TLS_UI\n"
+"X-Poedit-SearchPath-3: lib/TTLS_UI\n"
+"X-Poedit-SearchPath-4: EAPMethods\n"
-#: res/wxEAP_UI.cpp:123 res/wxEAP_UI.cpp:200
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:123 lib/EAPBase_UI/res/wxEAP_UI.cpp:200
msgid "Client Credentials"
msgstr ""
-#: res/wxEAP_UI.cpp:134
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:134
msgid "Manage your credentials stored in Windows Credential Manager."
msgstr ""
-#: res/wxEAP_UI.cpp:144
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:144
msgid "Identity:"
msgstr ""
-#: res/wxEAP_UI.cpp:149
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:149
msgid "Enter your user name here (user@domain.org, DOMAINUser, etc.)"
msgstr ""
-#: res/wxEAP_UI.cpp:159
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:159
msgid "&Set Credentials..."
msgstr ""
-#: res/wxEAP_UI.cpp:160
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:160
msgid "Click here to set or modify your credentials"
msgstr ""
-#: res/wxEAP_UI.cpp:164
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:164
msgid "&Clear Credentials"
msgstr ""
-#: res/wxEAP_UI.cpp:165
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:165
msgid ""
"Click to clear your credentials from Credential Manager.\n"
"Note: You will be prompted to enter credentials when connecting."
msgstr ""
-#: res/wxEAP_UI.cpp:211
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:211
msgid "Please provide your user ID and password."
msgstr ""
-#: res/wxEAP_UI.cpp:221
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:221
msgid "User ID:"
msgstr ""
-#: res/wxEAP_UI.cpp:226
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:226
msgid "Enter your user name here (user@domain.org, DOMAIN\\User, etc.)"
msgstr ""
-#: res/wxEAP_UI.cpp:230
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:230
msgid "Password:"
msgstr ""
-#: res/wxEAP_UI.cpp:235
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:235
msgid "Enter your password here"
msgstr ""
-#: res/wxEAP_UI.cpp:242 res/wxTLS_UI.cpp:164
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:242 lib/TLS_UI/res/wxTLS_UI.cpp:164
msgid "&Remember"
msgstr ""
-#: res/wxEAP_UI.cpp:243
+#: lib/EAPBase_UI/res/wxEAP_UI.cpp:243
msgid "Check if you would like to save username and password"
msgstr ""
-#: res/wxTLS_UI.cpp:17
+#: lib/PAP_UI/src/PAP_UI.cpp:41
+msgid "This method requires no additional settings."
+msgstr ""
+
+#: lib/TLS_UI/res/wxTLS_UI.cpp:17
msgid "Server Trust"
msgstr ""
-#: res/wxTLS_UI.cpp:28
+#: lib/TLS_UI/res/wxTLS_UI.cpp:28
msgid "Describe the servers you trust to prevent credential interception in case of man-in-the-middle attacks."
msgstr ""
-#: res/wxTLS_UI.cpp:35
+#: lib/TLS_UI/res/wxTLS_UI.cpp:35
msgid "Acceptable Certificate Authorities:"
msgstr ""
-#: res/wxTLS_UI.cpp:40
+#: lib/TLS_UI/res/wxTLS_UI.cpp:40
msgid "List of certificate authorities server's certificate must be issued by"
msgstr ""
-#: res/wxTLS_UI.cpp:47
+#: lib/TLS_UI/res/wxTLS_UI.cpp:47
msgid "Add CA from Store..."
msgstr ""
-#: res/wxTLS_UI.cpp:48
+#: lib/TLS_UI/res/wxTLS_UI.cpp:48
msgid "Adds a new certificate authority from the certificate store to the list"
msgstr ""
-#: res/wxTLS_UI.cpp:52
+#: lib/TLS_UI/res/wxTLS_UI.cpp:52
msgid "Add CA from File..."
msgstr ""
-#: res/wxTLS_UI.cpp:53
+#: lib/TLS_UI/res/wxTLS_UI.cpp:53
msgid "Adds a new certificate authority from the file to the list"
msgstr ""
-#: res/wxTLS_UI.cpp:57
+#: lib/TLS_UI/res/wxTLS_UI.cpp:57
msgid "&Remove CA"
msgstr ""
-#: res/wxTLS_UI.cpp:59
+#: lib/TLS_UI/res/wxTLS_UI.cpp:59
msgid "Removes selected certificate authorities from the list"
msgstr ""
-#: res/wxTLS_UI.cpp:72
+#: lib/TLS_UI/res/wxTLS_UI.cpp:72
msgid "Acceptable server &names:"
msgstr ""
-#: res/wxTLS_UI.cpp:77
+#: lib/TLS_UI/res/wxTLS_UI.cpp:77
msgid "A semicolon delimited list of acceptable server FQDN names; blank to skip name check; \"*\" wildchar allowed"
msgstr ""
-#: res/wxTLS_UI.cpp:81
+#: lib/TLS_UI/res/wxTLS_UI.cpp:81
msgid "(Example: foo.bar.com;*.domain.org)"
msgstr ""
-#: res/wxTLS_UI.cpp:120
+#: lib/TLS_UI/res/wxTLS_UI.cpp:120
msgid "TLS Client Certificate"
msgstr ""
-#: res/wxTLS_UI.cpp:131
+#: lib/TLS_UI/res/wxTLS_UI.cpp:131
msgid "Please select your client certificate to use for authentication."
msgstr ""
-#: res/wxTLS_UI.cpp:138
+#: lib/TLS_UI/res/wxTLS_UI.cpp:138
msgid "Co&nnect without providing a client certificate"
msgstr ""
-#: res/wxTLS_UI.cpp:139
+#: lib/TLS_UI/res/wxTLS_UI.cpp:139
msgid "Select if your server does not require you to provide a client certificate"
msgstr ""
-#: res/wxTLS_UI.cpp:146
+#: lib/TLS_UI/res/wxTLS_UI.cpp:146
msgid "Use the following &certificate:"
msgstr ""
-#: res/wxTLS_UI.cpp:147
+#: lib/TLS_UI/res/wxTLS_UI.cpp:147
msgid "Select if you need to provide a client certificate when connecting"
msgstr ""
-#: res/wxTLS_UI.cpp:154
+#: lib/TLS_UI/res/wxTLS_UI.cpp:154
msgid "Client certificate to use for authentication"
msgstr ""
-#: res/wxTLS_UI.cpp:165
+#: lib/TLS_UI/res/wxTLS_UI.cpp:165
msgid "Check if you would like to save certificate selection"
msgstr ""
-#: res/wxTTLS_UI.cpp:17
-msgid "Outer Identity"
+#: lib/TLS_UI/src/TLS_UI.cpp:199
+#, c-format
+msgid "Invalid character in host name found: %c"
msgstr ""
-#: res/wxTTLS_UI.cpp:28
-msgid "Select the user ID supplicant introduces itself as to authenticator:"
+#: lib/TLS_UI/src/TLS_UI.cpp:199
+msgid "Validation conflict"
msgstr ""
-#: res/wxTTLS_UI.cpp:35
-msgid "&Same as inner identity"
+#: lib/TLS_UI/src/TLS_UI.cpp:551
+msgid "Add Certificate"
msgstr ""
-#: res/wxTTLS_UI.cpp:36
-msgid "Use my true user name"
+#: lib/TLS_UI/src/TLS_UI.cpp:552
+msgid "Certificate Files (*.cer;*.crt;*.der;*.p7b;*.pem)"
msgstr ""
-#: res/wxTTLS_UI.cpp:40
-msgid "Use &empty outer identity (RFC 4822)"
+#: lib/TLS_UI/src/TLS_UI.cpp:553
+msgid "X.509 Certificate Files (*.cer;*.crt;*.der;*.pem)"
msgstr ""
-#: res/wxTTLS_UI.cpp:41
-msgid "Ommit my user name and use @mydomain.org only"
+#: lib/TLS_UI/src/TLS_UI.cpp:554
+msgid "PKCS #7 Certificate Files (*.p7b)"
msgstr ""
-#: res/wxTTLS_UI.cpp:48
-msgid "&Custom outer identity:"
+#: lib/TLS_UI/src/TLS_UI.cpp:555
+msgid "All Files (*.*)"
msgstr ""
-#: res/wxTTLS_UI.cpp:49
-msgid "Specify custom outer identity"
+#: lib/TLS_UI/src/TLS_UI.cpp:571
+#, c-format
+msgid "Invalid or unsupported certificate file %s"
msgstr ""
-#: res/wxTTLS_UI.cpp:54
-msgid "Custom outer identity to use"
-msgstr ""
+#: lib/TLS_UI/src/TLS_UI.cpp:571
+#, fuzzy
+msgid "Error"
+msgstr "Napaka pri nalaganju knjižnice MSI.DLL (%1!ld!)."
-#: src/PAP_UI.cpp:41
-msgid "This method requires no additional settings."
+#: lib/TTLS_UI/res/wxTTLS_UI.cpp:17
+msgid "Outer Identity"
msgstr ""
-#: src/TLS_UI.cpp:198
-#, c-format
-msgid "Invalid character in host name found: %c"
+#: lib/TTLS_UI/res/wxTTLS_UI.cpp:28
+msgid "Select the user ID supplicant introduces itself as to authenticator:"
msgstr ""
-#: src/TLS_UI.cpp:198
-msgid "Validation conflict"
+#: lib/TTLS_UI/res/wxTTLS_UI.cpp:35
+msgid "&Same as inner identity"
msgstr ""
-#: src/TLS_UI.cpp:550
-msgid "Add Certificate"
+#: lib/TTLS_UI/res/wxTTLS_UI.cpp:36
+msgid "Use my true user name"
msgstr ""
-#: src/TLS_UI.cpp:551
-msgid "Certificate Files (*.cer;*.crt;*.der;*.p7b;*.pem)"
+#: lib/TTLS_UI/res/wxTTLS_UI.cpp:40
+msgid "Use &empty outer identity (RFC 4822)"
msgstr ""
-#: src/TLS_UI.cpp:552
-msgid "X.509 Certificate Files (*.cer;*.crt;*.der;*.pem)"
+#: lib/TTLS_UI/res/wxTTLS_UI.cpp:41
+msgid "Ommit my user name and use @mydomain.org only"
msgstr ""
-#: src/TLS_UI.cpp:553
-msgid "PKCS #7 Certificate Files (*.p7b)"
+#: lib/TTLS_UI/res/wxTTLS_UI.cpp:48
+msgid "&Custom outer identity:"
msgstr ""
-#: src/TLS_UI.cpp:554
-msgid "All Files (*.*)"
+#: lib/TTLS_UI/res/wxTTLS_UI.cpp:49
+msgid "Specify custom outer identity"
msgstr ""
-#: src/TLS_UI.cpp:570
-#, c-format
-msgid "Invalid or unsupported certificate file %s"
+#: lib/TTLS_UI/res/wxTTLS_UI.cpp:54
+msgid "Custom outer identity to use"
msgstr ""
-#: src/TLS_UI.cpp:570
-#, fuzzy
-msgid "Error"
-msgstr "Napaka pri nalaganju knjižnice MSI.DLL (%1!ld!)."
-
-#: src/TTLS_UI.cpp:172
+#: lib/TTLS_UI/src/TTLS_UI.cpp:92
msgid "Outer Authentication"
msgstr ""
-#: src/TTLS_UI.cpp:185
+#: lib/TTLS_UI/src/TTLS_UI.cpp:105
msgid "Inner Authentication"
msgstr ""
-#: src/TTLS_UI.cpp:191
+#: lib/TTLS_UI/src/TTLS_UI.cpp:111
msgid "Select inner authentication method from the list"
msgstr ""
-#: src/TTLS_UI.cpp:192
+#: lib/TTLS_UI/src/TTLS_UI.cpp:112
msgid "PAP"
msgstr ""
-#: include/EAP_UI.h:272
+#: lib/EAPBase_UI/include/EAP_UI.h:217
msgid ""
msgstr ""
-#: include/EAP_UI.h:278
+#: lib/EAPBase_UI/include/EAP_UI.h:223
#, c-format
msgid ""
msgstr ""
-#: include/EAP_UI.h:301
+#: lib/EAPBase_UI/include/EAP_UI.h:246
#, c-format
msgid "Deleting credentials failed (error %u)."
msgstr ""
-#: include/EAP_UI.h:358
+#: lib/EAPBase_UI/include/EAP_UI.h:300
#, c-format
msgid "Error reading credentials from Credential Manager: %ls (error %u)"
msgstr ""
-#: include/EAP_UI.h:361
+#: lib/EAPBase_UI/include/EAP_UI.h:303
#, c-format
msgid "Reading credentials failed (error %u)."
msgstr ""
-#: include/EAP_UI.h:376
+#: lib/EAPBase_UI/include/EAP_UI.h:318
#, c-format
msgid "Error writing credentials to Credential Manager: %ls (error %u)"
msgstr ""
-#: include/EAP_UI.h:379
+#: lib/EAPBase_UI/include/EAP_UI.h:321
#, c-format
msgid "Writing credentials failed (error %u)."
msgstr ""
-#: res/wxEAP_UI.h:56
+#: lib/EAPBase_UI/res/wxEAP_UI.h:56
msgid "EAP Method Configuration"
msgstr ""
-#: res/wxEAP_UI.h:81
+#: lib/EAPBase_UI/res/wxEAP_UI.h:81
msgid "EAP Credentials"
msgstr ""
+
+#: EAPMethods/MSIBuild/En.Win32.Debug.Feature-2.idtx:3
+#: EAPMethods/MSIBuild/En.Win32.Release.Feature-2.idtx:3
+#: EAPMethods/MSIBuild/En.x64.Debug.Feature-2.idtx:3
+#: EAPMethods/MSIBuild/En.x64.Release.Feature-2.idtx:3
+#, fuzzy
+msgid "1252"
+msgstr "1250"
+
+#: EAPMethods/MSIBuild/En.Win32.Debug.Feature-2.idtx:4
+#: EAPMethods/MSIBuild/En.Win32.Release.Feature-2.idtx:4
+#: EAPMethods/MSIBuild/En.x64.Debug.Feature-2.idtx:4
+#: EAPMethods/MSIBuild/En.x64.Release.Feature-2.idtx:4
+msgid "EAP Peer Methods"
+msgstr ""
+
+#: EAPMethods/MSIBuild/En.Win32.Debug.Feature-2.idtx:4
+#: EAPMethods/MSIBuild/En.Win32.Release.Feature-2.idtx:4
+#: EAPMethods/MSIBuild/En.x64.Debug.Feature-2.idtx:4
+#: EAPMethods/MSIBuild/En.x64.Release.Feature-2.idtx:4
+msgid "Modules to support individual EAP methods"
+msgstr ""
+
+#: EAPMethods/MSIBuild/En.Win32.Debug.Feature-2.idtx:5
+#: EAPMethods/MSIBuild/En.Win32.Release.Feature-2.idtx:5
+#: EAPMethods/MSIBuild/En.x64.Debug.Feature-2.idtx:5
+#: EAPMethods/MSIBuild/En.x64.Release.Feature-2.idtx:5
+msgid "TTLS"
+msgstr ""
+
+#: EAPMethods/MSIBuild/En.Win32.Debug.Feature-2.idtx:5
+#: EAPMethods/MSIBuild/En.Win32.Release.Feature-2.idtx:5
+#: EAPMethods/MSIBuild/En.x64.Debug.Feature-2.idtx:5
+#: EAPMethods/MSIBuild/En.x64.Release.Feature-2.idtx:5
+msgid "Tunneled Transport Layer Security"
+msgstr ""
diff --git a/EAPMethods/src/EAP.cpp b/EAPMethods/src/EAP.cpp
deleted file mode 100644
index 6fcc8f8e..00000000
--- a/EAPMethods/src/EAP.cpp
+++ /dev/null
@@ -1,727 +0,0 @@
-/*
- Copyright 2015-2016 Amebis
- Copyright 2016 GÉANT
-
- This file is part of GÉANTLink.
-
- GÉANTLink is free software: you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- GÉANTLink is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GÉANTLink. If not, see .
-*/
-
-#include
-
-using namespace std;
-using namespace winstd;
-
-
-//////////////////////////////////////////////////////////////////////
-// eap::session
-//////////////////////////////////////////////////////////////////////
-
-eap::session::session()
-{
-}
-
-
-eap::session::~session()
-{
-}
-
-
-DWORD eap::session::begin(
- _In_ DWORD dwFlags,
- _In_ const EapAttributes *pAttributeArray,
- _In_ HANDLE hTokenImpersonateUser,
- _In_ DWORD dwConnectionDataSize,
- _In_count_(dwConnectionDataSize) const BYTE *pConnectionData,
- _In_ DWORD dwUserDataSize,
- _In_count_(dwUserDataSize) const BYTE *pUserData,
- _In_ DWORD dwMaxSendPacketSize,
- _Out_ EAP_ERROR **ppEapError)
-{
- UNREFERENCED_PARAMETER(dwFlags);
- UNREFERENCED_PARAMETER(pAttributeArray);
- UNREFERENCED_PARAMETER(hTokenImpersonateUser);
- UNREFERENCED_PARAMETER(dwConnectionDataSize);
- UNREFERENCED_PARAMETER(pConnectionData);
- UNREFERENCED_PARAMETER(dwUserDataSize);
- UNREFERENCED_PARAMETER(pUserData);
- UNREFERENCED_PARAMETER(dwMaxSendPacketSize);
- UNREFERENCED_PARAMETER(ppEapError);
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD eap::session::end(_Out_ EAP_ERROR **ppEapError)
-{
- UNREFERENCED_PARAMETER(ppEapError);
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD eap::session::process_request_packet(
- _In_ DWORD dwReceivedPacketSize,
- _In_bytecount_(dwReceivedPacketSize) const EapPacket *pReceivedPacket,
- _Out_ EapPeerMethodOutput *pEapOutput,
- _Out_ EAP_ERROR **ppEapError)
-{
- UNREFERENCED_PARAMETER(dwReceivedPacketSize);
- UNREFERENCED_PARAMETER(pReceivedPacket);
- UNREFERENCED_PARAMETER(pEapOutput);
- UNREFERENCED_PARAMETER(ppEapError);
-
- return ERROR_NOT_SUPPORTED;
-}
-
-
-DWORD eap::session::get_response_packet(
- _Inout_ DWORD *pdwSendPacketSize,
- _Inout_bytecap_(*dwSendPacketSize) EapPacket *pSendPacket,
- _Out_ EAP_ERROR **ppEapError)
-{
- UNREFERENCED_PARAMETER(pdwSendPacketSize);
- UNREFERENCED_PARAMETER(pSendPacket);
- UNREFERENCED_PARAMETER(ppEapError);
-
- return ERROR_NOT_SUPPORTED;
-}
-
-
-DWORD eap::session::get_result(_In_ EapPeerMethodResultReason reason, _Out_ EapPeerMethodResult *ppResult, _Out_ EAP_ERROR **ppEapError)
-{
- UNREFERENCED_PARAMETER(reason);
- UNREFERENCED_PARAMETER(ppResult);
- UNREFERENCED_PARAMETER(ppEapError);
-
- return ERROR_NOT_SUPPORTED;
-}
-
-
-DWORD eap::session::get_ui_context(
- _Out_ DWORD *pdwUIContextDataSize,
- _Out_ BYTE **ppUIContextData,
- _Out_ EAP_ERROR **ppEapError)
-{
- UNREFERENCED_PARAMETER(pdwUIContextDataSize);
- UNREFERENCED_PARAMETER(ppUIContextData);
- UNREFERENCED_PARAMETER(ppEapError);
-
- return ERROR_NOT_SUPPORTED;
-}
-
-
-DWORD eap::session::set_ui_context(
- _In_ DWORD dwUIContextDataSize,
- _In_count_(dwUIContextDataSize) const BYTE *pUIContextData,
- _In_ const EapPeerMethodOutput *pEapOutput,
- _Out_ EAP_ERROR **ppEapError)
-{
- UNREFERENCED_PARAMETER(dwUIContextDataSize);
- UNREFERENCED_PARAMETER(pUIContextData);
- UNREFERENCED_PARAMETER(pEapOutput);
- UNREFERENCED_PARAMETER(ppEapError);
-
- return ERROR_NOT_SUPPORTED;
-}
-
-
-DWORD eap::session::get_response_attributes(_Out_ EapAttributes *pAttribs, _Out_ EAP_ERROR **ppEapError)
-{
- UNREFERENCED_PARAMETER(pAttribs);
- UNREFERENCED_PARAMETER(ppEapError);
-
- return ERROR_NOT_SUPPORTED;
-}
-
-
-DWORD eap::session::set_response_attributes(const _In_ EapAttributes *pAttribs, _Out_ EapPeerMethodOutput *pEapOutput, _Out_ EAP_ERROR **ppEapError)
-{
- UNREFERENCED_PARAMETER(pAttribs);
- UNREFERENCED_PARAMETER(pEapOutput);
- UNREFERENCED_PARAMETER(ppEapError);
-
- return ERROR_NOT_SUPPORTED;
-}
-
-
-//////////////////////////////////////////////////////////////////////
-// eap::config
-//////////////////////////////////////////////////////////////////////
-
-eap::config::config(_In_ module &mod) :
- m_module(mod)
-{
-}
-
-
-eap::config::config(_In_ const config &other) :
- m_module(other.m_module)
-{
-}
-
-
-eap::config::config(_Inout_ config &&other) :
- m_module(other.m_module)
-{
-}
-
-
-eap::config::~config()
-{
-}
-
-
-eap::config& eap::config::operator=(_In_ const config &other)
-{
- UNREFERENCED_PARAMETER(other);
- assert(&m_module == &other.m_module); // Copy configuration within same module only!
- return *this;
-}
-
-
-eap::config& eap::config::operator=(_Inout_ config &&other)
-{
- UNREFERENCED_PARAMETER(other);
- assert(&m_module == &other.m_module); // Copy configuration within same module only!
- return *this;
-}
-
-
-//////////////////////////////////////////////////////////////////////
-// eap::config_method
-//////////////////////////////////////////////////////////////////////
-
-eap::config_method::config_method(_In_ module &mod) :
- m_allow_save(true),
- config(mod)
-{
-}
-
-
-eap::config_method::config_method(_In_ const config_method &other) :
- m_allow_save(other.m_allow_save),
- m_anonymous_identity(other.m_anonymous_identity),
- config(other)
-{
-}
-
-
-eap::config_method::config_method(_Inout_ config_method &&other) :
- m_allow_save(std::move(other.m_allow_save)),
- m_anonymous_identity(std::move(other.m_anonymous_identity)),
- config(std::move(other))
-{
-}
-
-
-eap::config_method& eap::config_method::operator=(_In_ const config_method &other)
-{
- if (this != &other) {
- (config&)*this = other;
- m_allow_save = other.m_allow_save;
- m_anonymous_identity = other.m_anonymous_identity;
- }
-
- return *this;
-}
-
-
-eap::config_method& eap::config_method::operator=(_Inout_ config_method &&other)
-{
- if (this != &other) {
- (config&&)*this = std::move(other);
- m_allow_save = std::move(other.m_allow_save);
- m_anonymous_identity = std::move(other.m_anonymous_identity);
- }
-
- return *this;
-}
-
-
-DWORD eap::config_method::save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const
-{
- const bstr bstrNamespace(L"urn:ietf:params:xml:ns:yang:ietf-eap-metadata");
- DWORD dwResult;
-
- //
- com_obj pXmlElClientSideCredential;
- if ((dwResult = eapxml::create_element(pDoc, pConfigRoot, bstr(L"eap-metadata:ClientSideCredential"), bstr(L"ClientSideCredential"), bstrNamespace, &pXmlElClientSideCredential)) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
- return dwResult;
- }
-
- // /
- if ((dwResult = eapxml::put_element_value(pDoc, pXmlElClientSideCredential, bstr(L"allow-save"), bstrNamespace, m_allow_save)) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
- return dwResult;
- }
-
- // /
- if (!m_anonymous_identity.empty())
- if ((dwResult = eapxml::put_element_value(pDoc, pXmlElClientSideCredential, bstr(L"AnonymousIdentity"), bstrNamespace, bstr(m_anonymous_identity))) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
- return dwResult;
- }
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD eap::config_method::load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError)
-{
- UNREFERENCED_PARAMETER(ppEapError);
-
- m_allow_save = true;
- m_anonymous_identity.clear();
-
- //
- com_obj pXmlElClientSideCredential;
- if (eapxml::select_element(pConfigRoot, bstr(L"eap-metadata:ClientSideCredential"), &pXmlElClientSideCredential) == ERROR_SUCCESS) {
- //
- eapxml::get_element_value(pXmlElClientSideCredential, bstr(L"eap-metadata:allow-save"), &m_allow_save);
-
- //
- eapxml::get_element_value(pXmlElClientSideCredential, bstr(L"eap-metadata:AnonymousIdentity"), m_anonymous_identity);
- }
-
- return ERROR_SUCCESS;
-}
-
-
-//////////////////////////////////////////////////////////////////////
-// eap::credentials
-//////////////////////////////////////////////////////////////////////
-
-eap::credentials::credentials(_In_ module &mod) : config(mod)
-{
-}
-
-
-eap::credentials::credentials(_In_ const credentials &other) :
- m_identity(other.m_identity),
- config(other)
-{
-}
-
-
-eap::credentials::credentials(_Inout_ credentials &&other) :
- m_identity(std::move(other.m_identity)),
- config(std::move(other))
-{
-}
-
-
-eap::credentials& eap::credentials::operator=(_In_ const credentials &other)
-{
- if (this != &other) {
- (config&)*this = other;
- m_identity = other.m_identity;
- }
-
- return *this;
-}
-
-
-eap::credentials& eap::credentials::operator=(_Inout_ credentials &&other)
-{
- if (this != &other) {
- (config&)*this = std::move(other);
- m_identity = std::move(other.m_identity);
- }
-
- return *this;
-}
-
-
-void eap::credentials::clear()
-{
- m_identity.clear();
-}
-
-
-bool eap::credentials::empty() const
-{
- return m_identity.empty();
-}
-
-
-DWORD eap::credentials::save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const
-{
- UNREFERENCED_PARAMETER(pDoc);
- UNREFERENCED_PARAMETER(pConfigRoot);
- UNREFERENCED_PARAMETER(ppEapError);
-
- // Yeah, right!? Credentials are non-exportable!
- return ERROR_NOT_SUPPORTED;
-}
-
-
-//////////////////////////////////////////////////////////////////////
-// eap::credentials_pass
-//////////////////////////////////////////////////////////////////////
-
-eap::credentials_pass::credentials_pass(_In_ module &mod) : credentials(mod)
-{
-}
-
-
-eap::credentials_pass::credentials_pass(_In_ const credentials_pass &other) :
- m_password(other.m_password),
- credentials(other)
-{
-}
-
-
-eap::credentials_pass::credentials_pass(_Inout_ credentials_pass &&other) :
- m_password(std::move(other.m_password)),
- credentials(std::move(other))
-{
-}
-
-
-eap::credentials_pass& eap::credentials_pass::operator=(_In_ const credentials_pass &other)
-{
- if (this != &other) {
- (credentials&)*this = other;
- m_password = other.m_password;
- }
-
- return *this;
-}
-
-
-eap::credentials_pass& eap::credentials_pass::operator=(_Inout_ credentials_pass &&other)
-{
- if (this != &other) {
- (credentials&)*this = std::move(other);
- m_password = std::move(other.m_password);
- }
-
- return *this;
-}
-
-
-void eap::credentials_pass::clear()
-{
- credentials::clear();
- m_password.clear();
-}
-
-
-bool eap::credentials_pass::empty() const
-{
- return credentials::empty() && m_password.empty();
-}
-
-
-DWORD eap::credentials_pass::load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError)
-{
- assert(pConfigRoot);
- UNREFERENCED_PARAMETER(ppEapError);
-
- eapxml::get_element_value(pConfigRoot, bstr(L"eap-metadata:UserName"), m_identity);
-
- bstr pass;
- if ((eapxml::get_element_value(pConfigRoot, bstr(L"eap-metadata:Password"), &pass)) == ERROR_SUCCESS)
- m_password = pass;
- SecureZeroMemory((BSTR)pass, sizeof(OLECHAR)*pass.length());
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD eap::credentials_pass::store(_In_ LPCTSTR pszTargetName, _Out_ EAP_ERROR **ppEapError) const
-{
- assert(pszTargetName);
- assert(ppEapError);
- DWORD dwResult;
- string password_enc;
-
- // Prepare cryptographics provider.
- crypt_prov cp;
- if (!cp.create(NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" CryptAcquireContext failed."), NULL);
- return dwResult;
- }
-
- // Import the public key.
- HRSRC res = FindResource(m_module.m_instance, MAKEINTRESOURCE(IDR_EAP_KEY_PUBLIC), RT_RCDATA);
- assert(res);
- HGLOBAL res_handle = LoadResource(m_module.m_instance, res);
- assert(res_handle);
- crypt_key key;
- unique_ptr > keyinfo_data;
- DWORD keyinfo_size = 0;
- if (!CryptDecodeObjectEx(X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, (const BYTE*)::LockResource(res_handle), ::SizeofResource(m_module.m_instance, res), CRYPT_DECODE_ALLOC_FLAG, NULL, &keyinfo_data, &keyinfo_size)) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" CryptDecodeObjectEx failed."), NULL);
- return dwResult;
- }
-
- if (!key.import_public(cp, X509_ASN_ENCODING, keyinfo_data.get())) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Public key import failed."), NULL);
- return dwResult;
- }
-
- // Convert password to UTF-8.
- sanitizing_string password_utf8;
- WideCharToMultiByte(CP_UTF8, 0, m_password.c_str(), (int)m_password.length(), password_utf8, NULL, NULL);
-
- // Pre-allocate memory to allow space, as encryption will grow the data, and we need additional 16B at the end for MD5 hash.
- DWORD dwBlockLen;
- vector > password(password_utf8.length());
- memcpy(password.data(), password_utf8.c_str(), sizeof(char)*password_utf8.length());
- if (!CryptGetKeyParam(key, KP_BLOCKLEN, dwBlockLen, 0)) dwBlockLen = 0;
- password.reserve((password.size() + dwBlockLen - 1) / dwBlockLen * dwBlockLen + 16);
-
- // Encrypt the password using our public key. Calculate MD5 hash and append it.
- crypt_hash hash;
- if (!hash.create(cp, CALG_MD5)) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Creating MD5 hash failed."), NULL);
- return dwResult;
- }
- if (!CryptEncrypt(key, hash, TRUE, 0, password)) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Encrypting password failed."), NULL);
- return dwResult;
- }
- vector hash_bin;
- CryptGetHashParam(hash, HP_HASHVAL, hash_bin, 0);
- password.insert(password.end(), hash_bin.begin(), hash_bin.end());
-
- // Convert encrypted password to Base64, since CredProtectA() fail for binary strings.
- string password_base64;
- base64_enc enc;
- enc.encode(password_base64, password.data(), password.size());
-
- // Encrypt the password using user's key.
- CRED_PROTECTION_TYPE cpt;
- if (!CredProtectA(TRUE, password_base64.c_str(), (DWORD)password_base64.length(), password_enc, &cpt)) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" CredProtect failed."), NULL);
- return dwResult;
- }
-
- tstring target(target_name(pszTargetName));
-
- // Write credentials.
- assert(password_enc.size()*sizeof(char) < CRED_MAX_CREDENTIAL_BLOB_SIZE);
- assert(m_identity.length() < CRED_MAX_USERNAME_LENGTH );
- CREDENTIAL cred = {
- 0, // Flags
- CRED_TYPE_GENERIC, // Type
- (LPTSTR)target.c_str(), // TargetName
- _T(""), // Comment
- { 0, 0 }, // LastWritten
- (DWORD)password_enc.size()*sizeof(char), // CredentialBlobSize
- (LPBYTE)password_enc.data(), // CredentialBlob
- CRED_PERSIST_ENTERPRISE, // Persist
- 0, // AttributeCount
- NULL, // Attributes
- NULL, // TargetAlias
- (LPTSTR)m_identity.c_str() // UserName
- };
- if (!CredWrite(&cred, 0)) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" CredWrite failed."), NULL);
- return dwResult;
- }
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD eap::credentials_pass::retrieve(_In_ LPCTSTR pszTargetName, _Out_ EAP_ERROR **ppEapError)
-{
- assert(pszTargetName);
- DWORD dwResult;
-
- // Read credentials.
- unique_ptr > cred;
- if (!CredRead(target_name(pszTargetName).c_str(), CRED_TYPE_GENERIC, 0, (PCREDENTIAL*)&cred)) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" CredRead failed."), NULL);
- return dwResult;
- }
-
- m_identity = cred->UserName;
-
- // Decrypt the password using user's key.
- string password_base64;
- if (!CredUnprotectA(TRUE, (LPCSTR)(cred->CredentialBlob), cred->CredentialBlobSize/sizeof(char), password_base64)) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" CredUnprotect failed."), NULL);
- return dwResult;
- }
-
- // Convert Base64 to binary encrypted password, since CredProtectA() fail for binary strings.
- vector > password;
- base64_dec dec;
- bool is_last;
- dec.decode(password, is_last, password_base64.c_str(), password_base64.length());
-
- // Prepare cryptographics provider.
- crypt_prov cp;
- if (!cp.create(NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT)) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" CryptAcquireContext failed."), NULL);
- return dwResult;
- }
-
- // Create hash.
- crypt_hash hash;
- if (!hash.create(cp, CALG_MD5)) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Creating MD5 hash failed."), NULL);
- return dwResult;
- }
- DWORD dwHashSize, dwHashSizeSize = sizeof(dwHashSize);
- CryptGetHashParam(hash, HP_HASHSIZE, (LPBYTE)&dwHashSize, &dwHashSizeSize, 0);
- if (password.size() < dwHashSize) {
- *ppEapError = m_module.make_error(dwResult = ERROR_INVALID_DATA, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Encrypted password too short."), NULL);
- return dwResult;
- }
-
- // Truncate hash from encrypted password.
- vector hash_bin;
- size_t enc_size = password.size() - dwHashSize;
- hash_bin.assign(password.begin() + enc_size, password.end());
- password.resize(enc_size);
-
- // Import the private key.
- HRSRC res = FindResource(m_module.m_instance, MAKEINTRESOURCE(IDR_EAP_KEY_PRIVATE), RT_RCDATA);
- assert(res);
- HGLOBAL res_handle = LoadResource(m_module.m_instance, res);
- assert(res_handle);
- crypt_key key;
- unique_ptr > keyinfo_data;
- DWORD keyinfo_size = 0;
- if (!CryptDecodeObjectEx(X509_ASN_ENCODING, PKCS_RSA_PRIVATE_KEY, (const BYTE*)::LockResource(res_handle), ::SizeofResource(m_module.m_instance, res), CRYPT_DECODE_ALLOC_FLAG, NULL, &keyinfo_data, &keyinfo_size)) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" CryptDecodeObjectEx failed."), NULL);
- return dwResult;
- }
-
- if (!key.import(cp, keyinfo_data.get(), keyinfo_size, NULL, 0)) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Private key import failed."), NULL);
- return dwResult;
- }
-
- // Decrypt the password using our private key. Calculate MD5 hash and verify it.
- if (!CryptDecrypt(key, hash, TRUE, 0, password)) {
- *ppEapError = m_module.make_error(dwResult = GetLastError(), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Decrypting password failed."), NULL);
- return dwResult;
- }
- vector hash2_bin;
- CryptGetHashParam(hash, HP_HASHVAL, hash2_bin, 0);
- if (hash_bin != hash2_bin) {
- *ppEapError = m_module.make_error(dwResult = ERROR_INVALID_DATA, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Invalid password data."), NULL);
- return dwResult;
- }
-
- // Convert password from UTF-8.
- MultiByteToWideChar(CP_UTF8, 0, password.data(), (int)password.size(), m_password);
-
- return ERROR_SUCCESS;
-}
-
-
-//////////////////////////////////////////////////////////////////////
-// eap::module
-//////////////////////////////////////////////////////////////////////
-
-eap::module::module() :
- m_instance(NULL)
-{
- m_ep.create(&EAPMETHOD_TRACE_EVENT_PROVIDER);
- m_ep.write(&EAPMETHOD_TRACE_EVT_MODULE_LOAD, event_data((BYTE)EAPMETHOD_TYPE), event_data::blank);
-
- m_heap.create(0, 0, 0);
-}
-
-
-eap::module::~module()
-{
- m_ep.write(&EAPMETHOD_TRACE_EVT_MODULE_UNLOAD, event_data((BYTE)EAPMETHOD_TYPE), event_data::blank);
-}
-
-
-EAP_ERROR* eap::module::make_error(_In_ DWORD dwErrorCode, _In_ DWORD dwReasonCode, _In_ LPCGUID pRootCauseGuid, _In_ LPCGUID pRepairGuid, _In_ LPCGUID pHelpLinkGuid, _In_z_ LPCWSTR pszRootCauseString, _In_z_ LPCWSTR pszRepairString) const
-{
- // Calculate memory size requirement.
- SIZE_T
- nRootCauseSize = pszRootCauseString != NULL && pszRootCauseString[0] ? (wcslen(pszRootCauseString) + 1)*sizeof(WCHAR) : 0,
- nRepairStringSize = pszRepairString != NULL && pszRepairString [0] ? (wcslen(pszRepairString ) + 1)*sizeof(WCHAR) : 0,
- nEapErrorSize = sizeof(EAP_ERROR) + nRootCauseSize + nRepairStringSize;
-
- EAP_ERROR *pError = (EAP_ERROR*)HeapAlloc(m_heap, 0, nEapErrorSize);
- if (!pError)
- return NULL;
- BYTE *p = (BYTE*)(pError + 1);
-
- // Fill the error descriptor.
- pError->dwWinError = dwErrorCode;
- pError->type.eapType.type = EAPMETHOD_TYPE;
- pError->type.eapType.dwVendorId = 0;
- pError->type.eapType.dwVendorType = 0;
- pError->type.dwAuthorId = 67532;
- pError->dwReasonCode = dwReasonCode;
- pError->rootCauseGuid = pRootCauseGuid != NULL ? *pRootCauseGuid : GUID_NULL;
- pError->repairGuid = pRepairGuid != NULL ? *pRepairGuid : GUID_NULL;
- pError->helpLinkGuid = pHelpLinkGuid != NULL ? *pHelpLinkGuid : GUID_NULL;
- if (nRootCauseSize) {
- pError->pRootCauseString = (LPWSTR)p;
- memcpy(pError->pRootCauseString, pszRootCauseString, nRootCauseSize);
- p += nRootCauseSize;
- } else
- pError->pRootCauseString = NULL;
- if (nRepairStringSize) {
- pError->pRepairString = (LPWSTR)p;
- memcpy(pError->pRepairString, pszRepairString, nRepairStringSize);
- p += nRepairStringSize;
- } else
- pError->pRepairString = NULL;
-
- // Write trace event.
- vector evt_desc;
- evt_desc.reserve(8);
- evt_desc.push_back(event_data(pError->dwWinError));
- evt_desc.push_back(event_data(pError->type.eapType.type));
- evt_desc.push_back(event_data(pError->dwReasonCode));
- evt_desc.push_back(event_data(&(pError->rootCauseGuid), sizeof(GUID)));
- evt_desc.push_back(event_data(&(pError->repairGuid), sizeof(GUID)));
- evt_desc.push_back(event_data(&(pError->helpLinkGuid), sizeof(GUID)));
- evt_desc.push_back(event_data(pError->pRootCauseString));
- evt_desc.push_back(event_data(pError->pRepairString));
- m_ep.write(&EAPMETHOD_TRACE_EAP_ERROR, (ULONG)evt_desc.size(), evt_desc.data());
-
- return pError;
-}
-
-
-BYTE* eap::module::alloc_memory(_In_ size_t size)
-{
- return (BYTE*)HeapAlloc(m_heap, 0, size);
-}
-
-
-void eap::module::free_memory(_In_ BYTE *ptr)
-{
- ETW_FN_VOID;
-
- // Since we do security here and some of the BLOBs contain credentials, sanitize every memory block before freeing.
- SecureZeroMemory(ptr, HeapSize(m_heap, 0, ptr));
- HeapFree(m_heap, 0, ptr);
-}
-
-
-void eap::module::free_error_memory(_In_ EAP_ERROR *err)
-{
- ETW_FN_VOID;
-
- // pRootCauseString and pRepairString always trail the ppEapError to reduce number of (de)allocations.
- HeapFree(m_heap, 0, err);
-}
diff --git a/EAPMethods/src/Main_UI.cpp b/EAPMethods/src/Main_UI.cpp
index a8962f94..89be26df 100644
--- a/EAPMethods/src/Main_UI.cpp
+++ b/EAPMethods/src/Main_UI.cpp
@@ -20,6 +20,8 @@
#include
+#pragma comment(lib, "msxml6.lib")
+
#if EAPMETHOD_TYPE==21
#define _EAPMETHOD_PEER_UI eap::peer_ttls_ui
diff --git a/EAPMethods/src/TTLS.cpp b/EAPMethods/src/TTLS.cpp
deleted file mode 100644
index c646d569..00000000
--- a/EAPMethods/src/TTLS.cpp
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- Copyright 2015-2016 Amebis
- Copyright 2016 GÉANT
-
- This file is part of GÉANTLink.
-
- GÉANTLink is free software: you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- GÉANTLink is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GÉANTLink. If not, see .
-*/
-
-#include
-
-#pragma comment(lib, "Msi.lib")
-#pragma comment(lib, "msxml6.lib")
-
-using namespace std;
-using namespace winstd;
-
-
-//////////////////////////////////////////////////////////////////////
-// eap::config_ttls
-//////////////////////////////////////////////////////////////////////
-
-eap::config_ttls::config_ttls(_In_ module &mod) :
- m_inner(NULL),
- config_tls(mod)
-{
-}
-
-
-eap::config_ttls::config_ttls(const _In_ config_ttls &other) :
- m_inner(other.m_inner ? (config_method*)other.m_inner->clone() : NULL),
- config_tls(other)
-{
-}
-
-
-eap::config_ttls::config_ttls(_Inout_ config_ttls &&other) :
- m_inner(other.m_inner),
- config_tls(std::move(other))
-{
- other.m_inner = NULL;
-}
-
-
-eap::config_ttls::~config_ttls()
-{
- if (m_inner)
- delete m_inner;
-}
-
-
-eap::config_ttls& eap::config_ttls::operator=(const _In_ config_ttls &other)
-{
- if (this != &other) {
- (config_tls&)*this = other;
- if (m_inner) delete m_inner;
- m_inner = other.m_inner ? (config_method*)other.m_inner->clone() : NULL;
- }
-
- return *this;
-}
-
-
-eap::config_ttls& eap::config_ttls::operator=(_Inout_ config_ttls &&other)
-{
- if (this != &other) {
- (config_tls&&)*this = std::move(other);
- if (m_inner) delete m_inner;
- m_inner = other.m_inner;
- other.m_inner = NULL;
- }
-
- return *this;
-}
-
-
-DWORD eap::config_ttls::save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const
-{
- const bstr bstrNamespace(L"urn:ietf:params:xml:ns:yang:ietf-eap-metadata");
- DWORD dwResult;
-
- //
- com_obj pXmlElInnerAuthenticationMethod;
- if ((dwResult = eapxml::create_element(pDoc, pConfigRoot, bstr(L"eap-metadata:InnerAuthenticationMethod"), bstr(L"InnerAuthenticationMethod"), bstrNamespace, &pXmlElInnerAuthenticationMethod)) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
- return dwResult;
- }
-
- if (dynamic_cast(m_inner)) {
- // /
- if ((dwResult = eapxml::put_element_value(pDoc, pXmlElInnerAuthenticationMethod, bstr(L"NonEAPAuthMethod"), bstrNamespace, bstr(L"PAP"))) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
- return dwResult;
- }
-
- // /...
- if ((dwResult = m_inner->save(pDoc, pXmlElInnerAuthenticationMethod, ppEapError)) != ERROR_SUCCESS)
- return dwResult;
- } else
- return dwResult = ERROR_NOT_SUPPORTED;
-
- return config_tls::save(pDoc, pConfigRoot, ppEapError);
-}
-
-
-DWORD eap::config_ttls::load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError)
-{
- assert(ppEapError);
- DWORD dwResult;
-
- // Load inner authentication configuration ().
- com_obj pXmlElInnerAuthenticationMethod;
- if ((dwResult = eapxml::select_element(pConfigRoot, bstr(L"eap-metadata:InnerAuthenticationMethod"), &pXmlElInnerAuthenticationMethod)) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error selecting element."), NULL);
- return dwResult;
- }
-
- // Determine inner authentication type ( and ).
- //DWORD dwMethodID;
- bstr bstrMethod;
- /*if (eapxml::get_element_value(pXmlElInnerAuthenticationMethod, bstr(L"eap-metadata:EAPMethod"), &dwMethodID) == ERROR_SUCCESS &&
- dwMethodID == EAP_TYPE_MSCHAPV2)
- {
- // MSCHAPv2
- // TODO: Add MSCHAPv2 support.
- return ERROR_NOT_SUPPORTED;
- } else*/ if (eapxml::get_element_value(pXmlElInnerAuthenticationMethod, bstr(L"eap-metadata:NonEAPAuthMethod"), &bstrMethod) == ERROR_SUCCESS &&
- CompareStringEx(LOCALE_NAME_INVARIANT, NORM_IGNORECASE, bstrMethod, bstrMethod.length(), L"PAP", -1, NULL, NULL, 0) == CSTR_EQUAL)
- {
- // PAP
- assert(!m_inner);
- m_inner = new eap::config_pap(m_module);
- if ((dwResult = m_inner->load(pXmlElInnerAuthenticationMethod, ppEapError)) != ERROR_SUCCESS)
- return dwResult;
- } else {
- *ppEapError = m_module.make_error(dwResult = ERROR_NOT_SUPPORTED, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Unsupported inner authentication method."), NULL);
- return dwResult;
- }
-
- return config_tls::load(pConfigRoot, ppEapError);
-}
-
-
-//////////////////////////////////////////////////////////////////////
-// eap::credentials_ttls
-//////////////////////////////////////////////////////////////////////
-
-eap::credentials_ttls::credentials_ttls(_In_ module &mod) : credentials_tls(mod)
-{
-}
-
-
-eap::credentials_ttls::credentials_ttls(_In_ const credentials_ttls &other) :
- m_inner(other.m_inner ? (credentials*)other.m_inner->clone() : NULL),
- credentials_tls(other)
-{
-}
-
-
-eap::credentials_ttls::credentials_ttls(_Inout_ credentials_ttls &&other) :
- m_inner(other.m_inner),
- credentials_tls(std::move(other))
-{
- other.m_inner = NULL;
-}
-
-
-eap::credentials_ttls& eap::credentials_ttls::operator=(_In_ const credentials_ttls &other)
-{
- if (this != &other) {
- (credentials_tls&)*this = other;
-
- if (m_inner) delete m_inner;
- m_inner = other.m_inner ? (credentials*)other.m_inner->clone() : NULL;
- }
-
- return *this;
-}
-
-
-eap::credentials_ttls& eap::credentials_ttls::operator=(_Inout_ credentials_ttls &&other)
-{
- if (this != &other) {
- (credentials_tls&)*this = std::move(other);
-
- if (m_inner) delete m_inner;
- m_inner = other.m_inner;
- other.m_inner = NULL;
- }
-
- return *this;
-}
-
-
-
-void eap::credentials_ttls::clear()
-{
- credentials_tls::clear();
- if (m_inner)
- m_inner->clear();
-}
-
-
-bool eap::credentials_ttls::empty() const
-{
- return credentials_tls::empty() && (!m_inner || m_inner->empty());
-}
-
-
-
-DWORD eap::credentials_ttls::load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError)
-{
- assert(pConfigRoot);
- DWORD dwResult;
-
- if ((dwResult = credentials_tls::load(pConfigRoot, ppEapError)) != ERROR_SUCCESS)
- return dwResult;
-
- if (m_inner) {
- com_obj pXmlElInnerAuthenticationMethod;
- if ((dwResult = eapxml::select_node(pConfigRoot, bstr(L"eap-metadata:InnerAuthenticationMethod"), &pXmlElInnerAuthenticationMethod)) != ERROR_SUCCESS) {
- *ppEapError = m_module.make_error(dwResult = ERROR_NOT_FOUND, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error selecting element."), NULL);
- return dwResult;
- }
-
- if ((dwResult = m_inner->load(pXmlElInnerAuthenticationMethod, ppEapError)) != ERROR_SUCCESS)
- return dwResult;
- }
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD eap::credentials_ttls::store(_In_ LPCTSTR pszTargetName, _Out_ EAP_ERROR **ppEapError) const
-{
- DWORD dwResult;
-
- if ((dwResult = credentials_tls::store(pszTargetName, ppEapError)) != ERROR_SUCCESS)
- return dwResult;
-
- if (m_inner) {
- if ((dwResult = m_inner->store(pszTargetName, ppEapError)) != ERROR_SUCCESS)
- return dwResult;
- }
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD eap::credentials_ttls::retrieve(_In_ LPCTSTR pszTargetName, _Out_ EAP_ERROR **ppEapError)
-{
- DWORD dwResult;
-
- if ((dwResult = credentials_tls::retrieve(pszTargetName, ppEapError)) != ERROR_SUCCESS)
- return dwResult;
-
- if (m_inner) {
- if ((dwResult = m_inner->retrieve(pszTargetName, ppEapError)) != ERROR_SUCCESS)
- return dwResult;
- }
-
- return ERROR_SUCCESS;
-}
-
-
-//////////////////////////////////////////////////////////////////////
-// eap::session_ttls
-//////////////////////////////////////////////////////////////////////
-
-eap::session_ttls::session_ttls() : session()
-{
-}
-
-
-//////////////////////////////////////////////////////////////////////
-// eap::peer_ttls
-//////////////////////////////////////////////////////////////////////
-
-eap::peer_ttls::peer_ttls() : peer()
-{
-}
-
-
-DWORD eap::peer_ttls::initialize(_Out_ EAP_ERROR **ppEapError)
-{
- UNREFERENCED_PARAMETER(ppEapError);
-
- // MSI's feature completeness check removed: It might invoke UI (prompt user for missing MSI),
- // which would be disasterous in EapHost system service.
-#if 0
- // Perform the Microsoft Installer's feature completeness check manually.
- // If execution got this far in the first place (dependent DLLs are present and loadable).
- // Furthermore, this increments program usage counter.
- if (MsiQueryFeatureState(_T(PRODUCT_VERSION_GUID), _T("featEAPTTLS")) != INSTALLSTATE_UNKNOWN)
- MsiUseFeature(_T(PRODUCT_VERSION_GUID), _T("featEAPTTLS"));
-#endif
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD eap::peer_ttls::shutdown(_Out_ EAP_ERROR **ppEapError)
-{
- UNREFERENCED_PARAMETER(ppEapError);
- return ERROR_SUCCESS;
-}
-
-
-DWORD eap::peer_ttls::get_identity(
- _In_ DWORD dwFlags,
- _In_ DWORD dwConnectionDataSize,
- _In_count_(dwConnectionDataSize) const BYTE *pConnectionData,
- _In_ DWORD dwUserDataSize,
- _In_count_(dwUserDataSize) const BYTE *pUserData,
- _In_ HANDLE hTokenImpersonateUser,
- _Out_ BOOL *pfInvokeUI,
- _Out_ DWORD *pdwUserDataOutSize,
- _Out_ BYTE **ppUserDataOut,
- _Out_ WCHAR **ppwszIdentity,
- _Out_ EAP_ERROR **ppEapError)
-{
- UNREFERENCED_PARAMETER(dwFlags);
- UNREFERENCED_PARAMETER(dwConnectionDataSize);
- UNREFERENCED_PARAMETER(pConnectionData);
- UNREFERENCED_PARAMETER(dwUserDataSize);
- UNREFERENCED_PARAMETER(pUserData);
- UNREFERENCED_PARAMETER(hTokenImpersonateUser);
- UNREFERENCED_PARAMETER(pfInvokeUI);
- UNREFERENCED_PARAMETER(pdwUserDataOutSize);
- UNREFERENCED_PARAMETER(ppUserDataOut);
- UNREFERENCED_PARAMETER(ppwszIdentity);
- UNREFERENCED_PARAMETER(ppEapError);
-
- DWORD dwResult = ERROR_NOT_SUPPORTED;
- ETW_FN_DWORD(dwResult);
- return dwResult;
-}
-
-
-DWORD eap::peer_ttls::get_method_properties(
- _In_ DWORD dwVersion,
- _In_ DWORD dwFlags,
- _In_ HANDLE hUserImpersonationToken,
- _In_ DWORD dwEapConnDataSize,
- _In_count_(dwEapConnDataSize) const BYTE *pEapConnData,
- _In_ DWORD dwUserDataSize,
- _In_count_(dwUserDataSize) const BYTE *pUserData,
- _Out_ EAP_METHOD_PROPERTY_ARRAY *pMethodPropertyArray,
- _Out_ EAP_ERROR **ppEapError) const
-{
- UNREFERENCED_PARAMETER(dwVersion);
- UNREFERENCED_PARAMETER(dwFlags);
- UNREFERENCED_PARAMETER(hUserImpersonationToken);
- UNREFERENCED_PARAMETER(dwEapConnDataSize);
- UNREFERENCED_PARAMETER(pEapConnData);
- UNREFERENCED_PARAMETER(dwUserDataSize);
- UNREFERENCED_PARAMETER(pUserData);
- UNREFERENCED_PARAMETER(pMethodPropertyArray);
- UNREFERENCED_PARAMETER(ppEapError);
-
- DWORD dwResult = ERROR_NOT_SUPPORTED;
- ETW_FN_DWORD(dwResult);
- return dwResult;
-}
diff --git a/VS10Solution.sln b/VS10Solution.sln
index e5761062..990d55bb 100644
--- a/VS10Solution.sln
+++ b/VS10Solution.sln
@@ -18,10 +18,26 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Utilities", "Utilities", "{
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CredWrite", "CredWrite\CredWrite.vcxproj", "{2D3CE079-7EB1-4F47-B79E-F0310671ECCB}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EAPMethodEvents", "EAPMethods\EAPMethodEvents\EAPMethodEvents.vcxproj", "{D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Events", "lib\Events\build\Events.vcxproj", "{D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EAPTTLSUI", "EAPMethods\EAPTTLSUI\EAPTTLSUI.vcxproj", "{DD7A97CA-F18E-43B7-95C4-D06E6A291624}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EAPBase", "lib\EAPBase\build\EAPBase.vcxproj", "{AD6816A0-9600-4E01-8C49-39D03D1E791F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EAPBase_UI", "lib\EAPBase_UI\build\EAPBase_UI.vcxproj", "{D4B54856-BE1F-4937-A8F7-495125BE76BE}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PAP", "lib\PAP\build\PAP.vcxproj", "{36B0CF8A-7794-46C3-8099-825BA962B4C7}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TLS", "lib\TLS\build\TLS.vcxproj", "{4D40CB8A-812E-4F12-B23A-31AF743878E8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TTLS", "lib\TTLS\build\TTLS.vcxproj", "{EE0EF0D9-A475-4038-8637-5754724F65B0}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PAP_UI", "lib\PAP_UI\build\PAP_UI.vcxproj", "{3D309C2E-64AB-4BC4-A16D-468571A2BC1A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TLS_UI", "lib\TLS_UI\build\TLS_UI.vcxproj", "{9A25C261-8ADE-4938-8393-E857EF0E37E9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TTLS_UI", "lib\TTLS_UI\build\TTLS_UI.vcxproj", "{42F0F0F4-C928-4860-A4E4-94991C2C3D90}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@@ -70,15 +86,87 @@ Global
{DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Release|Win32.Build.0 = Release|Win32
{DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Release|x64.ActiveCfg = Release|x64
{DD7A97CA-F18E-43B7-95C4-D06E6A291624}.Release|x64.Build.0 = Release|x64
+ {AD6816A0-9600-4E01-8C49-39D03D1E791F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AD6816A0-9600-4E01-8C49-39D03D1E791F}.Debug|Win32.Build.0 = Debug|Win32
+ {AD6816A0-9600-4E01-8C49-39D03D1E791F}.Debug|x64.ActiveCfg = Debug|x64
+ {AD6816A0-9600-4E01-8C49-39D03D1E791F}.Debug|x64.Build.0 = Debug|x64
+ {AD6816A0-9600-4E01-8C49-39D03D1E791F}.Release|Win32.ActiveCfg = Release|Win32
+ {AD6816A0-9600-4E01-8C49-39D03D1E791F}.Release|Win32.Build.0 = Release|Win32
+ {AD6816A0-9600-4E01-8C49-39D03D1E791F}.Release|x64.ActiveCfg = Release|x64
+ {AD6816A0-9600-4E01-8C49-39D03D1E791F}.Release|x64.Build.0 = Release|x64
+ {D4B54856-BE1F-4937-A8F7-495125BE76BE}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D4B54856-BE1F-4937-A8F7-495125BE76BE}.Debug|Win32.Build.0 = Debug|Win32
+ {D4B54856-BE1F-4937-A8F7-495125BE76BE}.Debug|x64.ActiveCfg = Debug|x64
+ {D4B54856-BE1F-4937-A8F7-495125BE76BE}.Debug|x64.Build.0 = Debug|x64
+ {D4B54856-BE1F-4937-A8F7-495125BE76BE}.Release|Win32.ActiveCfg = Release|Win32
+ {D4B54856-BE1F-4937-A8F7-495125BE76BE}.Release|Win32.Build.0 = Release|Win32
+ {D4B54856-BE1F-4937-A8F7-495125BE76BE}.Release|x64.ActiveCfg = Release|x64
+ {D4B54856-BE1F-4937-A8F7-495125BE76BE}.Release|x64.Build.0 = Release|x64
+ {36B0CF8A-7794-46C3-8099-825BA962B4C7}.Debug|Win32.ActiveCfg = Debug|Win32
+ {36B0CF8A-7794-46C3-8099-825BA962B4C7}.Debug|Win32.Build.0 = Debug|Win32
+ {36B0CF8A-7794-46C3-8099-825BA962B4C7}.Debug|x64.ActiveCfg = Debug|x64
+ {36B0CF8A-7794-46C3-8099-825BA962B4C7}.Debug|x64.Build.0 = Debug|x64
+ {36B0CF8A-7794-46C3-8099-825BA962B4C7}.Release|Win32.ActiveCfg = Release|Win32
+ {36B0CF8A-7794-46C3-8099-825BA962B4C7}.Release|Win32.Build.0 = Release|Win32
+ {36B0CF8A-7794-46C3-8099-825BA962B4C7}.Release|x64.ActiveCfg = Release|x64
+ {36B0CF8A-7794-46C3-8099-825BA962B4C7}.Release|x64.Build.0 = Release|x64
+ {4D40CB8A-812E-4F12-B23A-31AF743878E8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {4D40CB8A-812E-4F12-B23A-31AF743878E8}.Debug|Win32.Build.0 = Debug|Win32
+ {4D40CB8A-812E-4F12-B23A-31AF743878E8}.Debug|x64.ActiveCfg = Debug|x64
+ {4D40CB8A-812E-4F12-B23A-31AF743878E8}.Debug|x64.Build.0 = Debug|x64
+ {4D40CB8A-812E-4F12-B23A-31AF743878E8}.Release|Win32.ActiveCfg = Release|Win32
+ {4D40CB8A-812E-4F12-B23A-31AF743878E8}.Release|Win32.Build.0 = Release|Win32
+ {4D40CB8A-812E-4F12-B23A-31AF743878E8}.Release|x64.ActiveCfg = Release|x64
+ {4D40CB8A-812E-4F12-B23A-31AF743878E8}.Release|x64.Build.0 = Release|x64
+ {EE0EF0D9-A475-4038-8637-5754724F65B0}.Debug|Win32.ActiveCfg = Debug|Win32
+ {EE0EF0D9-A475-4038-8637-5754724F65B0}.Debug|Win32.Build.0 = Debug|Win32
+ {EE0EF0D9-A475-4038-8637-5754724F65B0}.Debug|x64.ActiveCfg = Debug|x64
+ {EE0EF0D9-A475-4038-8637-5754724F65B0}.Debug|x64.Build.0 = Debug|x64
+ {EE0EF0D9-A475-4038-8637-5754724F65B0}.Release|Win32.ActiveCfg = Release|Win32
+ {EE0EF0D9-A475-4038-8637-5754724F65B0}.Release|Win32.Build.0 = Release|Win32
+ {EE0EF0D9-A475-4038-8637-5754724F65B0}.Release|x64.ActiveCfg = Release|x64
+ {EE0EF0D9-A475-4038-8637-5754724F65B0}.Release|x64.Build.0 = Release|x64
+ {3D309C2E-64AB-4BC4-A16D-468571A2BC1A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {3D309C2E-64AB-4BC4-A16D-468571A2BC1A}.Debug|Win32.Build.0 = Debug|Win32
+ {3D309C2E-64AB-4BC4-A16D-468571A2BC1A}.Debug|x64.ActiveCfg = Debug|x64
+ {3D309C2E-64AB-4BC4-A16D-468571A2BC1A}.Debug|x64.Build.0 = Debug|x64
+ {3D309C2E-64AB-4BC4-A16D-468571A2BC1A}.Release|Win32.ActiveCfg = Release|Win32
+ {3D309C2E-64AB-4BC4-A16D-468571A2BC1A}.Release|Win32.Build.0 = Release|Win32
+ {3D309C2E-64AB-4BC4-A16D-468571A2BC1A}.Release|x64.ActiveCfg = Release|x64
+ {3D309C2E-64AB-4BC4-A16D-468571A2BC1A}.Release|x64.Build.0 = Release|x64
+ {9A25C261-8ADE-4938-8393-E857EF0E37E9}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9A25C261-8ADE-4938-8393-E857EF0E37E9}.Debug|Win32.Build.0 = Debug|Win32
+ {9A25C261-8ADE-4938-8393-E857EF0E37E9}.Debug|x64.ActiveCfg = Debug|x64
+ {9A25C261-8ADE-4938-8393-E857EF0E37E9}.Debug|x64.Build.0 = Debug|x64
+ {9A25C261-8ADE-4938-8393-E857EF0E37E9}.Release|Win32.ActiveCfg = Release|Win32
+ {9A25C261-8ADE-4938-8393-E857EF0E37E9}.Release|Win32.Build.0 = Release|Win32
+ {9A25C261-8ADE-4938-8393-E857EF0E37E9}.Release|x64.ActiveCfg = Release|x64
+ {9A25C261-8ADE-4938-8393-E857EF0E37E9}.Release|x64.Build.0 = Release|x64
+ {42F0F0F4-C928-4860-A4E4-94991C2C3D90}.Debug|Win32.ActiveCfg = Debug|Win32
+ {42F0F0F4-C928-4860-A4E4-94991C2C3D90}.Debug|Win32.Build.0 = Debug|Win32
+ {42F0F0F4-C928-4860-A4E4-94991C2C3D90}.Debug|x64.ActiveCfg = Debug|x64
+ {42F0F0F4-C928-4860-A4E4-94991C2C3D90}.Debug|x64.Build.0 = Debug|x64
+ {42F0F0F4-C928-4860-A4E4-94991C2C3D90}.Release|Win32.ActiveCfg = Release|Win32
+ {42F0F0F4-C928-4860-A4E4-94991C2C3D90}.Release|Win32.Build.0 = Release|Win32
+ {42F0F0F4-C928-4860-A4E4-94991C2C3D90}.Release|x64.ActiveCfg = Release|x64
+ {42F0F0F4-C928-4860-A4E4-94991C2C3D90}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{331B6077-E3E2-4867-B93E-9D3F57280DE7} = {60BAAC3D-DC98-4C19-BC40-1A86963DE86C}
- {D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B} = {60BAAC3D-DC98-4C19-BC40-1A86963DE86C}
{DD7A97CA-F18E-43B7-95C4-D06E6A291624} = {60BAAC3D-DC98-4C19-BC40-1A86963DE86C}
{47399D91-7EB9-41DE-B521-514BA5DB0C43} = {E66A3FE1-4EE4-401F-8EAD-BE518B230393}
+ {D63F24BD-92A0-4D6B-8B69-ED947E4D2B1B} = {E66A3FE1-4EE4-401F-8EAD-BE518B230393}
+ {AD6816A0-9600-4E01-8C49-39D03D1E791F} = {E66A3FE1-4EE4-401F-8EAD-BE518B230393}
+ {D4B54856-BE1F-4937-A8F7-495125BE76BE} = {E66A3FE1-4EE4-401F-8EAD-BE518B230393}
+ {36B0CF8A-7794-46C3-8099-825BA962B4C7} = {E66A3FE1-4EE4-401F-8EAD-BE518B230393}
+ {4D40CB8A-812E-4F12-B23A-31AF743878E8} = {E66A3FE1-4EE4-401F-8EAD-BE518B230393}
+ {EE0EF0D9-A475-4038-8637-5754724F65B0} = {E66A3FE1-4EE4-401F-8EAD-BE518B230393}
+ {3D309C2E-64AB-4BC4-A16D-468571A2BC1A} = {E66A3FE1-4EE4-401F-8EAD-BE518B230393}
+ {9A25C261-8ADE-4938-8393-E857EF0E37E9} = {E66A3FE1-4EE4-401F-8EAD-BE518B230393}
+ {42F0F0F4-C928-4860-A4E4-94991C2C3D90} = {E66A3FE1-4EE4-401F-8EAD-BE518B230393}
{2D3CE079-7EB1-4F47-B79E-F0310671ECCB} = {7B5EC9B7-208C-426A-941D-DAF9271BD4A4}
EndGlobalSection
EndGlobal
diff --git a/include/MSIBuildCfg.mak b/include/MSIBuildCfg.mak
index aa4abfb8..a3bd4a7b 100644
Binary files a/include/MSIBuildCfg.mak and b/include/MSIBuildCfg.mak differ
diff --git a/EAPMethods/EAPMethodEvents/.gitignore b/lib/EAPBase/build/.gitignore
similarity index 100%
rename from EAPMethods/EAPMethodEvents/.gitignore
rename to lib/EAPBase/build/.gitignore
diff --git a/lib/EAPBase/build/EAPBase.props b/lib/EAPBase/build/EAPBase.props
new file mode 100644
index 00000000..4997b714
--- /dev/null
+++ b/lib/EAPBase/build/EAPBase.props
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+ ..\..\Events\build\temp\Events.$(Platform).$(Configuration).$(PlatformToolset);..\..\WinStd\include;%(AdditionalIncludeDirectories)
+
+
+
+
\ No newline at end of file
diff --git a/lib/EAPBase/build/EAPBase.vcxproj b/lib/EAPBase/build/EAPBase.vcxproj
new file mode 100644
index 00000000..ca023e89
--- /dev/null
+++ b/lib/EAPBase/build/EAPBase.vcxproj
@@ -0,0 +1,111 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {AD6816A0-9600-4E01-8C49-39D03D1E791F}
+ EAPBase
+
+
+
+ StaticLibrary
+ true
+ Unicode
+
+
+ StaticLibrary
+ true
+ Unicode
+
+
+ StaticLibrary
+ false
+ true
+ Unicode
+
+
+ StaticLibrary
+ false
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create
+ Create
+ Create
+ Create
+
+
+
+
+ {d63f24bd-92a0-4d6b-8b69-ed947e4d2b1b}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/EAPBase/build/EAPBase.vcxproj.filters b/lib/EAPBase/build/EAPBase.vcxproj.filters
new file mode 100644
index 00000000..9dadc8e1
--- /dev/null
+++ b/lib/EAPBase/build/EAPBase.vcxproj.filters
@@ -0,0 +1,56 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hpp;hxx;hm;inl;inc;xsd
+
+
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
\ No newline at end of file
diff --git a/lib/EAPBase/include/Config.h b/lib/EAPBase/include/Config.h
new file mode 100644
index 00000000..b66701c8
--- /dev/null
+++ b/lib/EAPBase/include/Config.h
@@ -0,0 +1,850 @@
+/*
+ Copyright 2015-2016 Amebis
+ Copyright 2016 GÉANT
+
+ This file is part of GÉANTLink.
+
+ GÉANTLink is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ GÉANTLink is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GÉANTLink. If not, see .
+*/
+
+#include
+
+namespace eap
+{
+ ///
+ /// Base class for configuration storage
+ ///
+ class config;
+
+ ///
+ /// Base class for method configuration storage
+ ///
+ class config_method;
+
+ ///
+ /// Provider configuration
+ ///
+ template class config_provider;
+
+ ///
+ /// Providers configuration
+ ///
+ template class config_providers;
+
+ ///
+ /// Password based method configuration
+ ///
+ typedef config_method config_pass;
+}
+
+namespace eapserial
+{
+ ///
+ /// Packs a method configuration
+ ///
+ /// \param[inout] cursor Memory cursor
+ /// \param[in] val Configuration to pack
+ ///
+ inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_method &val);
+
+ ///
+ /// Returns packed size of a method configuration
+ ///
+ /// \param[in] val Configuration to pack
+ ///
+ /// \returns Size of data when packed (in bytes)
+ ///
+ inline size_t get_pk_size(const eap::config_method &val);
+
+ ///
+ /// Unpacks a method configuration
+ ///
+ /// \param[inout] cursor Memory cursor
+ /// \param[out] val Configuration to unpack to
+ ///
+ inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_method &val);
+
+ ///
+ /// Packs a provider configuration
+ ///
+ /// \param[inout] cursor Memory cursor
+ /// \param[in] val Configuration to pack
+ ///
+ template inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_provider<_Tmeth> &val);
+
+ ///
+ /// Returns packed size of a provider configuration
+ ///
+ /// \param[in] val Configuration to pack
+ ///
+ /// \returns Size of data when packed (in bytes)
+ ///
+ template inline size_t get_pk_size(const eap::config_provider<_Tmeth> &val);
+
+ ///
+ /// Unpacks a provider configuration
+ ///
+ /// \param[inout] cursor Memory cursor
+ /// \param[out] val Configuration to unpack to
+ ///
+ template inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_provider<_Tmeth> &val);
+
+ ///
+ /// Packs a providers configuration
+ ///
+ /// \param[inout] cursor Memory cursor
+ /// \param[in] val Configuration to pack
+ ///
+ template inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_providers<_Tprov> &val);
+
+ ///
+ /// Returns packed size of a providers configuration
+ ///
+ /// \param[in] val Configuration to pack
+ ///
+ /// \returns Size of data when packed (in bytes)
+ ///
+ template inline size_t get_pk_size(const eap::config_providers<_Tprov> &val);
+
+ ///
+ /// Unpacks a providers configuration
+ ///
+ /// \param[inout] cursor Memory cursor
+ /// \param[out] val Configuration to unpack to
+ ///
+ template inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_providers<_Tprov> &val);
+}
+
+#pragma once
+
+#include "Module.h"
+#include "EAPSerial.h"
+#include "EAPXML.h"
+
+#include
+#include
+
+#include
+#include // Must include after
+#include
+
+#include
+#include
+
+
+namespace eap
+{
+ class config
+ {
+ public:
+ ///
+ /// Constructs configuration
+ ///
+ /// \param[in] mod Reference of the EAP module to use for global services
+ ///
+ config(_In_ module &mod);
+
+ ///
+ /// Copies configuration
+ ///
+ /// \param[in] other Configuration to copy from
+ ///
+ config(_In_ const config &other);
+
+ ///
+ /// Moves configuration
+ ///
+ /// \param[in] other Configuration to move from
+ ///
+ config(_Inout_ config &&other);
+
+ ///
+ /// Destructs configuration
+ ///
+ virtual ~config();
+
+ ///
+ /// Copies configuration
+ ///
+ /// \param[in] other Configuration to copy from
+ ///
+ /// \returns Reference to this object
+ ///
+ config& operator=(_In_ const config &other);
+
+ ///
+ /// Moves configuration
+ ///
+ /// \param[in] other Configuration to move from
+ ///
+ /// \returns Reference to this object
+ ///
+ config& operator=(_Inout_ config &&other);
+
+ ///
+ /// Clones this configuration
+ ///
+ /// \returns Pointer to cloned configuration
+ ///
+ virtual config* clone() const = 0;
+
+ /// \name XML configuration management
+ /// @{
+
+ ///
+ /// Save configuration to XML document
+ ///
+ /// \param[in] pDoc XML document
+ /// \param[in] pConfigRoot Suggested root element for saving configuration
+ /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
+ ///
+ /// \returns
+ /// - \c ERROR_SUCCESS if succeeded
+ /// - error code otherwise
+ ///
+ virtual DWORD save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const = 0;
+
+ ///
+ /// Load configuration from XML document
+ ///
+ /// \param[in] pConfigRoot Root element for loading configuration
+ /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
+ ///
+ /// \returns
+ /// - \c ERROR_SUCCESS if succeeded
+ /// - error code otherwise
+ ///
+ virtual DWORD load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) = 0;
+
+ /// @}
+
+ public:
+ module &m_module; ///< Reference of the EAP module
+ };
+
+
+ class config_method : public config
+ {
+ public:
+ ///
+ /// Constructs configuration
+ ///
+ /// \param[in] mod Reference of the EAP module to use for global services
+ ///
+ config_method(_In_ module &mod);
+
+ ///
+ /// Copies configuration
+ ///
+ /// \param[in] other Configuration to copy from
+ ///
+ config_method(_In_ const config_method &other);
+
+ ///
+ /// Moves configuration
+ ///
+ /// \param[in] other Configuration to move from
+ ///
+ config_method(_Inout_ config_method &&other);
+
+ ///
+ /// Copies configuration
+ ///
+ /// \param[in] other Configuration to copy from
+ ///
+ /// \returns Reference to this object
+ ///
+ config_method& operator=(_In_ const config_method &other);
+
+ ///
+ /// Moves configuration
+ ///
+ /// \param[in] other Configuration to move from
+ ///
+ /// \returns Reference to this object
+ ///
+ config_method& operator=(_Inout_ config_method &&other);
+
+ /// \name XML configuration management
+ /// @{
+
+ ///
+ /// Save configuration to XML document
+ ///
+ /// \param[in] pDoc XML document
+ /// \param[in] pConfigRoot Suggested root element for saving configuration
+ /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
+ ///
+ /// \returns
+ /// - \c ERROR_SUCCESS if succeeded
+ /// - error code otherwise
+ ///
+ virtual DWORD save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const;
+
+ ///
+ /// Load configuration from XML document
+ ///
+ /// \param[in] pConfigRoot Root element for loading configuration
+ /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
+ ///
+ /// \returns
+ /// - \c ERROR_SUCCESS if succeeded
+ /// - error code otherwise
+ ///
+ virtual DWORD load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError);
+
+ /// @}
+
+ ///
+ /// Returns EAP method type of this configuration
+ ///
+ /// \returns One of `eap::type_t` constants.
+ ///
+ virtual type_t get_method_id() = 0;
+
+ public:
+ bool m_allow_save; ///< Are credentials allowed to be saved to Windows Credential Manager?
+ std::wstring m_anonymous_identity; ///< Anonymous identity
+ };
+
+
+ template
+ class config_provider : public config
+ {
+ public:
+ ///
+ /// Constructs configuration
+ ///
+ /// \param[in] mod Reference of the EAP module to use for global services
+ ///
+ config_provider(_In_ module &mod) : config(mod)
+ {
+ }
+
+ ///
+ /// Copies configuration
+ ///
+ /// \param[in] other Configuration to copy from
+ ///
+ config_provider(_In_ const config_provider &other) :
+ m_id(other.m_id),
+ m_lbl_alt_credential(other.m_lbl_alt_credential),
+ m_lbl_alt_identity(other.m_lbl_alt_identity),
+ m_lbl_alt_password(other.m_lbl_alt_password),
+ m_methods(other.m_methods),
+ config(other)
+ {
+ }
+
+ ///
+ /// Moves configuration
+ ///
+ /// \param[in] other Configuration to move from
+ ///
+ config_provider(_Inout_ config_provider &&other) :
+ m_id(std::move(other.m_id)),
+ m_lbl_alt_credential(std::move(other.m_lbl_alt_credential)),
+ m_lbl_alt_identity(std::move(other.m_lbl_alt_identity)),
+ m_lbl_alt_password(std::move(other.m_lbl_alt_password)),
+ m_methods(std::move(other.m_methods)),
+ config(std::move(other))
+ {
+ }
+
+ ///
+ /// Copies configuration
+ ///
+ /// \param[in] other Configuration to copy from
+ ///
+ /// \returns Reference to this object
+ ///
+ config_provider& operator=(_In_ const config_provider &other)
+ {
+ if (this != &other) {
+ (config&)*this = other;
+ m_id = other.m_id;
+ m_lbl_alt_credential = other.m_lbl_alt_credential;
+ m_lbl_alt_identity = other.m_lbl_alt_identity;
+ m_lbl_alt_password = other.m_lbl_alt_password;
+ m_methods = other.m_methods;
+ }
+
+ return *this;
+ }
+
+ ///
+ /// Moves configuration
+ ///
+ /// \param[in] other Configuration to move from
+ ///
+ /// \returns Reference to this object
+ ///
+ config_provider& operator=(_Inout_ config_provider &&other)
+ {
+ if (this != &other) {
+ (config&&)*this = std::move(other);
+ m_id = std::move(other.m_id);
+ m_lbl_alt_credential = std::move(other.m_lbl_alt_credential);
+ m_lbl_alt_identity = std::move(other.m_lbl_alt_identity);
+ m_lbl_alt_password = std::move(other.m_lbl_alt_password);
+ m_methods = std::move(other.m_methods);
+ }
+
+ return *this;
+ }
+
+ ///
+ /// Clones configuration
+ ///
+ /// \returns Pointer to cloned configuration
+ ///
+ virtual config* clone() const { return new config_provider<_Tmeth>(*this); }
+
+ /// \name XML configuration management
+ /// @{
+
+ ///
+ /// Save configuration to XML document
+ ///
+ /// \param[in] pDoc XML document
+ /// \param[in] pConfigRoot Suggested root element for saving configuration
+ /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
+ ///
+ /// \returns
+ /// - \c ERROR_SUCCESS if succeeded
+ /// - error code otherwise
+ ///
+ virtual DWORD save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const
+ {
+ const winstd::bstr bstrNamespace(L"urn:ietf:params:xml:ns:yang:ietf-eap-metadata");
+ DWORD dwResult;
+ HRESULT hr;
+
+ //
+ if (!m_id.empty())
+ if ((dwResult = eapxml::put_element_value(pDoc, pConfigRoot, winstd::bstr(L"ID"), bstrNamespace, winstd::bstr(m_id))) != ERROR_SUCCESS) {
+ *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
+ return dwResult;
+ }
+
+ //
+ winstd::com_obj pXmlElProviderInfo;
+ if ((dwResult = eapxml::create_element(pDoc, pConfigRoot, winstd::bstr(L"eap-metadata:ProviderInfo"), winstd::bstr(L"ProviderInfo"), bstrNamespace, &pXmlElProviderInfo)) != ERROR_SUCCESS) {
+ *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
+ return dwResult;
+ }
+
+ // /
+ if (!m_lbl_alt_credential.empty())
+ if ((dwResult = eapxml::put_element_value(pDoc, pXmlElProviderInfo, winstd::bstr(L"CredentialPrompt"), bstrNamespace, winstd::bstr(m_lbl_alt_credential))) != ERROR_SUCCESS) {
+ *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
+ return dwResult;
+ }
+
+ // /
+ if (!m_lbl_alt_identity.empty())
+ if ((dwResult = eapxml::put_element_value(pDoc, pXmlElProviderInfo, winstd::bstr(L"UserNameLabel"), bstrNamespace, winstd::bstr(m_lbl_alt_identity))) != ERROR_SUCCESS) {
+ *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
+ return dwResult;
+ }
+
+ // /
+ if (!m_lbl_alt_password.empty())
+ if ((dwResult = eapxml::put_element_value(pDoc, pXmlElProviderInfo, winstd::bstr(L"PasswordLabel"), bstrNamespace, winstd::bstr(m_lbl_alt_password))) != ERROR_SUCCESS) {
+ *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
+ return dwResult;
+ }
+
+ //
+ winstd::com_obj pXmlElAuthenticationMethods;
+ if ((dwResult = eapxml::create_element(pDoc, pConfigRoot, winstd::bstr(L"eap-metadata:AuthenticationMethods"), winstd::bstr(L"AuthenticationMethods"), bstrNamespace, &pXmlElAuthenticationMethods)) != ERROR_SUCCESS) {
+ *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
+ return dwResult;
+ }
+
+ for (std::list<_Tmeth>::const_iterator method = m_methods.cbegin(), method_end = m_methods.cend(); method != method_end; ++method) {
+ //
+ winstd::com_obj pXmlElAuthenticationMethod;
+ if ((dwResult = eapxml::create_element(pDoc, winstd::bstr(L"AuthenticationMethod"), bstrNamespace, &pXmlElAuthenticationMethod))) {
+ *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
+ return dwResult;
+ }
+
+ // /...
+ if ((dwResult = method->save(pDoc, pXmlElAuthenticationMethod, ppEapError)) != ERROR_SUCCESS)
+ return dwResult;
+
+ if (FAILED(hr = pXmlElAuthenticationMethods->appendChild(pXmlElAuthenticationMethod, NULL))) {
+ *ppEapError = m_module.make_error(dwResult = HRESULT_CODE(hr), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error appending element."), NULL);
+ return dwResult;
+ }
+ }
+
+ return dwResult;
+ }
+
+
+ ///
+ /// Load configuration from XML document
+ ///
+ /// \param[in] pConfigRoot Root element for loading configuration
+ /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
+ ///
+ /// \returns
+ /// - \c ERROR_SUCCESS if succeeded
+ /// - error code otherwise
+ ///
+ virtual DWORD load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError)
+ {
+ assert(pConfigRoot);
+ assert(ppEapError);
+ DWORD dwResult;
+ std::wstring lang;
+ LoadString(m_module.m_instance, 2, lang);
+
+ //
+ m_id.clear();
+ eapxml::get_element_value(pConfigRoot, winstd::bstr(L"eap-metadata:ID"), m_id);
+
+ //
+ m_lbl_alt_credential.clear();
+ m_lbl_alt_identity.clear();
+ m_lbl_alt_password.clear();
+ winstd::com_obj pXmlElProviderInfo;
+ if (eapxml::select_element(pConfigRoot, winstd::bstr(L"eap-metadata:ProviderInfo"), &pXmlElProviderInfo) == ERROR_SUCCESS) {
+ //
+ eapxml::get_element_localized(pXmlElProviderInfo, winstd::bstr(L"eap-metadata:CredentialPrompt"), lang.c_str(), m_lbl_alt_credential);
+
+ //
+ eapxml::get_element_localized(pXmlElProviderInfo, winstd::bstr(L"eap-metadata:UserNameLabel"), lang.c_str(), m_lbl_alt_identity);
+
+ //
+ eapxml::get_element_localized(pXmlElProviderInfo, winstd::bstr(L"eap-metadata:PasswordLabel"), lang.c_str(), m_lbl_alt_password);
+ }
+
+ // Iterate authentication methods ().
+ m_methods.clear();
+ winstd::com_obj pXmlListMethods;
+ if ((dwResult = eapxml::select_nodes(pConfigRoot, winstd::bstr(L"eap-metadata:AuthenticationMethods/eap-metadata:AuthenticationMethod"), &pXmlListMethods)) != ERROR_SUCCESS) {
+ *ppEapError = m_module.make_error(dwResult = ERROR_NOT_FOUND, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error selecting / elements."), NULL);
+ return dwResult;
+ }
+ long lCount = 0;
+ pXmlListMethods->get_length(&lCount);
+ for (long i = 0; i < lCount; i++) {
+ winstd::com_obj pXmlElMethod;
+ pXmlListMethods->get_item(i, &pXmlElMethod);
+
+ _Tmeth cfg(m_module);
+
+ // Check EAP method type ().
+ DWORD dwMethodID;
+ if (eapxml::get_element_value(pXmlElMethod, winstd::bstr(L"eap-metadata:EAPMethod"), &dwMethodID) == ERROR_SUCCESS) {
+ if ((type_t)dwMethodID != cfg.get_method_id()) {
+ // Wrong type.
+ continue;
+ }
+ }
+
+ // Load configuration.
+ dwResult = cfg.load(pXmlElMethod, ppEapError);
+ if (dwResult != ERROR_SUCCESS)
+ return dwResult;
+
+ // Add configuration to the list.
+ m_methods.push_back(std::move(cfg));
+ }
+
+ return ERROR_SUCCESS;
+ }
+
+ /// @}
+
+ public:
+ std::wstring m_id; ///< Profile ID
+ winstd::tstring m_lbl_alt_credential; ///< Alternative label for credential prompt
+ winstd::tstring m_lbl_alt_identity; ///< Alternative label for identity prompt
+ winstd::tstring m_lbl_alt_password; ///< Alternative label for password prompt
+ std::list<_Tmeth> m_methods; ///< List of method configurations
+ };
+
+
+ template
+ class config_providers : public config
+ {
+ public:
+ ///
+ /// Constructs configuration
+ ///
+ /// \param[in] mod Reference of the EAP module to use for global services
+ ///
+ config_providers(_In_ module &mod) : config(mod)
+ {
+ }
+
+ ///
+ /// Copies configuration
+ ///
+ /// \param[in] other Configuration to copy from
+ ///
+ config_providers(_In_ const config_providers &other) :
+ m_providers(other.m_providers),
+ config(other)
+ {
+ }
+
+ ///
+ /// Moves configuration
+ ///
+ /// \param[in] other Configuration to move from
+ ///
+ config_providers(_Inout_ config_providers &&other) :
+ m_providers(std::move(other.m_providers)),
+ config(std::move(other))
+ {
+ }
+
+ ///
+ /// Copies configuration
+ ///
+ /// \param[in] other Configuration to copy from
+ ///
+ /// \returns Reference to this object
+ ///
+ config_providers& operator=(_In_ const config_providers &other)
+ {
+ if (this != &other) {
+ (config&)*this = other;
+ m_providers = other.m_providers;
+ }
+
+ return *this;
+ }
+
+ ///
+ /// Moves configuration
+ ///
+ /// \param[in] other Configuration to move from
+ ///
+ /// \returns Reference to this object
+ ///
+ config_providers& operator=(_Inout_ config_providers &&other)
+ {
+ if (this != &other) {
+ (config&&)*this = std::move(other);
+ m_providers = std::move(other.m_providers);
+ }
+
+ return *this;
+ }
+
+ ///
+ /// Clones configuration
+ ///
+ /// \returns Pointer to cloned configuration
+ ///
+ virtual config* clone() const { return new config_providers<_Tprov>(*this); }
+
+ /// \name XML configuration management
+ /// @{
+
+ ///
+ /// Save configuration to XML document
+ ///
+ /// \param[in] pDoc XML document
+ /// \param[in] pConfigRoot Suggested root element for saving configuration
+ /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
+ ///
+ /// \returns
+ /// - \c ERROR_SUCCESS if succeeded
+ /// - error code otherwise
+ ///
+ virtual DWORD save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const
+ {
+ const winstd::bstr bstrNamespace(L"urn:ietf:params:xml:ns:yang:ietf-eap-metadata");
+ DWORD dwResult;
+ HRESULT hr;
+
+ // Select node.
+ winstd::com_obj pXmlElIdentityProviderList;
+ if ((dwResult = eapxml::select_node(pConfigRoot, winstd::bstr(L"eap-metadata:EAPIdentityProviderList"), &pXmlElIdentityProviderList)) != ERROR_SUCCESS) {
+ *ppEapError = m_module.make_error(dwResult = ERROR_NOT_FOUND, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error selecting element."), NULL);
+ return dwResult;
+ }
+
+ for (std::list<_Tprov>::const_iterator provider = m_providers.cbegin(), provider_end = m_providers.cend(); provider != provider_end; ++provider) {
+ //
+ winstd::com_obj pXmlElIdentityProvider;
+ if ((dwResult = eapxml::create_element(pDoc, winstd::bstr(L"EAPIdentityProvider"), bstrNamespace, &pXmlElIdentityProvider))) {
+ *ppEapError = m_module.make_error(dwResult, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error creating element."), NULL);
+ return dwResult;
+ }
+
+ // /...
+ if ((dwResult = provider->save(pDoc, pXmlElIdentityProvider, ppEapError)) != ERROR_SUCCESS)
+ return dwResult;
+
+ if (FAILED(hr = pXmlElIdentityProviderList->appendChild(pXmlElIdentityProvider, NULL))) {
+ *ppEapError = m_module.make_error(dwResult = HRESULT_CODE(hr), 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error appending element."), NULL);
+ return dwResult;
+ }
+ }
+
+ return dwResult;
+ }
+
+
+ ///
+ /// Load configuration from XML document
+ ///
+ /// \param[in] pConfigRoot Root element for loading configuration
+ /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
+ ///
+ /// \returns
+ /// - \c ERROR_SUCCESS if succeeded
+ /// - error code otherwise
+ ///
+ virtual DWORD load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError)
+ {
+ assert(pConfigRoot);
+ assert(ppEapError);
+ DWORD dwResult;
+
+ // Iterate authentication providers ().
+ winstd::com_obj pXmlListProviders;
+ if ((dwResult = eapxml::select_nodes(pConfigRoot, winstd::bstr(L"eap-metadata:EAPIdentityProviderList/eap-metadata:EAPIdentityProvider"), &pXmlListProviders)) != ERROR_SUCCESS) {
+ *ppEapError = m_module.make_error(dwResult = ERROR_NOT_FOUND, 0, NULL, NULL, NULL, _T(__FUNCTION__) _T(" Error selecting elements."), NULL);
+ return dwResult;
+ }
+ long lCount = 0;
+ pXmlListProviders->get_length(&lCount);
+ for (long i = 0; i < lCount; i++) {
+ winstd::com_obj pXmlElProvider;
+ pXmlListProviders->get_item(i, &pXmlElProvider);
+
+ _Tprov prov(m_module);
+
+ // Load provider.
+ dwResult = prov.load(pXmlElProvider, ppEapError);
+ if (dwResult != ERROR_SUCCESS)
+ return dwResult;
+
+ // Add provider to the list.
+ m_providers.push_back(std::move(prov));
+ }
+
+ return dwResult;
+ }
+
+ /// @}
+
+ public:
+ std::list<_Tprov> m_providers; ///< List of provider configurations
+ };
+}
+
+
+namespace eapserial
+{
+ inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_method &val)
+ {
+ pack(cursor, val.m_allow_save );
+ pack(cursor, val.m_anonymous_identity);
+ }
+
+
+ inline size_t get_pk_size(const eap::config_method &val)
+ {
+ return
+ get_pk_size(val.m_allow_save ) +
+ get_pk_size(val.m_anonymous_identity);
+ }
+
+
+ inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_method &val)
+ {
+ unpack(cursor, val.m_allow_save );
+ unpack(cursor, val.m_anonymous_identity);
+ }
+
+
+ template
+ inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_provider<_Tmeth> &val)
+ {
+ pack(cursor, val.m_id );
+ pack(cursor, val.m_lbl_alt_credential);
+ pack(cursor, val.m_lbl_alt_identity );
+ pack(cursor, val.m_lbl_alt_password );
+ pack(cursor, val.m_methods );
+ }
+
+
+ template
+ inline size_t get_pk_size(const eap::config_provider<_Tmeth> &val)
+ {
+ return
+ get_pk_size(val.m_id ) +
+ get_pk_size(val.m_lbl_alt_credential) +
+ get_pk_size(val.m_lbl_alt_identity ) +
+ get_pk_size(val.m_lbl_alt_password ) +
+ get_pk_size(val.m_methods );
+ }
+
+
+ template
+ inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_provider<_Tmeth> &val)
+ {
+ unpack(cursor, val.m_id );
+ unpack(cursor, val.m_lbl_alt_credential);
+ unpack(cursor, val.m_lbl_alt_identity );
+ unpack(cursor, val.m_lbl_alt_password );
+
+ std::list<_Tmeth>::size_type count = *(const std::list<_Tmeth>::size_type*&)cursor;
+ cursor += sizeof(std::list<_Tmeth>::size_type);
+ val.m_methods.clear();
+ for (std::list<_Tmeth>::size_type i = 0; i < count; i++) {
+ _Tmeth el(val.m_module);
+ unpack(cursor, el);
+ val.m_methods.push_back(std::move(el));
+ }
+ }
+
+
+ template
+ inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_providers<_Tprov> &val)
+ {
+ pack(cursor, val.m_providers);
+ }
+
+
+ template
+ inline size_t get_pk_size(const eap::config_providers<_Tprov> &val)
+ {
+ return get_pk_size(val.m_providers);
+ }
+
+
+ template
+ inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_providers<_Tprov> &val)
+ {
+ std::list<_Tprov>::size_type count = *(const std::list<_Tprov>::size_type*&)cursor;
+ cursor += sizeof(std::list<_Tprov>::size_type);
+ val.m_providers.clear();
+ for (std::list<_Tprov>::size_type i = 0; i < count; i++) {
+ _Tprov el(val.m_module);
+ unpack(cursor, el);
+ val.m_providers.push_back(std::move(el));
+ }
+ }
+}
diff --git a/EAPMethods/include/TLS.h b/lib/EAPBase/include/Credentials.h
similarity index 55%
rename from EAPMethods/include/TLS.h
rename to lib/EAPBase/include/Credentials.h
index e514af25..e0f617d4 100644
--- a/EAPMethods/include/TLS.h
+++ b/lib/EAPBase/include/Credentials.h
@@ -18,137 +18,219 @@
along with GÉANTLink. If not, see .
*/
-#include "EAP.h"
-#include "EAPSerial.h"
+#include
namespace eap
{
- class config_tls;
- class credentials_tls;
+ ///
+ /// Base class for method credential storage
+ ///
+ class credentials;
+
+ ///
+ /// Password based method credentials
+ ///
+ class credentials_pass;
}
namespace eapserial
{
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_tls &val);
- inline size_t get_pk_size(const eap::config_tls &val);
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_tls &val);
+ ///
+ /// Packs a method credentials
+ ///
+ /// \param[inout] cursor Memory cursor
+ /// \param[in] val Credentials to pack
+ ///
+ inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::credentials &val);
+
+ ///
+ /// Returns packed size of a method credentials
+ ///
+ /// \param[in] val Credentials to pack
+ ///
+ /// \returns Size of data when packed (in bytes)
+ ///
+ inline size_t get_pk_size(const eap::credentials &val);
+
+ ///
+ /// Unpacks a method credentials
+ ///
+ /// \param[inout] cursor Memory cursor
+ /// \param[out] val Credentials to unpack to
+ ///
+ inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::credentials &val);
+
+ ///
+ /// Packs a password based method credentials
+ ///
+ /// \param[inout] cursor Memory cursor
+ /// \param[in] val Credentials to pack
+ ///
+ inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::credentials_pass &val);
+
+ ///
+ /// Returns packed size of a password based method credentials
+ ///
+ /// \param[in] val Credentials to pack
+ ///
+ /// \returns Size of data when packed (in bytes)
+ ///
+ inline size_t get_pk_size(const eap::credentials_pass &val);
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::credentials_tls &val);
- inline size_t get_pk_size(const eap::credentials_tls &val);
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::credentials_tls &val);
+ ///
+ /// Unpacks a password based method credentials
+ ///
+ /// \param[inout] cursor Memory cursor
+ /// \param[out] val Credentials to unpack to
+ ///
+ inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::credentials_pass &val);
}
#pragma once
+#include "Config.h"
+#include "Module.h"
+#include "EAPSerial.h"
+
+#include "../../../include/Version.h"
+
+#include
+
+#include
+#include // Must include after
+#include
+#include
+
+#include
+
namespace eap
{
- ///
- /// TLS configuration
- ///
- class config_tls : public config_method
+ class credentials : public config
{
public:
///
- /// Constructs configuration
+ /// Constructs credentials
///
/// \param[in] mod Reference of the EAP module to use for global services
///
- config_tls(_In_ module &mod);
+ credentials(_In_ module &mod);
///
- /// Copies configuration
+ /// Copies credentials
///
- /// \param[in] other Configuration to copy from
+ /// \param[in] other Credentials to copy from
///
- config_tls(_In_ const config_tls &other);
+ credentials(_In_ const credentials &other);
///
- /// Moves configuration
+ /// Moves credentials
///
- /// \param[in] other Configuration to move from
+ /// \param[in] other Credentials to move from
///
- config_tls(_Inout_ config_tls &&other);
+ credentials(_Inout_ credentials &&other);
///
- /// Copies configuration
+ /// Copies credentials
///
- /// \param[in] other Configuration to copy from
+ /// \param[in] other Credentials to copy from
///
/// \returns Reference to this object
///
- config_tls& operator=(_In_ const config_tls &other);
+ credentials& operator=(_In_ const credentials &other);
///
- /// Moves configuration
+ /// Moves credentials
///
/// \param[in] other Configuration to move from
///
/// \returns Reference to this object
///
- config_tls& operator=(_Inout_ config_tls &&other);
+ credentials& operator=(_Inout_ credentials &&other);
///
- /// Clones configuration
+ /// Resets credentials
///
- /// \returns Pointer to cloned configuration
+ virtual void clear();
+
+ ///
+ /// Test credentials if blank
///
- virtual config* clone() const { return new config_tls(*this); }
+ virtual bool empty() const;
- /// \name XML configuration management
+ /// \name XML credentials management
/// @{
///
- /// Save configuration to XML document
+ /// Save credentials to XML document
///
/// \param[in] pDoc XML document
- /// \param[in] pConfigRoot Suggested root element for saving configuration
+ /// \param[in] pConfigRoot Suggested root element for saving credentials
/// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
///
+ /// \returns Always returns \c ERROR_NOT_SUPPORTED, as credentials are non-exportable.
+ ///
+ virtual DWORD save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const;
+
+ /// @}
+
+ /// \name Storage
+ /// @{
+
+ ///
+ /// Save credentials to Windows Credential Manager
+ ///
+ /// \param[in] pszTargetName The name in Windows Credential Manager to store credentials as
+ /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
+ ///
/// \returns
/// - \c ERROR_SUCCESS if succeeded
/// - error code otherwise
///
- virtual DWORD save(_In_ IXMLDOMDocument *pDoc, _In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError) const;
+ virtual DWORD store(_In_ LPCTSTR pszTargetName, _Out_ EAP_ERROR **ppEapError) const = 0;
///
- /// Load configuration from XML document
+ /// Retrieve credentials from Windows Credential Manager
///
- /// \param[in] pConfigRoot Root element for loading configuration
- /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
+ /// \param[in] pszTargetName The name in Windows Credential Manager to retrieve credentials from
+ /// \param[out] ppEapError Pointer to error descriptor in case of failure. Free using `module::free_error_memory()`.
///
/// \returns
/// - \c ERROR_SUCCESS if succeeded
/// - error code otherwise
///
- virtual DWORD load(_In_ IXMLDOMNode *pConfigRoot, _Out_ EAP_ERROR **ppEapError);
+ virtual DWORD retrieve(_In_ LPCTSTR pszTargetName, _Out_ EAP_ERROR **ppEapError) = 0;
- /// @}
-
- ///
- /// Returns EAP method type of this configuration
///
- /// \returns `eap::type_tls`
+ /// Return target suffix for Windows Credential Manager credential name
///
- virtual eap::type_t get_method_id() { return eap::type_tls; }
+ virtual LPCTSTR target_suffix() const = 0;
///
- /// Adds CA to the list of trusted root CA's
+ /// Returns target name for Windows Credential Manager credential name
+ ///
+ /// \param[in] pszTargetName The name in Windows Credential Manager to retrieve credentials from
///
- /// \sa [CertCreateCertificateContext function](https://msdn.microsoft.com/en-us/library/windows/desktop/aa376033.aspx)
+ /// \returns Final target name to store/retrieve credentials in Windows Credential Manager
///
- bool add_trusted_ca(_In_ DWORD dwCertEncodingType, _In_ const BYTE *pbCertEncoded, _In_ DWORD cbCertEncoded);
+ inline winstd::tstring target_name(_In_ LPCTSTR pszTargetName) const
+ {
+ winstd::tstring target_name(_T(PRODUCT_NAME_STR) _T("/"));
+ target_name += pszTargetName;
+ target_name += _T('/');
+ target_name += target_suffix();
+ assert(target_name.length() < CRED_MAX_GENERIC_TARGET_NAME_LENGTH);
+ return target_name;
+ }
+
+ /// @}
public:
- std::list m_trusted_root_ca; ///< Trusted root CAs
- std::list m_server_names; ///< Acceptable authenticating server names
+ std::wstring m_identity; ///< Identity (username\@domain, certificate name etc.)
};
- ///
- /// TLS credentials
- ///
- class credentials_tls : public credentials
+ class credentials_pass : public credentials
{
public:
///
@@ -156,21 +238,21 @@ namespace eap
///
/// \param[in] mod Reference of the EAP module to use for global services
///
- credentials_tls(_In_ module &mod);
+ credentials_pass(_In_ module &mod);
///
/// Copies credentials
///
/// \param[in] other Credentials to copy from
///
- credentials_tls(_In_ const credentials_tls &other);
+ credentials_pass(_In_ const credentials_pass &other);
///
/// Moves credentials
///
/// \param[in] other Credentials to move from
///
- credentials_tls(_Inout_ credentials_tls &&other);
+ credentials_pass(_Inout_ credentials_pass &&other);
///
/// Copies credentials
@@ -179,7 +261,7 @@ namespace eap
///
/// \returns Reference to this object
///
- credentials_tls& operator=(_In_ const credentials_tls &other);
+ credentials_pass& operator=(_In_ const credentials_pass &other);
///
/// Moves credentials
@@ -188,14 +270,7 @@ namespace eap
///
/// \returns Reference to this object
///
- credentials_tls& operator=(_Inout_ credentials_tls &&other);
-
- ///
- /// Clones credentials
- ///
- /// \returns Pointer to cloned credentials
- ///
- virtual config* clone() const { return new credentials_tls(*this); }
+ credentials_pass& operator=(_Inout_ credentials_pass &&other);
///
/// Resets credentials
@@ -207,7 +282,7 @@ namespace eap
///
virtual bool empty() const;
- /// \name XML credentials management
+ /// \name XML configuration management
/// @{
///
@@ -251,102 +326,56 @@ namespace eap
///
virtual DWORD retrieve(_In_ LPCTSTR pszTargetName, _Out_ EAP_ERROR **ppEapError);
- ///
- /// Return target suffix for Windows Credential Manager credential name
- ///
- virtual LPCTSTR target_suffix() const { return _T("TLS"); }
-
/// @}
public:
- std::vector m_cert_hash; ///< Client certificate hash (certificates are kept in Personal Certificate Storage)
+ winstd::sanitizing_wstring m_password; ///< Password
};
}
namespace eapserial
{
- ///
- /// Packs a TLS method configuration
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[in] val Configuration to pack
- ///
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::config_tls &val)
+ inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::credentials &val)
{
- pack(cursor, (const eap::config_method&)val);
- pack(cursor, val.m_trusted_root_ca );
- pack(cursor, val.m_server_names );
+ pack(cursor, (const eap::config&)val);
+ pack(cursor, val.m_identity );
}
- ///
- /// Returns packed size of a TLS method configuration
- ///
- /// \param[in] val Configuration to pack
- ///
- /// \returns Size of data when packed (in bytes)
- ///
- inline size_t get_pk_size(const eap::config_tls &val)
+ inline size_t get_pk_size(const eap::credentials &val)
{
return
- get_pk_size((const eap::config_method&)val) +
- get_pk_size(val.m_trusted_root_ca ) +
- get_pk_size(val.m_server_names );
+ get_pk_size((const eap::config&)val) +
+ get_pk_size(val.m_identity );
}
- ///
- /// Unpacks a TLS method configuration
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[out] val Configuration to unpack to
- ///
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::config_tls &val)
+ inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::credentials &val)
{
- unpack(cursor, (eap::config_method&)val );
- unpack(cursor, val.m_trusted_root_ca);
- unpack(cursor, val.m_server_names );
+ unpack(cursor, (eap::config&)val);
+ unpack(cursor, val.m_identity );
}
- ///
- /// Packs a TLS method credentials
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[in] val Credentials to pack
- ///
- inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::credentials_tls &val)
+ inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::credentials_pass &val)
{
pack(cursor, (const eap::credentials&)val);
- pack(cursor, val.m_cert_hash );
+ pack(cursor, val.m_password );
}
- ///
- /// Returns packed size of a TLS method credentials
- ///
- /// \param[in] val Credentials to pack
- ///
- /// \returns Size of data when packed (in bytes)
- ///
- inline size_t get_pk_size(const eap::credentials_tls &val)
+ inline size_t get_pk_size(const eap::credentials_pass &val)
{
return
get_pk_size((const eap::credentials&)val) +
- get_pk_size(val.m_cert_hash );
+ get_pk_size(val.m_password );
}
- ///
- /// Unpacks a TLS method credentials
- ///
- /// \param[inout] cursor Memory cursor
- /// \param[out] val Credentials to unpack to
- ///
- inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::credentials_tls &val)
+ inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::credentials_pass &val)
{
unpack(cursor, (eap::credentials&)val);
- unpack(cursor, val.m_cert_hash );
+ unpack(cursor, val.m_password );
}
}
diff --git a/lib/EAPBase/include/EAP.h b/lib/EAPBase/include/EAP.h
new file mode 100644
index 00000000..de29cf47
--- /dev/null
+++ b/lib/EAPBase/include/EAP.h
@@ -0,0 +1,52 @@
+/*
+ Copyright 2015-2016 Amebis
+ Copyright 2016 GÉANT
+
+ This file is part of GÉANTLink.
+
+ GÉANTLink is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ GÉANTLink is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GÉANTLink. If not, see .
+*/
+
+#define IDR_EAP_KEY_PUBLIC 1
+#define IDR_EAP_KEY_PRIVATE 2
+
+#if !defined(RC_INVOKED) && !defined(MIDL_PASS)
+
+namespace eap
+{
+ ///
+ /// EAP method numbers
+ ///
+ /// \sa [Extensible Authentication Protocol (EAP) Registry (Chapter: Method Types)](https://www.iana.org/assignments/eap-numbers/eap-numbers.xhtml#eap-numbers-4)
+ ///
+ enum type_t;
+}
+
+
+#pragma once
+
+
+namespace eap
+{
+ enum type_t {
+ type_undefined = 0, ///< Undefined EAP type
+ type_tls = 13, ///< EAP-TLS
+ type_ttls = 21, ///< EAP-TTLS
+ type_peap = 25, ///< EAP-PEAP
+ type_mschapv2 = 26, ///< EAP-MSCHAPv2
+ type_pap = 192, ///< PAP (Not actually an EAP method; Moved to the Unassigned area)
+ };
+}
+
+#endif
diff --git a/EAPMethods/include/EAPSerial.h b/lib/EAPBase/include/EAPSerial.h
similarity index 96%
rename from EAPMethods/include/EAPSerial.h
rename to lib/EAPBase/include/EAPSerial.h
index eeec53fa..8e0be3cb 100644
--- a/EAPMethods/include/EAPSerial.h
+++ b/lib/EAPBase/include/EAPSerial.h
@@ -20,34 +20,162 @@
#include
+#include
+
#include
#include