ReactOS 0.4.16-dev-2332-g4cba65d
crypt.c
Go to the documentation of this file.
1/*
2 * Copyright 1999 Ian Schmidt
3 * Copyright 2001 Travis Michielsen
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/***********************************************************************
21 *
22 * TODO:
23 * - Reference counting
24 * - Thread-safing
25 */
26
27#ifdef __REACTOS__
28#include <advapi32.h>
29#else
30#include "config.h"
31#include "wine/port.h"
32
33#include <limits.h>
34#include <time.h>
35#include <stdlib.h>
36#include <stdio.h>
37#include <sys/types.h>
38#ifdef HAVE_SYS_STAT_H
39# include <sys/stat.h>
40#endif
41#include <fcntl.h>
42#ifdef HAVE_UNISTD_H
43# include <unistd.h>
44#endif
45
46#include "ntstatus.h"
47#define WIN32_NO_STATUS
48#include "crypt.h"
49#include "winnls.h"
50#include "winreg.h"
51#include "rpc.h"
52#include "wine/debug.h"
53#include "wine/unicode.h"
54#include "winternl.h"
55#endif /* __REACTOS__ */
56
58
60
61#define CRYPT_Alloc(size) (LocalAlloc(LMEM_ZEROINIT, size))
62#define CRYPT_Free(buffer) (LocalFree(buffer))
63
64static inline PWSTR CRYPT_GetProvKeyName(PCWSTR pProvName)
65{
66 static const WCHAR KEYSTR[] = {
67 'S','o','f','t','w','a','r','e','\\',
68 'M','i','c','r','o','s','o','f','t','\\',
69 'C','r','y','p','t','o','g','r','a','p','h','y','\\',
70 'D','e','f','a','u','l','t','s','\\',
71 'P','r','o','v','i','d','e','r','\\',0
72 };
73 PWSTR keyname;
74
75 keyname = CRYPT_Alloc((strlenW(KEYSTR) + strlenW(pProvName) +1)*sizeof(WCHAR));
76 if (keyname)
77 {
78 strcpyW(keyname, KEYSTR);
79 strcpyW(keyname + strlenW(KEYSTR), pProvName);
80 } else
82 return keyname;
83}
84
86{
87 static const WCHAR MACHINESTR[] = {
88 'S','o','f','t','w','a','r','e','\\',
89 'M','i','c','r','o','s','o','f','t','\\',
90 'C','r','y','p','t','o','g','r','a','p','h','y','\\',
91 'D','e','f','a','u','l','t','s','\\',
92 'P','r','o','v','i','d','e','r',' ','T','y','p','e','s','\\',
93 'T','y','p','e',' ','X','X','X',0
94 };
95 static const WCHAR USERSTR[] = {
96 'S','o','f','t','w','a','r','e','\\',
97 'M','i','c','r','o','s','o','f','t','\\',
98 'C','r','y','p','t','o','g','r','a','p','h','y','\\',
99 'P','r','o','v','i','d','e','r',' ','T','y','p','e',' ','X','X','X',0
100 };
101 PWSTR keyname;
102 PWSTR ptr;
103
104 keyname = CRYPT_Alloc( ((user ? strlenW(USERSTR) : strlenW(MACHINESTR)) +1)*sizeof(WCHAR));
105 if (keyname)
106 {
107 user ? strcpyW(keyname, USERSTR) : strcpyW(keyname, MACHINESTR);
108 ptr = keyname + strlenW(keyname);
109 *(--ptr) = (dwType % 10) + '0';
110 *(--ptr) = ((dwType / 10) % 10) + '0';
111 *(--ptr) = (dwType / 100) + '0';
112 } else
114 return keyname;
115}
116
117/* CRYPT_UnicodeToANSI
118 * wstr - unicode string
119 * str - pointer to ANSI string or pointer to null pointer if we have to do the allocation
120 * strsize - size of buffer pointed to by str
121 *
122 * returns TRUE if unsuccessful, FALSE otherwise.
123 * if wstr is NULL, returns TRUE and sets str to NULL! Value of str should be checked after call
124 */
125static inline BOOL CRYPT_UnicodeToANSI(LPCWSTR wstr, LPSTR* str, int strsize)
126{
127 if (!wstr)
128 {
129 *str = NULL;
130 return TRUE;
131 }
132
133 if (!*str)
134 {
135 strsize = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
136 *str = CRYPT_Alloc(strsize * sizeof(CHAR));
137 }
138 else if (strsize < 0)
139 {
140 strsize = INT_MAX; /* windows will pretend that the buffer is infinitely long */
141 }
142
143 if (*str)
144 {
145 WideCharToMultiByte(CP_ACP, 0, wstr, -1, *str, strsize, NULL, NULL);
146 return TRUE;
147 }
148
150 return FALSE;
151}
152
153/* CRYPT_ANSITOUnicode
154 * str - ANSI string
155 * wstr - pointer to unicode string
156 * wstrsize - size of buffer pointed to by wstr or -1 if we have to do the allocation
157 */
158static inline BOOL CRYPT_ANSIToUnicode(LPCSTR str, LPWSTR* wstr, int wstrsize)
159{
160 unsigned int wcount;
161
162 if (!str)
163 {
164 *wstr = NULL;
165 return TRUE;
166 }
167 wcount = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
168 if (wstrsize == -1)
169 *wstr = CRYPT_Alloc(wcount * sizeof(WCHAR));
170 else
171 wcount = min( wcount, wstrsize/sizeof(WCHAR) );
172 if (*wstr)
173 {
174 MultiByteToWideChar(CP_ACP, 0, str, -1, *wstr, wcount);
175 return TRUE;
176 }
178 return FALSE;
179}
180
181/* These next 2 functions are used by the VTableProvStruc structure */
183{
184 if (!lpszImage || !pData)
185 {
187 return FALSE;
188 }
189
190 FIXME("(%s, %p): not verifying image\n", lpszImage, pData);
191
192 return TRUE;
193}
194
195static void CALLBACK CRYPT_ReturnhWnd(HWND *phWnd)
196{
197 if (phWnd) *phWnd = crypt_hWindow;
198}
199
200#define CRYPT_GetProvFunc(name) \
201 if ( !(provider->pFuncs->p##name = (void*)GetProcAddress(provider->hModule, #name)) ) goto error
202#define CRYPT_GetProvFuncOpt(name) \
203 provider->pFuncs->p##name = (void*)GetProcAddress(provider->hModule, #name)
205{
206 PCRYPTPROV provider;
207 DWORD errorcode = ERROR_NOT_ENOUGH_MEMORY;
208
209 if ( !(provider = CRYPT_Alloc(sizeof(CRYPTPROV))) ) goto error;
210 if ( !(provider->pFuncs = CRYPT_Alloc(sizeof(PROVFUNCS))) ) goto error;
211 if ( !(provider->pVTable = CRYPT_Alloc(sizeof(VTableProvStruc))) ) goto error;
212 if ( !(provider->hModule = LoadLibraryW(pImage)) )
213 {
215 FIXME("Failed to load dll %s\n", debugstr_w(pImage));
216 goto error;
217 }
218 provider->dwMagic = MAGIC_CRYPTPROV;
219 provider->refcount = 1;
220
221 errorcode = NTE_PROVIDER_DLL_FAIL;
222 CRYPT_GetProvFunc(CPAcquireContext);
223 CRYPT_GetProvFunc(CPCreateHash);
224 CRYPT_GetProvFunc(CPDecrypt);
225 CRYPT_GetProvFunc(CPDeriveKey);
226 CRYPT_GetProvFunc(CPDestroyHash);
227 CRYPT_GetProvFunc(CPDestroyKey);
228 CRYPT_GetProvFuncOpt(CPDuplicateHash);
229 CRYPT_GetProvFuncOpt(CPDuplicateKey);
230 CRYPT_GetProvFunc(CPEncrypt);
231 CRYPT_GetProvFunc(CPExportKey);
232 CRYPT_GetProvFunc(CPGenKey);
233 CRYPT_GetProvFunc(CPGenRandom);
234 CRYPT_GetProvFunc(CPGetHashParam);
235 CRYPT_GetProvFunc(CPGetKeyParam);
236 CRYPT_GetProvFunc(CPGetProvParam);
237 CRYPT_GetProvFunc(CPGetUserKey);
238 CRYPT_GetProvFunc(CPHashData);
239 CRYPT_GetProvFunc(CPHashSessionKey);
240 CRYPT_GetProvFunc(CPImportKey);
241 CRYPT_GetProvFunc(CPReleaseContext);
242 CRYPT_GetProvFunc(CPSetHashParam);
243 CRYPT_GetProvFunc(CPSetKeyParam);
244 CRYPT_GetProvFunc(CPSetProvParam);
245 CRYPT_GetProvFunc(CPSignHash);
246 CRYPT_GetProvFunc(CPVerifySignature);
247
248 /* FIXME: Not sure what the pbContextInfo field is for.
249 * Does it need memory allocation?
250 */
251 provider->pVTable->Version = 3;
252 provider->pVTable->FuncVerifyImage = CRYPT_VerifyImage;
253 provider->pVTable->FuncReturnhWnd = CRYPT_ReturnhWnd;
254 provider->pVTable->dwProvType = 0;
255 provider->pVTable->pbContextInfo = NULL;
256 provider->pVTable->cbContextInfo = 0;
257 provider->pVTable->pszProvName = NULL;
258 return provider;
259
260error:
261 SetLastError(errorcode);
262 if (provider)
263 {
264 provider->dwMagic = 0;
265 if (provider->hModule)
266 FreeLibrary(provider->hModule);
267 CRYPT_Free(provider->pVTable);
268 CRYPT_Free(provider->pFuncs);
269 CRYPT_Free(provider);
270 }
271 return NULL;
272}
273#undef CRYPT_GetProvFunc
274#undef CRYPT_GetProvFuncOpt
275
276
277static void CRYPT_CreateMachineGuid(void)
278{
279 static const WCHAR cryptographyW[] = {
280 'S','o','f','t','w','a','r','e','\\',
281 'M','i','c','r','o','s','o','f','t','\\',
282 'C','r','y','p','t','o','g','r','a','p','h','y',0 };
283 static const WCHAR machineGuidW[] = {
284 'M','a','c','h','i','n','e','G','u','i','d',0 };
285 LONG r;
286 HKEY key;
287
289 &key);
290 if (!r)
291 {
292 DWORD size;
293
294 r = RegQueryValueExW(key, machineGuidW, NULL, NULL, NULL, &size);
295 if (r == ERROR_FILE_NOT_FOUND)
296 {
297 UUID uuid;
298 WCHAR buf[37];
299 RPC_STATUS rs;
300 static const WCHAR uuidFmt[] = {
301 '%','0','8','x','-','%','0','4','x','-',
302 '%','0','4','x','-','%','0','2','x',
303 '%','0','2','x','-','%','0','2','x',
304 '%','0','2','x','%','0','2','x',
305 '%','0','2','x','%','0','2','x',
306 '%','0','2','x',0 };
307
308 rs = UuidCreate(&uuid);
309 if (rs == S_OK)
310 {
311 sprintfW(buf, uuidFmt,
313 uuid.Data4[0], uuid.Data4[1],
314 uuid.Data4[2], uuid.Data4[3],
315 uuid.Data4[4], uuid.Data4[5],
316 uuid.Data4[6], uuid.Data4[7] );
317 RegSetValueExW(key, machineGuidW, 0, REG_SZ,
318 (const BYTE *)buf,
319 (lstrlenW(buf)+1)*sizeof(WCHAR));
320 }
321 }
323 }
324}
325
326
327/******************************************************************************
328 * CloseEncryptedFileRaw (ADVAPI32.@)
329 *
330 * Close encrypted files
331 *
332 * PARAMS
333 * context [I] pointer to the context
334 * RETURNS
335 * Success: ERROR_SUCCESS
336 * Failure: NTSTATUS error code
337 */
339{
340 FIXME("(%p): stub\n", context);
341}
342
343/******************************************************************************
344 * CryptAcquireContextW (ADVAPI32.@)
345 *
346 * Acquire a crypto provider context handle.
347 *
348 * PARAMS
349 * phProv [O] Pointer to HCRYPTPROV for the output.
350 * pszContainer [I] Key Container Name
351 * pszProvider [I] Cryptographic Service Provider Name
352 * dwProvType [I] Crypto provider type to get a handle.
353 * dwFlags [I] flags for the operation
354 *
355 * RETURNS
356 * TRUE on success, FALSE on failure.
357 */
359 LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
360{
361 PCRYPTPROV pProv = NULL;
362 HKEY key;
363 PWSTR imagepath = NULL, keyname = NULL, provname = NULL, temp = NULL;
364 PSTR provnameA = NULL, pszContainerA = NULL;
365 DWORD keytype, type, len;
366 ULONG r;
367 static const WCHAR nameW[] = {'N','a','m','e',0};
368 static const WCHAR typeW[] = {'T','y','p','e',0};
369 static const WCHAR imagepathW[] = {'I','m','a','g','e',' ','P','a','t','h',0};
370
371 TRACE("(%p, %s, %s, %d, %08x)\n", phProv, debugstr_w(pszContainer),
372 debugstr_w(pszProvider), dwProvType, dwFlags);
373
374 if (dwProvType < 1 || dwProvType > MAXPROVTYPES)
375 {
377 return FALSE;
378 }
379
380 if (!phProv)
381 {
383 return FALSE;
384 }
385
386 /* Make sure the MachineGuid value exists */
388
389 if (!pszProvider || !*pszProvider)
390 {
391 /* No CSP name specified so try the user default CSP first
392 * then try the machine default CSP
393 */
394 if ( !(keyname = CRYPT_GetTypeKeyName(dwProvType, TRUE)) ) {
395 TRACE("No provider registered for crypto provider type %d.\n", dwProvType);
397 return FALSE;
398 }
399 if (RegOpenKeyW(HKEY_CURRENT_USER, keyname, &key))
400 {
401 CRYPT_Free(keyname);
402 if ( !(keyname = CRYPT_GetTypeKeyName(dwProvType, FALSE)) ) {
403 TRACE("No type registered for crypto provider type %d.\n", dwProvType);
406 goto error;
407 }
408 if (RegOpenKeyW(HKEY_LOCAL_MACHINE, keyname, &key)) {
409 TRACE("Did not find registry entry of crypto provider for %s.\n", debugstr_w(keyname));
410 CRYPT_Free(keyname);
413 goto error;
414 }
415 }
416 CRYPT_Free(keyname);
417 r = RegQueryValueExW(key, nameW, NULL, &keytype, NULL, &len);
418 if( r != ERROR_SUCCESS || !len || keytype != REG_SZ)
419 {
420 TRACE("error %d reading size of 'Name' from registry\n", r );
423 goto error;
424 }
425 if(!(provname = CRYPT_Alloc(len)))
426 {
429 goto error;
430 }
431 r = RegQueryValueExW(key, nameW, NULL, NULL, (LPBYTE)provname, &len);
432 if( r != ERROR_SUCCESS )
433 {
434 TRACE("error %d reading 'Name' from registry\n", r );
437 goto error;
438 }
440 } else {
441 if ( !(provname = CRYPT_Alloc((strlenW(pszProvider) +1)*sizeof(WCHAR))) )
442 {
444 goto error;
445 }
446 strcpyW(provname, pszProvider);
447 }
448
449 keyname = CRYPT_GetProvKeyName(provname);
450 r = RegOpenKeyW(HKEY_LOCAL_MACHINE, keyname, &key);
451 CRYPT_Free(keyname);
452 if (r != ERROR_SUCCESS)
453 {
455 goto error;
456 }
457 len = sizeof(DWORD);
459 if (r != ERROR_SUCCESS)
460 {
462 goto error;
463 }
464 if (type != dwProvType)
465 {
466 TRACE("Crypto provider has wrong type (%d vs expected %d).\n", type, dwProvType);
468 goto error;
469 }
470
471 r = RegQueryValueExW(key, imagepathW, NULL, &keytype, NULL, &len);
472 if ( r != ERROR_SUCCESS || keytype != REG_SZ)
473 {
474 TRACE("error %d reading size of 'Image Path' from registry\n", r );
477 goto error;
478 }
479 if (!(temp = CRYPT_Alloc(len)))
480 {
483 goto error;
484 }
485 r = RegQueryValueExW(key, imagepathW, NULL, NULL, (LPBYTE)temp, &len);
486 if( r != ERROR_SUCCESS )
487 {
488 TRACE("error %d reading 'Image Path' from registry\n", r );
491 goto error;
492 }
495 if ( !(imagepath = CRYPT_Alloc(len*sizeof(WCHAR))) )
496 {
498 goto error;
499 }
500 if (!ExpandEnvironmentStringsW(temp, imagepath, len))
501 {
502 /* ExpandEnvironmentStrings will call SetLastError */
503 goto error;
504 }
505 pProv = CRYPT_LoadProvider(imagepath);
506 if (!pProv) {
507 /* CRYPT_LoadProvider calls SetLastError */
508 goto error;
509 }
510 pProv->pVTable->dwProvType = dwProvType;
511 if(!CRYPT_UnicodeToANSI(provname, &provnameA, 0))
512 {
513 /* CRYPT_UnicodeToANSI calls SetLastError */
514 goto error;
515 }
516 pProv->pVTable->pszProvName = provnameA;
517 if(!CRYPT_UnicodeToANSI(pszContainer, &pszContainerA, 0))
518 {
519 /* CRYPT_UnicodeToANSI calls SetLastError */
520 goto error;
521 }
522 if (pProv->pFuncs->pCPAcquireContext(&pProv->hPrivate, pszContainerA, dwFlags, pProv->pVTable))
523 {
524 /* MSDN: When this flag is set, the value returned in phProv is undefined,
525 * and thus, the CryptReleaseContext function need not be called afterwards.
526 * Therefore, we must clean up everything now.
527 */
529 {
530 pProv->dwMagic = 0;
531 FreeLibrary(pProv->hModule);
532 CRYPT_Free(provnameA);
533 CRYPT_Free(pProv->pVTable);
534 CRYPT_Free(pProv->pFuncs);
535 CRYPT_Free(pProv);
536 } else {
537 *phProv = (HCRYPTPROV)pProv;
538 }
539 CRYPT_Free(pszContainerA);
540 CRYPT_Free(provname);
542 CRYPT_Free(imagepath);
543 return TRUE;
544 }
545 /* FALLTHROUGH TO ERROR IF FALSE - CSP internal error! */
546error:
547 if (pProv)
548 {
549 pProv->dwMagic = 0;
550 if (pProv->hModule)
551 FreeLibrary(pProv->hModule);
552 CRYPT_Free(pProv->pVTable);
553 CRYPT_Free(pProv->pFuncs);
554 CRYPT_Free(pProv);
555 }
556 CRYPT_Free(pszContainerA);
557 CRYPT_Free(provnameA);
558 CRYPT_Free(provname);
560 CRYPT_Free(imagepath);
561 return FALSE;
562}
563
564/******************************************************************************
565 * CryptAcquireContextA (ADVAPI32.@)
566 *
567 * See CryptAcquireContextW.
568 */
570 LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
571{
572 PWSTR pProvider = NULL, pContainer = NULL;
573 BOOL ret = FALSE;
574
575 TRACE("(%p, %s, %s, %d, %08x)\n", phProv, debugstr_a(pszContainer),
576 debugstr_a(pszProvider), dwProvType, dwFlags);
577
578 if ( !CRYPT_ANSIToUnicode(pszContainer, &pContainer, -1) )
579 {
581 return FALSE;
582 }
583 if ( !CRYPT_ANSIToUnicode(pszProvider, &pProvider, -1) )
584 {
585 CRYPT_Free(pContainer);
587 return FALSE;
588 }
589
590 ret = CryptAcquireContextW(phProv, pContainer, pProvider, dwProvType, dwFlags);
591
592 CRYPT_Free(pContainer);
594
595 return ret;
596}
597
598/******************************************************************************
599 * CryptContextAddRef (ADVAPI32.@)
600 *
601 * Increases reference count of a cryptographic service provider handle
602 * by one.
603 *
604 * PARAMS
605 * hProv [I] Handle to the CSP whose reference is being incremented.
606 * pdwReserved [IN] Reserved for future use and must be NULL.
607 * dwFlags [I] Reserved for future use and must be 0.
608 *
609 * RETURNS
610 * Success: TRUE
611 * Failure: FALSE
612 */
614{
615 PCRYPTPROV pProv = (PCRYPTPROV)hProv;
616
617 TRACE("(0x%lx, %p, %08x)\n", hProv, pdwReserved, dwFlags);
618
619 if (!pProv)
620 {
622 return FALSE;
623 }
624
625#ifdef __REACTOS__
627 {
628#endif
629 if (pProv->dwMagic != MAGIC_CRYPTPROV)
630 {
632 return FALSE;
633 }
634
636#ifdef __REACTOS__
637 }
639 {
641 _SEH2_YIELD(return FALSE);
642 }
643 _SEH2_END;
644#endif
645 return TRUE;
646}
647
648/******************************************************************************
649 * CryptReleaseContext (ADVAPI32.@)
650 *
651 * Releases the handle of a CSP. Reference count is decreased.
652 *
653 * PARAMS
654 * hProv [I] Handle of a CSP.
655 * dwFlags [I] Reserved for future use and must be 0.
656 *
657 * RETURNS
658 * Success: TRUE
659 * Failure: FALSE
660 */
662{
663 PCRYPTPROV pProv = (PCRYPTPROV)hProv;
664 BOOL ret = TRUE;
665
666 TRACE("(0x%lx, %08x)\n", hProv, dwFlags);
667
668 if (!pProv)
669 {
671 return FALSE;
672 }
673
674 if (pProv->dwMagic != MAGIC_CRYPTPROV)
675 {
677 return FALSE;
678 }
679
680 if (InterlockedDecrement(&pProv->refcount) == 0)
681 {
682 ret = pProv->pFuncs->pCPReleaseContext(pProv->hPrivate, dwFlags);
683 pProv->dwMagic = 0;
684 FreeLibrary(pProv->hModule);
685#if 0
686 CRYPT_Free(pProv->pVTable->pContextInfo);
687#endif
689 CRYPT_Free(pProv->pVTable);
690 CRYPT_Free(pProv->pFuncs);
691 CRYPT_Free(pProv);
692 }
693 return ret;
694}
695
696/******************************************************************************
697 * CryptGenRandom (ADVAPI32.@)
698 *
699 * Fills a buffer with cryptographically random bytes.
700 *
701 * PARAMS
702 * hProv [I] Handle of a CSP.
703 * dwLen [I] Number of bytes to generate.
704 * pbBuffer [I/O] Buffer to contain random bytes.
705 *
706 * RETURNS
707 * Success: TRUE
708 * Failure: FALSE
709 *
710 * NOTES
711 * pdBuffer must be at least dwLen bytes long.
712 */
714{
716
717 TRACE("(0x%lx, %d, %p)\n", hProv, dwLen, pbBuffer);
718
719 if (!hProv)
720 {
722 return FALSE;
723 }
724
725 if (prov->dwMagic != MAGIC_CRYPTPROV)
726 {
728 return FALSE;
729 }
730
731 return prov->pFuncs->pCPGenRandom(prov->hPrivate, dwLen, pbBuffer);
732}
733
734/******************************************************************************
735 * CryptCreateHash (ADVAPI32.@)
736 *
737 * Initiates the hashing of a stream of data.
738 *
739 * PARAMS
740 * hProv [I] Handle of a CSP.
741 * Algid [I] Identifies the hash algorithm to use.
742 * hKey [I] Key for the hash (if required).
743 * dwFlags [I] Reserved for future use and must be 0.
744 * phHash [O] Address of the future handle to the new hash object.
745 *
746 * RETURNS
747 * Success: TRUE
748 * Failure: FALSE
749 *
750 * NOTES
751 * If the algorithm is a keyed hash, hKey is the key.
752 */
754 DWORD dwFlags, HCRYPTHASH *phHash)
755{
759
760 TRACE("(0x%lx, 0x%x, 0x%lx, %08x, %p)\n", hProv, Algid, hKey, dwFlags, phHash);
761
762#ifdef __REACTOS__
764 {
765#endif
766 if (!prov || !phHash || prov->dwMagic != MAGIC_CRYPTPROV ||
767 (key && key->dwMagic != MAGIC_CRYPTKEY))
768 {
770 return FALSE;
771 }
772#ifdef __REACTOS__
773 }
775 {
777 _SEH2_YIELD(return FALSE);
778 }
779 _SEH2_END;
780#endif
781 if (dwFlags)
782 {
784 return FALSE;
785 }
786 if ( !(hash = CRYPT_Alloc(sizeof(CRYPTHASH))) )
787 {
789 return FALSE;
790 }
791
792 hash->pProvider = prov;
793 hash->dwMagic = MAGIC_CRYPTHASH;
794 if (prov->pFuncs->pCPCreateHash(prov->hPrivate, Algid,
795 key ? key->hPrivate : 0, 0, &hash->hPrivate))
796 {
797 *phHash = (HCRYPTHASH)hash;
798 return TRUE;
799 }
800
801 /* CSP error! */
802 hash->dwMagic = 0;
804 *phHash = 0;
805 return FALSE;
806}
807
808/******************************************************************************
809 * CryptDecrypt (ADVAPI32.@)
810 *
811 * Decrypts data encrypted by CryptEncrypt.
812 *
813 * PARAMS
814 * hKey [I] Handle to the decryption key.
815 * hHash [I] Handle to a hash object.
816 * Final [I] TRUE if this is the last section to be decrypted.
817 * dwFlags [I] Reserved for future use. Can be CRYPT_OAEP.
818 * pbData [I/O] Buffer that holds the encrypted data. Holds decrypted
819 * data on return
820 * pdwDataLen [I/O] Length of pbData before and after the call.
821 *
822 * RETURNS
823 * Success: TRUE
824 * Failure: FALSE
825 */
827 DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
828{
829 PCRYPTPROV prov;
831 PCRYPTHASH hash = (PCRYPTHASH)hHash;
832
833 TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p)\n", hKey, hHash, Final, dwFlags, pbData, pdwDataLen);
834
835#ifdef __REACTOS__
837 {
838#endif
839 if (!key || !pbData || !pdwDataLen ||
840 !key->pProvider || key->dwMagic != MAGIC_CRYPTKEY ||
841 key->pProvider->dwMagic != MAGIC_CRYPTPROV)
842 {
844 return FALSE;
845 }
846
847 prov = key->pProvider;
848 return prov->pFuncs->pCPDecrypt(prov->hPrivate, key->hPrivate, hash ? hash->hPrivate : 0,
849 Final, dwFlags, pbData, pdwDataLen);
850#ifdef __REACTOS__
851 }
853 {
855 _SEH2_YIELD(return FALSE);
856 }
857 _SEH2_END;
858#endif
859}
860
861/******************************************************************************
862 * CryptDeriveKey (ADVAPI32.@)
863 *
864 * Generates session keys derived from a base data value.
865 *
866 * PARAMS
867 * hProv [I] Handle to a CSP.
868 * Algid [I] Identifies the symmetric encryption algorithm to use.
869 * hBaseData [I] Handle to a hash object.
870 * dwFlags [I] Type of key to generate.
871 * phKey [I/O] Address of the newly generated key.
872 *
873 * RETURNS
874 * Success: TRUE
875 * Failure: FALSE
876 */
878 DWORD dwFlags, HCRYPTKEY *phKey)
879{
881 PCRYPTHASH hash = (PCRYPTHASH)hBaseData;
883
884 TRACE("(0x%lx, 0x%08x, 0x%lx, 0x%08x, %p)\n", hProv, Algid, hBaseData, dwFlags, phKey);
885
886 if (!prov || !hash)
887 {
889 return FALSE;
890 }
891 if (!phKey || prov->dwMagic != MAGIC_CRYPTPROV || hash->dwMagic != MAGIC_CRYPTHASH)
892 {
894 return FALSE;
895 }
896 if ( !(key = CRYPT_Alloc(sizeof(CRYPTKEY))) )
897 {
899 return FALSE;
900 }
901
902 key->pProvider = prov;
903 key->dwMagic = MAGIC_CRYPTKEY;
904 if (prov->pFuncs->pCPDeriveKey(prov->hPrivate, Algid, hash->hPrivate, dwFlags, &key->hPrivate))
905 {
906 *phKey = (HCRYPTKEY)key;
907 return TRUE;
908 }
909
910 /* CSP error! */
911 key->dwMagic = 0;
913 *phKey = 0;
914 return FALSE;
915}
916
917/******************************************************************************
918 * CryptDestroyHash (ADVAPI32.@)
919 *
920 * Destroys the hash object referenced by hHash.
921 *
922 * PARAMS
923 * hHash [I] Handle of the hash object to be destroyed.
924 *
925 * RETURNS
926 * Success: TRUE
927 * Failure: FALSE
928 */
930{
931 PCRYPTHASH hash = (PCRYPTHASH)hHash;
932 PCRYPTPROV prov;
933 BOOL ret;
934
935 TRACE("(0x%lx)\n", hHash);
936
937 if (!hash)
938 {
940 return FALSE;
941 }
942
943 if (!hash->pProvider || hash->dwMagic != MAGIC_CRYPTHASH ||
944 hash->pProvider->dwMagic != MAGIC_CRYPTPROV)
945 {
947 return FALSE;
948 }
949
950 prov = hash->pProvider;
951 ret = prov->pFuncs->pCPDestroyHash(prov->hPrivate, hash->hPrivate);
952 hash->dwMagic = 0;
954 return ret;
955}
956
957/******************************************************************************
958 * CryptDestroyKey (ADVAPI32.@)
959 *
960 * Releases the handle referenced by hKey.
961 *
962 * PARAMS
963 * hKey [I] Handle of the key to be destroyed.
964 *
965 * RETURNS
966 * Success: TRUE
967 * Failure: FALSE
968 */
970{
972 PCRYPTPROV prov;
973 BOOL ret;
974
975 TRACE("(0x%lx)\n", hKey);
976
977 if (!key)
978 {
980 return FALSE;
981 }
982
983 if (!key->pProvider || key->dwMagic != MAGIC_CRYPTKEY ||
984 key->pProvider->dwMagic != MAGIC_CRYPTPROV)
985 {
987 return FALSE;
988 }
989
990 prov = key->pProvider;
991 ret = prov->pFuncs->pCPDestroyKey(prov->hPrivate, key->hPrivate);
992 key->dwMagic = 0;
994 return ret;
995}
996
997/******************************************************************************
998 * CryptDuplicateHash (ADVAPI32.@)
999 *
1000 * Duplicates a hash.
1001 *
1002 * PARAMS
1003 * hHash [I] Handle to the hash to be copied.
1004 * pdwReserved [I] Reserved for future use and must be NULL.
1005 * dwFlags [I] Reserved for future use and must be zero.
1006 * phHash [O] Address of the handle to receive the copy.
1007 *
1008 * RETURNS
1009 * Success: TRUE
1010 * Failure: FALSE
1011 */
1013 DWORD dwFlags, HCRYPTHASH *phHash)
1014{
1015 PCRYPTPROV prov;
1016 PCRYPTHASH orghash, newhash;
1017
1018 TRACE("(0x%lx, %p, %08x, %p)\n", hHash, pdwReserved, dwFlags, phHash);
1019
1020 orghash = (PCRYPTHASH)hHash;
1021 if (!orghash || pdwReserved || !phHash || !orghash->pProvider ||
1022 orghash->dwMagic != MAGIC_CRYPTHASH || orghash->pProvider->dwMagic != MAGIC_CRYPTPROV)
1023 {
1025 return FALSE;
1026 }
1027
1028 prov = orghash->pProvider;
1029 if (!prov->pFuncs->pCPDuplicateHash)
1030 {
1032 return FALSE;
1033 }
1034
1035 if ( !(newhash = CRYPT_Alloc(sizeof(CRYPTHASH))) )
1036 {
1038 return FALSE;
1039 }
1040
1041 newhash->pProvider = prov;
1042 newhash->dwMagic = MAGIC_CRYPTHASH;
1043 if (prov->pFuncs->pCPDuplicateHash(prov->hPrivate, orghash->hPrivate, pdwReserved, dwFlags, &newhash->hPrivate))
1044 {
1045 *phHash = (HCRYPTHASH)newhash;
1046 return TRUE;
1047 }
1048 newhash->dwMagic = 0;
1049 CRYPT_Free(newhash);
1050 return FALSE;
1051}
1052
1053/******************************************************************************
1054 * CryptDuplicateKey (ADVAPI32.@)
1055 *
1056 * Duplicate a key and the key's state.
1057 *
1058 * PARAMS
1059 * hKey [I] Handle of the key to copy.
1060 * pdwReserved [I] Reserved for future use and must be NULL.
1061 * dwFlags [I] Reserved for future use and must be zero.
1062 * phKey [I] Address of the handle to the duplicated key.
1063 *
1064 * RETURNS
1065 * Success: TRUE
1066 * Failure: FALSE
1067 */
1069{
1070 PCRYPTPROV prov;
1071 PCRYPTKEY orgkey, newkey;
1072
1073 TRACE("(0x%lx, %p, %08x, %p)\n", hKey, pdwReserved, dwFlags, phKey);
1074
1075 orgkey = (PCRYPTKEY)hKey;
1076 if (!orgkey || pdwReserved || !phKey || !orgkey->pProvider ||
1077 orgkey->dwMagic != MAGIC_CRYPTKEY ||
1078 orgkey->pProvider->dwMagic != MAGIC_CRYPTPROV)
1079 {
1081 return FALSE;
1082 }
1083
1084 prov = orgkey->pProvider;
1085 if (!prov->pFuncs->pCPDuplicateKey)
1086 {
1088 return FALSE;
1089 }
1090
1091 if ( !(newkey = CRYPT_Alloc(sizeof(CRYPTKEY))) )
1092 {
1094 return FALSE;
1095 }
1096
1097 newkey->pProvider = prov;
1098 newkey->dwMagic = MAGIC_CRYPTKEY;
1099 if (prov->pFuncs->pCPDuplicateKey(prov->hPrivate, orgkey->hPrivate, pdwReserved, dwFlags, &newkey->hPrivate))
1100 {
1101 *phKey = (HCRYPTKEY)newkey;
1102 return TRUE;
1103 }
1104 newkey->dwMagic = 0;
1105 CRYPT_Free(newkey);
1106 return FALSE;
1107}
1108
1109/******************************************************************************
1110 * CryptEncrypt (ADVAPI32.@)
1111 *
1112 * Encrypts data.
1113 *
1114 * PARAMS
1115 * hKey [I] Handle to the encryption key.
1116 * hHash [I] Handle to a hash object.
1117 * Final [I] TRUE if this is the last section to encrypt.
1118 * dwFlags [I] Can be CRYPT_OAEP.
1119 * pbData [I/O] Data to be encrypted. Contains encrypted data after call.
1120 * pdwDataLen [I/O] Length of the data to encrypt. Contains the length of the
1121 * encrypted data after call.
1122 * dwBufLen [I] Length of the input pbData buffer.
1123 *
1124 * RETURNS
1125 * Success: TRUE
1126 * Failure: FALSE
1127 *
1128 * NOTES
1129 * If pbData is NULL, CryptEncrypt determines stores the number of bytes
1130 * required for the returned data in pdwDataLen.
1131 */
1133 DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen)
1134{
1135 PCRYPTPROV prov;
1137 PCRYPTHASH hash = (PCRYPTHASH)hHash;
1138
1139 TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p, %d)\n", hKey, hHash, Final, dwFlags, pbData, pdwDataLen, dwBufLen);
1140
1141#ifdef __REACTOS__
1142 _SEH2_TRY
1143 {
1144#endif
1145 if (!key || !pdwDataLen || !key->pProvider ||
1146 key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV)
1147 {
1149 return FALSE;
1150 }
1151
1152 prov = key->pProvider;
1153 return prov->pFuncs->pCPEncrypt(prov->hPrivate, key->hPrivate, hash ? hash->hPrivate : 0,
1154 Final, dwFlags, pbData, pdwDataLen, dwBufLen);
1155#ifdef __REACTOS__
1156 }
1158 {
1160 _SEH2_YIELD(return FALSE);
1161 }
1162 _SEH2_END;
1163#endif
1164}
1165
1166/******************************************************************************
1167 * CryptEnumProvidersW (ADVAPI32.@)
1168 *
1169 * Returns the next available CSP.
1170 *
1171 * PARAMS
1172 * dwIndex [I] Index of the next provider to be enumerated.
1173 * pdwReserved [I] Reserved for future use and must be NULL.
1174 * dwFlags [I] Reserved for future use and must be zero.
1175 * pdwProvType [O] DWORD designating the type of the provider.
1176 * pszProvName [O] Buffer that receives data from the provider.
1177 * pcbProvName [I/O] Specifies the size of pszProvName. Contains the number
1178 * of bytes stored in the buffer on return.
1179 *
1180 * RETURNS
1181 * Success: TRUE
1182 * Failure: FALSE
1183 *
1184 * NOTES
1185 * If pszProvName is NULL, CryptEnumProvidersW sets the size of the name
1186 * for memory allocation purposes.
1187 */
1189 DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszProvName, DWORD *pcbProvName)
1190{
1191 HKEY hKey;
1192 static const WCHAR providerW[] = {
1193 'S','o','f','t','w','a','r','e','\\',
1194 'M','i','c','r','o','s','o','f','t','\\',
1195 'C','r','y','p','t','o','g','r','a','p','h','y','\\',
1196 'D','e','f','a','u','l','t','s','\\',
1197 'P','r','o','v','i','d','e','r',0
1198 };
1199 static const WCHAR typeW[] = {'T','y','p','e',0};
1200 BOOL ret;
1201
1202 TRACE("(%d, %p, %d, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
1203 pdwProvType, pszProvName, pcbProvName);
1204
1205 if (pdwReserved || !pcbProvName)
1206 {
1208 return FALSE;
1209 }
1210 if (dwFlags)
1211 {
1213 return FALSE;
1214 }
1215
1216 if (RegOpenKeyW(HKEY_LOCAL_MACHINE, providerW, &hKey))
1217 {
1219 return FALSE;
1220 }
1221
1222 ret = TRUE;
1223 if (!pszProvName)
1224 {
1225 DWORD numkeys;
1226 WCHAR *provNameW;
1227
1228 RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &numkeys, pcbProvName,
1229 NULL, NULL, NULL, NULL, NULL, NULL);
1230
1231 if (!(provNameW = CRYPT_Alloc(*pcbProvName * sizeof(WCHAR))))
1232 {
1235 return FALSE;
1236 }
1237
1238 RegEnumKeyExW(hKey, dwIndex, provNameW, pcbProvName, NULL, NULL, NULL, NULL);
1239 CRYPT_Free(provNameW);
1240 (*pcbProvName)++;
1241 *pcbProvName *= sizeof(WCHAR);
1242
1243 if (dwIndex >= numkeys)
1244 {
1246 ret = FALSE;
1247 }
1248 } else {
1249 DWORD size = sizeof(DWORD);
1250 DWORD result;
1251 HKEY subkey;
1252
1253 result = RegEnumKeyW(hKey, dwIndex, pszProvName, *pcbProvName / sizeof(WCHAR));
1254 if (result)
1255 {
1258 return FALSE;
1259 }
1260 if (RegOpenKeyW(hKey, pszProvName, &subkey))
1261 {
1263 return FALSE;
1264 }
1265
1266 if (RegQueryValueExW(subkey, typeW, NULL, NULL, (BYTE*)pdwProvType, &size))
1267 ret = FALSE;
1268
1269 RegCloseKey(subkey);
1270 }
1272 return ret;
1273}
1274
1275/******************************************************************************
1276 * CryptEnumProvidersA (ADVAPI32.@)
1277 *
1278 * See CryptEnumProvidersW.
1279 */
1281 DWORD dwFlags, DWORD *pdwProvType, LPSTR pszProvName, DWORD *pcbProvName)
1282{
1283 PWSTR str = NULL;
1284 DWORD bufsize;
1285 BOOL ret;
1286
1287 TRACE("(%d, %p, %08x, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
1288 pdwProvType, pszProvName, pcbProvName);
1289
1290 if(!CryptEnumProvidersW(dwIndex, pdwReserved, dwFlags, pdwProvType, NULL, &bufsize))
1291 return FALSE;
1292 if ( pszProvName && !(str = CRYPT_Alloc(bufsize)) )
1293 {
1295 return FALSE;
1296 }
1297 ret = CryptEnumProvidersW(dwIndex, pdwReserved, dwFlags, pdwProvType, str, &bufsize);
1298 if (str)
1299 CRYPT_UnicodeToANSI(str, &pszProvName, *pcbProvName);
1300 *pcbProvName = bufsize / sizeof(WCHAR); /* FIXME: not correct */
1301 if (str)
1302 {
1303 CRYPT_Free(str);
1305 {
1307 return FALSE;
1308 }
1309 }
1310 return ret;
1311}
1312
1313/******************************************************************************
1314 * CryptEnumProviderTypesW (ADVAPI32.@)
1315 *
1316 * Retrieves the next type of CSP supported.
1317 *
1318 * PARAMS
1319 * dwIndex [I] Index of the next provider to be enumerated.
1320 * pdwReserved [I] Reserved for future use and must be NULL.
1321 * dwFlags [I] Reserved for future use and must be zero.
1322 * pdwProvType [O] DWORD designating the type of the provider.
1323 * pszTypeName [O] Buffer that receives data from the provider type.
1324 * pcbTypeName [I/O] Specifies the size of pszTypeName. Contains the number
1325 * of bytes stored in the buffer on return.
1326 *
1327 * RETURNS
1328 * Success: TRUE
1329 * Failure: FALSE
1330 *
1331 * NOTES
1332 * If pszTypeName is NULL, CryptEnumProviderTypesW sets the size of the name
1333 * for memory allocation purposes.
1334 */
1336 DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszTypeName, DWORD *pcbTypeName)
1337{
1338 HKEY hKey, hSubkey;
1339 DWORD keylen, numkeys, dwType;
1340 PWSTR keyname, ch;
1341 DWORD result;
1342 static const WCHAR KEYSTR[] = {
1343 'S','o','f','t','w','a','r','e','\\',
1344 'M','i','c','r','o','s','o','f','t','\\',
1345 'C','r','y','p','t','o','g','r','a','p','h','y','\\',
1346 'D','e','f','a','u','l','t','s','\\',
1347 'P','r','o','v','i','d','e','r',' ','T','y','p','e','s',0
1348 };
1349 static const WCHAR typenameW[] = {'T','y','p','e','N','a','m','e',0};
1350
1351 TRACE("(%d, %p, %08x, %p, %p, %p)\n", dwIndex, pdwReserved,
1352 dwFlags, pdwProvType, pszTypeName, pcbTypeName);
1353
1354 if (pdwReserved || !pdwProvType || !pcbTypeName)
1355 {
1357 return FALSE;
1358 }
1359 if (dwFlags)
1360 {
1362 return FALSE;
1363 }
1364
1365 if (RegOpenKeyW(HKEY_LOCAL_MACHINE, KEYSTR, &hKey))
1366 return FALSE;
1367
1368 RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &numkeys, &keylen, NULL, NULL, NULL, NULL, NULL, NULL);
1369 if (dwIndex >= numkeys)
1370 {
1373 return FALSE;
1374 }
1375 keylen++;
1376 if ( !(keyname = CRYPT_Alloc(keylen*sizeof(WCHAR))) )
1377 {
1380 return FALSE;
1381 }
1382 if ( RegEnumKeyW(hKey, dwIndex, keyname, keylen) ) {
1383 CRYPT_Free(keyname);
1385 return FALSE;
1386 }
1387 RegOpenKeyW(hKey, keyname, &hSubkey);
1389
1390 ch = keyname + strlenW(keyname);
1391 /* Convert "Type 000" to 0, etc/ */
1392 *pdwProvType = *(--ch) - '0';
1393 *pdwProvType += (*(--ch) - '0') * 10;
1394 *pdwProvType += (*(--ch) - '0') * 100;
1395 CRYPT_Free(keyname);
1396
1397 result = RegQueryValueExW(hSubkey, typenameW, NULL, &dwType, (LPBYTE)pszTypeName, pcbTypeName);
1398 if (result)
1399 {
1401 RegCloseKey(hSubkey);
1402 return FALSE;
1403 }
1404
1405 RegCloseKey(hSubkey);
1406 return TRUE;
1407}
1408
1409/******************************************************************************
1410 * CryptEnumProviderTypesA (ADVAPI32.@)
1411 *
1412 * See CryptEnumProviderTypesW.
1413 */
1415 DWORD dwFlags, DWORD *pdwProvType, LPSTR pszTypeName, DWORD *pcbTypeName)
1416{
1417 PWSTR str = NULL;
1418 DWORD bufsize;
1419 BOOL ret;
1420
1421 TRACE("(%d, %p, %08x, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
1422 pdwProvType, pszTypeName, pcbTypeName);
1423
1424 if(!CryptEnumProviderTypesW(dwIndex, pdwReserved, dwFlags, pdwProvType, NULL, &bufsize))
1425 return FALSE;
1426 if ( pszTypeName && !(str = CRYPT_Alloc(bufsize)) )
1427 {
1429 return FALSE;
1430 }
1431 ret = CryptEnumProviderTypesW(dwIndex, pdwReserved, dwFlags, pdwProvType, str, &bufsize);
1432 if (str)
1433 CRYPT_UnicodeToANSI(str, &pszTypeName, *pcbTypeName);
1434 *pcbTypeName = bufsize / sizeof(WCHAR);
1435 if (str)
1436 {
1437 CRYPT_Free(str);
1439 {
1441 return FALSE;
1442 }
1443 }
1444 return ret;
1445}
1446
1447/******************************************************************************
1448 * CryptExportKey (ADVAPI32.@)
1449 *
1450 * Exports a cryptographic key from a CSP.
1451 *
1452 * PARAMS
1453 * hKey [I] Handle to the key to export.
1454 * hExpKey [I] Handle to a cryptographic key of the end user.
1455 * dwBlobType [I] Type of BLOB to be exported.
1456 * dwFlags [I] CRYPT_DESTROYKEY/SSL2_FALLBACK/OAEP.
1457 * pbData [O] Buffer to receive BLOB data.
1458 * pdwDataLen [I/O] Specifies the size of pbData.
1459 *
1460 * RETURNS
1461 * Success: TRUE
1462 * Failure: FALSE
1463 *
1464 * NOTES
1465 * if pbData is NULL, CryptExportKey sets pdwDataLen as the size of the
1466 * buffer needed to hold the BLOB.
1467 */
1469 DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
1470{
1471 PCRYPTPROV prov;
1472 PCRYPTKEY key = (PCRYPTKEY)hKey, expkey = (PCRYPTKEY)hExpKey;
1473
1474 TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p)\n", hKey, hExpKey, dwBlobType, dwFlags, pbData, pdwDataLen);
1475
1476#ifdef __REACTOS__
1477 _SEH2_TRY
1478 {
1479#endif
1480 if (!key || !pdwDataLen || !key->pProvider ||
1481 key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV)
1482 {
1484 return FALSE;
1485 }
1486
1487 prov = key->pProvider;
1488 return prov->pFuncs->pCPExportKey(prov->hPrivate, key->hPrivate, expkey ? expkey->hPrivate : 0,
1489 dwBlobType, dwFlags, pbData, pdwDataLen);
1490#ifdef __REACTOS__
1491 }
1493 {
1495 _SEH2_YIELD(return FALSE);
1496 }
1497 _SEH2_END;
1498#endif
1499}
1500
1501/******************************************************************************
1502 * CryptGenKey (ADVAPI32.@)
1503 *
1504 * Generates a random cryptographic session key or a pub/priv key pair.
1505 *
1506 * PARAMS
1507 * hProv [I] Handle to a CSP.
1508 * Algid [I] Algorithm to use to make key.
1509 * dwFlags [I] Specifies type of key to make.
1510 * phKey [I] Address of the handle to which the new key is copied.
1511 *
1512 * RETURNS
1513 * Success: TRUE
1514 * Failure: FALSE
1515 */
1517{
1518 PCRYPTPROV prov = (PCRYPTPROV)hProv;
1519 PCRYPTKEY key;
1520
1521 TRACE("(0x%lx, %d, %08x, %p)\n", hProv, Algid, dwFlags, phKey);
1522
1523 if (!phKey || !prov || prov->dwMagic != MAGIC_CRYPTPROV)
1524 {
1526 return FALSE;
1527 }
1528 if ( !(key = CRYPT_Alloc(sizeof(CRYPTKEY))) )
1529 {
1531 return FALSE;
1532 }
1533
1534 key->pProvider = prov;
1535 key->dwMagic = MAGIC_CRYPTKEY;
1536 if (prov->pFuncs->pCPGenKey(prov->hPrivate, Algid, dwFlags, &key->hPrivate))
1537 {
1538 *phKey = (HCRYPTKEY)key;
1539 return TRUE;
1540 }
1541
1542 /* CSP error! */
1543 key->dwMagic = 0;
1544 CRYPT_Free(key);
1545 return FALSE;
1546}
1547
1548/******************************************************************************
1549 * CryptGetDefaultProviderW (ADVAPI32.@)
1550 *
1551 * Finds the default CSP of a certain provider type.
1552 *
1553 * PARAMS
1554 * dwProvType [I] Provider type to look for.
1555 * pdwReserved [I] Reserved for future use and must be NULL.
1556 * dwFlags [I] CRYPT_MACHINE_DEFAULT/USER_DEFAULT
1557 * pszProvName [O] Name of the default CSP.
1558 * pcbProvName [I/O] Size of pszProvName
1559 *
1560 * RETURNS
1561 * Success: TRUE
1562 * Failure: FALSE
1563 *
1564 * NOTES
1565 * If pszProvName is NULL, pcbProvName will hold the size of the buffer for
1566 * memory allocation purposes on return.
1567 */
1569 DWORD dwFlags, LPWSTR pszProvName, DWORD *pcbProvName)
1570{
1571 HKEY hKey;
1572 PWSTR keyname;
1573 DWORD result;
1574 static const WCHAR nameW[] = {'N','a','m','e',0};
1575
1576 if (pdwReserved || !pcbProvName)
1577 {
1579 return FALSE;
1580 }
1582 {
1584 return FALSE;
1585 }
1586 if (dwProvType > 999)
1587 {
1589 return FALSE;
1590 }
1591 if ( !(keyname = CRYPT_GetTypeKeyName(dwProvType, dwFlags & CRYPT_USER_DEFAULT)) )
1592 {
1594 return FALSE;
1595 }
1597 {
1598 CRYPT_Free(keyname);
1600 return FALSE;
1601 }
1602 CRYPT_Free(keyname);
1603
1604 result = RegQueryValueExW(hKey, nameW, NULL, NULL, (LPBYTE)pszProvName, pcbProvName);
1606
1607 if (result)
1608 {
1609 if (result != ERROR_MORE_DATA)
1611 else
1613
1614 return FALSE;
1615 }
1616
1617 return TRUE;
1618}
1619
1620/******************************************************************************
1621 * CryptGetDefaultProviderA (ADVAPI32.@)
1622 *
1623 * See CryptGetDefaultProviderW.
1624 */
1626 DWORD dwFlags, LPSTR pszProvName, DWORD *pcbProvName)
1627{
1628 PWSTR str = NULL;
1629 DWORD bufsize;
1630 BOOL ret;
1631
1632 TRACE("(%d, %p, %08x, %p, %p)\n", dwProvType, pdwReserved, dwFlags, pszProvName, pcbProvName);
1633
1634 CryptGetDefaultProviderW(dwProvType, pdwReserved, dwFlags, NULL, &bufsize);
1635 if ( pszProvName && !(str = CRYPT_Alloc(bufsize)) )
1636 {
1638 return FALSE;
1639 }
1640 ret = CryptGetDefaultProviderW(dwProvType, pdwReserved, dwFlags, str, &bufsize);
1641 if (str)
1642 CRYPT_UnicodeToANSI(str, &pszProvName, *pcbProvName);
1643 *pcbProvName = bufsize / sizeof(WCHAR);
1644 if (str)
1645 {
1646 CRYPT_Free(str);
1648 {
1650 return FALSE;
1651 }
1652 }
1653 return ret;
1654}
1655
1656/******************************************************************************
1657 * CryptGetHashParam (ADVAPI32.@)
1658 *
1659 * Retrieves data that controls the operations of a hash object.
1660 *
1661 * PARAMS
1662 * hHash [I] Handle of the hash object to question.
1663 * dwParam [I] Query type.
1664 * pbData [O] Buffer that receives the value data.
1665 * pdwDataLen [I/O] Size of the pbData buffer.
1666 * dwFlags [I] Reserved for future use and must be zero.
1667 *
1668 * RETURNS
1669 * Success: TRUE
1670 * Failure: FALSE
1671 *
1672 * NOTES
1673 * If pbData is NULL, pdwDataLen will contain the length required.
1674 */
1676 DWORD *pdwDataLen, DWORD dwFlags)
1677{
1678 PCRYPTPROV prov;
1679 PCRYPTHASH hash = (PCRYPTHASH)hHash;
1680
1681 TRACE("(0x%lx, %d, %p, %p, %08x)\n", hHash, dwParam, pbData, pdwDataLen, dwFlags);
1682
1683 if (!hash || !pdwDataLen || !hash->pProvider ||
1684 hash->dwMagic != MAGIC_CRYPTHASH || hash->pProvider->dwMagic != MAGIC_CRYPTPROV)
1685 {
1687 return FALSE;
1688 }
1689
1690 prov = hash->pProvider;
1691 return prov->pFuncs->pCPGetHashParam(prov->hPrivate, hash->hPrivate, dwParam,
1692 pbData, pdwDataLen, dwFlags);
1693}
1694
1695/******************************************************************************
1696 * CryptGetKeyParam (ADVAPI32.@)
1697 *
1698 * Retrieves data that controls the operations of a key.
1699 *
1700 * PARAMS
1701 * hKey [I] Handle to they key in question.
1702 * dwParam [I] Specifies query type.
1703 * pbData [O] Sequence of bytes to receive data.
1704 * pdwDataLen [I/O] Size of pbData.
1705 * dwFlags [I] Reserved for future use and must be zero.
1706 *
1707 * RETURNS
1708 * Success: TRUE
1709 * Failure: FALSE
1710 *
1711 * NOTES
1712 * If pbData is NULL, pdwDataLen is set to the needed length of the buffer.
1713 */
1715 DWORD *pdwDataLen, DWORD dwFlags)
1716{
1717 PCRYPTPROV prov;
1719
1720 TRACE("(0x%lx, %d, %p, %p, %08x)\n", hKey, dwParam, pbData, pdwDataLen, dwFlags);
1721
1722 if (!key || !pdwDataLen || !key->pProvider ||
1723 key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV)
1724 {
1726 return FALSE;
1727 }
1728
1729 prov = key->pProvider;
1730 return prov->pFuncs->pCPGetKeyParam(prov->hPrivate, key->hPrivate, dwParam,
1731 pbData, pdwDataLen, dwFlags);
1732}
1733
1734/******************************************************************************
1735 * CryptGetProvParam (ADVAPI32.@)
1736 *
1737 * Retrieves parameters that control the operations of a CSP.
1738 *
1739 * PARAMS
1740 * hProv [I] Handle of the CSP in question.
1741 * dwParam [I] Specifies query type.
1742 * pbData [O] Buffer to receive the data.
1743 * pdwDataLen [I/O] Size of pbData.
1744 * dwFlags [I] see MSDN Docs.
1745 *
1746 * RETURNS
1747 * Success: TRUE
1748 * Failure: FALSE
1749 *
1750 * NOTES
1751 * If pbData is NULL, pdwDataLen is set to the needed buffer length.
1752 */
1754 DWORD *pdwDataLen, DWORD dwFlags)
1755{
1756 PCRYPTPROV prov = (PCRYPTPROV)hProv;
1757
1758 TRACE("(0x%lx, %d, %p, %p, %08x)\n", hProv, dwParam, pbData, pdwDataLen, dwFlags);
1759
1760 if (!prov || prov->dwMagic != MAGIC_CRYPTPROV)
1761 {
1763 return FALSE;
1764 }
1765
1766 return prov->pFuncs->pCPGetProvParam(prov->hPrivate, dwParam, pbData, pdwDataLen, dwFlags);
1767}
1768
1769/******************************************************************************
1770 * CryptGetUserKey (ADVAPI32.@)
1771 *
1772 * Gets a handle of one of a user's two public/private key pairs.
1773 *
1774 * PARAMS
1775 * hProv [I] Handle of a CSP.
1776 * dwKeySpec [I] Private key to use.
1777 * phUserKey [O] Pointer to the handle of the retrieved keys.
1778 *
1779 * RETURNS
1780 * Success: TRUE
1781 * Failure: FALSE
1782 */
1784{
1785 PCRYPTPROV prov = (PCRYPTPROV)hProv;
1786 PCRYPTKEY key;
1787
1788 TRACE("(0x%lx, %d, %p)\n", hProv, dwKeySpec, phUserKey);
1789
1790 if (!prov)
1791 {
1793 return FALSE;
1794 }
1795 if (!phUserKey || prov->dwMagic != MAGIC_CRYPTPROV)
1796 {
1798 return FALSE;
1799 }
1800 if ( !(key = CRYPT_Alloc(sizeof(CRYPTKEY))) )
1801 {
1803 return FALSE;
1804 }
1805
1806 key->pProvider = prov;
1807 key->dwMagic = MAGIC_CRYPTKEY;
1808 if (prov->pFuncs->pCPGetUserKey(prov->hPrivate, dwKeySpec, &key->hPrivate))
1809 {
1810 *phUserKey = (HCRYPTKEY)key;
1811 return TRUE;
1812 }
1813
1814 /* CSP Error */
1815 key->dwMagic = 0;
1816 CRYPT_Free(key);
1817 *phUserKey = 0;
1818 return FALSE;
1819}
1820
1821/******************************************************************************
1822 * CryptHashData (ADVAPI32.@)
1823 *
1824 * Adds data to a hash object.
1825 *
1826 * PARAMS
1827 * hHash [I] Handle of the hash object.
1828 * pbData [I] Buffer of data to be hashed.
1829 * dwDataLen [I] Number of bytes to add.
1830 * dwFlags [I] Can be CRYPT_USERDATA
1831 *
1832 * RETURNS
1833 * Success: TRUE
1834 * Failure: FALSE
1835 */
1836BOOL WINAPI CryptHashData (HCRYPTHASH hHash, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags)
1837{
1838 PCRYPTHASH hash = (PCRYPTHASH)hHash;
1839 PCRYPTPROV prov;
1840
1841 TRACE("(0x%lx, %p, %d, %08x)\n", hHash, pbData, dwDataLen, dwFlags);
1842
1843 if (!hash)
1844 {
1846 return FALSE;
1847 }
1848 if (!hash->pProvider || hash->dwMagic != MAGIC_CRYPTHASH ||
1849 hash->pProvider->dwMagic != MAGIC_CRYPTPROV)
1850 {
1852 return FALSE;
1853 }
1854
1855 prov = hash->pProvider;
1856 return prov->pFuncs->pCPHashData(prov->hPrivate, hash->hPrivate, pbData, dwDataLen, dwFlags);
1857}
1858
1859/******************************************************************************
1860 * CryptHashSessionKey (ADVAPI32.@)
1861 *
1862 * Compute the cryptographic hash of a session key object.
1863 *
1864 * PARAMS
1865 * hHash [I] Handle to the hash object.
1866 * hKey [I] Handle to the key to be hashed.
1867 * dwFlags [I] Can be CRYPT_LITTLE_ENDIAN.
1868 *
1869 * RETURNS
1870 * Success: TRUE
1871 * Failure: FALSE
1872 */
1874{
1875 PCRYPTHASH hash = (PCRYPTHASH)hHash;
1877 PCRYPTPROV prov;
1878
1879 TRACE("(0x%lx, 0x%lx, %08x)\n", hHash, hKey, dwFlags);
1880
1881 if (!hash || !key)
1882 {
1884 return FALSE;
1885 }
1886
1887 if (!hash->pProvider || hash->dwMagic != MAGIC_CRYPTHASH ||
1888 hash->pProvider->dwMagic != MAGIC_CRYPTPROV || key->dwMagic != MAGIC_CRYPTKEY)
1889 {
1891 return FALSE;
1892 }
1893
1894 prov = hash->pProvider;
1895 return prov->pFuncs->pCPHashSessionKey(prov->hPrivate, hash->hPrivate, key->hPrivate, dwFlags);
1896}
1897
1898/******************************************************************************
1899 * CryptImportKey (ADVAPI32.@)
1900 *
1901 * Transfer a cryptographic key from a key BLOB into a cryptographic service provider (CSP).
1902 *
1903 * PARAMS
1904 * hProv [I] Handle of a CSP.
1905 * pbData [I] Contains the key to be imported.
1906 * dwDataLen [I] Length of the key.
1907 * hPubKey [I] Cryptographic key that decrypts pdData
1908 * dwFlags [I] Used only with a public/private key pair.
1909 * phKey [O] Imported key.
1910 *
1911 * RETURNS
1912 * Success: TRUE
1913 * Failure: FALSE
1914 */
1916 HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey)
1917{
1918 PCRYPTPROV prov = (PCRYPTPROV)hProv;
1919 PCRYPTKEY pubkey = (PCRYPTKEY)hPubKey, importkey;
1920
1921 TRACE("(0x%lx, %p, %d, 0x%lx, %08x, %p)\n", hProv, pbData, dwDataLen, hPubKey, dwFlags, phKey);
1922
1923 if (!prov || !pbData || !dwDataLen || !phKey ||
1924 prov->dwMagic != MAGIC_CRYPTPROV ||
1925 (pubkey && pubkey->dwMagic != MAGIC_CRYPTKEY))
1926 {
1928 return FALSE;
1929 }
1930
1931 if ( !(importkey = CRYPT_Alloc(sizeof(CRYPTKEY))) )
1932 {
1934 return FALSE;
1935 }
1936
1937 importkey->pProvider = prov;
1938 importkey->dwMagic = MAGIC_CRYPTKEY;
1939 if (prov->pFuncs->pCPImportKey(prov->hPrivate, pbData, dwDataLen,
1940 pubkey ? pubkey->hPrivate : 0, dwFlags, &importkey->hPrivate))
1941 {
1942 *phKey = (HCRYPTKEY)importkey;
1943 return TRUE;
1944 }
1945
1946 importkey->dwMagic = 0;
1947 CRYPT_Free(importkey);
1948 return FALSE;
1949}
1950
1951/******************************************************************************
1952 * CryptSignHashW (ADVAPI32.@)
1953 *
1954 * Signs data.
1955 *
1956 * PARAMS
1957 * hHash [I] Handle of the hash object to be signed.
1958 * dwKeySpec [I] Private key to use.
1959 * sDescription [I] Should be NULL.
1960 * dwFlags [I] CRYPT_NOHASHOID/X931_FORMAT.
1961 * pbSignature [O] Buffer of the signature data.
1962 * pdwSigLen [I/O] Size of the pbSignature buffer.
1963 *
1964 * RETURNS
1965 * Success: TRUE
1966 * Failure: FALSE
1967 *
1968 * NOTES
1969 * Because of security flaws sDescription should not be used and should thus be
1970 * NULL. It is supported only for compatibility with Microsoft's Cryptographic
1971 * Providers.
1972 */
1973BOOL WINAPI CryptSignHashW (HCRYPTHASH hHash, DWORD dwKeySpec, LPCWSTR sDescription,
1974 DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen)
1975{
1976 PCRYPTHASH hash = (PCRYPTHASH)hHash;
1977 PCRYPTPROV prov;
1978
1979 TRACE("(0x%lx, %d, %s, %08x, %p, %p)\n",
1980 hHash, dwKeySpec, debugstr_w(sDescription), dwFlags, pbSignature, pdwSigLen);
1981
1982 if (!hash)
1983 {
1985 return FALSE;
1986 }
1987 if (!pdwSigLen || !hash->pProvider || hash->dwMagic != MAGIC_CRYPTHASH ||
1988 hash->pProvider->dwMagic != MAGIC_CRYPTPROV)
1989 {
1991 return FALSE;
1992 }
1993
1994 prov = hash->pProvider;
1995 return prov->pFuncs->pCPSignHash(prov->hPrivate, hash->hPrivate, dwKeySpec, sDescription,
1996 dwFlags, pbSignature, pdwSigLen);
1997}
1998
1999/******************************************************************************
2000 * CryptSignHashA (ADVAPI32.@)
2001 *
2002 * See CryptSignHashW.
2003 */
2004BOOL WINAPI CryptSignHashA (HCRYPTHASH hHash, DWORD dwKeySpec, LPCSTR sDescription,
2005 DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen)
2006{
2007 LPWSTR wsDescription;
2008 BOOL result;
2009
2010 TRACE("(0x%lx, %d, %s, %08x, %p, %p)\n",
2011 hHash, dwKeySpec, debugstr_a(sDescription), dwFlags, pbSignature, pdwSigLen);
2012
2013 CRYPT_ANSIToUnicode(sDescription, &wsDescription, -1);
2014 result = CryptSignHashW(hHash, dwKeySpec, wsDescription, dwFlags, pbSignature, pdwSigLen);
2015 CRYPT_Free(wsDescription);
2016
2017 return result;
2018}
2019
2020/******************************************************************************
2021 * CryptSetHashParam (ADVAPI32.@)
2022 *
2023 * Customizes the operations of a hash object.
2024 *
2025 * PARAMS
2026 * hHash [I] Handle of the hash object to set parameters.
2027 * dwParam [I] HP_HMAC_INFO/HASHVAL.
2028 * pbData [I] Value data buffer.
2029 * dwFlags [I] Reserved for future use and must be zero.
2030 *
2031 * RETURNS
2032 * Success: TRUE
2033 * Failure: FALSE
2034 */
2036{
2037 PCRYPTPROV prov;
2038 PCRYPTHASH hash = (PCRYPTHASH)hHash;
2039
2040 TRACE("(0x%lx, %d, %p, %08x)\n", hHash, dwParam, pbData, dwFlags);
2041
2042 if (!hash || !pbData || !hash->pProvider ||
2043 hash->dwMagic != MAGIC_CRYPTHASH || hash->pProvider->dwMagic != MAGIC_CRYPTPROV)
2044 {
2046 return FALSE;
2047 }
2048
2049 prov = hash->pProvider;
2050 return prov->pFuncs->pCPSetHashParam(prov->hPrivate, hash->hPrivate,
2051 dwParam, pbData, dwFlags);
2052}
2053
2054/******************************************************************************
2055 * CryptSetKeyParam (ADVAPI32.@)
2056 *
2057 * Customizes a session key's operations.
2058 *
2059 * PARAMS
2060 * hKey [I] Handle to the key to set values.
2061 * dwParam [I] See MSDN Doc.
2062 * pbData [I] Buffer of values to set.
2063 * dwFlags [I] Only used when dwParam == KP_ALGID.
2064 *
2065 * RETURNS
2066 * Success: TRUE
2067 * Failure: FALSE
2068 */
2070{
2071 PCRYPTPROV prov;
2073
2074 TRACE("(0x%lx, %d, %p, %08x)\n", hKey, dwParam, pbData, dwFlags);
2075
2076 if (!key || !pbData || !key->pProvider ||
2077 key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV)
2078 {
2080 return FALSE;
2081 }
2082
2083 prov = key->pProvider;
2084 return prov->pFuncs->pCPSetKeyParam(prov->hPrivate, key->hPrivate,
2085 dwParam, pbData, dwFlags);
2086}
2087
2088/******************************************************************************
2089 * CryptSetProviderA (ADVAPI32.@)
2090 *
2091 * Specifies the current user's default CSP.
2092 *
2093 * PARAMS
2094 * pszProvName [I] Name of the new default CSP.
2095 * dwProvType [I] Provider type of the CSP.
2096 *
2097 * RETURNS
2098 * Success: TRUE
2099 * Failure: FALSE
2100 */
2101BOOL WINAPI CryptSetProviderA (LPCSTR pszProvName, DWORD dwProvType)
2102{
2103 TRACE("(%s, %d)\n", pszProvName, dwProvType);
2104 return CryptSetProviderExA(pszProvName, dwProvType, NULL, CRYPT_USER_DEFAULT);
2105}
2106
2107/******************************************************************************
2108 * CryptSetProviderW (ADVAPI32.@)
2109 *
2110 * See CryptSetProviderA.
2111 */
2112BOOL WINAPI CryptSetProviderW (LPCWSTR pszProvName, DWORD dwProvType)
2113{
2114 TRACE("(%s, %d)\n", debugstr_w(pszProvName), dwProvType);
2115 return CryptSetProviderExW(pszProvName, dwProvType, NULL, CRYPT_USER_DEFAULT);
2116}
2117
2118/******************************************************************************
2119 * CryptSetProviderExW (ADVAPI32.@)
2120 *
2121 * Specifies the default CSP.
2122 *
2123 * PARAMS
2124 * pszProvName [I] Name of the new default CSP.
2125 * dwProvType [I] Provider type of the CSP.
2126 * pdwReserved [I] Reserved for future use and must be NULL.
2127 * dwFlags [I] See MSDN Doc.
2128 *
2129 * RETURNS
2130 * Success: TRUE
2131 * Failure: FALSE
2132 */
2133BOOL WINAPI CryptSetProviderExW (LPCWSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags)
2134{
2135 HKEY hProvKey, hTypeKey;
2136 PWSTR keyname;
2137 static const WCHAR nameW[] = {'N','a','m','e',0};
2138
2139 TRACE("(%s, %d, %p, %08x)\n", debugstr_w(pszProvName), dwProvType, pdwReserved, dwFlags);
2140
2141 if (!pszProvName || pdwReserved)
2142 {
2144 return FALSE;
2145 }
2146 if (dwProvType > MAXPROVTYPES)
2147 {
2149 return FALSE;
2150 }
2153 {
2155 return FALSE;
2156 }
2157
2158 if (!(keyname = CRYPT_GetTypeKeyName(dwProvType, dwFlags & CRYPT_USER_DEFAULT)))
2159 {
2161 return FALSE;
2162 }
2164 keyname, &hTypeKey))
2165 {
2166 CRYPT_Free(keyname);
2168 return FALSE;
2169 }
2170 CRYPT_Free(keyname);
2171
2173 {
2174 RegDeleteValueW(hTypeKey, nameW);
2175 }
2176 else
2177 {
2178 if (!(keyname = CRYPT_GetProvKeyName(pszProvName)))
2179 {
2180 RegCloseKey(hTypeKey);
2182 return FALSE;
2183 }
2185 keyname, &hProvKey))
2186 {
2187 CRYPT_Free(keyname);
2188 RegCloseKey(hTypeKey);
2190 return FALSE;
2191 }
2192 CRYPT_Free(keyname);
2193
2194 if (RegSetValueExW(hTypeKey, nameW, 0, REG_SZ, (const BYTE *)pszProvName,
2195 (strlenW(pszProvName) + 1)*sizeof(WCHAR)))
2196 {
2197 RegCloseKey(hTypeKey);
2198 RegCloseKey(hProvKey);
2199 return FALSE;
2200 }
2201
2202 RegCloseKey(hProvKey);
2203 }
2204 RegCloseKey(hTypeKey);
2205
2206 return TRUE;
2207}
2208
2209/******************************************************************************
2210 * CryptSetProviderExA (ADVAPI32.@)
2211 *
2212 * See CryptSetProviderExW.
2213 */
2214BOOL WINAPI CryptSetProviderExA (LPCSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags)
2215{
2216 BOOL ret = FALSE;
2217 PWSTR str = NULL;
2218
2219 TRACE("(%s, %d, %p, %08x)\n", pszProvName, dwProvType, pdwReserved, dwFlags);
2220
2221 if (CRYPT_ANSIToUnicode(pszProvName, &str, -1))
2222 {
2223 ret = CryptSetProviderExW(str, dwProvType, pdwReserved, dwFlags);
2224 CRYPT_Free(str);
2225 }
2226 return ret;
2227}
2228
2229/******************************************************************************
2230 * CryptSetProvParam (ADVAPI32.@)
2231 *
2232 * Customizes the operations of a CSP.
2233 *
2234 * PARAMS
2235 * hProv [I] Handle of a CSP.
2236 * dwParam [I] See MSDN Doc.
2237 * pbData [I] Buffer that contains a value to set as a parameter.
2238 * dwFlags [I] if dwParam is PP_USE_HARDWARE_RNG, dwFlags must be zero.
2239 *
2240 * RETURNS
2241 * Success: TRUE
2242 * Failure: FALSE
2243 */
2245{
2246 PCRYPTPROV prov = (PCRYPTPROV)hProv;
2247
2248 TRACE("(0x%lx, %d, %p, %08x)\n", hProv, dwParam, pbData, dwFlags);
2249
2250 if (!prov)
2251 {
2253 return FALSE;
2254 }
2255 if (prov->dwMagic != MAGIC_CRYPTPROV)
2256 {
2258 return FALSE;
2259 }
2260 if (dwParam == PP_USE_HARDWARE_RNG)
2261 {
2262 FIXME("PP_USE_HARDWARE_RNG: What do I do with this?\n");
2263 FIXME("\tLetting the CSP decide.\n");
2264 }
2265 if (dwFlags & PP_CLIENT_HWND)
2266 {
2267 /* FIXME: Should verify the parameter */
2268 if (pbData /* && IsWindow((HWND)pbData) */)
2269 {
2270 crypt_hWindow = (HWND)(pbData);
2271 return TRUE;
2272 } else {
2274 return FALSE;
2275 }
2276 }
2277 /* All other flags go to the CSP */
2278 return prov->pFuncs->pCPSetProvParam(prov->hPrivate, dwParam, pbData, dwFlags);
2279}
2280
2281/******************************************************************************
2282 * CryptVerifySignatureW (ADVAPI32.@)
2283 *
2284 * Verifies the signature of a hash object.
2285 *
2286 * PARAMS
2287 * hHash [I] Handle of the hash object to verify.
2288 * pbSignature [I] Signature data to verify.
2289 * dwSigLen [I] Size of pbSignature.
2290 * hPubKey [I] Handle to the public key to authenticate signature.
2291 * sDescription [I] Should be NULL.
2292 * dwFlags [I] See MSDN doc.
2293 *
2294 * RETURNS
2295 * Success: TRUE
2296 * Failure: FALSE
2297 *
2298 * NOTES
2299 * Because of security flaws sDescription should not be used and should thus be
2300 * NULL. It is supported only for compatibility with Microsoft's Cryptographic
2301 * Providers.
2302 */
2303BOOL WINAPI CryptVerifySignatureW (HCRYPTHASH hHash, const BYTE *pbSignature, DWORD dwSigLen,
2304 HCRYPTKEY hPubKey, LPCWSTR sDescription, DWORD dwFlags)
2305{
2306 PCRYPTHASH hash = (PCRYPTHASH)hHash;
2307 PCRYPTKEY key = (PCRYPTKEY)hPubKey;
2308 PCRYPTPROV prov;
2309
2310 TRACE("(0x%lx, %p, %d, 0x%lx, %s, %08x)\n", hHash, pbSignature,
2311 dwSigLen, hPubKey, debugstr_w(sDescription), dwFlags);
2312
2313 if (!hash || !key || key->dwMagic != MAGIC_CRYPTKEY || hash->dwMagic != MAGIC_CRYPTHASH ||
2314 !hash->pProvider || hash->pProvider->dwMagic != MAGIC_CRYPTPROV ||
2315 !key->pProvider || key->pProvider->dwMagic != MAGIC_CRYPTPROV)
2316 {
2318 return FALSE;
2319 }
2320
2321 prov = hash->pProvider;
2322 return prov->pFuncs->pCPVerifySignature(prov->hPrivate, hash->hPrivate, pbSignature, dwSigLen,
2323 key->hPrivate, sDescription, dwFlags);
2324}
2325
2326/******************************************************************************
2327 * CryptVerifySignatureA (ADVAPI32.@)
2328 *
2329 * See CryptVerifySignatureW.
2330 */
2331BOOL WINAPI CryptVerifySignatureA (HCRYPTHASH hHash, const BYTE *pbSignature, DWORD dwSigLen,
2332 HCRYPTKEY hPubKey, LPCSTR sDescription, DWORD dwFlags)
2333{
2334 LPWSTR wsDescription;
2335 BOOL result;
2336
2337 TRACE("(0x%lx, %p, %d, 0x%lx, %s, %08x)\n", hHash, pbSignature,
2338 dwSigLen, hPubKey, debugstr_a(sDescription), dwFlags);
2339
2340 CRYPT_ANSIToUnicode(sDescription, &wsDescription, -1);
2341 result = CryptVerifySignatureW(hHash, pbSignature, dwSigLen, hPubKey, wsDescription, dwFlags);
2342 CRYPT_Free(wsDescription);
2343
2344 return result;
2345}
2346
2347/******************************************************************************
2348 * OpenEncryptedFileRawA (ADVAPI32.@)
2349 *
2350 * See OpenEncryptedFileRawW
2351 */
2353{
2354 FIXME("(%s, %x, %p): stub\n", debugstr_a(filename), flags, context);
2356}
2357
2358/******************************************************************************
2359 * OpenEncryptedFileRawW (ADVAPI32.@)
2360 *
2361 * Opens an EFS encrypted file for backup/restore
2362 *
2363 * PARAMS
2364 * filename [I] Filename to operate on
2365 * flags [I] Operation to perform
2366 * context [I] Handle to the context (out)
2367 * RETURNS
2368 * Success: ERROR_SUCCESS
2369 * Failure: NTSTATUS error code
2370 */
2372{
2373 FIXME("(%s, %x, %p): stub\n", debugstr_w(filename), flags, context);
2375}
2376
2377/******************************************************************************
2378 * ReadEncryptedFileRaw (ADVAPI32.@)
2379 *
2380 * Export encrypted files
2381 *
2382 * PARAMS
2383 * export [I] pointer to the export callback function
2384 * callback [I] pointer to the application defined context
2385 * context [I] pointer to the system context
2386 * RETURNS
2387 * Success: ERROR_SUCCESS
2388 * Failure: NTSTATUS error code
2389 */
2391{
2392 FIXME("(%p, %p, %p): stub\n", export, callback, context);
2394}
2395
2396#ifndef __REACTOS__
2397/******************************************************************************
2398 * SystemFunction030 (ADVAPI32.@)
2399 *
2400 * Tests if two blocks of 16 bytes are equal
2401 *
2402 * PARAMS
2403 * b1,b2 [I] block of 16 bytes
2404 *
2405 * RETURNS
2406 * TRUE if blocks are the same
2407 * FALSE if blocks are different
2408 */
2410{
2411 return !memcmp(b1, b2, 0x10);
2412}
2413
2414/******************************************************************************
2415 * SystemFunction035 (ADVAPI32.@)
2416 *
2417 * Described here:
2418http://disc.server.com/discussion.cgi?disc=148775;article=942;title=Coding%2FASM%2FSystem
2419 *
2420 * NOTES
2421 * Stub, always return TRUE.
2422 */
2424{
2425 FIXME("%s: stub\n", debugstr_a(lpszDllFilePath));
2426 return TRUE;
2427}
2428
2429/******************************************************************************
2430 * SystemFunction036 (ADVAPI32.@)
2431 *
2432 * MSDN documents this function as RtlGenRandom and declares it in ntsecapi.h
2433 *
2434 * PARAMS
2435 * pbBuffer [O] Pointer to memory to receive random bytes.
2436 * dwLen [I] Number of random bytes to fetch.
2437 *
2438 * RETURNS
2439 * Success: TRUE
2440 * Failure: FALSE
2441 */
2442
2444{
2445 int dev_random;
2446
2447 dev_random = open("/dev/urandom", O_RDONLY);
2448 if (dev_random != -1)
2449 {
2450 if (!IsBadWritePtr( pbBuffer, dwLen ) &&
2451 read(dev_random, pbBuffer, dwLen) == (ssize_t)dwLen)
2452 {
2453 close(dev_random);
2454 return TRUE;
2455 }
2456 close(dev_random);
2457 }
2458 else
2459 FIXME("couldn't open /dev/urandom\n");
2461 return FALSE;
2462}
2463
2464/*
2465 These functions have nearly identical prototypes to CryptProtectMemory and CryptUnprotectMemory,
2466 in crypt32.dll.
2467 */
2468
2469/******************************************************************************
2470 * SystemFunction040 (ADVAPI32.@)
2471 *
2472 * MSDN documents this function as RtlEncryptMemory and declares it in ntsecapi.h.
2473 *
2474 * PARAMS
2475 * memory [I/O] Pointer to memory to encrypt.
2476 * length [I] Length of region to encrypt in bytes.
2477 * flags [I] Control whether other processes are able to decrypt the memory.
2478 * RTL_ENCRYPT_OPTION_SAME_PROCESS
2479 * RTL_ENCRYPT_OPTION_CROSS_PROCESS
2480 * RTL_ENCRYPT_OPTION_SAME_LOGON
2481 *
2482 * RETURNS
2483 * Success: STATUS_SUCCESS
2484 * Failure: NTSTATUS error code
2485 *
2486 * NOTES
2487 * length must be a multiple of RTL_ENCRYPT_MEMORY_SIZE.
2488 * If flags are specified when encrypting, the same flag value must be given
2489 * when decrypting the memory.
2490 */
2492{
2493 FIXME("(%p, %x, %x): stub [RtlEncryptMemory]\n", memory, length, flags);
2494 return STATUS_SUCCESS;
2495}
2496
2497/******************************************************************************
2498 * SystemFunction041 (ADVAPI32.@)
2499 *
2500 * MSDN documents this function as RtlDecryptMemory and declares it in ntsecapi.h.
2501 *
2502 * PARAMS
2503 * memory [I/O] Pointer to memory to decrypt.
2504 * length [I] Length of region to decrypt in bytes.
2505 * flags [I] Control whether other processes are able to decrypt the memory.
2506 * RTL_ENCRYPT_OPTION_SAME_PROCESS
2507 * RTL_ENCRYPT_OPTION_CROSS_PROCESS
2508 * RTL_ENCRYPT_OPTION_SAME_LOGON
2509 *
2510 * RETURNS
2511 * Success: STATUS_SUCCESS
2512 * Failure: NTSTATUS error code
2513 *
2514 * NOTES
2515 * length must be a multiple of RTL_ENCRYPT_MEMORY_SIZE.
2516 * If flags are specified when encrypting, the same flag value must be given
2517 * when decrypting the memory.
2518 */
2520{
2521 FIXME("(%p, %x, %x): stub [RtlDecryptMemory]\n", memory, length, flags);
2522 return STATUS_SUCCESS;
2523}
2524#endif /* !__REACTOS __ */
2525
2526/******************************************************************************
2527 * WriteEncryptedFileRaw (ADVAPI32.@)
2528 *
2529 * Import encrypted files
2530 *
2531 * PARAMS
2532 * import [I] pointer to the import callback function
2533 * callback [I] pointer to the application defined context
2534 * context [I] pointer to the system context
2535 * RETURNS
2536 * Success: ERROR_SUCCESS
2537 * Failure: NTSTATUS error code
2538 */
2540{
2541 FIXME("(%p, %p, %p): stub\n", import, callback, context);
2543}
unsigned char BOOLEAN
Definition: actypes.h:127
#define read
Definition: acwin.h:96
#define close
Definition: acwin.h:98
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
LONG NTSTATUS
Definition: precomp.h:26
static const WCHAR nameW[]
Definition: main.c:49
void user(int argc, const char *argv[])
Definition: cmds.c:1350
#define FIXME(fmt,...)
Definition: precomp.h:53
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
Definition: reg.c:2330
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Definition: reg.c:3662
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
Definition: reg.c:2393
#define CRYPT_Free(buffer)
Definition: crypt.c:62
BOOL WINAPI CryptExportKey(HCRYPTKEY hKey, HCRYPTKEY hExpKey, DWORD dwBlobType, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
Definition: crypt.c:1468
BOOL WINAPI CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash)
Definition: crypt.c:753
BOOL WINAPI CryptGenRandom(HCRYPTPROV hProv, DWORD dwLen, BYTE *pbBuffer)
Definition: crypt.c:713
BOOL WINAPI SystemFunction035(LPCSTR lpszDllFilePath)
Definition: crypt.c:2423
BOOL WINAPI CryptSetProvParam(HCRYPTPROV hProv, DWORD dwParam, const BYTE *pbData, DWORD dwFlags)
Definition: crypt.c:2244
BOOL WINAPI CryptGetHashParam(HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
Definition: crypt.c:1675
DWORD WINAPI WriteEncryptedFileRaw(PFE_IMPORT_FUNC import, PVOID callback, PVOID context)
Definition: crypt.c:2539
BOOL WINAPI CryptDestroyKey(HCRYPTKEY hKey)
Definition: crypt.c:969
#define CRYPT_Alloc(size)
Definition: crypt.c:61
BOOL WINAPI CryptDestroyHash(HCRYPTHASH hHash)
Definition: crypt.c:929
static HWND crypt_hWindow
Definition: crypt.c:59
BOOL WINAPI CryptSignHashA(HCRYPTHASH hHash, DWORD dwKeySpec, LPCSTR sDescription, DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen)
Definition: crypt.c:2004
BOOL WINAPI CryptDuplicateKey(HCRYPTKEY hKey, DWORD *pdwReserved, DWORD dwFlags, HCRYPTKEY *phKey)
Definition: crypt.c:1068
BOOL WINAPI CryptEnumProvidersA(DWORD dwIndex, DWORD *pdwReserved, DWORD dwFlags, DWORD *pdwProvType, LPSTR pszProvName, DWORD *pcbProvName)
Definition: crypt.c:1280
BOOL WINAPI CryptVerifySignatureA(HCRYPTHASH hHash, const BYTE *pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCSTR sDescription, DWORD dwFlags)
Definition: crypt.c:2331
BOOL WINAPI CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
Definition: crypt.c:661
static PWSTR CRYPT_GetProvKeyName(PCWSTR pProvName)
Definition: crypt.c:64
BOOL WINAPI CryptDuplicateHash(HCRYPTHASH hHash, DWORD *pdwReserved, DWORD dwFlags, HCRYPTHASH *phHash)
Definition: crypt.c:1012
BOOL WINAPI CryptHashData(HCRYPTHASH hHash, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags)
Definition: crypt.c:1836
#define CRYPT_GetProvFunc(name)
Definition: crypt.c:200
BOOL WINAPI CryptAcquireContextA(HCRYPTPROV *phProv, LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
Definition: crypt.c:569
BOOL WINAPI CryptDeriveKey(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY *phKey)
Definition: crypt.c:877
BOOL WINAPI CryptEnumProviderTypesW(DWORD dwIndex, DWORD *pdwReserved, DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszTypeName, DWORD *pcbTypeName)
Definition: crypt.c:1335
void WINAPI CloseEncryptedFileRaw(PVOID context)
Definition: crypt.c:338
BOOL WINAPI CryptContextAddRef(HCRYPTPROV hProv, DWORD *pdwReserved, DWORD dwFlags)
Definition: crypt.c:613
#define CRYPT_GetProvFuncOpt(name)
Definition: crypt.c:202
static PCRYPTPROV CRYPT_LoadProvider(PCWSTR pImage)
Definition: crypt.c:204
static BOOL CALLBACK CRYPT_VerifyImage(LPCSTR lpszImage, BYTE *pData)
Definition: crypt.c:182
static void CALLBACK CRYPT_ReturnhWnd(HWND *phWnd)
Definition: crypt.c:195
BOOL WINAPI CryptGenKey(HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKEY *phKey)
Definition: crypt.c:1516
BOOL WINAPI CryptEnumProvidersW(DWORD dwIndex, DWORD *pdwReserved, DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszProvName, DWORD *pcbProvName)
Definition: crypt.c:1188
BOOL WINAPI CryptDecrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
Definition: crypt.c:826
BOOL WINAPI CryptSetProviderW(LPCWSTR pszProvName, DWORD dwProvType)
Definition: crypt.c:2112
BOOL WINAPI SystemFunction030(LPCVOID b1, LPCVOID b2)
Definition: crypt.c:2409
DWORD WINAPI OpenEncryptedFileRawA(LPCSTR filename, ULONG flags, PVOID *context)
Definition: crypt.c:2352
static PWSTR CRYPT_GetTypeKeyName(DWORD dwType, BOOL user)
Definition: crypt.c:85
BOOL WINAPI CryptVerifySignatureW(HCRYPTHASH hHash, const BYTE *pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCWSTR sDescription, DWORD dwFlags)
Definition: crypt.c:2303
BOOL WINAPI CryptEnumProviderTypesA(DWORD dwIndex, DWORD *pdwReserved, DWORD dwFlags, DWORD *pdwProvType, LPSTR pszTypeName, DWORD *pcbTypeName)
Definition: crypt.c:1414
BOOL WINAPI CryptGetUserKey(HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUserKey)
Definition: crypt.c:1783
BOOL WINAPI CryptGetKeyParam(HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
Definition: crypt.c:1714
BOOL WINAPI CryptSetKeyParam(HCRYPTKEY hKey, DWORD dwParam, const BYTE *pbData, DWORD dwFlags)
Definition: crypt.c:2069
BOOL WINAPI CryptSetHashParam(HCRYPTHASH hHash, DWORD dwParam, const BYTE *pbData, DWORD dwFlags)
Definition: crypt.c:2035
static BOOL CRYPT_UnicodeToANSI(LPCWSTR wstr, LPSTR *str, int strsize)
Definition: crypt.c:125
NTSTATUS WINAPI SystemFunction041(PVOID memory, ULONG length, ULONG flags)
Definition: crypt.c:2519
BOOL WINAPI CryptGetDefaultProviderW(DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags, LPWSTR pszProvName, DWORD *pcbProvName)
Definition: crypt.c:1568
BOOL WINAPI CryptSetProviderExW(LPCWSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags)
Definition: crypt.c:2133
NTSTATUS WINAPI SystemFunction040(PVOID memory, ULONG length, ULONG flags)
Definition: crypt.c:2491
BOOL WINAPI CryptSetProviderA(LPCSTR pszProvName, DWORD dwProvType)
Definition: crypt.c:2101
BOOLEAN WINAPI SystemFunction036(PVOID pbBuffer, ULONG dwLen)
Definition: crypt.c:2443
static BOOL CRYPT_ANSIToUnicode(LPCSTR str, LPWSTR *wstr, int wstrsize)
Definition: crypt.c:158
BOOL WINAPI CryptSignHashW(HCRYPTHASH hHash, DWORD dwKeySpec, LPCWSTR sDescription, DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen)
Definition: crypt.c:1973
BOOL WINAPI CryptAcquireContextW(HCRYPTPROV *phProv, LPCWSTR pszContainer, LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
Definition: crypt.c:358
DWORD WINAPI ReadEncryptedFileRaw(PFE_EXPORT_FUNC export, PVOID callback, PVOID context)
Definition: crypt.c:2390
DWORD WINAPI OpenEncryptedFileRawW(LPCWSTR filename, ULONG flags, PVOID *context)
Definition: crypt.c:2371
BOOL WINAPI CryptGetProvParam(HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
Definition: crypt.c:1753
BOOL WINAPI CryptSetProviderExA(LPCSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags)
Definition: crypt.c:2214
BOOL WINAPI CryptGetDefaultProviderA(DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags, LPSTR pszProvName, DWORD *pcbProvName)
Definition: crypt.c:1625
BOOL WINAPI CryptEncrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen)
Definition: crypt.c:1132
static void CRYPT_CreateMachineGuid(void)
Definition: crypt.c:277
BOOL WINAPI CryptImportKey(HCRYPTPROV hProv, const BYTE *pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey)
Definition: crypt.c:1915
BOOL WINAPI CryptHashSessionKey(HCRYPTHASH hHash, HCRYPTKEY hKey, DWORD dwFlags)
Definition: crypt.c:1873
#define MAGIC_CRYPTHASH
Definition: crypt.h:63
#define MAXPROVTYPES
Definition: crypt.h:89
struct tagCRYPTPROV * PCRYPTPROV
struct tagCRYPTHASH * PCRYPTHASH
#define MAGIC_CRYPTKEY
Definition: crypt.h:62
#define MAGIC_CRYPTPROV
Definition: crypt.h:61
struct tagCRYPTKEY * PCRYPTKEY
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define CP_ACP
Definition: compat.h:109
#define SetLastError(x)
Definition: compat.h:752
HANDLE HWND
Definition: compat.h:19
#define FreeLibrary(x)
Definition: compat.h:748
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
#define CALLBACK
Definition: compat.h:35
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
#define LoadLibraryW(x)
Definition: compat.h:747
#define lstrlenW
Definition: compat.h:750
static const WCHAR pubkey[]
Definition: asmname.c:68
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:520
BOOL NTAPI IsBadWritePtr(IN LPVOID lp, IN UINT_PTR ucb)
Definition: except.c:883
unsigned char ch[4][2]
Definition: console.c:118
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
#define O_RDONLY
Definition: fcntl.h:34
#define open
Definition: io.h:44
#define INT_MAX
Definition: limits.h:26
static const WCHAR typeW[]
Definition: name.c:51
return ret
Definition: mutex.c:146
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
FxWmiProvider * pProvider
Definition: fxwmiapi.cpp:57
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLsizeiptr size
Definition: glext.h:5919
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLbitfield flags
Definition: glext.h:7161
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLuint64EXT * result
Definition: glext.h:11304
GLenum GLuint GLsizei bufsize
Definition: glext.h:7473
GLenum GLsizei len
Definition: glext.h:6722
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
Definition: msctf.idl:532
unsigned short Data3
Definition: widltypes.h:34
unsigned int Data1
Definition: widltypes.h:32
unsigned char Data4[8]
Definition: widltypes.h:35
unsigned short Data2
Definition: widltypes.h:33
#define S_OK
Definition: intsafe.h:52
const char * filename
Definition: ioapi.h:137
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
#define REG_SZ
Definition: layer.c:22
CONST void * LPCVOID
Definition: minwindef.h:164
#define error(str)
Definition: mkdosfs.c:1605
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static PVOID ptr
Definition: dispmode.c:27
static IPrintDialogCallback callback
Definition: printdlg.c:326
static CRYPT_DATA_BLOB b2[]
Definition: msg.c:538
static CRYPT_DATA_BLOB b1[]
Definition: msg.c:529
static char memory[1024 *256]
Definition: process.c:122
static HCRYPTPROV hProv
Definition: rsaenh.c:32
#define min(a, b)
Definition: monoChain.cc:55
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define KEY_ALL_ACCESS
Definition: nt_native.h:1044
#define DWORD
Definition: nt_native.h:44
long LONG
Definition: pedump.c:60
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:82
#define _SEH2_END
Definition: pseh2_64.h:171
#define _SEH2_TRY
Definition: pseh2_64.h:71
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:184
int ssize_t
Definition: rosdhcp.h:50
const WCHAR * str
RPC_STATUS WINAPI UuidCreate(UUID *Uuid)
Definition: rpcrt4_main.c:330
static calc_node_t temp
Definition: rpn_ieee.c:38
long RPC_STATUS
Definition: rpc.h:48
#define STATUS_SUCCESS
Definition: shellext.h:65
#define TRACE(s)
Definition: solgame.cpp:4
BYTE * pbContextInfo
Definition: wincrypt.h:818
LPSTR pszProvName
Definition: wincrypt.h:820
DWORD dwProvType
Definition: wincrypt.h:817
DWORD cbContextInfo
Definition: wincrypt.h:819
Definition: http.c:7252
Definition: _hash_fun.h:40
Definition: copy.c:22
PCRYPTPROV pProvider
Definition: crypt.h:85
HCRYPTHASH hPrivate
Definition: crypt.h:86
DWORD dwMagic
Definition: crypt.h:84
HCRYPTKEY hPrivate
Definition: crypt.h:79
DWORD dwMagic
Definition: crypt.h:77
PCRYPTPROV pProvider
Definition: crypt.h:78
HMODULE hModule
Definition: crypt.h:69
PVTableProvStruc pVTable
Definition: crypt.h:72
PPROVFUNCS pFuncs
Definition: crypt.h:70
HCRYPTPROV hPrivate
Definition: crypt.h:71
LONG refcount
Definition: crypt.h:68
DWORD dwMagic
Definition: crypt.h:67
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
uint16_t * PWSTR
Definition: typedefs.h:56
char * PSTR
Definition: typedefs.h:51
const uint16_t * PCWSTR
Definition: typedefs.h:57
unsigned char * LPBYTE
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
DWORD(WINAPI * PFE_IMPORT_FUNC)(_Out_writes_bytes_to_(*ulLength, *ulLength) PBYTE pbData, _In_opt_ PVOID pvCallbackContext, _Inout_ PULONG ulLength)
Definition: winbase.h:1224
DWORD(WINAPI * PFE_EXPORT_FUNC)(_In_reads_bytes_(ulLength) PBYTE pbData, _In_opt_ PVOID pvCallbackContext, _In_ ULONG ulLength)
Definition: winbase.h:1192
#define PP_CLIENT_HWND
Definition: wincrypt.h:2285
ULONG_PTR HCRYPTPROV
Definition: wincrypt.h:55
unsigned int ALG_ID
Definition: wincrypt.h:54
#define CRYPT_MACHINE_DEFAULT
Definition: wincrypt.h:2280
#define CRYPT_DELETEKEYSET
Definition: wincrypt.h:2275
#define PP_USE_HARDWARE_RNG
Definition: wincrypt.h:2317
#define CRYPT_USER_DEFAULT
Definition: wincrypt.h:2281
ULONG_PTR HCRYPTKEY
Definition: wincrypt.h:58
ULONG_PTR HCRYPTHASH
Definition: wincrypt.h:59
#define CRYPT_DELETE_DEFAULT
Definition: wincrypt.h:2282
#define WINAPI
Definition: msvc.h:6
#define strlenW(s)
Definition: unicode.h:34
#define sprintfW
Definition: unicode.h:64
#define strcpyW(d, s)
Definition: unicode.h:35
#define NTE_PROV_DLL_NOT_FOUND
Definition: winerror.h:4277
#define NTE_BAD_PROV_TYPE
Definition: winerror.h:4267
#define NTE_PROVIDER_DLL_FAIL
Definition: winerror.h:4276
#define NTE_BAD_UID
Definition: winerror.h:4245
#define NTE_KEYSET_NOT_DEF
Definition: winerror.h:4272
#define NTE_FAIL
Definition: winerror.h:4279
#define NTE_PROV_TYPE_ENTRY_BAD
Definition: winerror.h:4271
#define NTE_PROV_TYPE_NO_MATCH
Definition: winerror.h:4274
#define NTE_PROV_TYPE_NOT_DEF
Definition: winerror.h:4270
#define NTE_BAD_FLAGS
Definition: winerror.h:4256
#define NTE_BAD_PROVIDER
Definition: winerror.h:4266
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
const char * LPCSTR
Definition: xmlstorage.h:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
char * LPSTR
Definition: xmlstorage.h:182
char CHAR
Definition: xmlstorage.h:175
unsigned char BYTE
Definition: xxhash.c:193