Cleanup libcrypto.num and make update
[openssl.git] / apps / winrand.c
1 /* ====================================================================
2  * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in
13  *    the documentation and/or other materials provided with the
14  *    distribution.
15  *
16  * 3. All advertising materials mentioning features or use of this
17  *    software must display the following acknowledgment:
18  *    "This product includes software developed by the OpenSSL Project
19  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
20  *
21  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
22  *    endorse or promote products derived from this software without
23  *    prior written permission. For written permission, please contact
24  *    openssl-core@openssl.org.
25  *
26  * 5. Products derived from this software may not be called "OpenSSL"
27  *    nor may "OpenSSL" appear in their names without prior written
28  *    permission of the OpenSSL Project.
29  *
30  * 6. Redistributions of any form whatsoever must retain the following
31  *    acknowledgment:
32  *    "This product includes software developed by the OpenSSL Project
33  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
34  *
35  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
36  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
41  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
42  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
43  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
44  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
45  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
46  * OF THE POSSIBILITY OF SUCH DAMAGE.
47  * ====================================================================
48  *
49  * This product includes cryptographic software written by Eric Young
50  * (eay@cryptsoft.com).  This product includes software written by Tim
51  * Hudson (tjh@cryptsoft.com).
52  *
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,
102                         NULL);
103
104     ShowWindow(hwnd, iCmdShow);
105     UpdateWindow(hwnd);
106
107     while (GetMessage(&msg, NULL, 0, 0)) {
108         TranslateMessage(&msg);
109         DispatchMessage(&msg);
110     }
111
112     return msg.wParam;
113 }
114
115 LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
116 {
117     HDC hdc;
118     PAINTSTRUCT ps;
119     RECT rect;
120     static int seeded = 0;
121
122     switch (iMsg) {
123     case WM_PAINT:
124         hdc = BeginPaint(hwnd, &ps);
125         GetClientRect(hwnd, &rect);
126         DrawText(hdc, "Seeding the PRNG. Please move the mouse!", -1,
127                  &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
128         EndPaint(hwnd, &ps);
129         return 0;
130
131     case WM_DESTROY:
132         PostQuitMessage(0);
133         return 0;
134     }
135
136     if (RAND_event(iMsg, wParam, lParam) == 1 && seeded == 0) {
137         seeded = 1;
138         if (RAND_write_file(filename) <= 0)
139             MessageBox(hwnd, "Couldn't write random file!",
140                        "OpenSSL", MB_OK | MB_ICONERROR);
141         PostQuitMessage(0);
142     }
143
144     return DefWindowProc(hwnd, iMsg, wParam, lParam);
145 }