mirror of
git://git.gnupg.org/gnupg.git
synced 2025-06-28 22:08:25 +02:00
See ChangeLog: Sun May 28 13:55:17 CEST 2000 Werner Koch
This commit is contained in:
parent
12d7d0bbe9
commit
ef5ab5bd87
3
AUTHORS
3
AUTHORS
@ -62,7 +62,8 @@ Torbjorn Granlund <tege@noisy.tmg.se>.
|
|||||||
|
|
||||||
The keybox implementation is based on GDBM 1.7.3 by Philip A. Nelson.
|
The keybox implementation is based on GDBM 1.7.3 by Philip A. Nelson.
|
||||||
|
|
||||||
The file cipher/rndunix.c is based on rndunix.c from cryptlib.
|
The files cipher/rndunix.c and cipher/rndw32.c are based on rndunix.c
|
||||||
|
and rndwin32.c from cryptlib.
|
||||||
Copyright Peter Gutmann, Paul Kendall, and Chris Wedgwood 1996-1999.
|
Copyright Peter Gutmann, Paul Kendall, and Chris Wedgwood 1996-1999.
|
||||||
|
|
||||||
The files in debian/ are by James Troup who is the Debian maintainer
|
The files in debian/ are by James Troup who is the Debian maintainer
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
Sun May 28 13:55:17 CEST 2000 Werner Koch <wk@openit.de>
|
||||||
|
|
||||||
|
* acinclude.m4 (GNUPG_SYS_NM_PARSE): Added BSDI support.
|
||||||
|
(GNUPG_CHECK_RDYNAMIC): Ditto.
|
||||||
|
|
||||||
Wed Apr 19 10:57:26 CEST 2000 Werner Koch <wk@openit.de>
|
Wed Apr 19 10:57:26 CEST 2000 Werner Koch <wk@openit.de>
|
||||||
|
|
||||||
* acconfig.h (HAVE_MLOCK): Added
|
* acconfig.h (HAVE_MLOCK): Added
|
||||||
|
5
NEWS
5
NEWS
@ -16,7 +16,10 @@ Noteworthy changes in the current test release
|
|||||||
|
|
||||||
* New options --ignore-time-conflict and --lock-never.
|
* New options --ignore-time-conflict and --lock-never.
|
||||||
|
|
||||||
* Some fixes for the W32 version
|
* Some fixes for the W32 version.
|
||||||
|
|
||||||
|
* The entropy.dll is not anymore used by the W32 version but replaced
|
||||||
|
by some code derived from Cryptlib.
|
||||||
|
|
||||||
* Encryption is now much faster: About 2 times for 1k bit keys
|
* Encryption is now much faster: About 2 times for 1k bit keys
|
||||||
and 8 times for 4k keys.
|
and 8 times for 4k keys.
|
||||||
|
@ -226,7 +226,7 @@ define(GNUPG_CHECK_RDYNAMIC,
|
|||||||
CFLAGS_RDYNAMIC="-Wl,-E"
|
CFLAGS_RDYNAMIC="-Wl,-E"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
openbsd* | freebsd2* | osf4* | irix* | netbsd* )
|
openbsd* | freebsd2* | osf4* | irix* | netbsd* | bsdi* )
|
||||||
CFLAGS_RDYNAMIC=""
|
CFLAGS_RDYNAMIC=""
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@ -463,7 +463,7 @@ case "$host_os" in
|
|||||||
aix*)
|
aix*)
|
||||||
ac_symcode='[BCDTU]'
|
ac_symcode='[BCDTU]'
|
||||||
;;
|
;;
|
||||||
freebsd* | netbsd* | openbsd* | sunos* | cygwin32* | mingw32*)
|
freebsd* | netbsd* | openbsd* | bsdi* | sunos* | cygwin32* | mingw32*)
|
||||||
ac_sympat='_\([_A-Za-z][_A-Za-z0-9]*\)'
|
ac_sympat='_\([_A-Za-z][_A-Za-z0-9]*\)'
|
||||||
ac_symxfrm='_\1 \1'
|
ac_symxfrm='_\1 \1'
|
||||||
;;
|
;;
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
Sun May 28 13:55:17 CEST 2000 Werner Koch <wk@openit.de>
|
||||||
|
|
||||||
|
* random.c (read_seed_file): Binary open for DOSish system
|
||||||
|
(update_random_seed_file): Ditto.
|
||||||
|
|
||||||
|
* rndw32.c: Add some debuging code enabled by an environment variable.
|
||||||
|
|
||||||
Tue May 23 09:19:00 CEST 2000 Werner Koch <wk@openit.de>
|
Tue May 23 09:19:00 CEST 2000 Werner Koch <wk@openit.de>
|
||||||
|
|
||||||
* rndw32.c: Started with alternative code to replace entropy.dll
|
* rndw32.c: Started with alternative code to replace entropy.dll
|
||||||
|
@ -297,7 +297,11 @@ read_seed_file()
|
|||||||
if( !seed_file_name )
|
if( !seed_file_name )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#ifdef HAVE_DOSISH_SYSTEM
|
||||||
|
fd = open( seed_file_name, O_RDONLY | O_BINARY );
|
||||||
|
#else
|
||||||
fd = open( seed_file_name, O_RDONLY );
|
fd = open( seed_file_name, O_RDONLY );
|
||||||
|
#endif
|
||||||
if( fd == -1 && errno == ENOENT) {
|
if( fd == -1 && errno == ENOENT) {
|
||||||
allow_seed_file_update = 1;
|
allow_seed_file_update = 1;
|
||||||
return 0;
|
return 0;
|
||||||
@ -383,7 +387,12 @@ update_random_seed_file()
|
|||||||
mix_pool(rndpool); rndstats.mixrnd++;
|
mix_pool(rndpool); rndstats.mixrnd++;
|
||||||
mix_pool(keypool); rndstats.mixkey++;
|
mix_pool(keypool); rndstats.mixkey++;
|
||||||
|
|
||||||
|
#ifdef HAVE_DOSISH_SYSTEM
|
||||||
|
fd = open( seed_file_name, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,
|
||||||
|
S_IRUSR|S_IWUSR );
|
||||||
|
#else
|
||||||
fd = open( seed_file_name, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR );
|
fd = open( seed_file_name, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR );
|
||||||
|
#endif
|
||||||
if( fd == -1 ) {
|
if( fd == -1 ) {
|
||||||
log_info(_("can't create `%s': %s\n"), seed_file_name, strerror(errno) );
|
log_info(_("can't create `%s': %s\n"), seed_file_name, strerror(errno) );
|
||||||
return;
|
return;
|
||||||
|
221
cipher/rndw32.c
221
cipher/rndw32.c
@ -18,6 +18,7 @@
|
|||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*
|
*
|
||||||
|
*************************************************************************
|
||||||
* The code here is based on code from Cryptlib 3.0 beta by Peter Gutmann.
|
* The code here is based on code from Cryptlib 3.0 beta by Peter Gutmann.
|
||||||
* Source file misc/rndwin32.c "Win32 Randomness-Gathering Code" with this
|
* Source file misc/rndwin32.c "Win32 Randomness-Gathering Code" with this
|
||||||
* copyright notice:
|
* copyright notice:
|
||||||
@ -55,6 +56,7 @@
|
|||||||
* Although not required under the terms of the GPL, it would still be nice if
|
* Although not required under the terms of the GPL, it would still be nice if
|
||||||
* you could make any changes available to the author to allow a consistent
|
* you could make any changes available to the author to allow a consistent
|
||||||
* code base to be maintained
|
* code base to be maintained
|
||||||
|
*************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@ -66,28 +68,14 @@
|
|||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
/* We need to define these types and constants:
|
|
||||||
`HEAPENTRY32'
|
|
||||||
`HEAPLIST32'
|
|
||||||
`IOCTL_DISK_PERFORMANCE'
|
|
||||||
`LPHEAPLIST32'
|
|
||||||
`LPMODULEENTRY32'
|
|
||||||
`LPPROCESSENTRY32'
|
|
||||||
`LPTHREADENTRY32'
|
|
||||||
`MODULEENTRY32'
|
|
||||||
`PPERF_DATA_BLOCK'
|
|
||||||
`PROCESSENTRY32'
|
|
||||||
`RESOURCE_DATA'
|
|
||||||
`TH32CS_SNAPALL'
|
|
||||||
`THREADENTRY32'
|
|
||||||
`VER_PLATFORM_WIN32_WINDOWS'
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "dynload.h"
|
#include "dynload.h"
|
||||||
|
|
||||||
#define USE_ENTROPY_DLL
|
/* We do not use the netropy DLL anymore because a standalone program is
|
||||||
|
* easier to maintain and */
|
||||||
|
/*#define USE_ENTROPY_DLL*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -98,6 +86,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static int debug_me;
|
||||||
|
|
||||||
#ifdef USE_ENTROPY_DLL
|
#ifdef USE_ENTROPY_DLL
|
||||||
|
|
||||||
#define WIN32_SLOW_SEEDER 0
|
#define WIN32_SLOW_SEEDER 0
|
||||||
@ -305,17 +295,106 @@ gather_random_fast( void (*add)(const void*, size_t, int), int requester )
|
|||||||
#else /* !USE_ENTROPY_DLL */
|
#else /* !USE_ENTROPY_DLL */
|
||||||
/* This is the new code which does not require the entropy.dll */
|
/* This is the new code which does not require the entropy.dll */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Definitions which are missing from the current GNU Windows32Api
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define TH32CS_SNAPHEAPLIST 1
|
||||||
|
#define TH32CS_SNAPPROCESS 2
|
||||||
|
#define TH32CS_SNAPTHREAD 4
|
||||||
|
#define TH32CS_SNAPMODULE 8
|
||||||
|
#define TH32CS_SNAPALL (1|2|4|8)
|
||||||
|
#define TH32CS_INHERIT 0x80000000
|
||||||
|
|
||||||
|
#define IOCTL_DISK_PERFORMANCE 0x00070020
|
||||||
|
#define VER_PLATFORM_WIN32_WINDOWS 1
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
DWORD dwSize;
|
||||||
|
DWORD th32ProcessID;
|
||||||
|
DWORD th32HeapID;
|
||||||
|
DWORD dwFlags;
|
||||||
|
} HEAPLIST32;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
DWORD dwSize;
|
||||||
|
HANDLE hHandle;
|
||||||
|
DWORD dwAddress;
|
||||||
|
DWORD dwBlockSize;
|
||||||
|
DWORD dwFlags;
|
||||||
|
DWORD dwLockCount;
|
||||||
|
DWORD dwResvd;
|
||||||
|
DWORD th32ProcessID;
|
||||||
|
DWORD th32HeapID;
|
||||||
|
} HEAPENTRY32;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
DWORD dwSize;
|
||||||
|
DWORD cntUsage;
|
||||||
|
DWORD th32ProcessID;
|
||||||
|
DWORD th32DefaultHeapID;
|
||||||
|
DWORD th32ModuleID;
|
||||||
|
DWORD cntThreads;
|
||||||
|
DWORD th32ParentProcessID;
|
||||||
|
LONG pcPriClassBase;
|
||||||
|
DWORD dwFlags;
|
||||||
|
char szExeFile[260];
|
||||||
|
} PROCESSENTRY32;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
DWORD dwSize;
|
||||||
|
DWORD cntUsage;
|
||||||
|
DWORD th32ThreadID;
|
||||||
|
DWORD th32OwnerProcessID;
|
||||||
|
LONG tpBasePri;
|
||||||
|
LONG tpDeltaPri;
|
||||||
|
DWORD dwFlags;
|
||||||
|
} THREADENTRY32;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
DWORD dwSize;
|
||||||
|
DWORD th32ModuleID;
|
||||||
|
DWORD th32ProcessID;
|
||||||
|
DWORD GlblcntUsage;
|
||||||
|
DWORD ProccntUsage;
|
||||||
|
BYTE *modBaseAddr;
|
||||||
|
DWORD modBaseSize;
|
||||||
|
HMODULE hModule;
|
||||||
|
char szModule[256];
|
||||||
|
char szExePath[260];
|
||||||
|
} MODULEENTRY32;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Type definitions for function pointers to call Toolhelp32 functions
|
/* Type definitions for function pointers to call Toolhelp32 functions
|
||||||
* used with the windows95 gatherer */
|
* used with the windows95 gatherer */
|
||||||
typedef BOOL (WINAPI * MODULEWALK) (HANDLE hSnapshot, LPMODULEENTRY32 lpme);
|
typedef BOOL (WINAPI * MODULEWALK) (HANDLE hSnapshot, MODULEENTRY32 *lpme);
|
||||||
typedef BOOL (WINAPI * THREADWALK) (HANDLE hSnapshot, LPTHREADENTRY32 lpte);
|
typedef BOOL (WINAPI * THREADWALK) (HANDLE hSnapshot, THREADENTRY32 *lpte);
|
||||||
typedef BOOL (WINAPI * PROCESSWALK) (HANDLE hSnapshot, LPPROCESSENTRY32 lppe);
|
typedef BOOL (WINAPI * PROCESSWALK) (HANDLE hSnapshot, PROCESSENTRY32 *lppe);
|
||||||
typedef BOOL (WINAPI * HEAPLISTWALK) (HANDLE hSnapshot, LPHEAPLIST32 lphl);
|
typedef BOOL (WINAPI * HEAPLISTWALK) (HANDLE hSnapshot, HEAPLIST32 *lphl);
|
||||||
typedef BOOL (WINAPI * HEAPFIRST) (LPHEAPENTRY32 lphe, DWORD th32ProcessID,
|
typedef BOOL (WINAPI * HEAPFIRST) (HEAPENTRY32 *lphe, DWORD th32ProcessID,
|
||||||
DWORD th32HeapID);
|
DWORD th32HeapID);
|
||||||
typedef BOOL (WINAPI * HEAPNEXT) (LPHEAPENTRY32 lphe);
|
typedef BOOL (WINAPI * HEAPNEXT) (HEAPENTRY32 *lphe);
|
||||||
typedef HANDLE (WINAPI * CREATESNAPSHOT) (DWORD dwFlags, DWORD th32ProcessID);
|
typedef HANDLE (WINAPI * CREATESNAPSHOT) (DWORD dwFlags, DWORD th32ProcessID);
|
||||||
|
|
||||||
|
/* Type definitions for function pointers to call NetAPI32 functions */
|
||||||
|
typedef DWORD (WINAPI * NETSTATISTICSGET) (LPWSTR szServer, LPWSTR szService,
|
||||||
|
DWORD dwLevel, DWORD dwOptions,
|
||||||
|
LPBYTE * lpBuffer);
|
||||||
|
typedef DWORD (WINAPI * NETAPIBUFFERSIZE) (LPVOID lpBuffer, LPDWORD cbBuffer);
|
||||||
|
typedef DWORD (WINAPI * NETAPIBUFFERFREE) (LPVOID lpBuffer);
|
||||||
|
|
||||||
|
|
||||||
|
/* When we query the performance counters, we allocate an initial buffer and
|
||||||
|
* then reallocate it as required until RegQueryValueEx() stops returning
|
||||||
|
* ERROR_MORE_DATA. The following values define the initial buffer size and
|
||||||
|
* step size by which the buffer is increased
|
||||||
|
*/
|
||||||
|
#define PERFORMANCE_BUFFER_SIZE 65536 /* Start at 64K */
|
||||||
|
#define PERFORMANCE_BUFFER_STEP 16384 /* Step by 16K */
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
slow_gatherer_windows95( void (*add)(const void*, size_t, int), int requester )
|
slow_gatherer_windows95( void (*add)(const void*, size_t, int), int requester )
|
||||||
{
|
{
|
||||||
@ -337,6 +416,9 @@ slow_gatherer_windows95( void (*add)(const void*, size_t, int), int requester )
|
|||||||
if ( !pCreateToolhelp32Snapshot ) {
|
if ( !pCreateToolhelp32Snapshot ) {
|
||||||
HANDLE hKernel;
|
HANDLE hKernel;
|
||||||
|
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#slow_gatherer_95: init toolkit\n" );
|
||||||
|
|
||||||
/* Obtain the module handle of the kernel to retrieve the addresses
|
/* Obtain the module handle of the kernel to retrieve the addresses
|
||||||
* of the Toolhelp32 functions */
|
* of the Toolhelp32 functions */
|
||||||
if ( ( !(hKernel = GetModuleHandle ("KERNEL32.DLL"))) ) {
|
if ( ( !(hKernel = GetModuleHandle ("KERNEL32.DLL"))) ) {
|
||||||
@ -381,6 +463,8 @@ slow_gatherer_windows95( void (*add)(const void*, size_t, int), int requester )
|
|||||||
{ HEAPLIST32 hl32;
|
{ HEAPLIST32 hl32;
|
||||||
hl32.dwSize = sizeof (HEAPLIST32);
|
hl32.dwSize = sizeof (HEAPLIST32);
|
||||||
if (pHeap32ListFirst (hSnapshot, &hl32)) {
|
if (pHeap32ListFirst (hSnapshot, &hl32)) {
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#slow_gatherer_95: walk heap\n" );
|
||||||
do {
|
do {
|
||||||
HEAPENTRY32 he32;
|
HEAPENTRY32 he32;
|
||||||
|
|
||||||
@ -404,6 +488,8 @@ slow_gatherer_windows95( void (*add)(const void*, size_t, int), int requester )
|
|||||||
{ PROCESSENTRY32 pe32;
|
{ PROCESSENTRY32 pe32;
|
||||||
pe32.dwSize = sizeof (PROCESSENTRY32);
|
pe32.dwSize = sizeof (PROCESSENTRY32);
|
||||||
if (pProcess32First (hSnapshot, &pe32)) {
|
if (pProcess32First (hSnapshot, &pe32)) {
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#slow_gatherer_95: walk processes\n" );
|
||||||
do {
|
do {
|
||||||
(*add) ( &pe32, sizeof (pe32), requester );
|
(*add) ( &pe32, sizeof (pe32), requester );
|
||||||
} while (pProcess32Next (hSnapshot, &pe32));
|
} while (pProcess32Next (hSnapshot, &pe32));
|
||||||
@ -414,6 +500,8 @@ slow_gatherer_windows95( void (*add)(const void*, size_t, int), int requester )
|
|||||||
{ THREADENTRY32 te32;
|
{ THREADENTRY32 te32;
|
||||||
te32.dwSize = sizeof (THREADENTRY32);
|
te32.dwSize = sizeof (THREADENTRY32);
|
||||||
if (pThread32First (hSnapshot, &te32)) {
|
if (pThread32First (hSnapshot, &te32)) {
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#slow_gatherer_95: walk threads\n" );
|
||||||
do {
|
do {
|
||||||
(*add) ( &te32, sizeof (te32), requester );
|
(*add) ( &te32, sizeof (te32), requester );
|
||||||
} while (pThread32Next (hSnapshot, &te32));
|
} while (pThread32Next (hSnapshot, &te32));
|
||||||
@ -424,6 +512,8 @@ slow_gatherer_windows95( void (*add)(const void*, size_t, int), int requester )
|
|||||||
{ MODULEENTRY32 me32;
|
{ MODULEENTRY32 me32;
|
||||||
me32.dwSize = sizeof (MODULEENTRY32);
|
me32.dwSize = sizeof (MODULEENTRY32);
|
||||||
if (pModule32First (hSnapshot, &me32)) {
|
if (pModule32First (hSnapshot, &me32)) {
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#slow_gatherer_95: walk modules\n" );
|
||||||
do {
|
do {
|
||||||
(*add) ( &me32, sizeof (me32), requester );
|
(*add) ( &me32, sizeof (me32), requester );
|
||||||
} while (pModule32Next (hSnapshot, &me32));
|
} while (pModule32Next (hSnapshot, &me32));
|
||||||
@ -434,20 +524,6 @@ slow_gatherer_windows95( void (*add)(const void*, size_t, int), int requester )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Type definitions for function pointers to call NetAPI32 functions */
|
|
||||||
typedef DWORD (WINAPI * NETSTATISTICSGET) (LPWSTR szServer, LPWSTR szService,
|
|
||||||
DWORD dwLevel, DWORD dwOptions,
|
|
||||||
LPBYTE * lpBuffer);
|
|
||||||
typedef DWORD (WINAPI * NETAPIBUFFERSIZE) (LPVOID lpBuffer, LPDWORD cbBuffer);
|
|
||||||
typedef DWORD (WINAPI * NETAPIBUFFERFREE) (LPVOID lpBuffer);
|
|
||||||
|
|
||||||
/* When we query the performance counters, we allocate an initial buffer and
|
|
||||||
* then reallocate it as required until RegQueryValueEx() stops returning
|
|
||||||
* ERROR_MORE_DATA. The following values define the initial buffer size and
|
|
||||||
* step size by which the buffer is increased
|
|
||||||
*/
|
|
||||||
#define PERFORMANCE_BUFFER_SIZE 65536 /* Start at 64K */
|
|
||||||
#define PERFORMANCE_BUFFER_STEP 16384 /* Step by 16K */
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
slow_gatherer_windowsNT( void (*add)(const void*, size_t, int), int requester )
|
slow_gatherer_windowsNT( void (*add)(const void*, size_t, int), int requester )
|
||||||
@ -459,15 +535,16 @@ slow_gatherer_windowsNT( void (*add)(const void*, size_t, int), int requester )
|
|||||||
static int is_workstation = 1;
|
static int is_workstation = 1;
|
||||||
|
|
||||||
static int cbPerfData = PERFORMANCE_BUFFER_SIZE;
|
static int cbPerfData = PERFORMANCE_BUFFER_SIZE;
|
||||||
RESOURCE_DATA msgData;
|
PERF_DATA_BLOCK *pPerfData;
|
||||||
PPERF_DATA_BLOCK pPerfData;
|
HANDLE hDevice, hNetAPI32 = NULL;
|
||||||
HANDLE hDevice;
|
|
||||||
DWORD dwSize, status;
|
DWORD dwSize, status;
|
||||||
int nDrive;
|
int nDrive;
|
||||||
|
|
||||||
if ( !is_initialized ) {
|
if ( !is_initialized ) {
|
||||||
HKEY hKey;
|
HKEY hKey;
|
||||||
|
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#slow_gatherer_nt: init toolkit\n" );
|
||||||
/* Find out whether this is an NT server or workstation if necessary */
|
/* Find out whether this is an NT server or workstation if necessary */
|
||||||
if (RegOpenKeyEx (HKEY_LOCAL_MACHINE,
|
if (RegOpenKeyEx (HKEY_LOCAL_MACHINE,
|
||||||
"SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
|
"SYSTEM\\CurrentControlSet\\Control\\ProductOptions",
|
||||||
@ -475,6 +552,8 @@ slow_gatherer_windowsNT( void (*add)(const void*, size_t, int), int requester )
|
|||||||
BYTE szValue[32];
|
BYTE szValue[32];
|
||||||
dwSize = sizeof (szValue);
|
dwSize = sizeof (szValue);
|
||||||
|
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#slow_gatherer_nt: check product options\n" );
|
||||||
status = RegQueryValueEx (hKey, "ProductType", 0, NULL,
|
status = RegQueryValueEx (hKey, "ProductType", 0, NULL,
|
||||||
szValue, &dwSize);
|
szValue, &dwSize);
|
||||||
if (status == ERROR_SUCCESS && stricmp (szValue, "WinNT")) {
|
if (status == ERROR_SUCCESS && stricmp (szValue, "WinNT")) {
|
||||||
@ -482,13 +561,16 @@ slow_gatherer_windowsNT( void (*add)(const void*, size_t, int), int requester )
|
|||||||
* WinNT = NT Workstation, ServerNT = NT Server, LanmanNT =
|
* WinNT = NT Workstation, ServerNT = NT Server, LanmanNT =
|
||||||
* NT Server acting as a Domain Controller */
|
* NT Server acting as a Domain Controller */
|
||||||
is_workstation = 0;
|
is_workstation = 0;
|
||||||
g10_log_debug ("rndw32: this is a NT server\n");
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32: this is a NT server\n");
|
||||||
}
|
}
|
||||||
RegCloseKey (hKey);
|
RegCloseKey (hKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the NetAPI32 function pointers if necessary */
|
/* Initialize the NetAPI32 function pointers if necessary */
|
||||||
if ( (hNetAPI32 = LoadLibrary ("NETAPI32.DLL")) ) {
|
if ( (hNetAPI32 = LoadLibrary ("NETAPI32.DLL")) ) {
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#slow_gatherer_nt: netapi32 loaded\n" );
|
||||||
pNetStatisticsGet = (NETSTATISTICSGET) GetProcAddress (hNetAPI32,
|
pNetStatisticsGet = (NETSTATISTICSGET) GetProcAddress (hNetAPI32,
|
||||||
"NetStatisticsGet");
|
"NetStatisticsGet");
|
||||||
pNetApiBufferSize = (NETAPIBUFFERSIZE) GetProcAddress (hNetAPI32,
|
pNetApiBufferSize = (NETAPIBUFFERSIZE) GetProcAddress (hNetAPI32,
|
||||||
@ -516,6 +598,8 @@ slow_gatherer_windowsNT( void (*add)(const void*, size_t, int), int requester )
|
|||||||
if (hNetAPI32 && !pNetStatisticsGet (NULL,
|
if (hNetAPI32 && !pNetStatisticsGet (NULL,
|
||||||
is_workstation ? L"LanmanWorkstation" :
|
is_workstation ? L"LanmanWorkstation" :
|
||||||
L"LanmanServer", 0, 0, &lpBuffer) ) {
|
L"LanmanServer", 0, 0, &lpBuffer) ) {
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#slow_gatherer_nt: get netstats\n" );
|
||||||
pNetApiBufferSize (lpBuffer, &dwSize);
|
pNetApiBufferSize (lpBuffer, &dwSize);
|
||||||
(*add) ( lpBuffer, dwSize,requester );
|
(*add) ( lpBuffer, dwSize,requester );
|
||||||
pNetApiBufferFree (lpBuffer);
|
pNetApiBufferFree (lpBuffer);
|
||||||
@ -532,16 +616,23 @@ slow_gatherer_windowsNT( void (*add)(const void*, size_t, int), int requester )
|
|||||||
hDevice = CreateFile (szDevice, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
|
hDevice = CreateFile (szDevice, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
NULL, OPEN_EXISTING, 0, NULL);
|
NULL, OPEN_EXISTING, 0, NULL);
|
||||||
if (hDevice == INVALID_HANDLE_VALUE)
|
if (hDevice == INVALID_HANDLE_VALUE)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Note: This only works if you have turned on the disk performance
|
/* Note: This only works if you have turned on the disk performance
|
||||||
* counters with 'diskperf -y'. These counters are off by default */
|
* counters with 'diskperf -y'. These counters are off by default */
|
||||||
if (DeviceIoControl (hDevice, IOCTL_DISK_PERFORMANCE, NULL, 0,
|
if (DeviceIoControl (hDevice, IOCTL_DISK_PERFORMANCE, NULL, 0,
|
||||||
&diskPerformance, sizeof (DISK_PERFORMANCE),
|
&diskPerformance, sizeof (DISK_PERFORMANCE),
|
||||||
&dwSize, NULL))
|
&dwSize, NULL))
|
||||||
{
|
{
|
||||||
(*add) ( &diskPerformance, dwSize);
|
if ( debug_me )
|
||||||
}
|
log_debug ("rndw32#slow_gatherer_nt: iostats drive %d\n",
|
||||||
|
nDrive );
|
||||||
|
(*add) ( &diskPerformance, dwSize, requester );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
log_info ("NOTE: you should run 'diskperf -y' "
|
||||||
|
"to enable the disk statistics\n");
|
||||||
|
}
|
||||||
CloseHandle (hDevice);
|
CloseHandle (hDevice);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -596,6 +687,8 @@ slow_gatherer_windowsNT( void (*add)(const void*, size_t, int), int requester )
|
|||||||
{ pPerfData = m_alloc (cbPerfData);
|
{ pPerfData = m_alloc (cbPerfData);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
dwSize = cbPerfData;
|
dwSize = cbPerfData;
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#slow_gatherer_nt: get perf data\n" );
|
||||||
status = RegQueryValueEx (HKEY_PERFORMANCE_DATA, "Global", NULL,
|
status = RegQueryValueEx (HKEY_PERFORMANCE_DATA, "Global", NULL,
|
||||||
NULL, (LPBYTE) pPerfData, &dwSize);
|
NULL, (LPBYTE) pPerfData, &dwSize);
|
||||||
if (status == ERROR_SUCCESS) {
|
if (status == ERROR_SUCCESS) {
|
||||||
@ -615,7 +708,7 @@ slow_gatherer_windowsNT( void (*add)(const void*, size_t, int), int requester )
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_free (cbPerfData);
|
m_free (pPerfData);
|
||||||
}
|
}
|
||||||
/* Although this isn't documented in the Win32 API docs, it's necessary
|
/* Although this isn't documented in the Win32 API docs, it's necessary
|
||||||
to explicitly close the HKEY_PERFORMANCE_DATA key after use (it's
|
to explicitly close the HKEY_PERFORMANCE_DATA key after use (it's
|
||||||
@ -637,11 +730,12 @@ gather_random( void (*add)(const void*, size_t, int), int requester,
|
|||||||
if( !level )
|
if( !level )
|
||||||
return 0;
|
return 0;
|
||||||
/* We don't differentiate between level 1 and 2 here because
|
/* We don't differentiate between level 1 and 2 here because
|
||||||
* there is no nternal entropy pool as ascary resource. It may
|
* there is no nternal entropy pool as a scary resource. It may
|
||||||
* all work slower, but because our entropy source will never
|
* all work slower, but because our entropy source will never
|
||||||
* block but deliver some not easy to measure entropy, we assume level 2
|
* block but deliver some not easy to measure entropy, we assume level 2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
if ( !is_initialized ) {
|
if ( !is_initialized ) {
|
||||||
OSVERSIONINFO osvi = { sizeof( osvi ) };
|
OSVERSIONINFO osvi = { sizeof( osvi ) };
|
||||||
DWORD platform;
|
DWORD platform;
|
||||||
@ -654,9 +748,15 @@ gather_random( void (*add)(const void*, size_t, int), int requester,
|
|||||||
g10_log_fatal("can't run on a W32s platform\n" );
|
g10_log_fatal("can't run on a W32s platform\n" );
|
||||||
}
|
}
|
||||||
is_initialized = 1;
|
is_initialized = 1;
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#gather_random: platform=%d\n", (int)platform );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#gather_random: req=%d len=%u lvl=%d\n",
|
||||||
|
requester, (unsigned int)length, level );
|
||||||
|
|
||||||
if (is_windows95 ) {
|
if (is_windows95 ) {
|
||||||
slow_gatherer_windows95( add, requester );
|
slow_gatherer_windows95( add, requester );
|
||||||
}
|
}
|
||||||
@ -674,6 +774,9 @@ gather_random_fast( void (*add)(const void*, size_t, int), int requester )
|
|||||||
{
|
{
|
||||||
static int addedFixedItems = 0;
|
static int addedFixedItems = 0;
|
||||||
|
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#gather_random_fast: req=%d\n", requester );
|
||||||
|
|
||||||
/* Get various basic pieces of system information: Handle of active
|
/* Get various basic pieces of system information: Handle of active
|
||||||
* window, handle of window with mouse capture, handle of clipboard owner
|
* window, handle of window with mouse capture, handle of clipboard owner
|
||||||
* handle of start of clpboard viewer list, pseudohandle of current
|
* handle of start of clpboard viewer list, pseudohandle of current
|
||||||
@ -734,6 +837,7 @@ gather_random_fast( void (*add)(const void*, size_t, int), int requester )
|
|||||||
and time in user mode in 100ns intervals */
|
and time in user mode in 100ns intervals */
|
||||||
{ HANDLE handle;
|
{ HANDLE handle;
|
||||||
FILETIME creationTime, exitTime, kernelTime, userTime;
|
FILETIME creationTime, exitTime, kernelTime, userTime;
|
||||||
|
DWORD minimumWorkingSetSize, maximumWorkingSetSize;
|
||||||
|
|
||||||
handle = GetCurrentThread ();
|
handle = GetCurrentThread ();
|
||||||
GetThreadTimes (handle, &creationTime, &exitTime,
|
GetThreadTimes (handle, &creationTime, &exitTime,
|
||||||
@ -750,17 +854,16 @@ gather_random_fast( void (*add)(const void*, size_t, int), int requester )
|
|||||||
(*add) ( &exitTime, sizeof (exitTime), requester );
|
(*add) ( &exitTime, sizeof (exitTime), requester );
|
||||||
(*add) ( &kernelTime, sizeof (kernelTime), requester );
|
(*add) ( &kernelTime, sizeof (kernelTime), requester );
|
||||||
(*add) ( &userTime, sizeof (userTime), requester );
|
(*add) ( &userTime, sizeof (userTime), requester );
|
||||||
|
|
||||||
|
/* Get the minimum and maximum working set size for the current process */
|
||||||
|
GetProcessWorkingSetSize (handle, &minimumWorkingSetSize,
|
||||||
|
&maximumWorkingSetSize);
|
||||||
|
(*add) ( &minimumWorkingSetSize,
|
||||||
|
sizeof (&minimumWorkingSetSize), requester );
|
||||||
|
(*add) ( &maximumWorkingSetSize,
|
||||||
|
sizeof (&maximumWorkingSetSize), requester );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the minimum and maximum working set size for the current process */
|
|
||||||
{ DWORD minimumWorkingSetSize, maximumWorkingSetSize;
|
|
||||||
GetProcessWorkingSetSize (handle, &minimumWorkingSetSize,
|
|
||||||
&maximumWorkingSetSize);
|
|
||||||
(*add) ( &minimumWorkingSetSize,
|
|
||||||
sizeof (&minimumWorkingSetSize), requester );
|
|
||||||
(*add) ( &maximumWorkingSetSize,
|
|
||||||
sizeof (&maximumWorkingSetSize), requester );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The following are fixed for the lifetime of the process so we only
|
/* The following are fixed for the lifetime of the process so we only
|
||||||
* add them once */
|
* add them once */
|
||||||
@ -784,11 +887,13 @@ gather_random_fast( void (*add)(const void*, size_t, int), int requester )
|
|||||||
* running NT), but who's going to run NT on a '386? */
|
* running NT), but who's going to run NT on a '386? */
|
||||||
{ LARGE_INTEGER performanceCount;
|
{ LARGE_INTEGER performanceCount;
|
||||||
if (QueryPerformanceCounter (&performanceCount)) {
|
if (QueryPerformanceCounter (&performanceCount)) {
|
||||||
|
if ( debug_me )
|
||||||
|
log_debug ("rndw32#gather_random_fast: perf data\n");
|
||||||
(*add) (&performanceCount, sizeof (&performanceCount), requester);
|
(*add) (&performanceCount, sizeof (&performanceCount), requester);
|
||||||
}
|
}
|
||||||
else { /* Millisecond accuracy at best... */
|
else { /* Millisecond accuracy at best... */
|
||||||
DWORD aword = GetTickCount ();
|
DWORD aword = GetTickCount ();
|
||||||
(*add) (&aword, soeof (aword), requester );
|
(*add) (&aword, sizeof (aword), requester );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -826,6 +931,8 @@ gnupgext_enum_func( int what, int *sequence, int *class, int *vers )
|
|||||||
void *ret;
|
void *ret;
|
||||||
int i = *sequence;
|
int i = *sequence;
|
||||||
|
|
||||||
|
debug_me = !!getenv("DEBUG_RNDW32");
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if ( i >= DIM(func_table) || i < 0 ) {
|
if ( i >= DIM(func_table) || i < 0 ) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -20,25 +20,18 @@ to get an answer).
|
|||||||
|
|
||||||
Installation instructions:
|
Installation instructions:
|
||||||
--------------------------
|
--------------------------
|
||||||
1. Unpack the ZIP archive (alright, you already did this)
|
1. Unpack the ZIP archive (alright, you already did this).
|
||||||
2. Copy "gpg.exe" to some place where you usually store your
|
2. Copy "gpg.exe" to some place where you usually store your
|
||||||
binaries.
|
binaries.
|
||||||
3. Create a directory "c:\gnupg" (or any other as you like)
|
3. Create a directory "c:\gnupg" (or any other as you like)
|
||||||
4. Copy the file "entropy.dll" to this directory.
|
4. If you did not use the default directory "c:\gnupg", you
|
||||||
5. If you did not use the default directory "c:\gnupg", you
|
|
||||||
should enter a string with the directory into the Registry
|
should enter a string with the directory into the Registry
|
||||||
under the key:
|
under the key:
|
||||||
\\HKEY_CURRENT_USER\Software\GNU\GnuPG\HomeDir
|
\\HKEY_CURRENT_USER\Software\GNU\GnuPG\HomeDir
|
||||||
Because the default location for the entropy DLL is also the
|
|
||||||
c:\gnupg; you have to set another Registry entry with the
|
|
||||||
full name of the DLL (e.g. "c:\foo\bar\entropy.dll") under
|
|
||||||
the key:
|
|
||||||
\\HKEY_LOCAL_MACHINE\Software\GNU\GnuPG\EntropyDLL
|
|
||||||
Please use forward slashes and not the backslashes when
|
Please use forward slashes and not the backslashes when
|
||||||
setting filenames for GnuPG into the Registry.
|
setting filenames for GnuPG into the Registry.
|
||||||
|
5. Enter "gpg" and see what happens
|
||||||
6. Enter "gpg" and see what happens
|
6. Read the file README and the online HOWTOs
|
||||||
7. Read the file README and the online HOWTOs
|
|
||||||
|
|
||||||
|
|
||||||
Internationalization support:
|
Internationalization support:
|
||||||
@ -93,15 +86,6 @@ After you have installed this environment you should be able to do this:
|
|||||||
|
|
||||||
And everything hopefully works.
|
And everything hopefully works.
|
||||||
|
|
||||||
It is currently not possible to build the entropy DLL with the MingW32/CPD
|
|
||||||
because it is still lacking C++ support. But I am working on it.
|
|
||||||
However the source is available at
|
|
||||||
|
|
||||||
ftp://ftp.gnupg.org/pub/gcrypt/contrib/winseed.zip
|
|
||||||
|
|
||||||
follow the instructions to build it (if you have a MS tool chain).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Don't forget that MS-Windows ist just a temporary workaround until
|
Don't forget that MS-Windows ist just a temporary workaround until
|
||||||
you can switch to a GNU system ;-)
|
you can switch to a GNU system ;-)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user