1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* apps/winrand.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* ==================================================================== 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the documentation and/or other materials provided with the 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * distribution. 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * software must display the following acknowledgment: 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * endorse or promote products derived from this software without 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * prior written permission. For written permission, please contact 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * openssl-core@openssl.org. 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL" 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * nor may "OpenSSL" appear in their names without prior written 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * permission of the OpenSSL Project. 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * acknowledgment: 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software developed by the OpenSSL Project 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE. 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ==================================================================== 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com). This product includes software written by Tim 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com). 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Usage: winrand [filename] 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Collects entropy from mouse movements and other events and writes 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * random data to filename or .rnd 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <windows.h> 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/opensslv.h> 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rand.h> 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectLRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst char *filename; 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PSTR cmdline, int iCmdShow) 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project static char appname[] = "OpenSSL"; 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project HWND hwnd; 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MSG msg; 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project WNDCLASSEX wndclass; 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char buffer[200]; 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (cmdline[0] == '\0') 79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project filename = RAND_file_name(buffer, sizeof buffer); 80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project filename = cmdline; 82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project RAND_load_file(filename, -1); 84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wndclass.cbSize = sizeof(wndclass); 86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wndclass.style = CS_HREDRAW | CS_VREDRAW; 87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wndclass.lpfnWndProc = WndProc; 88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wndclass.cbClsExtra = 0; 89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wndclass.cbWndExtra = 0; 90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wndclass.hInstance = hInstance; 91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); 93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wndclass.lpszMenuName = NULL; 95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wndclass.lpszClassName = appname; 96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project RegisterClassEx(&wndclass); 98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project hwnd = CreateWindow(appname, OPENSSL_VERSION_TEXT, 100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ShowWindow(hwnd, iCmdShow); 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project UpdateWindow(hwnd); 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (GetMessage(&msg, NULL, 0, 0)) 108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project TranslateMessage(&msg); 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DispatchMessage(&msg); 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return msg.wParam; 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectLRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project HDC hdc; 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PAINTSTRUCT ps; 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project RECT rect; 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project static int seeded = 0; 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project switch (iMsg) 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case WM_PAINT: 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project hdc = BeginPaint(hwnd, &ps); 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project GetClientRect(hwnd, &rect); 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project DrawText(hdc, "Seeding the PRNG. Please move the mouse!", -1, 129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); 130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EndPaint(hwnd, &ps); 131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project case WM_DESTROY: 134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PostQuitMessage(0); 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (RAND_event(iMsg, wParam, lParam) == 1 && seeded == 0) 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project seeded = 1; 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (RAND_write_file(filename) <= 0) 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project MessageBox(hwnd, "Couldn't write random file!", 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project "OpenSSL", MB_OK | MB_ICONERROR); 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project PostQuitMessage(0); 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return DefWindowProc(hwnd, iMsg, wParam, lParam); 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 149