Add UTC to the time zone list.
[wine/multimedia.git] / dlls / rsabase / main.c
blobcdd9b8fb0d0ac30dc85716a5dea8417719abb7b4
1 /*
2 * RSABASE - RSA encryption for Wine
4 * Copyright 2004 Mike McCormack for CodeWeavers
5 * Copyright 2002 TransGaming Technologies
7 * David Hammerton
9 * (based upon code from dlls/wininet/netconnection.c)
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #include "config.h"
29 #include "wine/port.h"
31 #include <stdarg.h>
33 #include "windef.h"
34 #include "winbase.h"
35 #include "winreg.h"
36 #include "wincrypt.h"
38 #ifdef HAVE_OPENSSL_SSL_H
39 #define DSA __ssl_DSA /* avoid conflict with commctrl.h */
40 #undef FAR
41 # include <openssl/rand.h>
42 #undef FAR
43 #define FAR do_not_use_this_in_wine
44 #undef DSA
45 #endif
47 #include "wine/library.h"
48 #include "wine/debug.h"
50 WINE_DEFAULT_DEBUG_CHANNEL(crypt);
52 #define RSABASE_MAGIC 0x52534100
54 #ifdef HAVE_OPENSSL_SSL_H
56 #ifndef SONAME_LIBCRYPTO
57 #define SONAME_LIBCRYPTO "libcrypto.so"
58 #endif
60 static void *libcrypto;
62 #define MAKE_FUNCPTR(f) static typeof(f) * p##f
64 /* OpenSSL funtions that we use */
65 MAKE_FUNCPTR(RAND_bytes);
67 static BOOL load_libcrypto( void )
69 libcrypto = wine_dlopen(SONAME_LIBCRYPTO, RTLD_NOW, NULL, 0);
70 if (!libcrypto)
72 MESSAGE("Couldn't load %s, RSA encryption not available.\n", SONAME_LIBCRYPTO);
73 MESSAGE("Install the openssl package if you're have problems.\n");
74 return FALSE;
77 #define GETFUNC(x) \
78 p##x = wine_dlsym(libcrypto, #x, NULL, 0); \
79 if (!p##x) \
80 { \
81 ERR("failed to load symbol %s\n", #x); \
82 return FALSE; \
85 GETFUNC(RAND_bytes);
87 return TRUE;
90 #endif
92 typedef struct _RSA_CryptProv
94 DWORD dwMagic;
95 } RSA_CryptProv;
97 BOOL WINAPI RSA_CPAcquireContext(HCRYPTPROV *phProv, LPSTR pszContainer,
98 DWORD dwFlags, PVTableProvStruc pVTable)
100 BOOL ret = FALSE;
102 TRACE("%p %s %08lx %p\n", phProv, debugstr_a(pszContainer),
103 dwFlags, pVTable);
105 #ifdef HAVE_OPENSSL_SSL_H
107 if( !load_libcrypto() )
108 return FALSE;
109 else
111 RSA_CryptProv *cp = HeapAlloc( GetProcessHeap(), 0, sizeof (RSA_CryptProv) );
112 if( !cp )
114 SetLastError(ERROR_NOT_ENOUGH_MEMORY);
115 return FALSE;
118 cp->dwMagic = RSABASE_MAGIC;
120 *phProv = (HCRYPTPROV) cp;
121 ret = TRUE;
123 #endif
125 return ret;
128 BOOL WINAPI RSA_CPCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash)
130 FIXME("%08lx %d %08lx %08lx %p\n", hProv, Algid, hKey, dwFlags, phHash);
131 return FALSE;
134 BOOL WINAPI RSA_CPDecrypt(HCRYPTPROV hProv, HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
136 FIXME("(stub)\n");
137 return FALSE;
140 BOOL WINAPI RSA_CPDeriveKey(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY *phKey)
142 FIXME("(stub)\n");
143 return FALSE;
146 BOOL WINAPI RSA_CPDestroyHash(HCRYPTPROV hProv, HCRYPTHASH hHash)
148 FIXME("(stub)\n");
149 return FALSE;
152 BOOL WINAPI RSA_CPDestroyKey(HCRYPTPROV hProv, HCRYPTKEY hKey)
154 FIXME("(stub)\n");
155 return FALSE;
158 BOOL WINAPI RSA_CPDuplicateHash(HCRYPTPROV hUID, HCRYPTHASH hHash, DWORD *pdwReserved, DWORD dwFlags, HCRYPTHASH *phHash)
160 FIXME("(stub)\n");
161 return FALSE;
164 BOOL WINAPI RSA_CPDuplicateKey(HCRYPTPROV hUID, HCRYPTKEY hKey, DWORD *pdwReserved, DWORD dwFlags, HCRYPTKEY *phKey)
166 FIXME("(stub)\n");
167 return FALSE;
170 BOOL WINAPI RSA_CPEncrypt(HCRYPTPROV hProv, HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen)
172 FIXME("(stub)\n");
173 return FALSE;
176 BOOL WINAPI RSA_CPExportKey(HCRYPTPROV hProv, HCRYPTKEY hKey, HCRYPTKEY hPubKey, DWORD dwBlobType, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
178 FIXME("(stub)\n");
179 return FALSE;
182 BOOL WINAPI RSA_CPGenKey(HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKEY *phKey)
184 FIXME("(stub)\n");
185 return FALSE;
188 BOOL WINAPI RSA_CPGenRandom(HCRYPTPROV hProv, DWORD dwLen, BYTE *pbBuffer)
190 BOOL ret = FALSE;
191 RSA_CryptProv *cp = (RSA_CryptProv*) hProv;
193 TRACE("%08lx %ld %p\n", hProv, dwLen, pbBuffer);
195 if( cp && ( cp->dwMagic != RSABASE_MAGIC ) )
196 return FALSE;
198 #ifdef HAVE_OPENSSL_SSL_H
200 if( !pRAND_bytes)
201 return FALSE;
202 ret = pRAND_bytes( pbBuffer, dwLen );
204 #endif
206 return ret;
209 BOOL WINAPI RSA_CPGetHashParam(HCRYPTPROV hProv, HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
211 FIXME("(stub)\n");
212 return FALSE;
215 BOOL WINAPI RSA_CPGetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
217 FIXME("(stub)\n");
218 return FALSE;
221 BOOL WINAPI RSA_CPGetProvParam(HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
223 FIXME("(stub)\n");
224 return FALSE;
227 BOOL WINAPI RSA_CPGetUserKey(HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUserKey)
229 FIXME("(stub)\n");
230 return FALSE;
233 BOOL WINAPI RSA_CPHashData(HCRYPTPROV hProv, HCRYPTHASH hHash, CONST BYTE *pbData, DWORD dwDataLen, DWORD dwFlags)
235 FIXME("(stub)\n");
236 return FALSE;
239 BOOL WINAPI RSA_CPHashSessionKey(HCRYPTPROV hProv, HCRYPTHASH hHash, HCRYPTKEY hKey, DWORD dwFlags)
241 FIXME("(stub)\n");
242 return FALSE;
245 BOOL WINAPI RSA_CPImportKey(HCRYPTPROV hProv, CONST BYTE *pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey)
247 FIXME("(stub)\n");
248 return FALSE;
251 BOOL WINAPI RSA_CPReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
253 RSA_CryptProv *cp = (RSA_CryptProv*) hProv;
255 TRACE("%08lx %08lx\n", hProv, dwFlags);
257 if( cp && ( cp->dwMagic != RSABASE_MAGIC ) )
258 return FALSE;
260 HeapFree( GetProcessHeap(), 0, cp );
262 return TRUE;
265 BOOL WINAPI RSA_CPSetHashParam(HCRYPTPROV hProv, HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD dwFlags)
267 FIXME("(stub)\n");
268 return FALSE;
271 BOOL WINAPI RSA_CPSetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD dwFlags)
273 FIXME("(stub)\n");
274 return FALSE;
277 BOOL WINAPI RSA_CPSetProvParam(HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, DWORD dwFlags)
279 FIXME("(stub)\n");
280 return FALSE;
283 BOOL WINAPI RSA_CPSignHash(HCRYPTPROV hProv, HCRYPTHASH hHash, DWORD dwKeySpec, LPCWSTR sDescription, DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen)
285 FIXME("(stub)\n");
286 return FALSE;
289 BOOL WINAPI RSA_CPVerifySignature(HCRYPTPROV hProv, HCRYPTHASH hHash, CONST BYTE *pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCWSTR sDescription, DWORD dwFlags)
291 FIXME("(stub)\n");
292 return FALSE;
295 static const WCHAR szRSAKey[] = { 'S','o','f','t','w','a','r','e','\\',
296 'M','i','c','r','o','s','o','f','t','\\','C','r','y','p','t','o','g','r',
297 'a','p','h','y','\\','D','e','f','a','u','l','t','s','\\','P','r','o','v',
298 'i','d','e','r','\\','M','i','c','r','o','s','o','f','t',' ','B','a','s',
299 'e',' ','C','r','y','p','t','o','g','r','a','p','h','i','c',' ','P','r',
300 'o','v','i','d','e','r',' ','v','1','.','0',0 };
301 static const WCHAR szRSAKey2[] = { 'S','o','f','t','w','a','r','e','\\',
302 'M','i','c','r','o','s','o','f','t','\\','C','r','y','p','t','o','g','r',
303 'a','p','h','y','\\','D','e','f','a','u','l','t','s','\\','P','r','o','v',
304 'i','d','e','r',' ','T','y','p','e','s','\\','T','y','p','e',' ','0','0','1',0};
306 /***********************************************************************
307 * DllRegisterServer (RSABASE.@)
309 HRESULT WINAPI RSABASE_DllRegisterServer()
311 HKEY key;
312 DWORD dp;
313 long apiRet = RegCreateKeyExW(HKEY_LOCAL_MACHINE, szRSAKey, 0, NULL,
314 REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &dp);
316 if (apiRet == ERROR_SUCCESS)
318 if (dp == REG_CREATED_NEW_KEY)
320 static const WCHAR szImagePath[] = { 'I','m','a','g','e',' ','P','a','t','h',0 };
321 static const WCHAR szRSABase[] = { 'r','s','a','b','a','s','e','.','d','l','l',0 };
322 static const WCHAR szType[] = { 'T','y','p','e',0 };
323 static const WCHAR szSignature[] = { 'S','i','g','n','a','t','u','r','e',0 };
324 DWORD type = 1;
325 DWORD sign = 0xdeadbeef;
326 RegSetValueExW(key, szImagePath, 0, REG_SZ, (LPBYTE)szRSABase, (lstrlenW(szRSABase) + 1) * sizeof(WCHAR));
327 RegSetValueExW(key, szType, 0, REG_DWORD, (LPBYTE)&type, sizeof(type));
328 RegSetValueExW(key, szSignature, 0, REG_BINARY, (LPBYTE)&sign, sizeof(sign));
330 RegCloseKey(key);
332 if (apiRet == ERROR_SUCCESS)
333 apiRet = RegCreateKeyExW(HKEY_LOCAL_MACHINE, szRSAKey2, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, &dp);
334 if (apiRet == ERROR_SUCCESS)
336 if (dp == REG_CREATED_NEW_KEY)
338 static const WCHAR szName[] = { 'N','a','m','e',0 };
339 static const WCHAR szRSAName[] = {
340 'M','i','c','r','o','s','o','f','t',' ','B','a','s','e',' ','C',
341 'r','y','p','t','o','g','r','a','p','h','i','c',' ','P','r',
342 'o','v','i','d','e','r',' ','v','1','.','0',0 };
343 static const WCHAR szTypeName[] = { 'T','y','p','e','N','a','m','e',0 };
344 static const WCHAR szRSATypeName[] = {
345 'R','S','A',' ','F','u','l','l',' ',
346 '(','S','i','g','n','a','t','u','r','e',' ','a','n','d',' ',
347 'K','e','y',' ','E','x','c','h','a','n','g','e',')',0 };
349 RegSetValueExW(key, szName, 0, REG_SZ, (LPBYTE)szRSAName, sizeof(szRSAName));
350 RegSetValueExW(key, szTypeName, 0, REG_SZ, (LPBYTE)szRSATypeName, sizeof(szRSATypeName));
352 RegCloseKey(key);
354 return HRESULT_FROM_WIN32(apiRet);
357 /***********************************************************************
358 * DllUnregisterServer (RSABASE.@)
360 HRESULT WINAPI RSABASE_DllUnregisterServer()
362 RegDeleteKeyW(HKEY_LOCAL_MACHINE, szRSAKey);
363 RegDeleteKeyW(HKEY_LOCAL_MACHINE, szRSAKey2);
364 return S_OK;