some system-specific adjustments for RNG routines
move some system-specific seed-related stuff from hacklib.c to a system-specific source file and #define SYS_RANDOM_SEED to utilize it during build. Windows changes for random seed generation using crypto next gen (CNG) api routines. Corresponding vms changes due to disentangling of VMS and unix when the unix seed bits got moved (untested).
This commit is contained in:
@@ -765,4 +765,31 @@ error:
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SYS_RANDOM_SEED
|
||||
unsigned long
|
||||
sys_random_seed()
|
||||
{
|
||||
unsigned long seed;
|
||||
unsigned long pid = (unsigned long) getpid();
|
||||
#ifdef DEV_RANDOM
|
||||
FILE *fptr = NULL;
|
||||
|
||||
fptr = fopen(DEV_RANDOM, "r");
|
||||
if (fptr) {
|
||||
fread(&seed, sizeof(long), 1, fptr);
|
||||
}
|
||||
fclose(fptr);
|
||||
#else
|
||||
seed = (unsigned long) getnow(); /* time((TIME_type) 0) */
|
||||
/* Quick dirty band-aid to prevent PRNG prediction */
|
||||
if (pid) {
|
||||
if (!(pid & 3L))
|
||||
pid -= 1L;
|
||||
seed *= pid;
|
||||
}
|
||||
#endif
|
||||
return seed;
|
||||
}
|
||||
#endif /* SYS_RANDOM_SEED */
|
||||
|
||||
/*unixmain.c*/
|
||||
|
||||
@@ -465,4 +465,22 @@ wd_message()
|
||||
You("are in non-scoring explore/discovery mode.");
|
||||
}
|
||||
|
||||
#ifdef SYS_RANDOM_SEED
|
||||
unsigned long
|
||||
sys_random_seed()
|
||||
{
|
||||
unsigned long seed;
|
||||
unsigned long pid = (unsigned long) getpid();
|
||||
|
||||
seed = (unsigned long) getnow(); /* time((TIME_type) 0) */
|
||||
/* Quick dirty band-aid to prevent PRNG prediction */
|
||||
if (pid) {
|
||||
if (!(pid & 3L))
|
||||
pid -= 1L;
|
||||
seed *= pid;
|
||||
}
|
||||
return seed;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*vmsmain.c*/
|
||||
|
||||
@@ -73,8 +73,8 @@ DEBUGINFO = Y
|
||||
# PDCurses header (.h) files and PDCURSES_C to the location
|
||||
# of your PDCurses C files.
|
||||
#
|
||||
#ADD_CURSES=Y
|
||||
#PDCURSES_TOP=..\..\pdcurses
|
||||
ADD_CURSES=Y
|
||||
PDCURSES_TOP=..\..\pdcurses
|
||||
#
|
||||
#==============================================================================
|
||||
# This marks the end of the BUILD DECISIONS section.
|
||||
@@ -129,9 +129,13 @@ OBJ = o
|
||||
# (see pcconf.h). Set to nothing if not used.
|
||||
#
|
||||
|
||||
RANDOM = $(OBJ)\random.o
|
||||
RANDOM = $(OBJ)\isaac64.o
|
||||
#RANDOM = $(OBJ)\random.o
|
||||
#RANDOM =
|
||||
|
||||
BCRYPT=
|
||||
! IF ("$(RANDOM)"=="$(OBJ)\isaac64.o")
|
||||
BCRYPT=bcrypt.lib
|
||||
! ENDIF
|
||||
WINPFLAG= -DTILES -DMSWIN_GRAPHICS -DWIN32CON
|
||||
|
||||
# To store all the level files,
|
||||
@@ -801,7 +805,7 @@ $(GAMEDIR)\NetHack.exe : $(O)gamedir.tag $(PDCLIB) $(O)tile.o $(O)nttty.o $(O)gu
|
||||
@if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR)
|
||||
@echo Linking $(@:\=/)
|
||||
$(link) $(lflagsBuild) $(conlflags) /STACK:2048 /PDB:$(GAMEDIR)\$(@B).PDB /MAP:$(O)$(@B).MAP \
|
||||
$(LIBS) $(PDCLIB) $(conlibs) -out:$@ @<<$(@B).lnk
|
||||
$(LIBS) $(PDCLIB) $(conlibs) $(BCRYPT) -out:$@ @<<$(@B).lnk
|
||||
$(GAMEOBJ)
|
||||
$(TTYOBJ)
|
||||
$(O)nttty.o
|
||||
@@ -824,7 +828,7 @@ $(GAMEDIR)\NetHackW.exe : $(O)gamedir.tag $(O)tile.o $(O)ttystub.o \
|
||||
@if not exist $(GAMEDIR)\*.* mkdir $(GAMEDIR)
|
||||
@echo Linking $(@:\=/)
|
||||
$(link) $(lflagsBuild) $(guilflags) /STACK:2048 /PDB:$(GAMEDIR)\$(@B).PDB \
|
||||
/MAP:$(O)$(@B).MAP $(LIBS) $(PDCLIB) $(guilibs) $(COMCTRL) -out:$@ @<<$(@B).lnk
|
||||
/MAP:$(O)$(@B).MAP $(LIBS) $(PDCLIB) $(guilibs) $(COMCTRL) $(BCRYPT) -out:$@ @<<$(@B).lnk
|
||||
$(GAMEOBJ)
|
||||
$(GUIOBJ)
|
||||
$(O)tile.o
|
||||
@@ -1514,6 +1518,8 @@ $(O)tos.o: ..\sys\atari\tos.c $(HACK_H) $(INCL)\tcap.h
|
||||
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\atari\tos.c
|
||||
$(O)pctty.o: ..\sys\share\pctty.c $(HACK_H)
|
||||
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\pctty.c
|
||||
$(O)isaac64.o: ..\src\isaac64.c $(HACK_H) $(INCL)\isaac64.h $(INCL)\integer.h
|
||||
@$(CC) $(cflagsBuild) -Fo$@ ..\src\isaac64.c
|
||||
$(O)random.o: ..\sys\share\random.c $(HACK_H)
|
||||
@$(CC) $(cflagsBuild) -Fo$@ ..\sys\share\random.c
|
||||
$(O)ioctl.o: ..\sys\share\ioctl.c $(HACK_H) $(INCL)\tcap.h
|
||||
|
||||
@@ -680,6 +680,55 @@ char *name;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef SYS_RANDOM_SEED
|
||||
#ifndef STATUS_SUCCESS
|
||||
#define STATUS_SUCCESS 0
|
||||
#endif
|
||||
#ifndef STATUS_NOT_FOUND
|
||||
#define STATUS_NOT_FOUND 0xC0000225
|
||||
#endif
|
||||
#ifndef STATUS_UNSUCCESSFUL
|
||||
#define STATUS_UNSUCCESSFUL 0xC0000001
|
||||
#endif
|
||||
|
||||
#include <bcrypt.h> /* Windows Crypto Next Gen (CNG) */
|
||||
|
||||
unsigned long
|
||||
sys_random_seed(VOID_ARGS)
|
||||
{
|
||||
unsigned long ourseed = 0UL;
|
||||
BCRYPT_ALG_HANDLE hRa = (BCRYPT_ALG_HANDLE) 0;
|
||||
NTSTATUS status = STATUS_UNSUCCESSFUL;
|
||||
boolean Plan_B = TRUE;
|
||||
|
||||
status = BCryptOpenAlgorithmProvider(&hRa, BCRYPT_RNG_ALGORITHM,
|
||||
(LPCWSTR) 0, 0);
|
||||
if (hRa && status == STATUS_SUCCESS) {
|
||||
status = BCryptGenRandom(hRa, (PUCHAR) &ourseed,
|
||||
(ULONG) sizeof ourseed, 0);
|
||||
if (status == STATUS_SUCCESS) {
|
||||
BCryptCloseAlgorithmProvider(hRa,0);
|
||||
Plan_B = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (Plan_B) {
|
||||
time_t datetime = 0;
|
||||
const char *emsg;
|
||||
|
||||
if (status == STATUS_NOT_FOUND)
|
||||
emsg = "BCRYPT_RNG_ALGORITHM not avail, falling back";
|
||||
else
|
||||
emsg = "Other failure than algorithm not avail";
|
||||
paniclog("sys_random_seed", emsg); /* leaves clue, doesn't exit */
|
||||
(void) time(&datetime);
|
||||
ourseed = (unsigned long) datetime;
|
||||
}
|
||||
return ourseed;
|
||||
}
|
||||
#endif /* SYS_RANDOM_SEED */
|
||||
|
||||
#endif /* WIN32 */
|
||||
|
||||
/*winnt.c*/
|
||||
|
||||
Reference in New Issue
Block a user