UnixEnroll.h

00001 /* [Windows 1251]
00002  * [Use `iconv -f WINDOWS-1251', if needed]
00003  */
00004 /*
00005  * Copyright(C) 2005-2011
00006  *
00007  * Этот файл содержит информацию, являющуюся
00008  * собственностью компании Крипто-Про.
00009  *
00010  * Любая часть этого файла не может быть скопирована,
00011  * исправлена, переведена на другие языки,
00012  * локализована или модифицирована любым способом,
00013  * откомпилирована, передана по сети с или на
00014  * любую компьютерную систему без предварительного
00015  * заключения соглашения с компанией Крипто-Про.
00016  *
00017  * This is proprietary information of
00018  * Crypto-Pro company.
00019  *
00020  * Any part of this file can not be copied, 
00021  * corrected, translated into other languages,
00022  * localized or modified by any means,
00023  * compiled, transferred over a network from or to
00024  * any computer system without preliminary
00025  * agreement with Crypto-Pro company
00026  */
00027 
00037 #ifndef _UNIXENROLL_H
00038 #define _UNIXENROLL_H
00039 
00040 #include <string>
00041 #include <memory>
00042 #include <list>
00043 #include <vector>
00044 #include "CSP_WinCrypt.h"
00045 #include "SecureBuffer.h"
00046 #include "BSTR.h"
00047 #include "CPEnrollImpl.h"
00048 
00049 #if __GNUC__==2
00050 typedef std::basic_string <wchar_t> std::wstring;
00051 #endif
00052 #ifdef ANDROID
00053 namespace std {
00054         typedef basic_string<wchar_t> wstring;
00055 }
00056 #endif
00057 
00058 // TODO:X Есть вероятность конфликта MonoTouch и пр. вероятно нужно 
00059 // внести всё в namespace ru::CryptoPro
00060 
00061 #define XECR_PKCS10_V2_0     0x1
00062 #define XECR_PKCS7           0x2
00063 #define XECR_CMC             0x3
00064 #define XECR_PKCS10_V1_5     0x4
00065 
00066 // BSTR SysAllocStringLen( const wchar_t *str, unsigned int cch);
00067 
00076 class UnixEnroll: public CPEnrollImpl
00077 {
00078 protected:
00079         bool handlePKCS7_;
00080 public:
00087     UnixEnroll(
00088         const CPEnroll::UserCallbacks& callbacks,
00089         bool handlePKCS7 = false);
00090 
00095     ~UnixEnroll();
00096 
00104     virtual HRESULT put_EnableSMIMECapabilities(bool value)
00105     { 
00106         UNUSED(value);
00107         return S_OK;
00108     }
00109     
00117     virtual HRESULT put_UseExistingKeySet(bool value);
00118     
00132     virtual HRESULT put_ContainerName( BSTR cName)
00133     {
00134         containerName_ = SysAllocString(cName);
00135         return S_OK;
00136     }
00137     
00147     virtual HRESULT put_ProviderType( DWORD pType)
00148     {
00149         providerType_ = pType;
00150         return S_OK;
00151     }
00152     
00162     virtual HRESULT put_ProviderName( BSTR pName)
00163     {
00164         providerName_ = SysAllocString(pName);
00165         return S_OK;
00166     }
00167     
00181     virtual HRESULT put_GenKeyFlags( DWORD keyFlags)
00182     {
00183         keyFlags_ = keyFlags;
00184         return S_OK;
00185     }
00186     
00204     virtual HRESULT put_RequestStoreFlags( DWORD storeFlags)
00205     {
00206         requestStoreFlags_ = storeFlags;
00207         return S_OK;
00208     }
00209     
00223     virtual HRESULT put_ProviderFlags( DWORD provFlags)
00224     {
00225         provFlags_ |= provFlags; /* TODO:XXX почему OR ??? */
00226         return S_OK;
00227     }
00228     
00245      /*
00246      *  TODO:XXX В отличии от ICertEnroll нет значения по умолчанию ???
00247      */
00248     virtual HRESULT put_KeySpec( DWORD _dwKeySpec)
00249     {
00250         dwKeySpec = _dwKeySpec;
00251         return S_OK;
00252     }
00253     
00279     virtual HRESULT put_LimitExchangeKeyToEncipherment( int value)
00280     {
00281         limitExchangeKeyToEncipherment_ = value ? true : false;
00282         return S_OK;
00283     }
00284     
00302     virtual HRESULT put_CAStoreFlags( DWORD flags)
00303     {
00304         caStoreFlags_ = flags;
00305         return S_OK;
00306     }
00307     
00326     virtual HRESULT put_MyStoreFlags( DWORD flags)
00327     {
00328         myStoreFlags_ = flags;
00329         return S_OK;
00330     }
00331     
00350     virtual HRESULT put_RootStoreFlags( DWORD flags)
00351     {
00352         rootStoreFlags_ = flags;
00353         return S_OK;
00354     }
00355     
00369     virtual HRESULT put_MyStoreName( BSTR name)
00370     {
00371         myStoreName_ = SysAllocString(name);
00372         return S_OK;
00373     }
00374     
00395     virtual HRESULT put_DeleteRequestCert( bool value)
00396     {
00397         deleteRequest_ = value;
00398         return S_OK;
00399     }
00400     
00433      /*
00434      *  Значение по умолчанию false.
00435      *  TODO:XXX В отличии от ICertEnroll, у которого оно true ???
00436      */
00437     virtual HRESULT put_WriteCertToCSP( bool value)
00438     {
00439         writeToCSP_ = value;
00440         return S_OK;
00441     }
00442     
00458     virtual HRESULT put_PIN( const CSecurePin& pin)
00459     {
00460         //ожидаем что пин имеет на конце ноль, иначе всё будет плохо
00461         if (pin.ptr()[pin.len() - 1] != 0)
00462             return NTE_BAD_DATA;
00463         pin_.copy(pin);
00464         return S_OK;
00465     }
00466     
00482     virtual HRESULT put_SupressAddRootUI( bool value)
00483     {
00484         supressAddRootUi_ = value;
00485         return S_OK;
00486     }
00487 
00501     virtual HRESULT addExtensionToRequest( LONG flags, BSTR name, BSTR value) {
00502         std::vector<BYTE> binary;
00503         HRESULT hr = UnixEnroll::getMessageFromBSTR(value,binary);
00504         if( S_OK != hr ) {
00505             return hr;
00506         }
00507         
00508         const char *oid = ConvertBSTRToString(name);
00509         
00510         extensions_.push_back(Extension(oid, flags, binary) );
00511 
00512         delete[] oid;
00513         
00514         return S_OK;
00515     }
00516 
00528     virtual HRESULT get_InstallToContainerStatus( DWORD *pdwStatus) {
00529         if(!pdwStatus) {
00530             return E_INVALIDARG;
00531         }
00532         *pdwStatus = installToContainerStatus_;
00533         return S_OK;
00534     }
00535     
00553     virtual HRESULT createPKCS10( BSTR rdn, BSTR usage, BSTR *request) {
00554         return
00555             createPKCSRequest(rdn, usage, request, false,false);
00556     }
00557     
00581     virtual HRESULT createRequest( LONG flags, BSTR rdn, BSTR usage, BSTR *request) {
00582         if( XECR_PKCS10_V2_0 == flags || XECR_PKCS10_V1_5 == flags ) {
00583             return createPKCSRequest(rdn, usage, request, true, false);
00584         } else if (flags == XECR_PKCS7) {
00585             return createPKCSRequest(rdn, usage, request, true, true);
00586         } else if (flags == XECR_PKCS7_TWICE) {
00587             return createPKCSRequest(rdn, usage, request, true, 2);
00588         } else
00589             return E_NOTIMPL;
00590     }
00591     
00621     virtual HRESULT acceptPKCS7( BSTR msg);
00622 
00642     virtual HRESULT installPKCS7( BSTR msg);
00666     HRESULT installPKCS7Ex( BSTR msg, LONG * plCertInstalled);
00675 private:
00676     HRESULT findCertificateInRequestStore(
00677         const BYTE* pbCert, DWORD cbCert,
00678         std::vector<BYTE>& foundedCert,
00679         cpcrypt_store_handle& store) const;
00680     HRESULT createCerificateContextFromRequestStore(
00681         const BYTE* pbCert, DWORD cbCert,
00682         PCCERT_CONTEXT& pCertContext,
00683         cpcrypt_store_handle& handle) const;
00684     HRESULT installCertificateToStore(
00685         PCCERT_CONTEXT pPrivateKeyCertContext,
00686         const BYTE* pbCert, DWORD cbCert);
00687     std::string prepareKeyUsageString( const std::string& usage );
00688     HRESULT encodeRequestToPKCS7(std::vector<BYTE>& Request); 
00689     HRESULT prepareKeyUsage(
00690         const std::string& usage,
00691         std::vector<std::string>& usageArray);
00692 };
00693 
00694 #endif /* _UNIXENROLL_H */

Документация по КриптоПро CAPILite. Последние изменения: Mon Jul 2 13:03:12 2018. Создано системой  doxygen 1.4.5-20051109