ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

provstore.c
Go to the documentation of this file.
00001 /*
00002  * Copyright 2004-2007 Juan Lang
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Lesser General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Lesser General Public
00015  * License along with this library; if not, write to the Free Software
00016  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00017  */
00018 #include <stdarg.h>
00019 #include "windef.h"
00020 #include "winbase.h"
00021 #include "wincrypt.h"
00022 #include "wine/debug.h"
00023 #include "wine/list.h"
00024 #include "crypt32_private.h"
00025 
00026 WINE_DEFAULT_DEBUG_CHANNEL(crypt);
00027 
00028 typedef struct _WINE_PROVIDERSTORE
00029 {
00030     WINECRYPT_CERTSTORE             hdr;
00031     DWORD                           dwStoreProvFlags;
00032     PWINECRYPT_CERTSTORE            memStore;
00033     HCERTSTOREPROV                  hStoreProv;
00034     PFN_CERT_STORE_PROV_CLOSE       provCloseStore;
00035     PFN_CERT_STORE_PROV_WRITE_CERT  provWriteCert;
00036     PFN_CERT_STORE_PROV_DELETE_CERT provDeleteCert;
00037     PFN_CERT_STORE_PROV_WRITE_CRL   provWriteCrl;
00038     PFN_CERT_STORE_PROV_DELETE_CRL  provDeleteCrl;
00039     PFN_CERT_STORE_PROV_WRITE_CTL   provWriteCtl;
00040     PFN_CERT_STORE_PROV_DELETE_CTL  provDeleteCtl;
00041     PFN_CERT_STORE_PROV_CONTROL     provControl;
00042 } WINE_PROVIDERSTORE, *PWINE_PROVIDERSTORE;
00043 
00044 static void WINAPI CRYPT_ProvCloseStore(HCERTSTORE hCertStore, DWORD dwFlags)
00045 {
00046     PWINE_PROVIDERSTORE store = hCertStore;
00047 
00048     TRACE("(%p, %08x)\n", store, dwFlags);
00049 
00050     if (store->provCloseStore)
00051         store->provCloseStore(store->hStoreProv, dwFlags);
00052     if (!(store->dwStoreProvFlags & CERT_STORE_PROV_EXTERNAL_FLAG))
00053         CertCloseStore(store->memStore, dwFlags);
00054     CRYPT_FreeStore((PWINECRYPT_CERTSTORE)store);
00055 }
00056 
00057 static BOOL CRYPT_ProvAddCert(PWINECRYPT_CERTSTORE store, void *cert,
00058  void *toReplace, const void **ppStoreContext)
00059 {
00060     PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store;
00061     BOOL ret;
00062 
00063     TRACE("(%p, %p, %p, %p)\n", store, cert, toReplace, ppStoreContext);
00064 
00065     if (toReplace)
00066         ret = ps->memStore->certs.addContext(ps->memStore, cert, toReplace,
00067          ppStoreContext);
00068     else
00069     {
00070         ret = TRUE;
00071         if (ps->provWriteCert)
00072             ret = ps->provWriteCert(ps->hStoreProv, cert,
00073              CERT_STORE_PROV_WRITE_ADD_FLAG);
00074         if (ret)
00075             ret = ps->memStore->certs.addContext(ps->memStore, cert, NULL,
00076              ppStoreContext);
00077     }
00078     /* dirty trick: replace the returned context's hCertStore with
00079      * store.
00080      */
00081     if (ret && ppStoreContext)
00082         (*(PCERT_CONTEXT *)ppStoreContext)->hCertStore = store;
00083     return ret;
00084 }
00085 
00086 static void *CRYPT_ProvEnumCert(PWINECRYPT_CERTSTORE store, void *pPrev)
00087 {
00088     PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store;
00089     void *ret;
00090 
00091     ret = ps->memStore->certs.enumContext(ps->memStore, pPrev);
00092     if (ret)
00093     {
00094         /* same dirty trick: replace the returned context's hCertStore with
00095          * store.
00096          */
00097         ((PCERT_CONTEXT)ret)->hCertStore = store;
00098     }
00099     return ret;
00100 }
00101 
00102 static BOOL CRYPT_ProvDeleteCert(PWINECRYPT_CERTSTORE store, void *cert)
00103 {
00104     PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store;
00105     BOOL ret = TRUE;
00106 
00107     TRACE("(%p, %p)\n", store, cert);
00108 
00109     if (ps->provDeleteCert)
00110         ret = ps->provDeleteCert(ps->hStoreProv, cert, 0);
00111     if (ret)
00112         ret = ps->memStore->certs.deleteContext(ps->memStore, cert);
00113     return ret;
00114 }
00115 
00116 static BOOL CRYPT_ProvAddCRL(PWINECRYPT_CERTSTORE store, void *crl,
00117  void *toReplace, const void **ppStoreContext)
00118 {
00119     PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store;
00120     BOOL ret;
00121 
00122     TRACE("(%p, %p, %p, %p)\n", store, crl, toReplace, ppStoreContext);
00123 
00124     if (toReplace)
00125         ret = ps->memStore->crls.addContext(ps->memStore, crl, toReplace,
00126          ppStoreContext);
00127     else
00128     {
00129         if (ps->hdr.dwOpenFlags & CERT_STORE_READONLY_FLAG)
00130         {
00131             SetLastError(ERROR_ACCESS_DENIED);
00132             ret = FALSE;
00133         }
00134         else
00135         {
00136             ret = TRUE;
00137             if (ps->provWriteCrl)
00138                 ret = ps->provWriteCrl(ps->hStoreProv, crl,
00139                  CERT_STORE_PROV_WRITE_ADD_FLAG);
00140             if (ret)
00141                 ret = ps->memStore->crls.addContext(ps->memStore, crl, NULL,
00142                  ppStoreContext);
00143         }
00144     }
00145     /* dirty trick: replace the returned context's hCertStore with
00146      * store.
00147      */
00148     if (ret && ppStoreContext)
00149         (*(PCRL_CONTEXT *)ppStoreContext)->hCertStore = store;
00150     return ret;
00151 }
00152 
00153 static void *CRYPT_ProvEnumCRL(PWINECRYPT_CERTSTORE store, void *pPrev)
00154 {
00155     PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store;
00156     void *ret;
00157 
00158     ret = ps->memStore->crls.enumContext(ps->memStore, pPrev);
00159     if (ret)
00160     {
00161         /* same dirty trick: replace the returned context's hCertStore with
00162          * store.
00163          */
00164         ((PCRL_CONTEXT)ret)->hCertStore = store;
00165     }
00166     return ret;
00167 }
00168 
00169 static BOOL CRYPT_ProvDeleteCRL(PWINECRYPT_CERTSTORE store, void *crl)
00170 {
00171     PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store;
00172     BOOL ret = TRUE;
00173 
00174     TRACE("(%p, %p)\n", store, crl);
00175 
00176     if (ps->provDeleteCrl)
00177         ret = ps->provDeleteCrl(ps->hStoreProv, crl, 0);
00178     if (ret)
00179         ret = ps->memStore->crls.deleteContext(ps->memStore, crl);
00180     return ret;
00181 }
00182 
00183 static BOOL CRYPT_ProvAddCTL(PWINECRYPT_CERTSTORE store, void *ctl,
00184  void *toReplace, const void **ppStoreContext)
00185 {
00186     PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store;
00187     BOOL ret;
00188 
00189     TRACE("(%p, %p, %p, %p)\n", store, ctl, toReplace, ppStoreContext);
00190 
00191     if (toReplace)
00192         ret = ps->memStore->ctls.addContext(ps->memStore, ctl, toReplace,
00193          ppStoreContext);
00194     else
00195     {
00196         if (ps->hdr.dwOpenFlags & CERT_STORE_READONLY_FLAG)
00197         {
00198             SetLastError(ERROR_ACCESS_DENIED);
00199             ret = FALSE;
00200         }
00201         else
00202         {
00203             ret = TRUE;
00204             if (ps->provWriteCtl)
00205                 ret = ps->provWriteCtl(ps->hStoreProv, ctl,
00206                  CERT_STORE_PROV_WRITE_ADD_FLAG);
00207             if (ret)
00208                 ret = ps->memStore->ctls.addContext(ps->memStore, ctl, NULL,
00209                  ppStoreContext);
00210         }
00211     }
00212     /* dirty trick: replace the returned context's hCertStore with
00213      * store.
00214      */
00215     if (ret && ppStoreContext)
00216         (*(PCTL_CONTEXT *)ppStoreContext)->hCertStore = store;
00217     return ret;
00218 }
00219 
00220 static void *CRYPT_ProvEnumCTL(PWINECRYPT_CERTSTORE store, void *pPrev)
00221 {
00222     PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store;
00223     void *ret;
00224 
00225     ret = ps->memStore->ctls.enumContext(ps->memStore, pPrev);
00226     if (ret)
00227     {
00228         /* same dirty trick: replace the returned context's hCertStore with
00229          * store.
00230          */
00231         ((PCTL_CONTEXT)ret)->hCertStore = store;
00232     }
00233     return ret;
00234 }
00235 
00236 static BOOL CRYPT_ProvDeleteCTL(PWINECRYPT_CERTSTORE store, void *ctl)
00237 {
00238     PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store;
00239     BOOL ret = TRUE;
00240 
00241     TRACE("(%p, %p)\n", store, ctl);
00242 
00243     if (ps->provDeleteCtl)
00244         ret = ps->provDeleteCtl(ps->hStoreProv, ctl, 0);
00245     if (ret)
00246         ret = ps->memStore->ctls.deleteContext(ps->memStore, ctl);
00247     return ret;
00248 }
00249 
00250 static BOOL WINAPI CRYPT_ProvControl(HCERTSTORE hCertStore, DWORD dwFlags,
00251  DWORD dwCtrlType, void const *pvCtrlPara)
00252 {
00253     PWINE_PROVIDERSTORE store = hCertStore;
00254     BOOL ret = TRUE;
00255 
00256     TRACE("(%p, %08x, %d, %p)\n", hCertStore, dwFlags, dwCtrlType,
00257      pvCtrlPara);
00258 
00259     if (store->provControl)
00260         ret = store->provControl(store->hStoreProv, dwFlags, dwCtrlType,
00261          pvCtrlPara);
00262     return ret;
00263 }
00264 
00265 PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(DWORD dwFlags,
00266  PWINECRYPT_CERTSTORE memStore, const CERT_STORE_PROV_INFO *pProvInfo)
00267 {
00268     PWINE_PROVIDERSTORE ret = CryptMemAlloc(sizeof(WINE_PROVIDERSTORE));
00269 
00270     if (ret)
00271     {
00272         CRYPT_InitStore(&ret->hdr, dwFlags, StoreTypeProvider);
00273         ret->dwStoreProvFlags = pProvInfo->dwStoreProvFlags;
00274         if (ret->dwStoreProvFlags & CERT_STORE_PROV_EXTERNAL_FLAG)
00275         {
00276             CertCloseStore(memStore, 0);
00277             ret->memStore = NULL;
00278         }
00279         else
00280             ret->memStore = memStore;
00281         ret->hStoreProv = pProvInfo->hStoreProv;
00282         ret->hdr.closeStore = CRYPT_ProvCloseStore;
00283         ret->hdr.certs.addContext = CRYPT_ProvAddCert;
00284         ret->hdr.certs.enumContext = CRYPT_ProvEnumCert;
00285         ret->hdr.certs.deleteContext = CRYPT_ProvDeleteCert;
00286         ret->hdr.crls.addContext = CRYPT_ProvAddCRL;
00287         ret->hdr.crls.enumContext = CRYPT_ProvEnumCRL;
00288         ret->hdr.crls.deleteContext = CRYPT_ProvDeleteCRL;
00289         ret->hdr.ctls.addContext = CRYPT_ProvAddCTL;
00290         ret->hdr.ctls.enumContext = CRYPT_ProvEnumCTL;
00291         ret->hdr.ctls.deleteContext = CRYPT_ProvDeleteCTL;
00292         ret->hdr.control = CRYPT_ProvControl;
00293         if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_CLOSE_FUNC)
00294             ret->provCloseStore =
00295              pProvInfo->rgpvStoreProvFunc[CERT_STORE_PROV_CLOSE_FUNC];
00296         else
00297             ret->provCloseStore = NULL;
00298         if (pProvInfo->cStoreProvFunc >
00299          CERT_STORE_PROV_WRITE_CERT_FUNC)
00300             ret->provWriteCert = pProvInfo->rgpvStoreProvFunc[
00301              CERT_STORE_PROV_WRITE_CERT_FUNC];
00302         else
00303             ret->provWriteCert = NULL;
00304         if (pProvInfo->cStoreProvFunc >
00305          CERT_STORE_PROV_DELETE_CERT_FUNC)
00306             ret->provDeleteCert = pProvInfo->rgpvStoreProvFunc[
00307              CERT_STORE_PROV_DELETE_CERT_FUNC];
00308         else
00309             ret->provDeleteCert = NULL;
00310         if (pProvInfo->cStoreProvFunc >
00311          CERT_STORE_PROV_WRITE_CRL_FUNC)
00312             ret->provWriteCrl = pProvInfo->rgpvStoreProvFunc[
00313              CERT_STORE_PROV_WRITE_CRL_FUNC];
00314         else
00315             ret->provWriteCrl = NULL;
00316         if (pProvInfo->cStoreProvFunc >
00317          CERT_STORE_PROV_DELETE_CRL_FUNC)
00318             ret->provDeleteCrl = pProvInfo->rgpvStoreProvFunc[
00319              CERT_STORE_PROV_DELETE_CRL_FUNC];
00320         else
00321             ret->provDeleteCrl = NULL;
00322         if (pProvInfo->cStoreProvFunc >
00323          CERT_STORE_PROV_WRITE_CTL_FUNC)
00324             ret->provWriteCtl = pProvInfo->rgpvStoreProvFunc[
00325              CERT_STORE_PROV_WRITE_CTL_FUNC];
00326         else
00327             ret->provWriteCtl = NULL;
00328         if (pProvInfo->cStoreProvFunc >
00329          CERT_STORE_PROV_DELETE_CTL_FUNC)
00330             ret->provDeleteCtl = pProvInfo->rgpvStoreProvFunc[
00331              CERT_STORE_PROV_DELETE_CTL_FUNC];
00332         else
00333             ret->provDeleteCtl = NULL;
00334         if (pProvInfo->cStoreProvFunc >
00335          CERT_STORE_PROV_CONTROL_FUNC)
00336             ret->provControl = pProvInfo->rgpvStoreProvFunc[
00337              CERT_STORE_PROV_CONTROL_FUNC];
00338         else
00339             ret->provControl = NULL;
00340     }
00341     return (PWINECRYPT_CERTSTORE)ret;
00342 }
00343 
00344 PWINECRYPT_CERTSTORE CRYPT_ProvOpenStore(LPCSTR lpszStoreProvider,
00345  DWORD dwEncodingType, HCRYPTPROV hCryptProv, DWORD dwFlags, const void *pvPara)
00346 {
00347     static HCRYPTOIDFUNCSET set = NULL;
00348     PFN_CERT_DLL_OPEN_STORE_PROV_FUNC provOpenFunc;
00349     HCRYPTOIDFUNCADDR hFunc;
00350     PWINECRYPT_CERTSTORE ret = NULL;
00351 
00352     if (!set)
00353         set = CryptInitOIDFunctionSet(CRYPT_OID_OPEN_STORE_PROV_FUNC, 0);
00354     CryptGetOIDFunctionAddress(set, dwEncodingType, lpszStoreProvider, 0,
00355      (void **)&provOpenFunc, &hFunc);
00356     if (provOpenFunc)
00357     {
00358         CERT_STORE_PROV_INFO provInfo = { 0 };
00359 
00360         provInfo.cbSize = sizeof(provInfo);
00361         if (dwFlags & CERT_STORE_DELETE_FLAG)
00362             provOpenFunc(lpszStoreProvider, dwEncodingType, hCryptProv,
00363              dwFlags, pvPara, NULL, &provInfo);
00364         else
00365         {
00366             HCERTSTORE memStore;
00367 
00368             memStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0,
00369              CERT_STORE_CREATE_NEW_FLAG, NULL);
00370             if (memStore)
00371             {
00372                 if (provOpenFunc(lpszStoreProvider, dwEncodingType, hCryptProv,
00373                  dwFlags, pvPara, memStore, &provInfo))
00374                     ret = CRYPT_ProvCreateStore(dwFlags, memStore, &provInfo);
00375                 else
00376                     CertCloseStore(memStore, 0);
00377             }
00378         }
00379         CryptFreeOIDFunctionAddress(hFunc, 0);
00380     }
00381     else
00382         SetLastError(ERROR_FILE_NOT_FOUND);
00383     return ret;
00384 }

Generated on Thu May 24 2012 04:23:40 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.