diff --git a/lib/EAPBase/include/EAP.h b/lib/EAPBase/include/EAP.h index 70d5358..f1bac15 100644 --- a/lib/EAPBase/include/EAP.h +++ b/lib/EAPBase/include/EAP.h @@ -91,6 +91,40 @@ namespace eap /// struct diameter_avp_header_ven; + /// + /// Appends Diameter AVP to response packet + /// + /// \param[in ] code AVP code + /// \param[in ] flags AVP flags + /// \param[in ] data AVP data (<16777212B) + /// \param[in ] size Size of \p data in bytes + /// \param[inout] packet Response packet to append data to + /// + void diameter_avp_append( + _In_ unsigned int code, + _In_ unsigned char flags, + _In_bytecount_(size) const void *data, + _In_ unsigned int size, + _Inout_ sanitizing_blob &packet); + + /// + /// Appends Diameter AVP to response packet + /// + /// \param[in ] code AVP code + /// \param[in ] vendor_id Vendor-ID + /// \param[in ] flags AVP flags + /// \param[in ] data AVP data (<16777212B) + /// \param[in ] size Size of \p data in bytes + /// \param[inout] packet Response packet to append data to + /// + void diameter_avp_append( + _In_ unsigned int code, + _In_ unsigned int vendor_id, + _In_ unsigned char flags, + _In_bytecount_(size) const void *data, + _In_ unsigned int size, + _Inout_ sanitizing_blob &packet); + /// /// EAP packet /// diff --git a/lib/EAPBase/src/EAP.cpp b/lib/EAPBase/src/EAP.cpp index 64e9072..e3f84e1 100644 --- a/lib/EAPBase/src/EAP.cpp +++ b/lib/EAPBase/src/EAP.cpp @@ -24,6 +24,78 @@ using namespace std; using namespace winstd; +////////////////////////////////////////////////////////////////////// +// eap::diameter_avp_append +////////////////////////////////////////////////////////////////////// + +void eap::diameter_avp_append( + _In_ unsigned int code, + _In_ unsigned char flags, + _In_bytecount_(size) const void *data, + _In_ unsigned int size, + _Inout_ sanitizing_blob &packet) +{ + unsigned int + padding = (unsigned int)((4 - size) % 4), + size_outer; + + packet.reserve( + packet.size() + + (size_outer = + sizeof(diameter_avp_header) + // Diameter header + size) + // Data + padding); // Data padding + + // Diameter AVP header + diameter_avp_header hdr; + *reinterpret_cast(hdr.code) = htonl(code); + hdr.flags = flags; + hton24(size_outer, hdr.length); + packet.insert(packet.end(), reinterpret_cast(&hdr), reinterpret_cast(&hdr + 1)); + + // Data + packet.insert(packet.end(), reinterpret_cast(data), reinterpret_cast(data) + size); + packet.insert(packet.end(), padding, 0); +} + + +////////////////////////////////////////////////////////////////////// +// eap::diameter_avp_append +////////////////////////////////////////////////////////////////////// + +void eap::diameter_avp_append( + _In_ unsigned int code, + _In_ unsigned int vendor_id, + _In_ unsigned char flags, + _In_bytecount_(size) const void *data, + _In_ unsigned int size, + _Inout_ sanitizing_blob &packet) +{ + unsigned int + padding = (unsigned int)((4 - size) % 4), + size_outer; + + packet.reserve( + packet.size() + + (size_outer = + sizeof(diameter_avp_header_ven) + // Diameter header + size) + // Data + padding); // Data padding + + // Diameter AVP header + diameter_avp_header_ven hdr; + *reinterpret_cast(hdr.code) = htonl(code); + hdr.flags = flags | diameter_avp_flag_vendor; + hton24(size_outer, hdr.length); + *reinterpret_cast(hdr.vendor) = htonl(vendor_id); + packet.insert(packet.end(), reinterpret_cast(&hdr), reinterpret_cast(&hdr + 1)); + + // Data + packet.insert(packet.end(), reinterpret_cast(data), reinterpret_cast(data) + size); + packet.insert(packet.end(), padding, 0); +} + + ////////////////////////////////////////////////////////////////////// // eap::packet //////////////////////////////////////////////////////////////////////