Home | History | Annotate | Download | only in apps
      1 /* apps/winrand.c */
      2 /* ====================================================================
      3  * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  *
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in
     14  *    the documentation and/or other materials provided with the
     15  *    distribution.
     16  *
     17  * 3. All advertising materials mentioning features or use of this
     18  *    software must display the following acknowledgment:
     19  *    "This product includes software developed by the OpenSSL Project
     20  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
     21  *
     22  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
     23  *    endorse or promote products derived from this software without
     24  *    prior written permission. For written permission, please contact
     25  *    openssl-core (at) openssl.org.
     26  *
     27  * 5. Products derived from this software may not be called "OpenSSL"
     28  *    nor may "OpenSSL" appear in their names without prior written
     29  *    permission of the OpenSSL Project.
     30  *
     31  * 6. Redistributions of any form whatsoever must retain the following
     32  *    acknowledgment:
     33  *    "This product includes software developed by the OpenSSL Project
     34  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
     35  *
     36  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
     37  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     38  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     39  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
     40  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     41  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     42  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     43  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     44  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     45  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     46  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     47  * OF THE POSSIBILITY OF SUCH DAMAGE.
     48  * ====================================================================
     49  *
     50  * This product includes cryptographic software written by Eric Young
     51  * (eay (at) cryptsoft.com).  This product includes software written by Tim
     52  * Hudson (tjh (at) cryptsoft.com).
     53  *
     54  */
     55 
     56 /* Usage: winrand [filename]
     57  *
     58  * Collects entropy from mouse movements and other events and writes
     59  * random data to filename or .rnd
     60  */
     61 
     62 #include <windows.h>
     63 #include <openssl/opensslv.h>
     64 #include <openssl/rand.h>
     65 
     66 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
     67 const char *filename;
     68 
     69 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
     70         PSTR cmdline, int iCmdShow)
     71 	{
     72 	static char appname[] = "OpenSSL";
     73 	HWND hwnd;
     74 	MSG msg;
     75 	WNDCLASSEX wndclass;
     76         char buffer[200];
     77 
     78         if (cmdline[0] == '\0')
     79                 filename = RAND_file_name(buffer, sizeof buffer);
     80         else
     81                 filename = cmdline;
     82 
     83         RAND_load_file(filename, -1);
     84 
     85 	wndclass.cbSize = sizeof(wndclass);
     86 	wndclass.style = CS_HREDRAW | CS_VREDRAW;
     87 	wndclass.lpfnWndProc = WndProc;
     88 	wndclass.cbClsExtra = 0;
     89 	wndclass.cbWndExtra = 0;
     90 	wndclass.hInstance = hInstance;
     91 	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
     92 	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
     93 	wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
     94 	wndclass.lpszMenuName = NULL;
     95         wndclass.lpszClassName = appname;
     96 	wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
     97 	RegisterClassEx(&wndclass);
     98 
     99         hwnd = CreateWindow(appname, OPENSSL_VERSION_TEXT,
    100 		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
    101 		CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    102 
    103 	ShowWindow(hwnd, iCmdShow);
    104 	UpdateWindow(hwnd);
    105 
    106 
    107 	while (GetMessage(&msg, NULL, 0, 0))
    108 		{
    109 		TranslateMessage(&msg);
    110 		DispatchMessage(&msg);
    111 		}
    112 
    113 	return msg.wParam;
    114 	}
    115 
    116 LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    117 	{
    118         HDC hdc;
    119 	PAINTSTRUCT ps;
    120         RECT rect;
    121         static int seeded = 0;
    122 
    123 	switch (iMsg)
    124 		{
    125 	case WM_PAINT:
    126 		hdc = BeginPaint(hwnd, &ps);
    127 		GetClientRect(hwnd, &rect);
    128                 DrawText(hdc, "Seeding the PRNG. Please move the mouse!", -1,
    129 			&rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    130 		EndPaint(hwnd, &ps);
    131 		return 0;
    132 
    133         case WM_DESTROY:
    134                 PostQuitMessage(0);
    135                 return 0;
    136                 }
    137 
    138         if (RAND_event(iMsg, wParam, lParam) == 1 && seeded == 0)
    139                 {
    140                 seeded = 1;
    141                 if (RAND_write_file(filename) <= 0)
    142                         MessageBox(hwnd, "Couldn't write random file!",
    143 				"OpenSSL", MB_OK | MB_ICONERROR);
    144                 PostQuitMessage(0);
    145                 }
    146 
    147 	return DefWindowProc(hwnd, iMsg, wParam, lParam);
    148 	}
    149