mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 04:48:09 +02:00
Cleanup obfuscation code
This commit is contained in:
parent
17b4d6fcf9
commit
cb4f400c7e
5 changed files with 55 additions and 101 deletions
|
@ -11,14 +11,35 @@
|
||||||
|
|
||||||
#include "Packet.h"
|
#include "Packet.h"
|
||||||
|
|
||||||
#include <LogHandler.h>
|
#include <array>
|
||||||
|
|
||||||
#include "SaltShaker.h"
|
#include <LogHandler.h>
|
||||||
|
|
||||||
using namespace udt;
|
using namespace udt;
|
||||||
|
|
||||||
static int packetMetaTypeId = qRegisterMetaType<Packet*>("Packet*");
|
static int packetMetaTypeId = qRegisterMetaType<Packet*>("Packet*");
|
||||||
|
|
||||||
|
using Key = uint64_t;
|
||||||
|
static const std::array<Key, 4> KEYS {{
|
||||||
|
0x0,
|
||||||
|
0x6362726973736574,
|
||||||
|
0x7362697261726461,
|
||||||
|
0x72687566666d616e,
|
||||||
|
}};
|
||||||
|
|
||||||
|
void xorHelper(char* start, int size, Key key) {
|
||||||
|
const auto end = start + size;
|
||||||
|
|
||||||
|
auto p = start;
|
||||||
|
for (; p + sizeof(Key) < end; p += sizeof(Key)) {
|
||||||
|
*reinterpret_cast<Key*>(p) ^= key;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; p < end; ++p || ++i) {
|
||||||
|
*p ^= *(reinterpret_cast<const char*>(&key) + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int Packet::localHeaderSize(bool isPartOfMessage) {
|
int Packet::localHeaderSize(bool isPartOfMessage) {
|
||||||
return sizeof(Packet::SequenceNumberAndBitField) +
|
return sizeof(Packet::SequenceNumberAndBitField) +
|
||||||
(isPartOfMessage ? sizeof(Packet::MessageNumberAndBitField) + sizeof(MessagePartNumber) : 0);
|
(isPartOfMessage ? sizeof(Packet::MessageNumberAndBitField) + sizeof(MessagePartNumber) : 0);
|
||||||
|
@ -72,11 +93,9 @@ Packet::Packet(std::unique_ptr<char[]> data, qint64 size, const HifiSockAddr& se
|
||||||
{
|
{
|
||||||
readHeader();
|
readHeader();
|
||||||
|
|
||||||
if (getObfuscationLevel() != Packet::NoObfuscation) {
|
adjustPayloadStartAndCapacity(Packet::localHeaderSize(_isPartOfMessage), _payloadSize > 0);
|
||||||
SaltShaker shaker;
|
|
||||||
shaker.unsalt(*this, getObfuscationLevel());
|
|
||||||
readHeader(); // read packet header again as some of the data was obfuscated
|
|
||||||
|
|
||||||
|
if (getObfuscationLevel() != Packet::NoObfuscation) {
|
||||||
QString debugString = "Unobfuscating packet %1 with level %2";
|
QString debugString = "Unobfuscating packet %1 with level %2";
|
||||||
debugString = debugString.arg(QString::number((uint32_t)getSequenceNumber()),
|
debugString = debugString.arg(QString::number((uint32_t)getSequenceNumber()),
|
||||||
QString::number(getObfuscationLevel()));
|
QString::number(getObfuscationLevel()));
|
||||||
|
@ -90,9 +109,9 @@ Packet::Packet(std::unique_ptr<char[]> data, qint64 size, const HifiSockAddr& se
|
||||||
|
|
||||||
static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("^Unobfuscating packet .{0,1000}");
|
static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("^Unobfuscating packet .{0,1000}");
|
||||||
qDebug() << qPrintable(debugString);
|
qDebug() << qPrintable(debugString);
|
||||||
}
|
|
||||||
|
|
||||||
adjustPayloadStartAndCapacity(Packet::localHeaderSize(_isPartOfMessage), _payloadSize > 0);
|
obfuscate(NoObfuscation); // Undo obfuscation
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Packet::Packet(const Packet& other) : BasePacket(other) {
|
Packet::Packet(const Packet& other) : BasePacket(other) {
|
||||||
|
@ -119,7 +138,7 @@ Packet& Packet::operator=(Packet&& other) {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Packet::writeMessageNumber(MessageNumber messageNumber, PacketPosition position, MessagePartNumber messagePartNumber) {
|
void Packet::writeMessageNumber(MessageNumber messageNumber, PacketPosition position, MessagePartNumber messagePartNumber) const {
|
||||||
_isPartOfMessage = true;
|
_isPartOfMessage = true;
|
||||||
_messageNumber = messageNumber;
|
_messageNumber = messageNumber;
|
||||||
_packetPosition = position;
|
_packetPosition = position;
|
||||||
|
@ -127,12 +146,23 @@ void Packet::writeMessageNumber(MessageNumber messageNumber, PacketPosition posi
|
||||||
writeHeader();
|
writeHeader();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Packet::writeSequenceNumber(SequenceNumber sequenceNumber, ObfuscationLevel level) const {
|
void Packet::writeSequenceNumber(SequenceNumber sequenceNumber) const {
|
||||||
_sequenceNumber = sequenceNumber;
|
_sequenceNumber = sequenceNumber;
|
||||||
_obfuscationLevel = level;
|
|
||||||
writeHeader();
|
writeHeader();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Packet::obfuscate(ObfuscationLevel level) {
|
||||||
|
auto obfuscationKey = KEYS[getObfuscationLevel()] ^ KEYS[level]; // Undo old and apply new one.
|
||||||
|
if (obfuscationKey != 0) {
|
||||||
|
xorHelper(getData() + localHeaderSize(isPartOfMessage()),
|
||||||
|
getDataSize() - localHeaderSize(isPartOfMessage()), obfuscationKey);
|
||||||
|
|
||||||
|
// Update members and header
|
||||||
|
_obfuscationLevel = level;
|
||||||
|
writeHeader();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Packet::copyMembers(const Packet& other) {
|
void Packet::copyMembers(const Packet& other) {
|
||||||
_isReliable = other._isReliable;
|
_isReliable = other._isReliable;
|
||||||
_isPartOfMessage = other._isPartOfMessage;
|
_isPartOfMessage = other._isPartOfMessage;
|
||||||
|
@ -155,6 +185,7 @@ void Packet::readHeader() const {
|
||||||
|
|
||||||
if (_isPartOfMessage) {
|
if (_isPartOfMessage) {
|
||||||
MessageNumberAndBitField* messageNumberAndBitField = seqNumBitField + 1;
|
MessageNumberAndBitField* messageNumberAndBitField = seqNumBitField + 1;
|
||||||
|
|
||||||
_messageNumber = *messageNumberAndBitField & MESSAGE_NUMBER_MASK;
|
_messageNumber = *messageNumberAndBitField & MESSAGE_NUMBER_MASK;
|
||||||
_packetPosition = static_cast<PacketPosition>(*messageNumberAndBitField >> PACKET_POSITION_OFFSET);
|
_packetPosition = static_cast<PacketPosition>(*messageNumberAndBitField >> PACKET_POSITION_OFFSET);
|
||||||
|
|
||||||
|
|
|
@ -90,8 +90,9 @@ public:
|
||||||
PacketPosition getPacketPosition() const { return _packetPosition; }
|
PacketPosition getPacketPosition() const { return _packetPosition; }
|
||||||
MessagePartNumber getMessagePartNumber() const { return _messagePartNumber; }
|
MessagePartNumber getMessagePartNumber() const { return _messagePartNumber; }
|
||||||
|
|
||||||
void writeMessageNumber(MessageNumber messageNumber, PacketPosition position, MessagePartNumber messagePartNumber);
|
void writeMessageNumber(MessageNumber messageNumber, PacketPosition position, MessagePartNumber messagePartNumber) const;
|
||||||
void writeSequenceNumber(SequenceNumber sequenceNumber, ObfuscationLevel level = NoObfuscation) const;
|
void writeSequenceNumber(SequenceNumber sequenceNumber) const;
|
||||||
|
void obfuscate(ObfuscationLevel level);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Packet(qint64 size, bool isReliable = false, bool isPartOfMessage = false);
|
Packet(qint64 size, bool isReliable = false, bool isPartOfMessage = false);
|
||||||
|
|
|
@ -1,52 +0,0 @@
|
||||||
//
|
|
||||||
// SaltShaker.cpp
|
|
||||||
// libraries/networking/src/udt
|
|
||||||
//
|
|
||||||
// Created by Clement on 2/18/16.
|
|
||||||
// Copyright 2016 High Fidelity, Inc.
|
|
||||||
//
|
|
||||||
// Distributed under the Apache License, Version 2.0.
|
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "SaltShaker.h"
|
|
||||||
|
|
||||||
#include <array>
|
|
||||||
|
|
||||||
using namespace udt;
|
|
||||||
|
|
||||||
using Key = uint64_t;
|
|
||||||
static const std::array<Key, 4> KEYS {{
|
|
||||||
0x0,
|
|
||||||
0xd6ea42f07644016a,
|
|
||||||
0x700f7e3414dc4d8c,
|
|
||||||
0x54c92e8d2c871642
|
|
||||||
}};
|
|
||||||
|
|
||||||
void saltingHelper(char* start, int size, Key key) {
|
|
||||||
const auto end = start + size;
|
|
||||||
|
|
||||||
auto p = start;
|
|
||||||
for (; p + sizeof(Key) < end; p += sizeof(Key)) {
|
|
||||||
*reinterpret_cast<Key*>(p) ^= key;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; p < end; ++p || ++i) {
|
|
||||||
*p ^= *(reinterpret_cast<const char*>(&key) + i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_ptr<Packet> SaltShaker::salt(const Packet& packet, unsigned int saltiness) {
|
|
||||||
Q_ASSERT_X(saltiness < KEYS.size(), Q_FUNC_INFO, "");
|
|
||||||
|
|
||||||
auto copy = Packet::createCopy(packet);
|
|
||||||
copy->writeSequenceNumber(copy->getSequenceNumber(), (Packet::ObfuscationLevel)saltiness);
|
|
||||||
saltingHelper(copy->getData() + 4, copy->getDataSize() - 4, KEYS[saltiness]);
|
|
||||||
return copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SaltShaker::unsalt(Packet& packet, unsigned int saltiness) {
|
|
||||||
Q_ASSERT_X(saltiness < KEYS.size(), Q_FUNC_INFO, "");
|
|
||||||
|
|
||||||
saltingHelper(packet.getData() + 4, packet.getDataSize() - 4, KEYS[saltiness]);
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
//
|
|
||||||
// SaltShaker.h
|
|
||||||
// libraries/networking/src/udt
|
|
||||||
//
|
|
||||||
// Created by Clement on 2/18/16.
|
|
||||||
// Copyright 2016 High Fidelity, Inc.
|
|
||||||
//
|
|
||||||
// Distributed under the Apache License, Version 2.0.
|
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef hifi_SaltShaker_h
|
|
||||||
#define hifi_SaltShaker_h
|
|
||||||
|
|
||||||
#include "Packet.h"
|
|
||||||
|
|
||||||
namespace udt {
|
|
||||||
|
|
||||||
class SaltShaker {
|
|
||||||
public:
|
|
||||||
std::unique_ptr<Packet> salt(const Packet& packet, unsigned int saltiness);
|
|
||||||
void unsalt(Packet& packet, unsigned int saltiness);
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // hifi_SaltShaker_h
|
|
|
@ -18,13 +18,13 @@
|
||||||
#include <QtCore/QDateTime>
|
#include <QtCore/QDateTime>
|
||||||
#include <QtCore/QThread>
|
#include <QtCore/QThread>
|
||||||
|
|
||||||
|
#include <LogHandler.h>
|
||||||
#include <SharedUtil.h>
|
#include <SharedUtil.h>
|
||||||
|
|
||||||
#include "../NetworkLogging.h"
|
#include "../NetworkLogging.h"
|
||||||
#include "ControlPacket.h"
|
#include "ControlPacket.h"
|
||||||
#include "Packet.h"
|
#include "Packet.h"
|
||||||
#include "PacketList.h"
|
#include "PacketList.h"
|
||||||
#include "SaltShaker.h"
|
|
||||||
#include "Socket.h"
|
#include "Socket.h"
|
||||||
|
|
||||||
using namespace udt;
|
using namespace udt;
|
||||||
|
@ -338,8 +338,6 @@ bool SendQueue::maybeSendNewPacket() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <LogHandler.h>
|
|
||||||
|
|
||||||
bool SendQueue::maybeResendPacket() {
|
bool SendQueue::maybeResendPacket() {
|
||||||
|
|
||||||
// the following while makes sure that we find a packet to re-send, if there is one
|
// the following while makes sure that we find a packet to re-send, if there is one
|
||||||
|
@ -364,13 +362,12 @@ bool SendQueue::maybeResendPacket() {
|
||||||
auto& resendPacket = *(entry.second);
|
auto& resendPacket = *(entry.second);
|
||||||
++entry.first; // Add 1 resend
|
++entry.first; // Add 1 resend
|
||||||
|
|
||||||
auto saltiness = entry.first < 2 ? 0 : (entry.first - 2) % 4;
|
Packet::ObfuscationLevel level = (Packet::ObfuscationLevel)(entry.first < 2 ? 0 : (entry.first - 2) % 4);
|
||||||
|
|
||||||
if (saltiness != 0) {
|
if (level != Packet::NoObfuscation) {
|
||||||
QString debugString = "Obfuscating packet %1 with level %2";
|
QString debugString = "Obfuscating packet %1 with level %2";
|
||||||
debugString = debugString.arg(QString::number((uint32_t)resendPacket.getSequenceNumber()),
|
debugString = debugString.arg(QString::number((uint32_t)resendPacket.getSequenceNumber()),
|
||||||
QString::number(saltiness));
|
QString::number(level));
|
||||||
|
|
||||||
if (resendPacket.isPartOfMessage()) {
|
if (resendPacket.isPartOfMessage()) {
|
||||||
debugString += "\n";
|
debugString += "\n";
|
||||||
debugString += " Message Number: %1, Part Number: %2.";
|
debugString += " Message Number: %1, Part Number: %2.";
|
||||||
|
@ -382,12 +379,16 @@ bool SendQueue::maybeResendPacket() {
|
||||||
static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("^Obfuscating packet .{0,1000}");
|
static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex("^Obfuscating packet .{0,1000}");
|
||||||
qCritical() << qPrintable(debugString);
|
qCritical() << qPrintable(debugString);
|
||||||
|
|
||||||
SaltShaker shaker;
|
|
||||||
auto packet = shaker.salt(resendPacket, saltiness);
|
// Create copy of the packet
|
||||||
|
auto packet = Packet::createCopy(resendPacket);
|
||||||
|
|
||||||
// unlock the sent packets
|
// unlock the sent packets
|
||||||
sentLocker.unlock();
|
sentLocker.unlock();
|
||||||
|
|
||||||
|
// Obfuscate packet
|
||||||
|
packet->obfuscate(level);
|
||||||
|
|
||||||
// send it off
|
// send it off
|
||||||
sendPacket(*packet);
|
sendPacket(*packet);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue