Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

dll.cpp

00001 // dll.cpp - written and placed in the public domain by Wei Dai 00002 00003 #define CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES 00004 #define CRYPTOPP_DEFAULT_NO_DLL 00005 00006 #include "dll.h" 00007 #pragma warning(default: 4660) 00008 00009 #ifdef CRYPTOPP_WIN32_AVAILABLE 00010 #include <windows.h> 00011 #endif 00012 00013 #include "iterhash.cpp" 00014 #include "strciphr.cpp" 00015 #include "algebra.cpp" 00016 #include "eprecomp.cpp" 00017 #include "eccrypto.cpp" 00018 00019 #ifndef CRYPTOPP_IMPORTS 00020 00021 NAMESPACE_BEGIN(CryptoPP) 00022 00023 #ifdef __MWERKS__ 00024 // CodeWarrior 8 workaround: explicit instantiations have to appear after member function definitions 00025 CRYPTOPP_DLL_TEMPLATE_CLASS DL_GroupParameters_EC<ECP>; 00026 CRYPTOPP_DLL_TEMPLATE_CLASS DL_GroupParameters_EC<EC2N>; 00027 CRYPTOPP_DLL_TEMPLATE_CLASS DL_FixedBasePrecomputationImpl<Integer>; 00028 CRYPTOPP_STATIC_TEMPLATE_CLASS IteratedHashBase<word64, HashTransformation>; 00029 CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase<word32, HashTransformation>; 00030 CRYPTOPP_STATIC_TEMPLATE_CLASS IteratedHashBase<word32, MessageAuthenticationCode>; 00031 CRYPTOPP_DLL_TEMPLATE_CLASS CFB_CipherTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> >; 00032 CRYPTOPP_DLL_TEMPLATE_CLASS CFB_EncryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> >; 00033 CRYPTOPP_DLL_TEMPLATE_CLASS CFB_DecryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> >; 00034 CRYPTOPP_DLL_TEMPLATE_CLASS AdditiveCipherTemplate<>; 00035 CRYPTOPP_DLL_TEMPLATE_CLASS AdditiveCipherTemplate<AbstractPolicyHolder<AdditiveCipherAbstractPolicy, OFB_ModePolicy> >; 00036 CRYPTOPP_DLL_TEMPLATE_CLASS AdditiveCipherTemplate<AbstractPolicyHolder<AdditiveCipherAbstractPolicy, CTR_ModePolicy> >; 00037 CRYPTOPP_DLL_TEMPLATE_CLASS AbstractEuclideanDomain<Integer>; 00038 #endif 00039 00040 template<> const byte PKCS_DigestDecoration<SHA>::decoration[] = {0x30,0x21,0x30,0x09,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x05,0x00,0x04,0x14}; 00041 template<> const unsigned int PKCS_DigestDecoration<SHA>::length = sizeof(PKCS_DigestDecoration<SHA>::decoration); 00042 00043 NAMESPACE_END 00044 00045 #endif 00046 00047 #ifdef CRYPTOPP_EXPORTS 00048 00049 USING_NAMESPACE(CryptoPP) 00050 00051 #if !(defined(_MSC_VER) && (_MSC_VER < 1300)) 00052 using std::set_new_handler; 00053 #endif 00054 00055 static PNew s_pNew = NULL; 00056 static PDelete s_pDelete = NULL; 00057 00058 static void * CRYPTOPP_CDECL New (size_t size) 00059 { 00060 void *p; 00061 while (!(p = malloc(size))) 00062 CallNewHandler(); 00063 00064 return p; 00065 } 00066 00067 static void SetNewAndDeleteFunctionPointers() 00068 { 00069 void *p = NULL; 00070 HMODULE hModule = NULL; 00071 MEMORY_BASIC_INFORMATION mbi; 00072 00073 while (true) 00074 { 00075 VirtualQuery(p, &mbi, sizeof(mbi)); 00076 00077 if (p >= (char *)mbi.BaseAddress + mbi.RegionSize) 00078 break; 00079 00080 p = (char *)mbi.BaseAddress + mbi.RegionSize; 00081 00082 if (!mbi.AllocationBase || mbi.AllocationBase == hModule) 00083 continue; 00084 00085 hModule = HMODULE(mbi.AllocationBase); 00086 00087 PGetNewAndDelete pGetNewAndDelete = (PGetNewAndDelete)GetProcAddress(hModule, "GetNewAndDeleteForCryptoPP"); 00088 if (pGetNewAndDelete) 00089 { 00090 pGetNewAndDelete(s_pNew, s_pDelete); 00091 return; 00092 } 00093 00094 PSetNewAndDelete pSetNewAndDelete = (PSetNewAndDelete)GetProcAddress(hModule, "SetNewAndDeleteFromCryptoPP"); 00095 if (pSetNewAndDelete) 00096 { 00097 s_pNew = &New; 00098 s_pDelete = &free; 00099 pSetNewAndDelete(s_pNew, s_pDelete, &set_new_handler); 00100 return; 00101 } 00102 } 00103 00104 hModule = GetModuleHandle("msvcrtd"); 00105 if (!hModule) 00106 hModule = GetModuleHandle("msvcrt"); 00107 if (hModule) 00108 { 00109 s_pNew = (PNew)GetProcAddress(hModule, "??2@YAPAXI@Z"); // operator new 00110 s_pDelete = (PDelete)GetProcAddress(hModule, "??3@YAXPAX@Z"); // operator delete 00111 return; 00112 } 00113 00114 OutputDebugString("Crypto++ was not able to obtain new and delete function pointers.\n"); 00115 throw 0; 00116 } 00117 00118 void * CRYPTOPP_CDECL operator new (size_t size) 00119 { 00120 if (!s_pNew) 00121 SetNewAndDeleteFunctionPointers(); 00122 00123 return s_pNew(size); 00124 } 00125 00126 void CRYPTOPP_CDECL operator delete (void * p) 00127 { 00128 s_pDelete(p); 00129 } 00130 00131 void * CRYPTOPP_CDECL operator new [] (size_t size) 00132 { 00133 return operator new (size); 00134 } 00135 00136 void CRYPTOPP_CDECL operator delete [] (void * p) 00137 { 00138 operator delete (p); 00139 } 00140 00141 #endif // #ifdef CRYPTOPP_EXPORTS

Generated on Fri Aug 27 13:36:30 2004 for Crypto++ by doxygen 1.3.8