dll.cpp

00001 // dll.cpp - written and placed in the public domain by Wei Dai
00002 
00003 #if defined( __GNUC__ ) && __GNUC__ > 3
00004 #       undef CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES
00005 #else
00006 #       define CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES
00007 #endif
00008 #define CRYPTOPP_DEFAULT_NO_DLL
00009 
00010 #include "dll.h"
00011 #ifdef _MSC_VER
00012 #pragma warning(default: 4660)
00013 #endif
00014 
00015 #ifdef CRYPTOPP_WIN32_AVAILABLE
00016 #include <windows.h>
00017 #endif
00018 
00019 #include "iterhash.cpp"
00020 #include "strciphr.cpp"
00021 #include "algebra.cpp"
00022 #include "eprecomp.cpp"
00023 #include "eccrypto.cpp"
00024 
00025 #ifndef CRYPTOPP_IMPORTS
00026 
00027 NAMESPACE_BEGIN(CryptoPP)
00028 
00029 #ifdef __MWERKS__
00030 // CodeWarrior 8 workaround: explicit instantiations have to appear after member function definitions
00031 CRYPTOPP_DLL_TEMPLATE_CLASS DL_GroupParameters_EC<ECP>;
00032 CRYPTOPP_DLL_TEMPLATE_CLASS DL_GroupParameters_EC<EC2N>;
00033 CRYPTOPP_DLL_TEMPLATE_CLASS DL_FixedBasePrecomputationImpl<Integer>;
00034 CRYPTOPP_STATIC_TEMPLATE_CLASS IteratedHashBase<word64, HashTransformation>;
00035 CRYPTOPP_DLL_TEMPLATE_CLASS IteratedHashBase<word32, HashTransformation>;
00036 CRYPTOPP_STATIC_TEMPLATE_CLASS IteratedHashBase<word32, MessageAuthenticationCode>;
00037 CRYPTOPP_DLL_TEMPLATE_CLASS CFB_CipherTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> >;
00038 CRYPTOPP_DLL_TEMPLATE_CLASS CFB_EncryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> >;
00039 CRYPTOPP_DLL_TEMPLATE_CLASS CFB_DecryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> >;
00040 CRYPTOPP_DLL_TEMPLATE_CLASS AdditiveCipherTemplate<>;
00041 CRYPTOPP_DLL_TEMPLATE_CLASS AdditiveCipherTemplate<AbstractPolicyHolder<AdditiveCipherAbstractPolicy, OFB_ModePolicy> >;
00042 CRYPTOPP_DLL_TEMPLATE_CLASS AdditiveCipherTemplate<AbstractPolicyHolder<AdditiveCipherAbstractPolicy, CTR_ModePolicy> >;
00043 CRYPTOPP_DLL_TEMPLATE_CLASS AbstractEuclideanDomain<Integer>;
00044 #endif
00045 
00046 #if defined(__GNUC__) && __GNUC__ > 3
00047 template class CRYPTOPP_DLL AbstractEuclideanDomain<Integer>;
00048 template class CRYPTOPP_DLL AbstractEuclideanDomain<PolynomialMod2>;
00049 template class CRYPTOPP_DLL AbstractGroup<Integer>;
00050 template class CRYPTOPP_DLL AbstractGroup<EC2NPoint>;
00051 template class CRYPTOPP_DLL AbstractGroup<ECPPoint>;
00052 template class CRYPTOPP_DLL AbstractGroup<PolynomialMod2>;
00053 template class CRYPTOPP_DLL AbstractPolicyHolder<AdditiveCipherAbstractPolicy, TwoBases<SimpleKeyedTransformation<StreamTransformation>, RandomNumberGenerator> >;
00054 template class CRYPTOPP_DLL AbstractRing<Integer>;
00055 template class CRYPTOPP_DLL AbstractRing<PolynomialMod2>;
00056 template class CRYPTOPP_DLL AdditiveCipherTemplate<>;
00057 template class CRYPTOPP_DLL AdditiveCipherTemplate<AbstractPolicyHolder<AdditiveCipherAbstractPolicy, CTR_ModePolicy> >;
00058 template class CRYPTOPP_DLL AdditiveCipherTemplate<AbstractPolicyHolder<AdditiveCipherAbstractPolicy, OFB_ModePolicy> >;
00059 template class CRYPTOPP_DLL AllocatorWithCleanup<byte>;
00060 template class CRYPTOPP_DLL AllocatorWithCleanup<word16>;
00061 template class CRYPTOPP_DLL AllocatorWithCleanup<word32>;
00062 template class CRYPTOPP_DLL AutoSeededX917RNG<DES_EDE3>;
00063 template class CRYPTOPP_DLL CFB_CipherTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> >;
00064 template class CRYPTOPP_DLL CFB_CipherTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, SymmetricCipher> >;
00065 template class CRYPTOPP_DLL CFB_DecryptionTemplate<>;
00066 template class CRYPTOPP_DLL CFB_DecryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> >;
00067 template class CRYPTOPP_DLL CFB_EncryptionTemplate<>;
00068 template class CRYPTOPP_DLL CFB_EncryptionTemplate<AbstractPolicyHolder<CFB_CipherAbstractPolicy, CFB_ModePolicy> >;
00069 template class CRYPTOPP_DLL CipherModeFinalTemplate_ExternalCipher<CBC_CTS_Decryption>;
00070 template class CRYPTOPP_DLL CipherModeFinalTemplate_ExternalCipher<CBC_CTS_Encryption>;
00071 template class CRYPTOPP_DLL CipherModeFinalTemplate_ExternalCipher<CBC_Decryption>;
00072 template class CRYPTOPP_DLL CipherModeFinalTemplate_ExternalCipher<CBC_Encryption>;
00073 template class CRYPTOPP_DLL CipherModeFinalTemplate_ExternalCipher<ECB_OneWay>;
00074 template class CRYPTOPP_DLL DH_Domain<DL_GroupParameters_GFP_DefaultSafePrime>;
00075 template class CRYPTOPP_DLL DL_Algorithm_GDSA<EC2N::Point>;
00076 template class CRYPTOPP_DLL DL_Algorithm_GDSA<ECP::Point>;
00077 template class CRYPTOPP_DLL DL_Algorithm_GDSA<Integer>;
00078 template class CRYPTOPP_DLL DL_FixedBasePrecomputationImpl<EC2N::Point>;
00079 template class CRYPTOPP_DLL DL_FixedBasePrecomputationImpl<ECPPoint>;
00080 template class CRYPTOPP_DLL DL_FixedBasePrecomputationImpl<Integer>;
00081 template class CRYPTOPP_DLL DL_GroupParameters<Integer>;
00082 template class CRYPTOPP_DLL DL_GroupParameters_EC<EC2N>;
00083 template class CRYPTOPP_DLL DL_GroupParameters_EC<ECP>;
00084 template class CRYPTOPP_DLL DL_GroupParameters_IntegerBasedImpl<ModExpPrecomputation>;
00085 template class CRYPTOPP_DLL DL_GroupPrecomputation<EC2N::Point>;
00086 template class CRYPTOPP_DLL DL_GroupPrecomputation<ECPPoint>;
00087 template class CRYPTOPP_DLL DL_PrivateKeyImpl<DL_GroupParameters_EC<EC2N> >;
00088 template class CRYPTOPP_DLL DL_PrivateKeyImpl<DL_GroupParameters_EC<ECP> >;
00089 template class CRYPTOPP_DLL DL_PrivateKey_EC<EC2N>;
00090 template class CRYPTOPP_DLL DL_PrivateKey_EC<ECP>;
00091 template class CRYPTOPP_DLL DL_PrivateKey_GFP<DL_GroupParameters_DSA>;
00092 template class CRYPTOPP_DLL DL_PrivateKey_WithSignaturePairwiseConsistencyTest<DL_PrivateKey_EC<EC2N>, ECDSA<EC2N> >;
00093 template class CRYPTOPP_DLL DL_PrivateKey_WithSignaturePairwiseConsistencyTest<DL_PrivateKey_EC<ECP>, ECDSA<ECP> >;
00094 template class CRYPTOPP_DLL DL_PrivateKey_WithSignaturePairwiseConsistencyTest<DL_PrivateKey_GFP<DL_GroupParameters_DSA>, DSA>;
00095 template class CRYPTOPP_DLL DL_PublicKeyImpl<DL_GroupParameters_EC<EC2N> >;
00096 template class CRYPTOPP_DLL DL_PublicKeyImpl<DL_GroupParameters_EC<ECP> >;
00097 template class CRYPTOPP_DLL DL_PublicKey_EC<EC2N>;
00098 template class CRYPTOPP_DLL DL_PublicKey_EC<ECP>;
00099 template class CRYPTOPP_DLL DL_PublicKey_GFP<DL_GroupParameters_DSA>;
00100 template class CRYPTOPP_DLL EuclideanDomainOf<PolynomialMod2>;
00101 template class CRYPTOPP_DLL IteratedHashBase<word32, HashTransformation>;
00102 template class CRYPTOPP_DLL IteratedHashBase<word32, MessageAuthenticationCode>;
00103 #ifdef WORD64_AVAILABLE
00104 template class CRYPTOPP_DLL IteratedHashBase<word64, HashTransformation>;
00105 template class CRYPTOPP_DLL IteratedHashBase<word64, MessageAuthenticationCode>;
00106 #endif
00107 template class CRYPTOPP_DLL OAEP<SHA>;
00108 #ifdef CRYPTOPP_IS_DLL
00109 template class CRYPTOPP_DLL PKCS_DigestDecoration<SHA>;
00110 #endif
00111 template class CRYPTOPP_DLL QuotientRing<EuclideanDomainOf<PolynomialMod2> >;
00112 template class CRYPTOPP_DLL SimpleKeyedTransformation<BlockTransformation>;
00113 template class CRYPTOPP_DLL SimpleKeyedTransformation<HashTransformation>;
00114 template class CRYPTOPP_DLL SimpleKeyedTransformation<StreamTransformation>;
00115 template class CRYPTOPP_DLL StringSinkTemplate<std::string>;
00116 template class CRYPTOPP_DLL TwoBases<SymmetricCipher, RandomNumberGenerator>;
00117 #endif // __GNUC__ > 3
00118 
00119 template<> const byte PKCS_DigestDecoration<SHA>::decoration[] = {0x30,0x21,0x30,0x09,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x05,0x00,0x04,0x14};
00120 template<> const unsigned int PKCS_DigestDecoration<SHA>::length = sizeof(PKCS_DigestDecoration<SHA>::decoration);
00121 
00122 NAMESPACE_END
00123 
00124 #endif
00125 
00126 #ifdef CRYPTOPP_EXPORTS
00127 
00128 USING_NAMESPACE(CryptoPP)
00129 
00130 #if !(defined(_MSC_VER) && (_MSC_VER < 1300))
00131 using std::set_new_handler;
00132 #endif
00133 
00134 static PNew s_pNew = NULL;
00135 static PDelete s_pDelete = NULL;
00136 
00137 static void * CRYPTOPP_CDECL New (size_t size)
00138 {
00139         void *p;
00140         while (!(p = malloc(size)))
00141                 CallNewHandler();
00142 
00143         return p;
00144 }
00145 
00146 static void SetNewAndDeleteFunctionPointers()
00147 {
00148         void *p = NULL;
00149         HMODULE hModule = NULL;
00150         MEMORY_BASIC_INFORMATION mbi;
00151 
00152         while (true)
00153         {
00154                 VirtualQuery(p, &mbi, sizeof(mbi));
00155 
00156                 if (p >= (char *)mbi.BaseAddress + mbi.RegionSize)
00157                         break;
00158 
00159                 p = (char *)mbi.BaseAddress + mbi.RegionSize;
00160 
00161                 if (!mbi.AllocationBase || mbi.AllocationBase == hModule)
00162                         continue;
00163 
00164                 hModule = HMODULE(mbi.AllocationBase);
00165 
00166                 PGetNewAndDelete pGetNewAndDelete = (PGetNewAndDelete)GetProcAddress(hModule, "GetNewAndDeleteForCryptoPP");
00167                 if (pGetNewAndDelete)
00168                 {
00169                         pGetNewAndDelete(s_pNew, s_pDelete);
00170                         return;
00171                 }
00172 
00173                 PSetNewAndDelete pSetNewAndDelete = (PSetNewAndDelete)GetProcAddress(hModule, "SetNewAndDeleteFromCryptoPP");
00174                 if (pSetNewAndDelete)
00175                 {
00176                         s_pNew = &New;
00177                         s_pDelete = &free;
00178                         pSetNewAndDelete(s_pNew, s_pDelete, &set_new_handler);
00179                         return;
00180                 }
00181         }
00182 
00183         hModule = GetModuleHandle("msvcrtd");
00184         if (!hModule)
00185                 hModule = GetModuleHandle("msvcrt");
00186         if (hModule)
00187         {
00188                 s_pNew = (PNew)GetProcAddress(hModule, "??2@YAPAXI@Z");         // operator new
00189                 s_pDelete = (PDelete)GetProcAddress(hModule, "??3@YAXPAX@Z");   // operator delete
00190                 return;
00191         }
00192 
00193         OutputDebugString("Crypto++ was not able to obtain new and delete function pointers.\n");
00194         throw 0;
00195 }
00196 
00197 void * CRYPTOPP_CDECL operator new (size_t size)
00198 {
00199         if (!s_pNew)
00200                 SetNewAndDeleteFunctionPointers();
00201 
00202         return s_pNew(size);
00203 }
00204 
00205 void CRYPTOPP_CDECL operator delete (void * p)
00206 {
00207         s_pDelete(p);
00208 }
00209 
00210 void * CRYPTOPP_CDECL operator new [] (size_t size)
00211 {
00212         return operator new (size);
00213 }
00214 
00215 void CRYPTOPP_CDECL operator delete [] (void * p)
00216 {
00217         operator delete (p);
00218 }
00219 
00220 #endif  // #ifdef CRYPTOPP_EXPORTS

Generated on Fri Dec 16 03:04:15 2005 for Crypto++ by  doxygen 1.4.5