diff --git a/extra/yassl/include/lock.hpp b/extra/yassl/include/lock.hpp index 11a623879d4..f5231528821 100644 --- a/extra/yassl/include/lock.hpp +++ b/extra/yassl/include/lock.hpp @@ -31,7 +31,7 @@ namespace yaSSL { #ifdef MULTI_THREADED - #ifdef WIN32 + #ifdef _WIN32 #include class Mutex { @@ -50,7 +50,7 @@ namespace yaSSL { ~Lock(); }; }; - #else // WIN32 + #else // _WIN32 #include class Mutex { @@ -71,7 +71,7 @@ namespace yaSSL { }; }; - #endif // WIN32 + #endif // _WIN32 #else // MULTI_THREADED (WE'RE SINGLE) class Mutex { diff --git a/extra/yassl/include/socket_wrapper.hpp b/extra/yassl/include/socket_wrapper.hpp index a103cca1b37..38a9ce3bd25 100644 --- a/extra/yassl/include/socket_wrapper.hpp +++ b/extra/yassl/include/socket_wrapper.hpp @@ -31,7 +31,7 @@ #include -#ifdef WIN32 +#ifdef _WIN32 #include #else #include @@ -47,7 +47,7 @@ namespace yaSSL { typedef unsigned int uint; -#ifdef WIN32 +#ifdef _WIN32 typedef SOCKET socket_t; #else typedef int socket_t; diff --git a/extra/yassl/mySTL/helpers.hpp b/extra/yassl/mySTL/helpers.hpp index 5f9b4beaa40..8d2061fc4f1 100644 --- a/extra/yassl/mySTL/helpers.hpp +++ b/extra/yassl/mySTL/helpers.hpp @@ -31,32 +31,39 @@ #include // placement new + #ifdef __IBMCPP__ /* - Workaround for the lack of operator new(size_t, void*) - in IBM VA C++ 6.0 + Workaround for the lack of operator new(size_t, void*) + in IBM VA C++ 6.0 */ -struct Dummy {}; -inline void *operator new(size_t size, Dummy *d) { return (void*) d; } -typedef Dummy *yassl_pointer; + struct Dummy {}; + + inline void* operator new(size_t size, Dummy* d) + { + return static_cast(d); + } + + typedef Dummy* yassl_pointer; #else -typedef void *yassl_pointer; + typedef void* yassl_pointer; #endif + namespace mySTL { template inline void construct(T* p, const T2& value) { - new ((yassl_pointer) p) T(value); + new (reinterpret_cast(p)) T(value); } template inline void construct(T* p) { - new (static_cast(p)) T(); + new (reinterpret_cast(p)) T(); } diff --git a/extra/yassl/src/lock.cpp b/extra/yassl/src/lock.cpp index b8f6212ad3f..8a0b66ead42 100644 --- a/extra/yassl/src/lock.cpp +++ b/extra/yassl/src/lock.cpp @@ -29,7 +29,7 @@ namespace yaSSL { #ifdef MULTI_THREADED - #ifdef WIN32 + #ifdef _WIN32 Mutex::Mutex() { @@ -54,7 +54,7 @@ namespace yaSSL { LeaveCriticalSection(&mutex_.cs_); } - #else // WIN32 + #else // _WIN32 Mutex::Mutex() { @@ -80,7 +80,7 @@ namespace yaSSL { } - #endif // WIN32 + #endif // _WIN32 #endif // MULTI_THREADED diff --git a/extra/yassl/src/log.cpp b/extra/yassl/src/log.cpp index 538b80b8280..38633cd1210 100644 --- a/extra/yassl/src/log.cpp +++ b/extra/yassl/src/log.cpp @@ -78,8 +78,8 @@ namespace yaSSL { } - #if defined(WIN32) || defined(__MACH__) || defined(__hpux__) - typedef int socklen_t; + #if defined(_WIN32) || defined(__MACH__) || defined(__hpux__) + typedef int socklen_t; #endif diff --git a/extra/yassl/src/socket_wrapper.cpp b/extra/yassl/src/socket_wrapper.cpp index 1be6a715980..00f9c8d170c 100644 --- a/extra/yassl/src/socket_wrapper.cpp +++ b/extra/yassl/src/socket_wrapper.cpp @@ -28,7 +28,7 @@ #include "socket_wrapper.hpp" -#ifndef WIN32 +#ifndef _WIN32 #include #include #include @@ -36,19 +36,19 @@ #include #include #include -#endif // WIN32 +#endif // _WIN32 #ifdef __sun #include #endif -#ifdef WIN32 +#ifdef _WIN32 const int SOCKET_EINVAL = WSAEINVAL; const int SOCKET_EWOULDBLOCK = WSAEWOULDBLOCK; #else const int SOCKET_EINVAL = EINVAL; const int SOCKET_EWOULDBLOCK = EWOULDBLOCK; -#endif // WIN32 +#endif // _WIN32 namespace yaSSL { @@ -80,7 +80,7 @@ Socket::~Socket() void Socket::closeSocket() { if (socket_ != INVALID_SOCKET) { -#ifdef WIN32 +#ifdef _WIN32 closesocket(socket_); #else close(socket_); @@ -94,7 +94,7 @@ uint Socket::get_ready() const { unsigned long ready = 0; -#ifdef WIN32 +#ifdef _WIN32 ioctlsocket(socket_, FIONREAD, &ready); #else ioctl(socket_, FIONREAD, &ready); @@ -145,7 +145,7 @@ void Socket::shutDown(int how) int Socket::get_lastError() { -#ifdef WIN32 +#ifdef _WIN32 return WSAGetLastError(); #else return errno; @@ -155,7 +155,7 @@ int Socket::get_lastError() void Socket::set_lastError(int errorCode) { -#ifdef WIN32 +#ifdef _WIN32 WSASetLastError(errorCode); #else errno = errorCode; diff --git a/extra/yassl/src/ssl.cpp b/extra/yassl/src/ssl.cpp index a82afcd4aad..d37c44049b2 100644 --- a/extra/yassl/src/ssl.cpp +++ b/extra/yassl/src/ssl.cpp @@ -32,11 +32,11 @@ /* see man pages for function descriptions */ +#include "runtime.hpp" #include "openssl/ssl.h" #include "handshake.hpp" #include "yassl_int.hpp" #include -#include "runtime.hpp" namespace yaSSL { diff --git a/extra/yassl/src/timer.cpp b/extra/yassl/src/timer.cpp index 547c31205c6..cfa1319ae80 100644 --- a/extra/yassl/src/timer.cpp +++ b/extra/yassl/src/timer.cpp @@ -27,7 +27,7 @@ namespace yaSSL { -#ifdef WIN32 +#ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -54,7 +54,7 @@ namespace yaSSL { return static_cast(timer()); } -#else // WIN32 +#else // _WIN32 #include @@ -77,5 +77,5 @@ namespace yaSSL { } -#endif // WIN32 +#endif // _WIN32 } // namespace yaSSL diff --git a/extra/yassl/taocrypt/include/misc.hpp b/extra/yassl/taocrypt/include/misc.hpp index 812cdd93879..187d5cc6769 100644 --- a/extra/yassl/taocrypt/include/misc.hpp +++ b/extra/yassl/taocrypt/include/misc.hpp @@ -30,15 +30,10 @@ #include "types.hpp" #include "type_traits.hpp" -/* -namespace GCC_ABI { - extern "C" int __cxa_pure_virtual(); -} */ + namespace TaoCrypt { -// using GCC_ABI::__cxa_pure_virtual; - // library allocation struct new_t {}; // TaoCrypt New type extern new_t tc; // pass in parameter @@ -75,7 +70,7 @@ void tcArrayDelete(T* ptr) // to resolve compiler generated operator delete on base classes with -// virtual destructors, make sure doesn't get called +// virtual destructors (when on stack), make sure doesn't get called class virtual_base { public: static void operator delete(void*) { assert(0); } @@ -742,8 +737,6 @@ unsigned int BytePrecision(unsigned long value); unsigned int BitPrecision(unsigned long); unsigned long Crop(unsigned long value, unsigned int size); -void CallNewHandler(); - } // namespace diff --git a/extra/yassl/taocrypt/include/random.hpp b/extra/yassl/taocrypt/include/random.hpp index 5fdda8da47a..62f49a8716f 100644 --- a/extra/yassl/taocrypt/include/random.hpp +++ b/extra/yassl/taocrypt/include/random.hpp @@ -42,7 +42,7 @@ public: void GenerateSeed(byte*, word32 sz); Error GetError() const { return error_; } private: -#if defined(WIN32) +#if defined(_WIN32) #if defined(_WIN64) typedef unsigned __int64 ProviderHandle; // type HCRYPTPROV, avoid #include diff --git a/extra/yassl/taocrypt/include/types.hpp b/extra/yassl/taocrypt/include/types.hpp index 9c5d3e4b194..d497d45e1da 100644 --- a/extra/yassl/taocrypt/include/types.hpp +++ b/extra/yassl/taocrypt/include/types.hpp @@ -80,16 +80,14 @@ typedef unsigned int word32; #else #define TAOCRYPT_NATIVE_DWORD_AVAILABLE #ifdef WORD64_AVAILABLE - #define TAOCRYPT_SLOW_WORD64 - // define this if your CPU is not64-bit to use alternative code - // that avoids word64 - typedef word16 hword; - typedef word32 word; - typedef word64 dword; + #define TAOCRYPT_SLOW_WORD64 + typedef word16 hword; + typedef word32 word; + typedef word64 dword; #else - typedef byte hword; - typedef word16 word; - typedef word32 dword; + typedef byte hword; + typedef word16 word; + typedef word32 dword; #endif #endif diff --git a/extra/yassl/taocrypt/src/asn.cpp b/extra/yassl/taocrypt/src/asn.cpp index 720fe7cd532..8f8d2ba52da 100644 --- a/extra/yassl/taocrypt/src/asn.cpp +++ b/extra/yassl/taocrypt/src/asn.cpp @@ -22,7 +22,6 @@ /* asn.cpp implements ASN1 BER, PublicKey, and x509v3 decoding */ - #include "runtime.hpp" #include "asn.hpp" #include "file.hpp" diff --git a/extra/yassl/taocrypt/src/integer.cpp b/extra/yassl/taocrypt/src/integer.cpp index 0f06b9805dd..ebfefb027b3 100644 --- a/extra/yassl/taocrypt/src/integer.cpp +++ b/extra/yassl/taocrypt/src/integer.cpp @@ -23,6 +23,7 @@ /* based on Wei Dai's integer.cpp from CryptoPP */ +#include "runtime.hpp" #include "integer.hpp" #include "modarith.hpp" #include "asn.hpp" @@ -34,6 +35,21 @@ #endif +#if defined(_MSC_VER) && defined(_WIN64) // 64 bit X overflow intrinsic + #ifdef __ia64__ + #define myUMULH __UMULH + #elif __x86_64__ + #define myUMULH __umulh + #else + #error unknown 64bit windows + #endif + +extern "C" word myUMULH(word, word); + +#pragma intrinsic (myUMULH) +#endif + + #ifdef SSE2_INTRINSICS_AVAILABLE #ifdef __GNUC__ #include @@ -73,16 +89,15 @@ CPP_TYPENAME AllocatorBase::pointer AlignedAllocator::allocate( { void* p; #ifdef TAOCRYPT_MM_MALLOC_AVAILABLE - while (!(p = _mm_malloc(sizeof(T)*n, 16))) + p = _mm_malloc(sizeof(T)*n, 16); #elif defined(TAOCRYPT_MEMALIGN_AVAILABLE) - while (!(p = memalign(16, sizeof(T)*n))) + p = memalign(16, sizeof(T)*n); #elif defined(TAOCRYPT_MALLOC_ALIGNMENT_IS_16) - while (!(p = malloc(sizeof(T)*n))) + p = malloc(sizeof(T)*n); #else - while (!(p = (byte *)malloc(sizeof(T)*n + 8))) + p = (byte *)malloc(sizeof(T)*n + 8); // assume malloc alignment is at least 8 #endif - CallNewHandler(); #ifdef TAOCRYPT_NO_ALIGNED_ALLOC assert(m_pBlock == 0); @@ -156,8 +171,14 @@ DWord() {} static DWord Multiply(word a, word b) { DWord r; + #ifdef TAOCRYPT_NATIVE_DWORD_AVAILABLE r.whole_ = (dword)a * b; + + #elif defined(_MSC_VER) + r.halfs_.low = a*b; + r.halfs_.high = myUMULH(a,b); + #elif defined(__alpha__) r.halfs_.low = a*b; #ifdef __GNUC__ @@ -166,22 +187,27 @@ DWord() {} #elif defined(__DECCXX) r.halfs_.high = asm("umulh %a0, %a1, %v0", a, b); #else - #error can not implement multiply overflow + #error unknown alpha compiler #endif + #elif defined(__ia64__) r.halfs_.low = a*b; __asm__("xmpy.hu %0=%1,%2" : "=f" (r.halfs_.high) : "f" (a), "f" (b)); + #elif defined(_ARCH_PPC64) r.halfs_.low = a*b; __asm__("mulhdu %0,%1,%2" : "=r" (r.halfs_.high) : "r" (a), "r" (b) : "cc"); + #elif defined(__x86_64__) __asm__("mulq %3" : "=d" (r.halfs_.high), "=a" (r.halfs_.low) : "a" (a), "rm" (b) : "cc"); + #elif defined(__mips64) __asm__("dmultu %2,%3" : "=h" (r.halfs_.high), "=l" (r.halfs_.low) : "r" (a), "r" (b)); + #elif defined(_M_IX86) // for testing word64 t = (word64)a * b; @@ -190,6 +216,7 @@ DWord() {} #else #error can not implement DWord #endif + return r; } @@ -3936,5 +3963,6 @@ template hword DivideThreeWordsByTwo(hword*, hword, hword, Word*); template word DivideThreeWordsByTwo(word*, word, word, DWord*); #endif + } // namespace diff --git a/extra/yassl/taocrypt/src/misc.cpp b/extra/yassl/taocrypt/src/misc.cpp index 3ec4502ed57..6a801a9995a 100644 --- a/extra/yassl/taocrypt/src/misc.cpp +++ b/extra/yassl/taocrypt/src/misc.cpp @@ -64,10 +64,6 @@ void* operator new[](size_t sz); void operator delete[](void* ptr); */ -/* namespace GCC_ABI { - extern "C" int __cxa_pure_virtual() { assert(0); return 0; } -} */ - namespace TaoCrypt { @@ -135,17 +131,5 @@ unsigned long Crop(unsigned long value, unsigned int size) } -#if !(defined(_MSC_VER) && (_MSC_VER < 1300)) && \ - !(defined(__HP_aCC) && (__HP_aCC <= 36300)) -using std::new_handler; -using std::set_new_handler; -#endif - -void CallNewHandler() -{ - abort(); -} - - } // namespace diff --git a/extra/yassl/taocrypt/src/random.cpp b/extra/yassl/taocrypt/src/random.cpp index 921e710540d..69fb180720a 100644 --- a/extra/yassl/taocrypt/src/random.cpp +++ b/extra/yassl/taocrypt/src/random.cpp @@ -26,7 +26,7 @@ #include "random.hpp" -#if defined(WIN32) +#if defined(_WIN32) #define _WIN32_WINNT 0x0400 #include #include @@ -34,7 +34,7 @@ #include #include #include -#endif // WIN32 +#endif // _WIN32 namespace TaoCrypt { @@ -64,7 +64,7 @@ byte RandomNumberGenerator::GenerateByte() } -#if defined(WIN32) +#if defined(_WIN32) OS_Seed::OS_Seed() { @@ -87,7 +87,7 @@ void OS_Seed::GenerateSeed(byte* output, word32 sz) } -#else // WIN32 +#else // _WIN32 OS_Seed::OS_Seed() @@ -122,7 +122,7 @@ void OS_Seed::GenerateSeed(byte* output, word32 sz) } } -#endif // WIN32 +#endif // _WIN32