[Network] Experimenting with scrambling packets
diff --git a/src/docs/Changelog b/src/docs/Changelog
index d18b196..096b816 100644
--- a/src/docs/Changelog
+++ b/src/docs/Changelog
@@ -11,6 +11,7 @@
* [Master Server] Changed default port address for the master server
* [Client] Fix drop shadows
* [Client] Unlocked FPS and lag
+ * [Network] Experimenting with scrambling packets
2021-04-10 Dusan Jocic <dusanjocic@msn>
* [Libraries] Cleaning
diff --git a/src/engine/framework/NetworkChain.cpp b/src/engine/framework/NetworkChain.cpp
index 5979709..92e8dfe 100644
--- a/src/engine/framework/NetworkChain.cpp
+++ b/src/engine/framework/NetworkChain.cpp
@@ -111,6 +111,109 @@ void idNetworkChainSystemLocal::Init( sint port )
/*
==============
+idNetworkChainSystemLocal::ScramblePacket
+==============
+*/
+void idNetworkChainSystemLocal::ScramblePacket( msg_t* buf )
+{
+ uint seed;
+ sint i, j, c, mask, temp;
+ sint seq[MAX_PACKETLEN];
+
+ seed = ( LittleLong( *( uint* )buf->data ) * 3 ) ^ ( buf->cursize * 123 ) ^ 0x87243987;
+ c = buf->cursize;
+
+ if( c <= SCRAMBLE_START )
+ {
+ return;
+ }
+
+ if( c > MAX_PACKETLEN )
+ {
+ Com_Error( ERR_DROP, "MAX_PACKETLEN" );
+ }
+
+ // generate a sequence of "random" numbers
+ for( i = 0; i < c; i++ )
+ {
+ seed = ( 69069 * seed + 1 );
+ seq[i] = seed;
+ }
+
+ // byte xor the data after the header
+ for( i = SCRAMBLE_START; i < c; i++ )
+ {
+ buf->data[i] ^= seq[i];
+ }
+
+ // transpose each character
+ for( mask = 1; mask < c - SCRAMBLE_START; mask = ( mask << 1 ) + 1 )
+ {
+ }
+
+ mask >>= 1;
+ for( i = SCRAMBLE_START; i < c; i++ )
+ {
+ j = SCRAMBLE_START + ( seq[i] & mask );
+ temp = buf->data[j];
+ buf->data[j] = buf->data[i];
+ buf->data[i] = temp;
+ }
+}
+
+/*
+==============
+idNetworkChainSystemLocal::UnScramblePacket
+==============
+*/
+void idNetworkChainSystemLocal::UnScramblePacket( msg_t* buf )
+{
+ uint seed;
+ sint i, j, c, mask, temp;
+ sint seq[MAX_PACKETLEN];
+
+ seed = ( LittleLong( *( unsigned* )buf->data ) * 3 ) ^ ( buf->cursize * 123 ) ^ 0x87243987;
+ c = buf->cursize;
+
+ if( c <= SCRAMBLE_START )
+ {
+ return;
+ }
+ if( c > MAX_PACKETLEN )
+ {
+ Com_Error( ERR_DROP, "MAX_PACKETLEN" );
+ }
+
+ // generate a sequence of "random" numbers
+ for( i = 0; i < c; i++ )
+ {
+ seed = ( 69069 * seed + 1 );
+ seq[i] = seed;
+ }
+
+ // transpose each character in reverse order
+ for( mask = 1; mask < c - SCRAMBLE_START; mask = ( mask << 1 ) + 1 )
+ {
+ }
+
+ mask >>= 1;
+ for( i = c - 1; i >= SCRAMBLE_START; i-- )
+ {
+ j = SCRAMBLE_START + ( seq[i] & mask );
+ temp = buf->data[j];
+ buf->data[j] = buf->data[i];
+ buf->data[i] = temp;
+ }
+
+ // byte xor the data after the header
+ for( i = SCRAMBLE_START; i < c; i++ )
+ {
+ buf->data[i] ^= seq[i];
+ }
+}
+
+/*
+==============
idNetworkChainSystemLocal::Setup
called to open a channel to a remote system
@@ -129,7 +232,7 @@ void idNetworkChainSystemLocal::Setup( netsrc_t sock, netchan_t* chan, netadr_t
/*
=================
-Netchan_TransmitNextFragment
+idNetworkChainSystemLocal::TransmitNextFragment
Send one fragment of the current message
=================
@@ -162,6 +265,9 @@ void idNetworkChainSystemLocal::TransmitNextFragment( netchan_t* chan )
MSG_WriteShort( &send, fragmentLength );
MSG_WriteData( &send, chan->unsentBuffer + chan->unsentFragmentStart, fragmentLength );
+ // XOR scramble all data in the packet after the header
+ ScramblePacket( &send );
+
// send the datagram
networkChainSystem->SendPacket( chan->sock, send.cursize, send.data, chan->remoteAddress );
@@ -239,6 +345,9 @@ void idNetworkChainSystemLocal::Transmit( netchan_t* chan, sint length, const uc
MSG_WriteData( &send, data, length );
+ // XOR scramble all data in the packet after the header
+ ScramblePacket( &send );
+
// send the datagram
networkChainSystem->SendPacket( chan->sock, send.cursize, send.data, chan->remoteAddress );
@@ -276,8 +385,8 @@ bool idNetworkChainSystemLocal::Process( netchan_t* chan, msg_t* msg )
bool fragmented;
// XOR unscramble all data in the packet after the header
-// Netchan_UnScramblePacket( msg );
-
+ UnScramblePacket( msg );
+
// get sequence numbers
MSG_BeginReadingOOB( msg );
sequence = MSG_ReadLong( msg );
diff --git a/src/engine/framework/NetworkChain.hpp b/src/engine/framework/NetworkChain.hpp
index d90ade8..a83fdcf 100644
--- a/src/engine/framework/NetworkChain.hpp
+++ b/src/engine/framework/NetworkChain.hpp
@@ -119,6 +119,10 @@ public:
static void SendLoopPacket( netsrc_t sock, sint length, const void* data, netadr_t to );
static void QueuePacket( sint length, const void* data, netadr_t to, sint offset );
+ static void ScramblePacket( msg_t* buf );
+ static void UnScramblePacket( msg_t* buf );
+
+ static const sint SCRAMBLE_START = 6;
};
extern idNetworkChainSystemLocal networkChainSystemLocal;
GitHub
sha: 5eee5e1e