RSNEAPOL::RSNEAPOL(const uint8_t* buffer, uint32_t total_sz) : EAPOL(buffer, total_sz) { InputMemoryStream stream(buffer, total_sz); stream.skip(sizeof(eapol_header)); stream.read(header_); if (stream.size() >= wpa_length()) { stream.read(key_, wpa_length()); if (stream) { inner_pdu(new RawPDU(stream.pointer(), stream.size())); } } }
void RSNEAPOL::write_body(OutputMemoryStream& stream) { if (key_.size()) { if (!header_.key_t && header_.install) { header_.key_length = Endian::host_to_be<uint16_t>(32); wpa_length(static_cast<uint16_t>(key_.size())); } else if (key_.size()) { wpa_length(static_cast<uint16_t>(key_.size())); } } stream.write(header_); stream.write(key_.begin(), key_.end()); }
void RSNEAPOL::write_body(uint8_t *buffer, uint32_t total_sz) { #ifdef TINS_DEBUG assert(total_sz >= header_size() - sizeof(eapolhdr)); #endif if(_key.size()) { if(!_header.key_t) { _header.key_length = Endian::host_to_be<uint16_t>(32); wpa_length(_key.size()); } else if(_key.size()) { wpa_length(_key.size()); } } std::memcpy(buffer, &_header, sizeof(_header)); buffer += sizeof(_header); std::copy(_key.begin(), _key.end(), buffer); }
RSNEAPOL::RSNEAPOL(const uint8_t *buffer, uint32_t total_sz) : EAPOL(buffer, total_sz) { buffer += sizeof(eapolhdr); total_sz -= sizeof(eapolhdr); if(total_sz < sizeof(_header)) throw malformed_packet(); std::memcpy(&_header, buffer, sizeof(_header)); buffer += sizeof(_header); total_sz -= sizeof(_header); if(total_sz == wpa_length()) _key.assign(buffer, buffer + total_sz); }