aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortjw <tjw@edf5b092-35ff-0310-97b2-ce42778d08ea>2007-02-16 23:50:37 +0000
committertjw <tjw@edf5b092-35ff-0310-97b2-ce42778d08ea>2007-02-16 23:50:37 +0000
commit9dbe35a4dd8d5fce96c627f000d15395f32bc55a (patch)
tree3bc0f6b9f85125a426cdc2a290237adc76b1c699
parent9a51af746dd98abd8ca52424a4b78a16e3d98b7b (diff)
downloadioquake3-aero-9dbe35a4dd8d5fce96c627f000d15395f32bc55a.tar.gz
ioquake3-aero-9dbe35a4dd8d5fce96c627f000d15395f32bc55a.zip
* (bug 3019) use the operating system's random number generator if possible
when generating the qkey file git-svn-id: svn://svn.icculus.org/quake3/trunk@1046 edf5b092-35ff-0310-97b2-ce42778d08ea
-rw-r--r--code/client/cl_main.c10
-rw-r--r--code/qcommon/common.c21
-rw-r--r--code/qcommon/md5.c4
-rw-r--r--code/qcommon/q_shared.h2
-rw-r--r--code/qcommon/qcommon.h2
-rw-r--r--code/unix/unix_shared.c16
-rw-r--r--code/win32/win_shared.c19
7 files changed, 65 insertions, 9 deletions
diff --git a/code/client/cl_main.c b/code/client/cl_main.c
index bb8d635..cfb1313 100644
--- a/code/client/cl_main.c
+++ b/code/client/cl_main.c
@@ -2534,18 +2534,14 @@ static void CL_GenerateQKey(void)
return;
}
else {
- int i;
-
if( len > 0 ) {
Com_Printf( "QKEY file size != %d, regenerating\n",
QKEY_SIZE );
}
- srand(time(0));
- for(i = 0; i < sizeof(buff) - 1; i++) {
- buff[i] = (unsigned char)(rand() % 255);
- }
- buff[i] = 0;
+ Com_Printf( "QKEY building random string\n" );
+ Com_RandomBytes( buff, sizeof(buff) );
+
f = FS_SV_FOpenFileWrite( QKEY_FILE );
if( !f ) {
Com_Printf( "QKEY could not open %s for write\n",
diff --git a/code/qcommon/common.c b/code/qcommon/common.c
index ca56db0..defb5fa 100644
--- a/code/qcommon/common.c
+++ b/code/qcommon/common.c
@@ -3217,3 +3217,24 @@ void Field_AutoComplete( field_t *field )
Field_CompleteCommand( completionField->buffer, qtrue, qtrue );
}
+
+/*
+==================
+Com_RandomBytes
+
+fills string array with len radom bytes, peferably from the OS randomizer
+==================
+*/
+void Com_RandomBytes( byte *string, int len )
+{
+ int i;
+
+ if( Sys_RandomBytes( string, len ) )
+ return;
+
+ Com_Printf( "Com_RandomBytes: using weak randomization\n" );
+ srand( time( 0 ) );
+ for( i = 0; i < len; i++ )
+ string[i] = (unsigned char)( rand() % 255 );
+}
+
diff --git a/code/qcommon/md5.c b/code/qcommon/md5.c
index dcb4e44..5cf12bb 100644
--- a/code/qcommon/md5.c
+++ b/code/qcommon/md5.c
@@ -263,7 +263,7 @@ char *Com_MD5File( const char *fn, int length, const char *prefix, int prefix_le
unsigned char digest[16] = {""};
fileHandle_t f;
MD5_CTX md5;
- char buffer[2048];
+ byte buffer[2048];
int i;
int filelen = 0;
int r = 0;
@@ -296,7 +296,7 @@ char *Com_MD5File( const char *fn, int length, const char *prefix, int prefix_le
if(r + total > length)
r = length - total;
total += r;
- MD5Update(&md5 , (unsigned char *)buffer, r);
+ MD5Update(&md5 , buffer, r);
if(r < sizeof(buffer) || total >= length)
break;
}
diff --git a/code/qcommon/q_shared.h b/code/qcommon/q_shared.h
index 74958ff..f4b9bd2 100644
--- a/code/qcommon/q_shared.h
+++ b/code/qcommon/q_shared.h
@@ -640,6 +640,8 @@ void QDECL Com_sprintf (char *dest, int size, const char *fmt, ...) __attribute_
char *Com_SkipTokens( char *s, int numTokens, char *sep );
char *Com_SkipCharset( char *s, char *sep );
+void Com_RandomBytes( byte *string, int len );
+
// mode parm for FS_FOpenFile
typedef enum {
FS_READ,
diff --git a/code/qcommon/qcommon.h b/code/qcommon/qcommon.h
index 8bde028..f0d6722 100644
--- a/code/qcommon/qcommon.h
+++ b/code/qcommon/qcommon.h
@@ -1001,6 +1001,8 @@ int Sys_Milliseconds (void);
void Sys_SnapVector( float *v );
+qboolean Sys_RandomBytes( byte *string, int len );
+
// the system console is shown when a dedicated server is running
void Sys_DisplaySystemConsole( qboolean show );
diff --git a/code/unix/unix_shared.c b/code/unix/unix_shared.c
index c037813..a607a2f 100644
--- a/code/unix/unix_shared.c
+++ b/code/unix/unix_shared.c
@@ -174,6 +174,22 @@ char *strlwr (char *s) {
return s; // bk001204 - duh
}
+qboolean Sys_RandomBytes( byte *string, int len )
+{
+ FILE *fp;
+
+ fp = fopen( "/dev/urandom", "r" );
+ if( !fp )
+ return qfalse;
+
+ if( !fread( string, sizeof( byte ), len, fp ) ) {
+ fclose( fp );
+ return qfalse;
+ }
+ fclose( fp );
+ return qtrue;
+}
+
//============================================
#define MAX_FOUND_FILES 0x1000
diff --git a/code/win32/win_shared.c b/code/win32/win_shared.c
index f28ff3a..24e3079 100644
--- a/code/win32/win_shared.c
+++ b/code/win32/win_shared.c
@@ -32,6 +32,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include <direct.h>
#include <io.h>
#include <conio.h>
+#include <wincrypt.h>
/*
================
@@ -81,6 +82,24 @@ void Sys_SnapVector( float *v )
}
#endif
+qboolean Sys_RandomBytes( byte *string, int len )
+{
+ HCRYPTPROV prov;
+
+ if( !CryptAcquireContext( &prov, NULL, NULL,
+ PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) ) {
+
+ return qfalse;
+ }
+
+ if( !CryptGenRandom( prov, len, (BYTE *)string ) ) {
+ CryptReleaseContext( prov, 0 );
+ return qfalse;
+ }
+ CryptReleaseContext( prov, 0 );
+ return qtrue;
+}
+
/*
**