X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=crypto%2Fcryptlib.c;h=e522861e26fe4b0c40b10f4cffa5054bb8c7f8cf;hp=4b0a36c3d3a5e8717cfac5b6ef0ae95515422ef6;hb=90b9c78b305781015248c7963e0e6b2215ecb8c2;hpb=ff6f9f96fd372bb4d05c08dea7d317026edf2e94 diff --git a/crypto/cryptlib.c b/crypto/cryptlib.c index 4b0a36c3d3..e522861e26 100644 --- a/crypto/cryptlib.c +++ b/crypto/cryptlib.c @@ -117,15 +117,16 @@ #include "cryptlib.h" #include -#if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WIN16) +#if defined(OPENSSL_SYS_WIN32) static double SSLeay_MSVC5_hack=0.0; /* and for VC1.5 */ #endif #if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \ defined(__INTEL__) || \ - defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64) + defined(__x86_64) || defined(__x86_64__) || \ + defined(_M_AMD64) || defined(_M_X64) -extern unsigned int OPENSSL_ia32cap_P[2]; +extern unsigned int OPENSSL_ia32cap_P[4]; unsigned int *OPENSSL_ia32cap_loc(void) { return OPENSSL_ia32cap_P; } #if defined(OPENSSL_CPUID_OBJ) && !defined(OPENSSL_NO_ASM) && !defined(I386_ONLY) @@ -137,7 +138,7 @@ typedef unsigned long long IA32CAP; #endif void OPENSSL_cpuid_setup(void) { static int trigger=0; - IA32CAP OPENSSL_ia32_cpuid(void); + IA32CAP OPENSSL_ia32_cpuid(unsigned int *); IA32CAP vec; char *env; @@ -147,14 +148,25 @@ void OPENSSL_cpuid_setup(void) if ((env=getenv("OPENSSL_ia32cap"))) { int off = (env[0]=='~')?1:0; #if defined(_WIN32) - if (!sscanf(env+off,"%I64i",&vec)) vec = strtoul(env+off,NULL,0); + if (!sscanf(env+off,"%I64i",&vec)) vec = strtoul(env+off,NULL,0); #else - vec = strtoull(env+off,NULL,0); + if (!sscanf(env+off,"%lli",(long long *)&vec)) vec = strtoul(env+off,NULL,0); #endif - if (off) vec = OPENSSL_ia32_cpuid()&~vec; + if (off) vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P)&~vec; + else if (env[0]==':') vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P); + + OPENSSL_ia32cap_P[2] = 0; + if ((env=strchr(env,':'))) { + unsigned int vecx; + env++; + off = (env[0]=='~')?1:0; + vecx = strtoul(env+off,NULL,0); + if (off) OPENSSL_ia32cap_P[2] &= ~vecx; + else OPENSSL_ia32cap_P[2] = vecx; + } } else - vec = OPENSSL_ia32_cpuid(); + vec = OPENSSL_ia32_cpuid(OPENSSL_ia32cap_P); /* * |(1<<10) sets a reserved bit to signal that variable @@ -165,7 +177,7 @@ void OPENSSL_cpuid_setup(void) OPENSSL_ia32cap_P[1] = (unsigned int)(vec>>32); } #else -unsigned int OPENSSL_ia32cap_P[2]; +unsigned int OPENSSL_ia32cap_P[4]; #endif #else @@ -294,12 +306,13 @@ void OPENSSL_showfatal (const char *fmta,...) if ((h=GetStdHandle(STD_ERROR_HANDLE)) != NULL && GetFileType(h)!=FILE_TYPE_UNKNOWN) - { /* must be console application */ + { + /* must be console application */ int len; DWORD out; va_start (ap,fmta); - len=_vsnprintf((char *)buf,sizeof(buf),fmt,ap); + len=_vsnprintf((char *)buf,sizeof(buf),fmta,ap); WriteFile(h,buf,len<0?sizeof(buf):(DWORD)len,&out,NULL); va_end (ap); return; @@ -346,7 +359,7 @@ void OPENSSL_showfatal (const char *fmta,...) #if defined(_WIN32_WINNT) && _WIN32_WINNT>=0x0333 /* this -------------v--- guards NT-specific calls */ - if (GetVersion() < 0x80000000 && OPENSSL_isservice() > 0) + if (check_winnt() && OPENSSL_isservice() > 0) { HANDLE h = RegisterEventSource(0,_T("OPENSSL")); const TCHAR *pmsg=buf; ReportEvent(h,EVENTLOG_ERROR_TYPE,0,0,0,1,0,&pmsg,0); @@ -376,11 +389,24 @@ void OpenSSLDie(const char *file,int line,const char *assertion) abort(); #else /* Win32 abort() customarily shows a dialog, but we just did that... */ +#if !defined(_WIN32_WCE) raise(SIGABRT); +#endif _exit(3); #endif } -#ifndef OPENSSL_FIPSCANISTER void *OPENSSL_stderr(void) { return stderr; } -#endif + +int CRYPTO_memcmp(const void *in_a, const void *in_b, size_t len) + { + size_t i; + const unsigned char *a = in_a; + const unsigned char *b = in_b; + unsigned char x = 0; + + for (i = 0; i < len; i++) + x |= a[i] ^ b[i]; + + return x; + }