00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
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
00059
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
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;
00226 return S_OK;
00227 }
00228
00245
00246
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
00435
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