00001 00011 #include "pkif.h" 00012 #include "PKIFBCryptGuard.h" 00013 00014 #if !defined(WIN32) 00015 #include <ltdl.h> 00016 #endif 00017 00018 #include <cstring> 00019 00020 using namespace std; 00026 class CPKIFBCryptGuardImpl 00027 { 00028 public: 00029 CPKIFBCryptGuardImpl() 00030 :m_hBcrypt(0),m_bInited(false),m_lastError(0) 00031 { 00032 m_hBcrypt = LoadLibrary("bcrypt"); 00033 if(m_hBcrypt) m_bInited = true; 00034 } 00035 ~CPKIFBCryptGuardImpl() 00036 { 00037 if(m_lastError) 00038 { 00039 free(m_lastError); 00040 m_lastError = 0; 00041 } 00042 if(m_hBcrypt) { 00043 FreeLibrary(m_hBcrypt); 00044 } 00045 } 00046 00047 const char * GetLastError() 00048 { 00049 return m_lastError; 00050 } 00051 00052 bool IsCNGAvailable() 00053 { 00054 return(m_hBcrypt != 0); 00055 } 00056 00057 private: 00058 void SetLastError(const char * err) 00059 { 00060 if(m_lastError) { 00061 free(m_lastError); 00062 m_lastError = 0; 00063 } 00064 if(err) m_lastError = strdup(err); 00065 } 00066 HMODULE m_hBcrypt; 00067 00068 char * m_lastError; 00069 bool m_bInited; 00070 }; 00071 00078 class BCryptGuardCleaner 00079 { 00080 public: 00081 ~BCryptGuardCleaner() 00082 { 00083 CPKIFBCryptGuard::Shutdown(); 00084 } 00085 } BCryptGuardCleanerInstance; 00086 00087 CPKIFBCryptGuardImpl * CPKIFBCryptGuard::m_impl = 0; 00088 00089 00098 CPKIFBCryptGuard::CPKIFBCryptGuard() 00099 { 00100 if(!m_impl) { 00101 m_impl = new CPKIFBCryptGuardImpl(); 00102 } 00103 } 00111 CPKIFBCryptGuard::~CPKIFBCryptGuard() 00112 { 00113 } 00114 00115 00125 void CPKIFBCryptGuard::Shutdown() 00126 { 00127 if(m_impl) { 00128 delete m_impl; 00129 m_impl = 0; 00130 } 00131 } 00132 00140 bool CPKIFBCryptGuard::IsCNGAvailable() 00141 { 00142 if(m_impl) { 00143 return m_impl->IsCNGAvailable(); 00144 } 00145 return false; 00146 } 00147 00155 const char * CPKIFBCryptGuard::GetLoaderError() 00156 { 00157 if(m_impl) { 00158 return m_impl->GetLastError(); 00159 } 00160 return 0; 00161 }