PKIFBCryptGuard.cpp

Go to the documentation of this file.
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 }

Generated on Mon Nov 15 11:15:53 2010 for PublicKeyInfrastructureFramework(PKIF) by  doxygen 1.5.6