mirror of
				https://github.com/KartKrewDev/RingRacers.git
				synced 2025-10-30 08:01:28 +00:00 
			
		
		
		
	Literally, unironically, draw the rest of the owl
This commit is contained in:
		
							parent
							
								
									9b77d95357
								
							
						
					
					
						commit
						138663bf5a
					
				
					 6 changed files with 47 additions and 27 deletions
				
			
		| 
						 | 
				
			
			@ -47,6 +47,7 @@
 | 
			
		|||
#include "lua_hook.h"
 | 
			
		||||
#include "md5.h"
 | 
			
		||||
#include "m_perfstats.h"
 | 
			
		||||
#include "monocypher/monocypher.h"
 | 
			
		||||
 | 
			
		||||
// SRB2Kart
 | 
			
		||||
#include "k_kart.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -156,13 +157,13 @@ char connectedservername[MAXSERVERNAME];
 | 
			
		|||
/// \todo WORK!
 | 
			
		||||
boolean acceptnewnode = true;
 | 
			
		||||
 | 
			
		||||
char lastReceivedKey[MAXNETNODES][32];
 | 
			
		||||
char lastComputedChallenge[MAXNETNODES][32];
 | 
			
		||||
uint8_t lastReceivedKey[MAXNETNODES][32];
 | 
			
		||||
uint8_t lastSentChallenge[MAXNETNODES][32];
 | 
			
		||||
 | 
			
		||||
boolean serverisfull = false; //lets us be aware if the server was full after we check files, but before downloading, so we can ask if the user still wants to download or not
 | 
			
		||||
tic_t firstconnectattempttime = 0;
 | 
			
		||||
 | 
			
		||||
char awaitingChallenge[32];
 | 
			
		||||
uint8_t awaitingChallenge[32];
 | 
			
		||||
 | 
			
		||||
// engine
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -833,7 +834,16 @@ static boolean CL_SendJoin(void)
 | 
			
		|||
 | 
			
		||||
	memcpy(&netbuffer->u.clientcfg.availabilities, R_GetSkinAvailabilities(false, false), MAXAVAILABILITY*sizeof(UINT8));
 | 
			
		||||
 | 
			
		||||
	memcpy(&netbuffer->u.clientcfg.challengeResponse, awaitingChallenge, 32);
 | 
			
		||||
	uint8_t signature[64];
 | 
			
		||||
	crypto_eddsa_sign(signature, secret_key, awaitingChallenge, 32);
 | 
			
		||||
 | 
			
		||||
	if (crypto_eddsa_check(signature, public_key, awaitingChallenge, 32) != 0)
 | 
			
		||||
		I_Error("Couldn't verify own key?");
 | 
			
		||||
 | 
			
		||||
	// Testing
 | 
			
		||||
	// memset(signature, 0, sizeof(signature));
 | 
			
		||||
 | 
			
		||||
	memcpy(&netbuffer->u.clientcfg.challengeResponse, signature, sizeof(signature));
 | 
			
		||||
 | 
			
		||||
	return HSendPacket(servernode, false, 0, sizeof (clientconfig_pak));
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -4059,6 +4069,11 @@ static void HandleConnect(SINT8 node)
 | 
			
		|||
		if (playernode[i] != UINT8_MAX) // We use this to count players because it is affected by SV_AddWaitingPlayers when more than one client joins on the same tic, unlike playeringame and D_NumPlayers. UINT8_MAX denotes no node for that player
 | 
			
		||||
			connectedplayers++;
 | 
			
		||||
 | 
			
		||||
	// Testing
 | 
			
		||||
	// memset(netbuffer->u.clientcfg.challengeResponse, 0, sizeof(netbuffer->u.clientcfg.challengeResponse));
 | 
			
		||||
 | 
			
		||||
	int sigcheck = crypto_eddsa_check(netbuffer->u.clientcfg.challengeResponse, lastReceivedKey[node], lastSentChallenge[node], 32);
 | 
			
		||||
 | 
			
		||||
	if (bannednode && bannednode[node].banid != SIZE_MAX)
 | 
			
		||||
	{
 | 
			
		||||
		const char *reason = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -4140,9 +4155,9 @@ static void HandleConnect(SINT8 node)
 | 
			
		|||
		SV_SendRefuse(node, va(M_GetText("Too many people are connecting.\nPlease wait %d seconds and then\ntry rejoining."),
 | 
			
		||||
			(joindelay - 2 * cv_joindelay.value * TICRATE) / TICRATE));
 | 
			
		||||
	}
 | 
			
		||||
	else if (netgame && node != 0 && !memcmp(netbuffer->u.clientcfg.challengeResponse, lastComputedChallenge[node], 32))
 | 
			
		||||
	else if (netgame && node != 0 && sigcheck != 0)
 | 
			
		||||
	{
 | 
			
		||||
		SV_SendRefuse(node, M_GetText("Failed to validate key exchange."));
 | 
			
		||||
		SV_SendRefuse(node, M_GetText("Signature verification failed."));
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -4536,7 +4551,7 @@ static void HandlePacketFromAwayNode(SINT8 node)
 | 
			
		|||
				PT_ClientKey(node);
 | 
			
		||||
			break;
 | 
			
		||||
		case PT_SERVERCHALLENGE:
 | 
			
		||||
			memset(awaitingChallenge, 0, 32); // TODO: ACTUALLY COMPUTE CHALLENGE RESPONSE IDIOT
 | 
			
		||||
			memcpy(awaitingChallenge, netbuffer->u.serverchallenge.secret, sizeof(awaitingChallenge));
 | 
			
		||||
			cl_mode = CL_ASKJOIN;
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -256,7 +256,7 @@ struct clientconfig_pak
 | 
			
		|||
	UINT8 mode;
 | 
			
		||||
	char names[MAXSPLITSCREENPLAYERS][MAXPLAYERNAME];
 | 
			
		||||
	UINT8 availabilities[MAXAVAILABILITY];
 | 
			
		||||
	char challengeResponse[32];
 | 
			
		||||
	uint8_t challengeResponse[64];
 | 
			
		||||
} ATTRPACK;
 | 
			
		||||
 | 
			
		||||
#define SV_SPEEDMASK 0x03		// used to send kartspeed
 | 
			
		||||
| 
						 | 
				
			
			@ -460,8 +460,8 @@ extern UINT16 software_MAXPACKETLENGTH;
 | 
			
		|||
extern boolean acceptnewnode;
 | 
			
		||||
extern SINT8 servernode;
 | 
			
		||||
extern char connectedservername[MAXSERVERNAME];
 | 
			
		||||
extern char lastReceivedKey[MAXNETNODES][32];
 | 
			
		||||
extern char lastComputedChallenge[MAXNETNODES][32];
 | 
			
		||||
extern uint8_t lastReceivedKey[MAXNETNODES][32];
 | 
			
		||||
extern uint8_t lastSentChallenge[MAXNETNODES][32];
 | 
			
		||||
 | 
			
		||||
void Command_Ping_f(void);
 | 
			
		||||
extern tic_t connectiontimeout;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										26
									
								
								src/d_main.c
									
										
									
									
									
								
							
							
						
						
									
										26
									
								
								src/d_main.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -161,7 +161,7 @@ boolean dedicated = false;
 | 
			
		|||
 | 
			
		||||
// For identity negotiation with netgame servers
 | 
			
		||||
uint8_t	public_key[32];
 | 
			
		||||
uint8_t	secret_key[32];
 | 
			
		||||
uint8_t	secret_key[64];
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// D_PostEvent
 | 
			
		||||
| 
						 | 
				
			
			@ -1715,32 +1715,36 @@ void D_SRB2Main(void)
 | 
			
		|||
	ACS_Init();
 | 
			
		||||
	CON_SetLoadingProgress(LOADED_ACSINIT);
 | 
			
		||||
 | 
			
		||||
	// -- IT'S HOMEGROWN CRYPTO TIME --
 | 
			
		||||
 | 
			
		||||
	// TODO: This file should probably give a fuck about command line params,
 | 
			
		||||
	// or not be stored next to the EXE in a way that allows people to unknowingly send it to others.
 | 
			
		||||
	static char keyfile[16] = "rrid.dat";
 | 
			
		||||
 | 
			
		||||
	csprng(secret_key, 32);
 | 
			
		||||
	static uint8_t seed[32];
 | 
			
		||||
	csprng(seed, 32);
 | 
			
		||||
	crypto_eddsa_key_pair(secret_key, public_key, seed);
 | 
			
		||||
 | 
			
		||||
	int sk_size = sizeof(secret_key);
 | 
			
		||||
	int pk_size = sizeof(public_key);
 | 
			
		||||
	int totalsize = sk_size + pk_size;
 | 
			
		||||
 | 
			
		||||
	if (FIL_ReadFileOK(keyfile))
 | 
			
		||||
	{
 | 
			
		||||
		UINT8 *readbuffer = NULL;
 | 
			
		||||
		UINT16 lengthRead = FIL_ReadFile(keyfile, &readbuffer);
 | 
			
		||||
		if (readbuffer == NULL || lengthRead != 32)
 | 
			
		||||
		if (readbuffer == NULL || lengthRead != totalsize)
 | 
			
		||||
			I_Error("Malformed keyfile");
 | 
			
		||||
		memcpy(secret_key, readbuffer, 32);
 | 
			
		||||
		memcpy(secret_key, readbuffer, sk_size);
 | 
			
		||||
		memcpy(public_key, readbuffer + sk_size, pk_size);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		if (!FIL_WriteFile(keyfile, secret_key, 32))
 | 
			
		||||
		uint8_t keybuffer[totalsize];
 | 
			
		||||
		memcpy(keybuffer, secret_key, sk_size);
 | 
			
		||||
		memcpy(keybuffer + sk_size, public_key, pk_size);
 | 
			
		||||
		if (!FIL_WriteFile(keyfile, keybuffer, totalsize))
 | 
			
		||||
			I_Error("Couldn't open keyfile");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	crypto_x25519_public_key(public_key, secret_key);
 | 
			
		||||
 | 
			
		||||
	// -- END HOMEGROWN CRYPTO TIME --
 | 
			
		||||
 | 
			
		||||
	//------------------------------------------------ COMMAND LINE PARAMS
 | 
			
		||||
 | 
			
		||||
	// this must be done after loading gamedata,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,7 +32,7 @@ extern char srb2path[256]; //Alam: SRB2's Home
 | 
			
		|||
extern char addonsdir[MAX_WADPATH]; // Where addons are stored
 | 
			
		||||
 | 
			
		||||
extern uint8_t	public_key[32];
 | 
			
		||||
extern uint8_t	secret_key[32];
 | 
			
		||||
extern uint8_t	secret_key[64];
 | 
			
		||||
 | 
			
		||||
// the infinite loop of D_SRB2Loop() called from win_main for windows version
 | 
			
		||||
void D_SRB2Loop(void) FUNCNORETURN;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1320,14 +1320,15 @@ void PT_ClientKey(INT32 node)
 | 
			
		|||
 | 
			
		||||
	// TODO
 | 
			
		||||
	// Stage 1: Exchange packets with no verification of their contents
 | 
			
		||||
	// Stage 2: Exchange packets with a check, but no crypto (YOU ARE HERE)
 | 
			
		||||
	// Stage 3: The crypto part
 | 
			
		||||
	// Stage 2: Exchange packets with a check, but no crypto
 | 
			
		||||
	// Stage 3: The crypto part (YOU ARE HERE)
 | 
			
		||||
 | 
			
		||||
	memcpy(lastReceivedKey[node], packet->key, 32);
 | 
			
		||||
 | 
			
		||||
	netbuffer->packettype = PT_SERVERCHALLENGE;
 | 
			
		||||
	csprng(lastComputedChallenge[node], sizeof(serverchallenge_pak));
 | 
			
		||||
	memcpy(&netbuffer->u.serverchallenge, lastComputedChallenge[node], sizeof(serverchallenge_pak));
 | 
			
		||||
 | 
			
		||||
	csprng(lastSentChallenge[node], sizeof(serverchallenge_pak));
 | 
			
		||||
	memcpy(&netbuffer->u.serverchallenge, lastSentChallenge[node], sizeof(serverchallenge_pak));
 | 
			
		||||
	HSendPacket(node, false, 0, sizeof (serverchallenge_pak));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -713,7 +713,7 @@ struct player_t
 | 
			
		|||
	mobj_t *stumbleIndicator;
 | 
			
		||||
	mobj_t *sliptideZipIndicator;
 | 
			
		||||
 | 
			
		||||
	char public_key[32];
 | 
			
		||||
	uint8_t public_key[32];
 | 
			
		||||
 | 
			
		||||
#ifdef HWRENDER
 | 
			
		||||
	fixed_t fovadd; // adjust FOV for hw rendering
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue