Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenprovstore.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
1.7.6.1
|