| /* |
| * 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 <stdarg.h> |
| |
| #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 "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; |
| } |