From 4aca87515a5083ae0e31ce3177189fd43b6d05ac Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 3 Jan 2015 13:58:15 +0100 Subject: patch to Vanilla Tomato 1.28 --- release/src/router/matrixssl/src/os/win/win.c | 241 ++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 release/src/router/matrixssl/src/os/win/win.c (limited to 'release/src/router/matrixssl/src/os/win/win.c') diff --git a/release/src/router/matrixssl/src/os/win/win.c b/release/src/router/matrixssl/src/os/win/win.c new file mode 100644 index 00000000..b4d9afa6 --- /dev/null +++ b/release/src/router/matrixssl/src/os/win/win.c @@ -0,0 +1,241 @@ +/* + * win.c + * Release $Name: MATRIXSSL_1_8_8_OPEN $ + * + * Microsoft Windows compatibility layer. + */ +/* + * Copyright (c) PeerSec Networks, 2002-2009. All Rights Reserved. + * The latest version of this code is available at http://www.matrixssl.org + * + * This software is open source; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This General Public License does NOT permit incorporating this software + * into proprietary programs. If you are unable to comply with the GPL, a + * commercial license for this software may be purchased from PeerSec Networks + * at http://www.peersec.com + * + * This program is distributed in WITHOUT ANY WARRANTY; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * http://www.gnu.org/copyleft/gpl.html + */ + /******************************************************************************/ + +#include "../osLayer.h" + +#include +#include + +#ifndef WINCE +#include +#endif + +#include + +#if defined(WIN32) || defined(WINCE) + +#define MAX_INT 0x7FFFFFFF + +static LARGE_INTEGER hiresStart; /* zero-time */ +static LARGE_INTEGER hiresFreq; /* tics per second */ + +/* For backwards compatibility */ +#ifndef CRYPT_SILENT +#define CRYPT_SILENT 0 +#endif + +static HCRYPTPROV hProv; /* Crypto context for random bytes */ + +int32 sslOpenOsdep() +{ + int32 rc; + + if ((rc = psOpenMalloc(MAX_MEMORY_USAGE)) < 0) { + return rc; + } +/* + Hires time init +*/ + QueryPerformanceFrequency(&hiresFreq); + QueryPerformanceCounter(&hiresStart); + + if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT)) { + return -1; + } + return 0; +} + +int32 sslCloseOsdep() +{ + CryptReleaseContext(hProv, 0); + psCloseMalloc(); + return 0; +} + +int32 sslGetEntropy(unsigned char *bytes, int32 size) +{ + if (CryptGenRandom(hProv, size, bytes)) { + return size; + } + return -1; +} + +#ifdef DEBUG +void psBreak() +{ + int32 i = 0; i++; /* Prevent the compiler optimizing this function away */ + + DebugBreak(); +} +#endif + +int32 sslInitMsecs(sslTime_t *t) +{ + __int64 diff; + int32 d; + + QueryPerformanceCounter(t); + diff = t->QuadPart - hiresStart.QuadPart; + d = (int32)((diff * 1000) / hiresFreq.QuadPart); + return d; +} + +int32 sslDiffSecs(sslTime_t then, sslTime_t now) +{ + __int64 diff; + + diff = now.QuadPart - then.QuadPart; + return (int32)(diff / hiresFreq.QuadPart); +} + +/* + Time comparison. 1 if 'a' is less than or equal. 0 if 'a' is greater +*/ +int32 sslCompareTime(sslTime_t a, sslTime_t b) +{ + if (a.QuadPart <= b.QuadPart) { + return 1; + } + return 0; +} + +#ifdef WINCE +/******************************************************************************/ +/* + Our implementation of wide character stat: get file information. + + NOTES: + only gets the file size currently + */ +int32 stat(char *filename, struct stat *sbuf) +{ + DWORD dwAttributes; + HANDLE hFile; + int32 rc, size; + + unsigned short uniFile[512]; + + rc = 0; + memset(sbuf, 0, sizeof(struct stat)); + + MultiByteToWideChar(CP_ACP, 0, filename, -1, uniFile, 256); + dwAttributes = GetFileAttributes(uniFile); + if (dwAttributes != 0xFFFFFFFF && dwAttributes & FILE_ATTRIBUTE_DIRECTORY) { + sbuf->st_mode = S_IFDIR; + return 0; + } + sbuf->st_mode = S_IFREG; + + if ((hFile = CreateFile(uniFile, GENERIC_READ, FILE_SHARE_READ && FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { + return -1; + } + +/* + * Get the file size. + */ + size = GetFileSize(hFile, NULL); + sbuf->st_size = size; + + CloseHandle(hFile); + return rc; +} + +/******************************************************************************/ +/* + The following functions implement a unixlike time() function. + */ + +static FILETIME YearToFileTime(WORD wYear) +{ + SYSTEMTIME sbase; + FILETIME fbase; + + sbase.wYear = wYear; + sbase.wMonth = 1; + sbase.wDayOfWeek = 1; //assumed + sbase.wDay = 1; + sbase.wHour = 0; + sbase.wMinute = 0; + sbase.wSecond = 0; + sbase.wMilliseconds = 0; + + SystemTimeToFileTime( &sbase, &fbase ); + + return fbase; +} + +time_t time() { + + __int64 time1, time2, iTimeDiff; + FILETIME fileTime1, fileTime2; + SYSTEMTIME sysTime; + +/* + Get 1970's filetime. +*/ + fileTime1 = YearToFileTime(1970); + +/* + Get the current filetime time. +*/ + GetSystemTime(&sysTime); + SystemTimeToFileTime(&sysTime, &fileTime2); + + +/* + Stuff the 2 FILETIMEs into their own __int64s. +*/ + time1 = fileTime1.dwHighDateTime; + time1 <<= 32; + time1 |= fileTime1.dwLowDateTime; + + time2 = fileTime2.dwHighDateTime; + time2 <<= 32; + time2 |= fileTime2.dwLowDateTime; + +/* + Get the difference of the two64-bit ints. + + This is he number of 100-nanosecond intervals since Jan. 1970. So + we divide by 10000 to get seconds. + */ + iTimeDiff = (time2 - time1) / 10000000; + return (int32)iTimeDiff; +} +#endif /* WINCE */ + + + +#endif /* WIN32 */ + +/******************************************************************************/ -- cgit v1.2.3-54-g00ecf