/* * Copyright 2001 Rein Klazes * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" #include #include "windef.h" #include "winbase.h" #include "winerror.h" #include "winreg.h" #include "guiddef.h" #include "wintrust.h" #include "softpub.h" #include "mscat.h" #include "objbase.h" #include "wintrust_priv.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(wintrust); /*********************************************************************** * DllMain (WINTRUST.@) */ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved ) { switch(reason) { case DLL_WINE_PREATTACH: return FALSE; /* prefer native version */ case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls( inst ); break; } return TRUE; } /*********************************************************************** * TrustIsCertificateSelfSigned (WINTRUST.@) */ BOOL WINAPI TrustIsCertificateSelfSigned( PCCERT_CONTEXT cert ) { BOOL ret; TRACE("%p\n", cert); ret = CertCompareCertificateName(cert->dwCertEncodingType, &cert->pCertInfo->Subject, &cert->pCertInfo->Issuer); return ret; } /*********************************************************************** * WinVerifyTrust (WINTRUST.@) * * Verifies an object by calling the specified trust provider. * * PARAMS * hwnd [I] Handle to a caller window. * ActionID [I] Pointer to a GUID that identifies the action to perform. * ActionData [I] Information used by the trust provider to verify the object. * * RETURNS * Success: Zero. * Failure: A TRUST_E_* error code. * * NOTES * Trust providers can be found at: * HKLM\SOFTWARE\Microsoft\Cryptography\Providers\Trust\ */ LONG WINAPI WinVerifyTrust( HWND hwnd, GUID *ActionID, LPVOID ActionData ) { FIXME("%p %s %p\n", hwnd, debugstr_guid(ActionID), ActionData); return ERROR_SUCCESS; } /*********************************************************************** * WinVerifyTrustEx (WINTRUST.@) */ HRESULT WINAPI WinVerifyTrustEx( HWND hwnd, GUID *ActionID, WINTRUST_DATA* ActionData ) { return WinVerifyTrust(hwnd, ActionID, ActionData); } /*********************************************************************** * WTHelperGetProvSignerFromChain (WINTRUST.@) */ CRYPT_PROVIDER_SGNR * WINAPI WTHelperGetProvSignerFromChain( CRYPT_PROVIDER_DATA *pProvData, DWORD idxSigner, BOOL fCounterSigner, DWORD idxCounterSigner) { CRYPT_PROVIDER_SGNR *sgnr; TRACE("(%p %d %d %d)\n", pProvData, idxSigner, fCounterSigner, idxCounterSigner); if (idxSigner >= pProvData->csSigners || !pProvData->pasSigners) return NULL; sgnr = &pProvData->pasSigners[idxSigner]; if (fCounterSigner) { if (idxCounterSigner >= sgnr->csCounterSigners || !sgnr->pasCounterSigners) return NULL; sgnr = &sgnr->pasCounterSigners[idxCounterSigner]; } TRACE("returning %p\n", sgnr); return sgnr; } /*********************************************************************** * WTHelperGetProvCertFromChain (WINTRUST.@) */ CRYPT_PROVIDER_CERT * WINAPI WTHelperGetProvCertFromChain( CRYPT_PROVIDER_SGNR *pSgnr, DWORD idxCert) { CRYPT_PROVIDER_CERT *cert; TRACE("(%p %d)\n", pSgnr, idxCert); if (idxCert >= pSgnr->csCertChain || !pSgnr->pasCertChain) return NULL; cert = &pSgnr->pasCertChain[idxCert]; TRACE("returning %p\n", cert); return cert; } /*********************************************************************** * WTHelperProvDataFromStateData (WINTRUST.@) */ CRYPT_PROVIDER_DATA * WINAPI WTHelperProvDataFromStateData(HANDLE hStateData) { TRACE("%p\n", hStateData); return (CRYPT_PROVIDER_DATA *)hStateData; } static const WCHAR Software_Publishing[] = { 'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\', 'W','i','n','d','o','w','s','\\', 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', 'W','i','n','t','r','u','s','t','\\', 'T','r','u','s','t',' ','P','r','o','v','i','d','e','r','s','\\', 'S','o','f','t','w','a','r','e',' ', 'P','u','b','l','i','s','h','i','n','g',0 }; static const WCHAR State[] = { 'S','t','a','t','e',0 }; /*********************************************************************** * WintrustGetRegPolicyFlags (WINTRUST.@) */ void WINAPI WintrustGetRegPolicyFlags( DWORD* pdwPolicyFlags ) { HKEY key; LONG r; TRACE("%p\n", pdwPolicyFlags); *pdwPolicyFlags = 0; r = RegCreateKeyExW(HKEY_CURRENT_USER, Software_Publishing, 0, NULL, 0, KEY_READ, NULL, &key, NULL); if (!r) { DWORD size = sizeof(DWORD); r = RegQueryValueExW(key, State, NULL, NULL, (LPBYTE)pdwPolicyFlags, &size); RegCloseKey(key); if (r) { /* Failed to query, create and return default value */ *pdwPolicyFlags = WTPF_IGNOREREVOCATIONONTS | WTPF_OFFLINEOKNBU_COM | WTPF_OFFLINEOKNBU_IND | WTPF_OFFLINEOK_COM | WTPF_OFFLINEOK_IND; WintrustSetRegPolicyFlags(*pdwPolicyFlags); } } } /*********************************************************************** * WintrustSetRegPolicyFlags (WINTRUST.@) */ BOOL WINAPI WintrustSetRegPolicyFlags( DWORD dwPolicyFlags) { HKEY key; LONG r; TRACE("%x\n", dwPolicyFlags); r = RegCreateKeyExW(HKEY_CURRENT_USER, Software_Publishing, 0, NULL, 0, KEY_WRITE, NULL, &key, NULL); if (!r) { r = RegSetValueExW(key, State, 0, REG_DWORD, (LPBYTE)&dwPolicyFlags, sizeof(DWORD)); RegCloseKey(key); } if (r) SetLastError(r); return r == ERROR_SUCCESS; } /* Utility functions */ void * WINAPI WINTRUST_Alloc(DWORD cb) { return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cb); } void * WINAPI WINTRUST_ReAlloc(void *ptr, DWORD cb) { return HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ptr, cb); } void WINAPI WINTRUST_Free(void *p) { HeapFree(GetProcessHeap(), 0, p); } BOOL WINAPI WINTRUST_AddStore(CRYPT_PROVIDER_DATA *data, HCERTSTORE store) { BOOL ret = FALSE; if (data->chStores) data->pahStores = WINTRUST_ReAlloc(data->pahStores, (data->chStores + 1) * sizeof(HCERTSTORE)); else { data->pahStores = WINTRUST_Alloc(sizeof(HCERTSTORE)); data->chStores = 0; } if (data->pahStores) { data->pahStores[data->chStores++] = CertDuplicateStore(store); ret = TRUE; } else SetLastError(ERROR_OUTOFMEMORY); return ret; }