From 11c28326aabfc9efc6f2a207ff4c0a058f0bc7f3 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Wed, 15 Jun 2016 11:30:03 +0200 Subject: [PATCH] Serialization of TTLS credentials added --- lib/TTLS/include/Credentials.h | 82 ++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/lib/TTLS/include/Credentials.h b/lib/TTLS/include/Credentials.h index cfe5efb..eded339 100644 --- a/lib/TTLS/include/Credentials.h +++ b/lib/TTLS/include/Credentials.h @@ -26,9 +26,38 @@ namespace eap class credentials_ttls; } +namespace eapserial +{ + /// + /// Packs a TTLS based method credentials + /// + /// \param[inout] cursor Memory cursor + /// \param[in] val Configuration to pack + /// + inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::credentials_ttls &val); + + /// + /// Returns packed size of a TTLS based method credentials + /// + /// \param[in] val Configuration to pack + /// + /// \returns Size of data when packed (in bytes) + /// + inline size_t get_pk_size(const eap::credentials_ttls &val); + + /// + /// Unpacks a TTLS based method credentials + /// + /// \param[inout] cursor Memory cursor + /// \param[out] val Configuration to unpack to + /// + inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::credentials_ttls &val); +} + #pragma once #include "../../TLS/include/Credentials.h" +#include "../../PAP/include/Credentials.h" namespace eap @@ -142,3 +171,56 @@ namespace eap credentials *m_inner; ///< Inner credentials }; } + + +namespace eapserial +{ + inline void pack(_Inout_ unsigned char *&cursor, _In_ const eap::credentials_ttls &val) + { + pack(cursor, (const eap::credentials_tls&)val); + if (val.m_inner) { + if (dynamic_cast(val.m_inner)) { + pack(cursor, (unsigned char)eap::type_pap); + pack(cursor, (const eap::credentials_pap&)*val.m_inner); + } else { + assert(0); // Unsupported inner authentication method type. + pack(cursor, (unsigned char)0); + } + } else + pack(cursor, (unsigned char)0); + } + + + inline size_t get_pk_size(const eap::credentials_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::credentials_pap&)*val.m_inner); + else + assert(0); // Unsupported inner authentication method type. + } + + return + get_pk_size((const eap::credentials_tls&)val) + + size_inner; + } + + + inline void unpack(_Inout_ const unsigned char *&cursor, _Out_ eap::credentials_ttls &val) + { + unpack(cursor, (eap::credentials_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::credentials_pap(val.m_module); + unpack(cursor, (eap::credentials_pap&)*val.m_inner); + break; + case 0 : break; + default : assert(0); // Unsupported inner authentication method type. + } + } +}