diff --git a/libraries/networking/src/udt/Packet.cpp b/libraries/networking/src/udt/Packet.cpp index 263c7ee6cf..84b4b24ec2 100644 --- a/libraries/networking/src/udt/Packet.cpp +++ b/libraries/networking/src/udt/Packet.cpp @@ -11,6 +11,10 @@ #include "Packet.h" +#include + +#include "SaltShaker.h" + using namespace udt; static int packetMetaTypeId = qRegisterMetaType("Packet*"); @@ -68,6 +72,26 @@ Packet::Packet(std::unique_ptr data, qint64 size, const HifiSockAddr& se { readHeader(); + if (getObfuscationLevel() != Packet::NoObfuscation) { + SaltShaker shaker; + shaker.unsalt(*this, getObfuscationLevel()); + readHeader(); // read packet header again as some of the data was obfuscated + + QString debugString = "Unobfuscating packet %1 with level %2"; + debugString = debugString.arg(QString::number((uint32_t)getSequenceNumber()), + QString::number(getObfuscationLevel())); + + if (isPartOfMessage()) { + debugString += "\n"; + debugString += " Message Number: %1, Part Number: %2."; + debugString = debugString.arg(QString::number(getMessageNumber()), + QString::number(getMessagePartNumber())); + } + + static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("^Unobfuscating packet .{0,1000}"); + qDebug() << qPrintable(debugString); + } + adjustPayloadStartAndCapacity(Packet::localHeaderSize(_isPartOfMessage), _payloadSize > 0); } diff --git a/libraries/networking/src/udt/SaltShaker.cpp b/libraries/networking/src/udt/SaltShaker.cpp index 2ae1ab520c..73c59f7925 100644 --- a/libraries/networking/src/udt/SaltShaker.cpp +++ b/libraries/networking/src/udt/SaltShaker.cpp @@ -23,7 +23,7 @@ static const std::array KEYS {{ 0x54c92e8d2c871642 }}; -void saltingHelper(char* start, int size, Key key) {; +void saltingHelper(char* start, int size, Key key) { const auto end = start + size; auto p = start; @@ -42,13 +42,13 @@ std::unique_ptr SaltShaker::salt(const Packet& packet, unsigned int salt Q_ASSERT_X(saltiness < KEYS.size(), Q_FUNC_INFO, ""); auto copy = Packet::createCopy(packet); - saltingHelper(copy->getPayload(), copy->getPayloadSize(), KEYS[saltiness]); copy->writeSequenceNumber(copy->getSequenceNumber(), (Packet::ObfuscationLevel)saltiness); + saltingHelper(copy->getData() + 4, copy->getDataSize() - 4, KEYS[saltiness]); return copy; } -void unsalt(Packet& packet, unsigned int saltiness) { +void SaltShaker::unsalt(Packet& packet, unsigned int saltiness) { Q_ASSERT_X(saltiness < KEYS.size(), Q_FUNC_INFO, ""); - saltingHelper(packet.getPayload(), packet.getPayloadSize(), KEYS[saltiness]); + saltingHelper(packet.getData() + 4, packet.getDataSize() - 4, KEYS[saltiness]); } \ No newline at end of file diff --git a/libraries/networking/src/udt/SendQueue.cpp b/libraries/networking/src/udt/SendQueue.cpp index e8cf121609..da3727b214 100644 --- a/libraries/networking/src/udt/SendQueue.cpp +++ b/libraries/networking/src/udt/SendQueue.cpp @@ -338,6 +338,8 @@ bool SendQueue::maybeSendNewPacket() { return false; } +#include + bool SendQueue::maybeResendPacket() { // the following while makes sure that we find a packet to re-send, if there is one @@ -362,27 +364,26 @@ bool SendQueue::maybeResendPacket() { auto& resendPacket = *(entry.second); ++entry.first; // Add 1 resend - static const int OBFUSCATION_THRESHOLD = 3; - if (entry.first > OBFUSCATION_THRESHOLD) { + auto saltiness = entry.first < 2 ? 0 : (entry.first - 2) % 4; - if (entry.first % OBFUSCATION_THRESHOLD == 0) { - QString debugString = "Obfuscating packet %1 with level %2 for the first time."; - debugString = debugString.arg((uint32_t)resendPacket.getSequenceNumber(), - entry.first / OBFUSCATION_THRESHOLD); + if (saltiness != 0) { + QString debugString = "Obfuscating packet %1 with level %2"; + debugString = debugString.arg(QString::number((uint32_t)resendPacket.getSequenceNumber()), + QString::number(saltiness)); - if (resendPacket.isPartOfMessage()) { - debugString += "\n"; - debugString += " Message Number: %1, Part Number: %2."; - debugString = debugString.arg(resendPacket.getMessageNumber(), - resendPacket.getMessagePartNumber()); - } - - qCritical() << qPrintable(debugString); + if (resendPacket.isPartOfMessage()) { + debugString += "\n"; + debugString += " Message Number: %1, Part Number: %2."; + debugString = debugString.arg(QString::number(resendPacket.getMessageNumber()), + QString::number(resendPacket.getMessagePartNumber())); } + static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("^Obfuscating packet .{0,1000}"); + qCritical() << qPrintable(debugString); + SaltShaker shaker; - auto packet = shaker.salt(resendPacket, glm::min(entry.first / OBFUSCATION_THRESHOLD, 3)); + auto packet = shaker.salt(resendPacket, saltiness); // unlock the sent packets sentLocker.unlock();