⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rand_win.c

📁 OpenSSL 0.9.8k 最新版OpenSSL
💻 C
📖 第 1 页 / 共 2 页
字号:
		}        if (advapi)		FreeLibrary(advapi);	if ((osverinfo.dwPlatformId != VER_PLATFORM_WIN32_NT ||	     !OPENSSL_isservice()) &&	    (user = LoadLibrary(TEXT("USER32.DLL"))))		{		GETCURSORINFO cursor;		GETFOREGROUNDWINDOW win;		GETQUEUESTATUS queue;		win = (GETFOREGROUNDWINDOW) GetProcAddress(user, "GetForegroundWindow");		cursor = (GETCURSORINFO) GetProcAddress(user, "GetCursorInfo");		queue = (GETQUEUESTATUS) GetProcAddress(user, "GetQueueStatus");		if (win)			{			/* window handle */			HWND h = win();			RAND_add(&h, sizeof(h), 0);			}		if (cursor)			{			/* unfortunately, its not safe to call GetCursorInfo()			 * on NT4 even though it exists in SP3 (or SP6) and			 * higher.			 */			if ( osverinfo.dwPlatformId == VER_PLATFORM_WIN32_NT &&				osverinfo.dwMajorVersion < 5)				cursor = 0;			}		if (cursor)			{			/* cursor position */                        /* assume 2 bytes of entropy */			CURSORINFO ci;			ci.cbSize = sizeof(CURSORINFO);			if (cursor(&ci))				RAND_add(&ci, ci.cbSize, 2);			}		if (queue)			{			/* message queue status */                        /* assume 1 byte of entropy */			w = queue(QS_ALLEVENTS);			RAND_add(&w, sizeof(w), 1);			}		FreeLibrary(user);		}	/* Toolhelp32 snapshot: enumerate processes, threads, modules and heap	 * http://msdn.microsoft.com/library/psdk/winbase/toolhelp_5pfd.htm	 * (Win 9x and 2000 only, not available on NT)	 *	 * This seeding method was proposed in Peter Gutmann, Software	 * Generation of Practically Strong Random Numbers,	 * http://www.usenix.org/publications/library/proceedings/sec98/gutmann.html	 * revised version at http://www.cryptoengines.com/~peter/06_random.pdf	 * (The assignment of entropy estimates below is arbitrary, but based	 * on Peter's analysis the full poll appears to be safe. Additional	 * interactive seeding is encouraged.)	 */	if (kernel)		{		CREATETOOLHELP32SNAPSHOT snap;		CLOSETOOLHELP32SNAPSHOT close_snap;		HANDLE handle;		HEAP32FIRST heap_first;		HEAP32NEXT heap_next;		HEAP32LIST heaplist_first, heaplist_next;		PROCESS32 process_first, process_next;		THREAD32 thread_first, thread_next;		MODULE32 module_first, module_next;		HEAPLIST32 hlist;		HEAPENTRY32 hentry;		PROCESSENTRY32 p;		THREADENTRY32 t;		MODULEENTRY32 m;		DWORD stoptime = 0;		snap = (CREATETOOLHELP32SNAPSHOT)			GetProcAddress(kernel, "CreateToolhelp32Snapshot");		close_snap = (CLOSETOOLHELP32SNAPSHOT)			GetProcAddress(kernel, "CloseToolhelp32Snapshot");		heap_first = (HEAP32FIRST) GetProcAddress(kernel, "Heap32First");		heap_next = (HEAP32NEXT) GetProcAddress(kernel, "Heap32Next");		heaplist_first = (HEAP32LIST) GetProcAddress(kernel, "Heap32ListFirst");		heaplist_next = (HEAP32LIST) GetProcAddress(kernel, "Heap32ListNext");		process_first = (PROCESS32) GetProcAddress(kernel, "Process32First");		process_next = (PROCESS32) GetProcAddress(kernel, "Process32Next");		thread_first = (THREAD32) GetProcAddress(kernel, "Thread32First");		thread_next = (THREAD32) GetProcAddress(kernel, "Thread32Next");		module_first = (MODULE32) GetProcAddress(kernel, "Module32First");		module_next = (MODULE32) GetProcAddress(kernel, "Module32Next");		if (snap && heap_first && heap_next && heaplist_first &&			heaplist_next && process_first && process_next &&			thread_first && thread_next && module_first &&			module_next && (handle = snap(TH32CS_SNAPALL,0))			!= INVALID_HANDLE_VALUE)			{			/* heap list and heap walking */                        /* HEAPLIST32 contains 3 fields that will change with                         * each entry.  Consider each field a source of 1 byte                         * of entropy.                         * HEAPENTRY32 contains 5 fields that will change with                          * each entry.  Consider each field a source of 1 byte                         * of entropy.                         */			hlist.dwSize = sizeof(HEAPLIST32);					if (good) stoptime = GetTickCount() + MAXDELAY;			if (heaplist_first(handle, &hlist))				do					{					RAND_add(&hlist, hlist.dwSize, 3);					hentry.dwSize = sizeof(HEAPENTRY32);					if (heap_first(&hentry,						hlist.th32ProcessID,						hlist.th32HeapID))						{						int entrycnt = 80;						do							RAND_add(&hentry,								hentry.dwSize, 5);						while (heap_next(&hentry)							&& --entrycnt > 0);						}					} while (heaplist_next(handle,						&hlist) && GetTickCount() < stoptime);			/* process walking */                        /* PROCESSENTRY32 contains 9 fields that will change                         * with each entry.  Consider each field a source of                         * 1 byte of entropy.                         */			p.dwSize = sizeof(PROCESSENTRY32);					if (good) stoptime = GetTickCount() + MAXDELAY;			if (process_first(handle, &p))				do					RAND_add(&p, p.dwSize, 9);				while (process_next(handle, &p) && GetTickCount() < stoptime);			/* thread walking */                        /* THREADENTRY32 contains 6 fields that will change                         * with each entry.  Consider each field a source of                         * 1 byte of entropy.                         */			t.dwSize = sizeof(THREADENTRY32);			if (good) stoptime = GetTickCount() + MAXDELAY;			if (thread_first(handle, &t))				do					RAND_add(&t, t.dwSize, 6);				while (thread_next(handle, &t) && GetTickCount() < stoptime);			/* module walking */                        /* MODULEENTRY32 contains 9 fields that will change                         * with each entry.  Consider each field a source of                         * 1 byte of entropy.                         */			m.dwSize = sizeof(MODULEENTRY32);			if (good) stoptime = GetTickCount() + MAXDELAY;			if (module_first(handle, &m))				do					RAND_add(&m, m.dwSize, 9);				while (module_next(handle, &m)					       	&& (GetTickCount() < stoptime));			if (close_snap)				close_snap(handle);			else				CloseHandle(handle);			}		FreeLibrary(kernel);		}	}#endif /* !OPENSSL_SYS_WINCE */	/* timer data */	readtimer();		/* memory usage statistics */	GlobalMemoryStatus(&m);	RAND_add(&m, sizeof(m), 1);	/* process ID */	w = GetCurrentProcessId();	RAND_add(&w, sizeof(w), 1);#if 0	printf("Exiting RAND_poll\n");#endif	return(1);}int RAND_event(UINT iMsg, WPARAM wParam, LPARAM lParam)        {        double add_entropy=0;        switch (iMsg)                {        case WM_KEYDOWN:                        {                        static WPARAM key;                        if (key != wParam)                                add_entropy = 0.05;                        key = wParam;                        }                        break;	case WM_MOUSEMOVE:                        {                        static int lastx,lasty,lastdx,lastdy;                        int x,y,dx,dy;                        x=LOWORD(lParam);                        y=HIWORD(lParam);                        dx=lastx-x;                        dy=lasty-y;                        if (dx != 0 && dy != 0 && dx-lastdx != 0 && dy-lastdy != 0)                                add_entropy=.2;                        lastx=x, lasty=y;                        lastdx=dx, lastdy=dy;                        }		break;		}	readtimer();        RAND_add(&iMsg, sizeof(iMsg), add_entropy);	RAND_add(&wParam, sizeof(wParam), 0);	RAND_add(&lParam, sizeof(lParam), 0); 	return (RAND_status());	}void RAND_screen(void) /* function available for backward compatibility */{	RAND_poll();	readscreen();}/* feed timing information to the PRNG */static void readtimer(void){	DWORD w;	LARGE_INTEGER l;	static int have_perfc = 1;#if defined(_MSC_VER) && defined(_M_X86)	static int have_tsc = 1;	DWORD cyclecount;	if (have_tsc) {	  __try {	    __asm {	      _emit 0x0f	      _emit 0x31	      mov cyclecount, eax	      }	    RAND_add(&cyclecount, sizeof(cyclecount), 1);	  } __except(EXCEPTION_EXECUTE_HANDLER) {	    have_tsc = 0;	  }	}#else# define have_tsc 0#endif	if (have_perfc) {	  if (QueryPerformanceCounter(&l) == 0)	    have_perfc = 0;	  else	    RAND_add(&l, sizeof(l), 0);	}	if (!have_tsc && !have_perfc) {	  w = GetTickCount();	  RAND_add(&w, sizeof(w), 0);	}}/* feed screen contents to PRNG *//***************************************************************************** * * Created 960901 by Gertjan van Oosten, gertjan@West.NL, West Consulting B.V. * * Code adapted from * <URL:http://support.microsoft.com/default.aspx?scid=kb;[LN];97193>; * the original copyright message is: * *   (C) Copyright Microsoft Corp. 1993.  All rights reserved. * *   You have a royalty-free right to use, modify, reproduce and *   distribute the Sample Files (and/or any modified version) in *   any way you find useful, provided that you agree that *   Microsoft has no warranty obligations or liability for any *   Sample Application Files which are modified. */static void readscreen(void){#if !defined(OPENSSL_SYS_WINCE) && !defined(OPENSSL_SYS_WIN32_CYGWIN)  HDC		hScrDC;		/* screen DC */  HDC		hMemDC;		/* memory DC */  HBITMAP	hBitmap;	/* handle for our bitmap */  HBITMAP	hOldBitmap;	/* handle for previous bitmap */  BITMAP	bm;		/* bitmap properties */  unsigned int	size;		/* size of bitmap */  char		*bmbits;	/* contents of bitmap */  int		w;		/* screen width */  int		h;		/* screen height */  int		y;		/* y-coordinate of screen lines to grab */  int		n = 16;		/* number of screen lines to grab at a time */  if (GetVersion() >= 0x80000000 || !OPENSSL_isservice())    return;  /* Create a screen DC and a memory DC compatible to screen DC */  hScrDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL);  hMemDC = CreateCompatibleDC(hScrDC);  /* Get screen resolution */  w = GetDeviceCaps(hScrDC, HORZRES);  h = GetDeviceCaps(hScrDC, VERTRES);  /* Create a bitmap compatible with the screen DC */  hBitmap = CreateCompatibleBitmap(hScrDC, w, n);  /* Select new bitmap into memory DC */  hOldBitmap = SelectObject(hMemDC, hBitmap);  /* Get bitmap properties */  GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);  size = (unsigned int)bm.bmWidthBytes * bm.bmHeight * bm.bmPlanes;  bmbits = OPENSSL_malloc(size);  if (bmbits) {    /* Now go through the whole screen, repeatedly grabbing n lines */    for (y = 0; y < h-n; y += n)    	{	unsigned char md[MD_DIGEST_LENGTH];	/* Bitblt screen DC to memory DC */	BitBlt(hMemDC, 0, 0, w, n, hScrDC, 0, y, SRCCOPY);	/* Copy bitmap bits from memory DC to bmbits */	GetBitmapBits(hBitmap, size, bmbits);	/* Get the hash of the bitmap */	MD(bmbits,size,md);	/* Seed the random generator with the hash value */	RAND_add(md, MD_DIGEST_LENGTH, 0);	}    OPENSSL_free(bmbits);  }  /* Select old bitmap back into memory DC */  hBitmap = SelectObject(hMemDC, hOldBitmap);  /* Clean up */  DeleteObject(hBitmap);  DeleteDC(hMemDC);  DeleteDC(hScrDC);#endif /* !OPENSSL_SYS_WINCE */}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -