| 1 | /*
|
|---|
| 2 | * Copyright 2002 Mike McCormack for CodeWeavers
|
|---|
| 3 | * Copyright 2005 Juan Lang
|
|---|
| 4 | *
|
|---|
| 5 | * This library is free software; you can redistribute it and/or
|
|---|
| 6 | * modify it under the terms of the GNU Lesser General Public
|
|---|
| 7 | * License as published by the Free Software Foundation; either
|
|---|
| 8 | * version 2.1 of the License, or (at your option) any later version.
|
|---|
| 9 | *
|
|---|
| 10 | * This library is distributed in the hope that it will be useful,
|
|---|
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|---|
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|---|
| 13 | * Lesser General Public License for more details.
|
|---|
| 14 | *
|
|---|
| 15 | * You should have received a copy of the GNU Lesser General Public
|
|---|
| 16 | * License along with this library; if not, write to the Free Software
|
|---|
| 17 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|---|
| 18 | */
|
|---|
| 19 |
|
|---|
| 20 | #include "config.h"
|
|---|
| 21 | #include <stdarg.h>
|
|---|
| 22 | #include <stdio.h>
|
|---|
| 23 |
|
|---|
| 24 | #include "windef.h"
|
|---|
| 25 | #include "winbase.h"
|
|---|
| 26 | #include "wincrypt.h"
|
|---|
| 27 | #include "winreg.h"
|
|---|
| 28 | #include "winuser.h"
|
|---|
| 29 | #include "i_cryptasn1tls.h"
|
|---|
| 30 | #include "crypt32_private.h"
|
|---|
| 31 | #include "wine/debug.h"
|
|---|
| 32 |
|
|---|
| 33 | #define DBG_LOCALLOG DBG_crypt32
|
|---|
| 34 | #include "dbglocal.h"
|
|---|
| 35 |
|
|---|
| 36 |
|
|---|
| 37 | ODINDEBUGCHANNEL(CRYPT32-CRYPT32)
|
|---|
| 38 |
|
|---|
| 39 | static HCRYPTPROV hDefProv;
|
|---|
| 40 | HINSTANCE hInstance;
|
|---|
| 41 |
|
|---|
| 42 | BOOL WINAPI Crypt32DllMain(HINSTANCE hInst, DWORD fdwReason, PVOID pvReserved)
|
|---|
| 43 | {
|
|---|
| 44 | switch (fdwReason)
|
|---|
| 45 | {
|
|---|
| 46 | case DLL_PROCESS_ATTACH:
|
|---|
| 47 | hInstance = hInst;
|
|---|
| 48 | DisableThreadLibraryCalls(hInst);
|
|---|
| 49 | crypt_oid_init();
|
|---|
| 50 | break;
|
|---|
| 51 | case DLL_PROCESS_DETACH:
|
|---|
| 52 | crypt_oid_free();
|
|---|
| 53 | crypt_sip_free();
|
|---|
| 54 | root_store_free();
|
|---|
| 55 | default_chain_engine_free();
|
|---|
| 56 | /* Don't release the default provider on process shutdown, there's
|
|---|
| 57 | * no guarantee the provider dll hasn't already been unloaded.
|
|---|
| 58 | */
|
|---|
| 59 | if (hDefProv && !pvReserved) CryptReleaseContext(hDefProv, 0);
|
|---|
| 60 | break;
|
|---|
| 61 | }
|
|---|
| 62 | return TRUE;
|
|---|
| 63 | }
|
|---|
| 64 |
|
|---|
| 65 | HCRYPTPROV CRYPT_GetDefaultProvider(void)
|
|---|
| 66 | {
|
|---|
| 67 | if (!hDefProv)
|
|---|
| 68 | {
|
|---|
| 69 | HCRYPTPROV prov;
|
|---|
| 70 |
|
|---|
| 71 | CryptAcquireContextW(&prov, NULL, MS_ENHANCED_PROV_W, PROV_RSA_FULL,
|
|---|
| 72 | CRYPT_VERIFYCONTEXT);
|
|---|
| 73 | InterlockedCompareExchangePointer((PVOID *)&hDefProv, (PVOID)prov,
|
|---|
| 74 | NULL);
|
|---|
| 75 | if (hDefProv != prov)
|
|---|
| 76 | CryptReleaseContext(prov, 0);
|
|---|
| 77 | }
|
|---|
| 78 | return hDefProv;
|
|---|
| 79 | }
|
|---|
| 80 |
|
|---|
| 81 | typedef void * HLRUCACHE;
|
|---|
| 82 |
|
|---|
| 83 | /* this function is called by Internet Explorer when it is about to verify a
|
|---|
| 84 | * downloaded component. The first parameter appears to be a pointer to an
|
|---|
| 85 | * unknown type, native fails unless it points to a buffer of at least 20 bytes.
|
|---|
| 86 | * The second parameter appears to be an out parameter, whatever it's set to is
|
|---|
| 87 | * passed (by cryptnet.dll) to I_CryptFlushLruCache.
|
|---|
| 88 | */
|
|---|
| 89 | BOOL WINAPI I_CryptCreateLruCache(void *unknown, HLRUCACHE *out)
|
|---|
| 90 | {
|
|---|
| 91 | FIXME("(%p, %p): stub!\n", unknown, out);
|
|---|
| 92 | *out = (void *)0xbaadf00d;
|
|---|
| 93 | return TRUE;
|
|---|
| 94 | }
|
|---|
| 95 |
|
|---|
| 96 | BOOL WINAPI I_CryptFindLruEntry(DWORD unk0, DWORD unk1)
|
|---|
| 97 | {
|
|---|
| 98 | FIXME("(%08x, %08x): stub!\n", unk0, unk1);
|
|---|
| 99 | return FALSE;
|
|---|
| 100 | }
|
|---|
| 101 |
|
|---|
| 102 | BOOL WINAPI I_CryptFindLruEntryData(DWORD unk0, DWORD unk1, DWORD unk2)
|
|---|
| 103 | {
|
|---|
| 104 | FIXME("(%08x, %08x, %08x): stub!\n", unk0, unk1, unk2);
|
|---|
| 105 | return FALSE;
|
|---|
| 106 | }
|
|---|
| 107 |
|
|---|
| 108 | BOOL WINAPI I_CryptCreateLruEntry(HLRUCACHE h, DWORD unk0, DWORD unk1)
|
|---|
| 109 | {
|
|---|
| 110 | FIXME("(%p, %08x, %08x): stub!\n", h, unk0, unk1);
|
|---|
| 111 | return FALSE;
|
|---|
| 112 | }
|
|---|
| 113 |
|
|---|
| 114 | DWORD WINAPI I_CryptFlushLruCache(HLRUCACHE h, DWORD unk0, DWORD unk1)
|
|---|
| 115 | {
|
|---|
| 116 | FIXME("(%p, %08x, %08x): stub!\n", h, unk0, unk1);
|
|---|
| 117 | return 0;
|
|---|
| 118 | }
|
|---|
| 119 |
|
|---|
| 120 | HLRUCACHE WINAPI I_CryptFreeLruCache(HLRUCACHE h, DWORD unk0, DWORD unk1)
|
|---|
| 121 | {
|
|---|
| 122 | FIXME("(%p, %08x, %08x): stub!\n", h, unk0, unk1);
|
|---|
| 123 | return h;
|
|---|
| 124 | }
|
|---|
| 125 |
|
|---|
| 126 | LPVOID WINAPI CryptMemAlloc(ULONG cbSize)
|
|---|
| 127 | {
|
|---|
| 128 | return HeapAlloc(GetProcessHeap(), 0, cbSize);
|
|---|
| 129 | }
|
|---|
| 130 |
|
|---|
| 131 | LPVOID WINAPI CryptMemRealloc(LPVOID pv, ULONG cbSize)
|
|---|
| 132 | {
|
|---|
| 133 | return HeapReAlloc(GetProcessHeap(), 0, pv, cbSize);
|
|---|
| 134 | }
|
|---|
| 135 |
|
|---|
| 136 | VOID WINAPI CryptMemFree(LPVOID pv)
|
|---|
| 137 | {
|
|---|
| 138 | HeapFree(GetProcessHeap(), 0, pv);
|
|---|
| 139 | }
|
|---|
| 140 |
|
|---|
| 141 | DWORD WINAPI I_CryptAllocTls(void)
|
|---|
| 142 | {
|
|---|
| 143 | return TlsAlloc();
|
|---|
| 144 | }
|
|---|
| 145 |
|
|---|
| 146 | LPVOID WINAPI I_CryptDetachTls(DWORD dwTlsIndex)
|
|---|
| 147 | {
|
|---|
| 148 | LPVOID ret;
|
|---|
| 149 |
|
|---|
| 150 | ret = TlsGetValue(dwTlsIndex);
|
|---|
| 151 | TlsSetValue(dwTlsIndex, NULL);
|
|---|
| 152 | return ret;
|
|---|
| 153 | }
|
|---|
| 154 |
|
|---|
| 155 | LPVOID WINAPI I_CryptGetTls(DWORD dwTlsIndex)
|
|---|
| 156 | {
|
|---|
| 157 | return TlsGetValue(dwTlsIndex);
|
|---|
| 158 | }
|
|---|
| 159 |
|
|---|
| 160 | BOOL WINAPI I_CryptSetTls(DWORD dwTlsIndex, LPVOID lpTlsValue)
|
|---|
| 161 | {
|
|---|
| 162 | return TlsSetValue(dwTlsIndex, lpTlsValue);
|
|---|
| 163 | }
|
|---|
| 164 |
|
|---|
| 165 | BOOL WINAPI I_CryptFreeTls(DWORD dwTlsIndex, DWORD unknown)
|
|---|
| 166 | {
|
|---|
| 167 | TRACE("(%d, %d)\n", dwTlsIndex, unknown);
|
|---|
| 168 | return TlsFree(dwTlsIndex);
|
|---|
| 169 | }
|
|---|
| 170 |
|
|---|
| 171 | BOOL WINAPI I_CryptGetOssGlobal(DWORD x)
|
|---|
| 172 | {
|
|---|
| 173 | FIXME("%08x\n", x);
|
|---|
| 174 | return FALSE;
|
|---|
| 175 | }
|
|---|
| 176 |
|
|---|
| 177 | HCRYPTPROV WINAPI I_CryptGetDefaultCryptProv(DWORD reserved)
|
|---|
| 178 | {
|
|---|
| 179 | HCRYPTPROV ret;
|
|---|
| 180 |
|
|---|
| 181 | TRACE("(%08x)\n", reserved);
|
|---|
| 182 |
|
|---|
| 183 | if (reserved)
|
|---|
| 184 | {
|
|---|
| 185 | SetLastError(E_INVALIDARG);
|
|---|
| 186 | return (HCRYPTPROV)0;
|
|---|
| 187 | }
|
|---|
| 188 | ret = CRYPT_GetDefaultProvider();
|
|---|
| 189 | CryptContextAddRef(ret, NULL, 0);
|
|---|
| 190 | return ret;
|
|---|
| 191 | }
|
|---|
| 192 |
|
|---|
| 193 | BOOL WINAPI I_CryptReadTrustedPublisherDWORDValueFromRegistry(LPCWSTR name,
|
|---|
| 194 | DWORD *value)
|
|---|
| 195 | {
|
|---|
| 196 | static const WCHAR safer[] = {
|
|---|
| 197 | 'S','o','f','t','w','a','r','e','\\','P','o','l','i','c','i','e','s','\\',
|
|---|
| 198 | 'M','i','c','r','o','s','o','f','t','\\','S','y','s','t','e','m',
|
|---|
| 199 | 'C','e','r','t','i','f','i','c','a','t','e','s','\\',
|
|---|
| 200 | 'T','r','u','s','t','e','d','P','u','b','l','i','s','h','e','r','\\',
|
|---|
| 201 | 'S','a','f','e','r',0 };
|
|---|
| 202 | HKEY key;
|
|---|
| 203 | LONG rc;
|
|---|
| 204 | BOOL ret = FALSE;
|
|---|
| 205 |
|
|---|
| 206 | TRACE("(%s, %p)\n", debugstr_w(name), value);
|
|---|
| 207 |
|
|---|
| 208 | *value = 0;
|
|---|
| 209 | rc = RegCreateKeyW(HKEY_LOCAL_MACHINE, safer, &key);
|
|---|
| 210 | if (rc == ERROR_SUCCESS)
|
|---|
| 211 | {
|
|---|
| 212 | DWORD size = sizeof(DWORD);
|
|---|
| 213 |
|
|---|
| 214 | if (!RegQueryValueExW(key, name, NULL, NULL, (LPBYTE)value, &size))
|
|---|
| 215 | ret = TRUE;
|
|---|
| 216 | RegCloseKey(key);
|
|---|
| 217 | }
|
|---|
| 218 | return ret;
|
|---|
| 219 | }
|
|---|
| 220 |
|
|---|
| 221 | DWORD WINAPI I_CryptInstallOssGlobal(DWORD x, DWORD y, DWORD z)
|
|---|
| 222 | {
|
|---|
| 223 | static int ret = 8;
|
|---|
| 224 | ret++;
|
|---|
| 225 | FIXME("%08x %08x %08x, return value %d\n", x, y, z,ret);
|
|---|
| 226 | return ret;
|
|---|
| 227 | }
|
|---|
| 228 |
|
|---|
| 229 | BOOL WINAPI I_CryptInstallAsn1Module(ASN1module_t x, DWORD y, void* z)
|
|---|
| 230 | {
|
|---|
| 231 | FIXME("(%p %08x %p): stub\n", x, y, z);
|
|---|
| 232 | return TRUE;
|
|---|
| 233 | }
|
|---|
| 234 |
|
|---|
| 235 | BOOL WINAPI I_CryptUninstallAsn1Module(HCRYPTASN1MODULE x)
|
|---|
| 236 | {
|
|---|
| 237 | FIXME("(%08x): stub\n", x);
|
|---|
| 238 | return TRUE;
|
|---|
| 239 | }
|
|---|
| 240 |
|
|---|
| 241 | ASN1decoding_t WINAPI I_CryptGetAsn1Decoder(HCRYPTASN1MODULE x)
|
|---|
| 242 | {
|
|---|
| 243 | FIXME("(%08x): stub\n", x);
|
|---|
| 244 | return NULL;
|
|---|
| 245 | }
|
|---|
| 246 |
|
|---|
| 247 | ASN1encoding_t WINAPI I_CryptGetAsn1Encoder(HCRYPTASN1MODULE x)
|
|---|
| 248 | {
|
|---|
| 249 | FIXME("(%08x): stub\n", x);
|
|---|
| 250 | return NULL;
|
|---|
| 251 | }
|
|---|