xor packet magic during checksum implicitly

This commit is contained in:
jacob 2026-01-17 16:15:07 -06:00
parent 847f36d81a
commit c3959a6970
2 changed files with 25 additions and 17 deletions

View File

@ -140,9 +140,15 @@ NET_W32_Peer *NET_W32_TouchPeerFromKey(NET_W32_Pipe *pipe, NET_Key key)
return peer; return peer;
} }
u32 NET_W32_ChecksumFromString(String str) u32 NET_W32_ChecksumFromPacketString(String str)
{ {
// Adler-32 u32 result = 0;
if (str.len > 4)
{
// Skip the first 4 bytes of packet since it contains the checksum itself
str.text += 4;
str.len -= 4;
// https://en.wikipedia.org/wiki/Adler-32 // https://en.wikipedia.org/wiki/Adler-32
u32 a = 1; u32 a = 1;
u32 b = 0; u32 b = 0;
@ -151,7 +157,9 @@ u32 NET_W32_ChecksumFromString(String str)
a = (a + str.text[idx]) % 65521; a = (a + str.text[idx]) % 65521;
b = (b + a) % 65521; b = (b + a) % 65521;
} }
return (b << 16) | a; result = (b << 16) | a;
}
return result ^ NET_W32_ProtocolMagic;
} }
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
@ -326,7 +334,6 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
for (;;) for (;;)
{ {
TempArena scratch = BeginScratchNoConflict(); TempArena scratch = BeginScratchNoConflict();
u32 magic = 0xde8c590b;
i64 heartbeat_threshold_ns = NsFromSeconds(0.250); i64 heartbeat_threshold_ns = NsFromSeconds(0.250);
i64 passive_run_threshold_ns = NsFromSeconds(0.250); i64 passive_run_threshold_ns = NsFromSeconds(0.250);
@ -596,8 +603,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
{ {
NET_W32_PacketHeader header = Zi; NET_W32_PacketHeader header = Zi;
CopyBytes(&header, buff, sizeof(header)); CopyBytes(&header, buff, sizeof(header));
CopyBytes(buff, &magic, sizeof(magic)); u32 checksum = NET_W32_ChecksumFromPacketString(STRING(len, buff));
u32 checksum = NET_W32_ChecksumFromString(STRING(len, buff));
if (header.checksum == checksum) if (header.checksum == checksum)
{ {
NET_Key key = NET_W32_KeyFromAddress(addr); NET_Key key = NET_W32_KeyFromAddress(addr);
@ -914,7 +920,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
u8 buff[Kibi(2)]; u8 buff[Kibi(2)];
NET_W32_PacketHeader header = Zi; NET_W32_PacketHeader header = Zi;
{ {
header.checksum = magic; header.checksum = 0;
header.flags = NET_W32_PacketFlag_Heartbeat; header.flags = NET_W32_PacketFlag_Heartbeat;
header.bottom_ack = peer->bottom_ack; header.bottom_ack = peer->bottom_ack;
header.ack_bits = peer->ack_bits; header.ack_bits = peer->ack_bits;
@ -922,7 +928,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
CopyBytes(buff, &header, sizeof(header)); CopyBytes(buff, &header, sizeof(header));
buff_len += sizeof(header); buff_len += sizeof(header);
u32 checksum = NET_W32_ChecksumFromString(STRING(buff_len, buff)); u32 checksum = NET_W32_ChecksumFromPacketString(STRING(buff_len, buff));
CopyBytes(buff, &checksum, sizeof(checksum)); CopyBytes(buff, &checksum, sizeof(checksum));
sendto( sendto(
pipe->udp, pipe->udp,
@ -990,7 +996,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
NET_W32_PacketHeader header = Zi; NET_W32_PacketHeader header = Zi;
{ {
header.checksum = magic; header.checksum = 0;
header.flags = packet->flags; header.flags = packet->flags;
header.seq = packet->seq; header.seq = packet->seq;
header.msg_seq = packet->msg_seq; header.msg_seq = packet->msg_seq;
@ -1003,7 +1009,7 @@ void NET_W32_TickForever(WaveLaneCtx *lane)
CopyBytes(buff + buff_len, packet->data.text, packet->data.len); CopyBytes(buff + buff_len, packet->data.text, packet->data.len);
buff_len += packet->data.len; buff_len += packet->data.len;
u32 checksum = NET_W32_ChecksumFromString(STRING(buff_len, buff)); u32 checksum = NET_W32_ChecksumFromPacketString(STRING(buff_len, buff));
CopyBytes(buff, &checksum, sizeof(checksum)); CopyBytes(buff, &checksum, sizeof(checksum));
sendto( sendto(
pipe->udp, pipe->udp,

View File

@ -35,6 +35,8 @@ Struct(NET_W32_MsgBuff)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Packet types //~ Packet types
#define NET_W32_ProtocolMagic 0xde8c590b
Enum(NET_W32_PacketFlag) Enum(NET_W32_PacketFlag)
{ {
NET_W32_PacketFlag_None = 0, NET_W32_PacketFlag_None = 0,
@ -180,7 +182,7 @@ NET_Key NET_W32_KeyFromAddress(struct sockaddr_in6 addr);
struct sockaddr_in6 NET_W32_AddressFromKey(NET_Key key); struct sockaddr_in6 NET_W32_AddressFromKey(NET_Key key);
void NET_W32_SignalWorker(void); void NET_W32_SignalWorker(void);
NET_W32_Peer *NET_W32_TouchPeerFromKey(NET_W32_Pipe *pipe, NET_Key key); NET_W32_Peer *NET_W32_TouchPeerFromKey(NET_W32_Pipe *pipe, NET_Key key);
u32 NET_W32_ChecksumFromString(String str); u32 NET_W32_ChecksumFromPacketString(String str);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Worker //~ Worker