29#define ARRAY_SIZE(x) _countof(x)
38#define WIN32_NO_STATUS
63#define CRYPT_Alloc(size) (LocalAlloc(LMEM_ZEROINIT, size))
64#define CRYPT_Free(buffer) (LocalFree(buffer))
103 static const WCHAR KEYSTR[] =
L"Software\\Microsoft\\Cryptography\\Defaults\\Provider\\";
118 static const WCHAR MACHINESTR[] =
L"Software\\Microsoft\\Cryptography\\Defaults\\Provider Types\\Type XXX";
119 static const WCHAR USERSTR[] =
L"Software\\Microsoft\\Cryptography\\Provider Type XXX";
128 *(--
ptr) = (dwType % 10) +
'0';
129 *(--
ptr) = ((dwType / 10) % 10) +
'0';
130 *(--
ptr) = (dwType / 100) +
'0';
157 else if (strsize < 0)
190 wcount =
min( wcount, wstrsize/
sizeof(
WCHAR) );
203 if (!lpszImage || !
pData)
209 FIXME(
"(%s, %p): not verifying image\n", lpszImage,
pData);
219#define CRYPT_GetProvFunc(name) \
220 if ( !(provider->pFuncs->p##name = (void*)GetProcAddress(provider->hModule, #name)) ) goto error
221#define CRYPT_GetProvFuncOpt(name) \
222 provider->pFuncs->p##name = (void*)GetProcAddress(provider->hModule, #name)
292#undef CRYPT_GetProvFunc
293#undef CRYPT_GetProvFuncOpt
390 if (!pszProvider || !*pszProvider)
396 TRACE(
"No provider registered for crypto provider type %ld.\n", dwProvType);
404 TRACE(
"No type registered for crypto provider type %ld.\n", dwProvType);
410 TRACE(
"Did not find registry entry of crypto provider for %s.\n",
debugstr_w(keyname));
421 TRACE(
"error %ld reading size of 'Name' from registry\n",
r );
435 TRACE(
"error %ld reading 'Name' from registry\n",
r );
465 if (
type != dwProvType)
467 TRACE(
"Crypto provider has wrong type (%ld vs expected %ld).\n",
type, dwProvType);
475 TRACE(
"error %ld reading size of 'Image Path' from registry\n",
r );
489 TRACE(
"error %ld reading 'Image Path' from registry\n",
r );
688 TRACE(
"(0x%Ix, %ld, %p)\n",
hProv, dwLen, pbBuffer);
693 return prov->
pFuncs->pCPGenRandom(prov->
hPrivate, dwLen, pbBuffer);
746 hash->pProvider = prov;
787 TRACE(
"(0x%Ix, 0x%Ix, %d, %08lx, %p, %p)\n",
hKey, hHash, Final,
dwFlags, pbData, pdwDataLen);
801 prov =
key->pProvider;
803 Final,
dwFlags, pbData, pdwDataLen);
829 TRACE(
"(0x%Ix, 0x%08x, 0x%Ix, 0x%08lx, %p)\n",
hProv, Algid, hBaseData,
dwFlags, phKey);
848 key->pProvider = prov;
881 TRACE(
"(0x%Ix)\n", hHash);
892 prov =
hash->pProvider;
928 prov =
key->pProvider;
956 TRACE(
"(0x%Ix, %p, %08lx, %p)\n", hHash, pdwReserved,
dwFlags, phHash);
968 if (!prov->
pFuncs->pCPDuplicateHash)
1024 if (!prov->
pFuncs->pCPDuplicateKey)
1078 TRACE(
"(0x%Ix, 0x%Ix, %d, %08lx, %p, %p, %ld)\n",
hKey, hHash, Final,
dwFlags, pbData, pdwDataLen, dwBufLen);
1092 prov =
key->pProvider;
1094 Final,
dwFlags, pbData, pdwDataLen, dwBufLen);
1125 TRACE(
"(%ld, %p, %ld, %p, %p, %p)\n", dwIndex, pdwReserved,
dwFlags,
1126 pdwProvType, pszProvName, pcbProvName);
1128 if (pdwReserved || !pcbProvName)
1164 *pcbProvName *=
sizeof(
WCHAR);
1166 if (dwIndex >= numkeys)
1210 TRACE(
"(%ld, %p, %08lx, %p, %p, %p)\n", dwIndex, pdwReserved,
dwFlags,
1211 pdwProvType, pszProvName, pcbProvName);
1262 DWORD keylen, numkeys, dwType;
1266 TRACE(
"(%ld, %p, %08lx, %p, %p, %p)\n", dwIndex, pdwReserved,
1267 dwFlags, pdwProvType, pszTypeName, pcbTypeName);
1269 if (pdwReserved || !pdwProvType || !pcbTypeName)
1283 RegQueryInfoKeyW(
hKey,
NULL,
NULL,
NULL, &numkeys, &keylen,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL);
1284 if (dwIndex >= numkeys)
1307 *pdwProvType = *(--
ch) -
'0';
1308 *pdwProvType += (*(--
ch) -
'0') * 10;
1309 *pdwProvType += (*(--
ch) -
'0') * 100;
1336 TRACE(
"(%ld, %p, %08lx, %p, %p, %p)\n", dwIndex, pdwReserved,
dwFlags,
1337 pdwProvType, pszTypeName, pcbTypeName);
1389 TRACE(
"(0x%Ix, 0x%Ix, %ld, %08lx, %p, %p)\n",
hKey, hExpKey, dwBlobType,
dwFlags, pbData, pdwDataLen);
1403 prov =
key->pProvider;
1405 dwBlobType,
dwFlags, pbData, pdwDataLen);
1444 key->pProvider = prov;
1485 if (pdwReserved || !pcbProvName)
1495 if (dwProvType > 999)
1541 TRACE(
"(%ld, %p, %08lx, %p, %p)\n", dwProvType, pdwReserved,
dwFlags, pszProvName, pcbProvName);
1590 TRACE(
"(0x%Ix, %ld, %p, %p, %08lx)\n", hHash, dwParam, pbData, pdwDataLen,
dwFlags);
1602 prov =
hash->pProvider;
1632 TRACE(
"(0x%Ix, %ld, %p, %p, %08lx)\n",
hKey, dwParam, pbData, pdwDataLen,
dwFlags);
1643 prov =
key->pProvider;
1672 TRACE(
"(0x%Ix, %ld, %p, %p, %08lx)\n",
hProv, dwParam, pbData, pdwDataLen,
dwFlags);
1699 TRACE(
"(0x%Ix, %ld, %p)\n",
hProv, dwKeySpec, phUserKey);
1715 key->pProvider = prov;
1750 TRACE(
"(0x%Ix, %p, %ld, %08lx)\n", hHash, pbData, dwDataLen,
dwFlags);
1761 prov =
hash->pProvider;
1799 prov =
hash->pProvider;
1826 TRACE(
"(0x%Ix, %p, %ld, 0x%Ix, %08lx, %p)\n",
hProv, pbData, dwDataLen, hPubKey,
dwFlags, phKey);
1834 if (!pbData || !dwDataLen || !phKey)
1846 importkey->pProvider = prov;
1848 if (prov->
pFuncs->pCPImportKey(prov->
hPrivate, pbData, dwDataLen,
1855 importkey->dwMagic = 0;
1888 TRACE(
"(0x%Ix, %ld, %s, %08lx, %p, %p)\n",
1900 prov =
hash->pProvider;
1901 return prov->
pFuncs->pCPSignHash(prov->
hPrivate,
hash->hPrivate, dwKeySpec, sDescription,
1902 dwFlags, pbSignature, pdwSigLen);
1916 TRACE(
"(0x%Ix, %ld, %s, %08lx, %p, %p)\n",
1946 TRACE(
"(0x%Ix, %ld, %p, %08lx)\n", hHash, dwParam, pbData,
dwFlags);
1957 prov =
hash->pProvider;
1993 prov =
key->pProvider;
2013 TRACE(
"(%s, %ld)\n", pszProvName, dwProvType);
2045 HKEY hProvKey, hTypeKey;
2050 if (!pszProvName || pdwReserved)
2073 keyname, &hTypeKey))
2094 keyname, &hProvKey))
2128 TRACE(
"(%s, %ld, %p, %08lx)\n", pszProvName, dwProvType, pdwReserved,
dwFlags);
2164 FIXME(
"PP_USE_HARDWARE_RNG: What do I do with this?\n");
2165 FIXME(
"\tLetting the CSP decide.\n");
2212 TRACE(
"(0x%Ix, %p, %ld, 0x%Ix, %s, %08lx)\n", hHash, pbSignature,
2228 prov =
hash->pProvider;
2229 return prov->
pFuncs->pCPVerifySignature(prov->
hPrivate,
hash->hPrivate, pbSignature, dwSigLen,
2244 TRACE(
"(0x%Ix, %p, %ld, 0x%Ix, %s, %08lx)\n", hHash, pbSignature,
2395 0, 0, { (
DWORD_PTR)(__FILE__
": random_cs") }
2412 WARN(
"failed to get random bytes %08lx\n",
status );
#define InterlockedIncrement
#define InterlockedDecrement
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
void user(int argc, const char *argv[])
#define RegCloseKey(hKey)
#define ERROR_NOT_ENOUGH_MEMORY
#define ERROR_INSUFFICIENT_BUFFER
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
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)
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
LONG WINAPI RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
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)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
#define CRYPT_Free(buffer)
BOOL WINAPI CryptExportKey(HCRYPTKEY hKey, HCRYPTKEY hExpKey, DWORD dwBlobType, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
BOOL WINAPI CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, HCRYPTHASH *phHash)
BOOL WINAPI CryptGenRandom(HCRYPTPROV hProv, DWORD dwLen, BYTE *pbBuffer)
BOOL WINAPI SystemFunction035(LPCSTR lpszDllFilePath)
static PCRYPTPROV provider_from_handle(HCRYPTPROV handle)
BOOL WINAPI CryptSetProvParam(HCRYPTPROV hProv, DWORD dwParam, const BYTE *pbData, DWORD dwFlags)
BOOL WINAPI CryptGetHashParam(HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
DWORD WINAPI WriteEncryptedFileRaw(PFE_IMPORT_FUNC import, PVOID callback, PVOID context)
static BOOL fill_random_buffer(void)
struct tagMD4_CTX MD4_CTX
BOOL WINAPI CryptDestroyKey(HCRYPTKEY hKey)
#define CRYPT_Alloc(size)
BOOL WINAPI CryptDestroyHash(HCRYPTHASH hHash)
static HWND crypt_hWindow
BOOL WINAPI CryptSignHashA(HCRYPTHASH hHash, DWORD dwKeySpec, LPCSTR sDescription, DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen)
static void * pointer_from_handle(UINT_PTR handle, DWORD magic)
BOOL WINAPI CryptDuplicateKey(HCRYPTKEY hKey, DWORD *pdwReserved, DWORD dwFlags, HCRYPTKEY *phKey)
BOOL WINAPI CryptEnumProvidersA(DWORD dwIndex, DWORD *pdwReserved, DWORD dwFlags, DWORD *pdwProvType, LPSTR pszProvName, DWORD *pcbProvName)
BOOL WINAPI CryptVerifySignatureA(HCRYPTHASH hHash, const BYTE *pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCSTR sDescription, DWORD dwFlags)
BOOL WINAPI CryptReleaseContext(HCRYPTPROV hProv, DWORD dwFlags)
static PWSTR CRYPT_GetProvKeyName(PCWSTR pProvName)
void WINAPI MD4Init(MD4_CTX *ctx)
BOOL WINAPI CryptDuplicateHash(HCRYPTHASH hHash, DWORD *pdwReserved, DWORD dwFlags, HCRYPTHASH *phHash)
BOOL WINAPI CryptHashData(HCRYPTHASH hHash, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags)
#define CRYPT_GetProvFunc(name)
BOOL WINAPI CryptAcquireContextA(HCRYPTPROV *phProv, LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
BOOL WINAPI CryptDeriveKey(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, DWORD dwFlags, HCRYPTKEY *phKey)
BOOL WINAPI CryptEnumProviderTypesW(DWORD dwIndex, DWORD *pdwReserved, DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszTypeName, DWORD *pcbTypeName)
NTSTATUS WINAPI SystemFunction010(LPVOID unknown, const BYTE *data, LPBYTE hash)
void WINAPI MD4Final(MD4_CTX *ctx)
void WINAPI CloseEncryptedFileRaw(PVOID context)
BOOL WINAPI CryptContextAddRef(HCRYPTPROV hProv, DWORD *pdwReserved, DWORD dwFlags)
#define CRYPT_GetProvFuncOpt(name)
static PCRYPTPROV CRYPT_LoadProvider(PCWSTR pImage)
static PCRYPTHASH hash_from_handle(HCRYPTHASH handle)
static BOOL CALLBACK CRYPT_VerifyImage(LPCSTR lpszImage, BYTE *pData)
static void CALLBACK CRYPT_ReturnhWnd(HWND *phWnd)
BOOLEAN WINAPI SystemFunction036(void *buffer, ULONG len)
static char random_buf[sizeof(SYSTEM_INTERRUPT_INFORMATION) *MAX_CPUS]
BOOL WINAPI CryptGenKey(HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKEY *phKey)
BOOL WINAPI CryptEnumProvidersW(DWORD dwIndex, DWORD *pdwReserved, DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszProvName, DWORD *pcbProvName)
BOOL WINAPI CryptDecrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
BOOL WINAPI CryptSetProviderW(LPCWSTR pszProvName, DWORD dwProvType)
BOOL WINAPI SystemFunction030(LPCVOID b1, LPCVOID b2)
DWORD WINAPI OpenEncryptedFileRawA(LPCSTR filename, ULONG flags, PVOID *context)
static PWSTR CRYPT_GetTypeKeyName(DWORD dwType, BOOL user)
BOOL WINAPI CryptVerifySignatureW(HCRYPTHASH hHash, const BYTE *pbSignature, DWORD dwSigLen, HCRYPTKEY hPubKey, LPCWSTR sDescription, DWORD dwFlags)
NTSTATUS WINAPI SystemFunction007(const UNICODE_STRING *string, LPBYTE hash)
BOOL WINAPI CryptEnumProviderTypesA(DWORD dwIndex, DWORD *pdwReserved, DWORD dwFlags, DWORD *pdwProvType, LPSTR pszTypeName, DWORD *pcbTypeName)
BOOL WINAPI CryptGetUserKey(HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUserKey)
BOOL WINAPI CryptGetKeyParam(HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
void WINAPI MD4Update(MD4_CTX *ctx, const unsigned char *buf, unsigned int len)
BOOL WINAPI CryptSetKeyParam(HCRYPTKEY hKey, DWORD dwParam, const BYTE *pbData, DWORD dwFlags)
BOOL WINAPI CryptSetHashParam(HCRYPTHASH hHash, DWORD dwParam, const BYTE *pbData, DWORD dwFlags)
static CRITICAL_SECTION random_cs
static BOOL CRYPT_UnicodeToANSI(LPCWSTR wstr, LPSTR *str, int strsize)
NTSTATUS WINAPI SystemFunction041(PVOID memory, ULONG length, ULONG flags)
BOOL WINAPI CryptGetDefaultProviderW(DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags, LPWSTR pszProvName, DWORD *pcbProvName)
BOOL WINAPI CryptSetProviderExW(LPCWSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags)
NTSTATUS WINAPI SystemFunction040(PVOID memory, ULONG length, ULONG flags)
BOOL WINAPI CryptSetProviderA(LPCSTR pszProvName, DWORD dwProvType)
static BOOL CRYPT_ANSIToUnicode(LPCSTR str, LPWSTR *wstr, int wstrsize)
BOOL WINAPI CryptSignHashW(HCRYPTHASH hHash, DWORD dwKeySpec, LPCWSTR sDescription, DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen)
BOOL WINAPI CryptAcquireContextW(HCRYPTPROV *phProv, LPCWSTR pszContainer, LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
DWORD WINAPI ReadEncryptedFileRaw(PFE_EXPORT_FUNC export, PVOID callback, PVOID context)
DWORD WINAPI OpenEncryptedFileRawW(LPCWSTR filename, ULONG flags, PVOID *context)
static CRITICAL_SECTION_DEBUG random_debug
BOOL WINAPI CryptGetProvParam(HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, DWORD *pdwDataLen, DWORD dwFlags)
BOOL WINAPI CryptSetProviderExA(LPCSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags)
BOOL WINAPI CryptGetDefaultProviderA(DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags, LPSTR pszProvName, DWORD *pcbProvName)
BOOL WINAPI CryptEncrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen)
static PCRYPTKEY key_from_handle(HCRYPTKEY handle)
static void CRYPT_CreateMachineGuid(void)
BOOL WINAPI CryptImportKey(HCRYPTPROV hProv, const BYTE *pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey)
BOOL WINAPI CryptHashSessionKey(HCRYPTHASH hHash, HCRYPTKEY hKey, DWORD dwFlags)
static WCHAR unknown[MAX_STRING_RESOURCE_LEN]
#define ERROR_CALL_NOT_IMPLEMENTED
#define ERROR_INVALID_PARAMETER
#define ERROR_NO_MORE_ITEMS
#define WideCharToMultiByte
#define MultiByteToWideChar
#define __EXCEPT_PAGE_FAULT
static const WCHAR pubkey[]
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
@ SystemInterruptInformation
FxWmiProvider * pProvider
GLuint GLuint GLsizei GLenum type
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLenum GLuint GLenum GLsizei const GLchar * buf
GLuint GLsizei GLsizei * length
GLenum GLuint GLsizei bufsize
#define memcpy(s1, s2, n)
#define ERROR_FILE_NOT_FOUND
static IPrintDialogCallback callback
static CRYPT_DATA_BLOB b2[]
static CRYPT_DATA_BLOB b1[]
static char memory[1024 *256]
unsigned __int3264 UINT_PTR
struct _SYSTEM_INTERRUPT_INFORMATION SYSTEM_INTERRUPT_INFORMATION
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
RPC_STATUS WINAPI UuidCreate(UUID *Uuid)
NTSYSAPI NTSTATUS NTAPI NtQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
LIST_ENTRY ProcessLocksList
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
DWORD WINAPI GetLastError(void)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
DWORD(WINAPI * PFE_IMPORT_FUNC)(_Out_writes_bytes_to_(*ulLength, *ulLength) PBYTE pbData, _In_opt_ PVOID pvCallbackContext, _Inout_ PULONG ulLength)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
DWORD(WINAPI * PFE_EXPORT_FUNC)(_In_reads_bytes_(ulLength) PBYTE pbData, _In_opt_ PVOID pvCallbackContext, _In_ ULONG ulLength)
#define CRYPT_MACHINE_DEFAULT
#define CRYPT_DELETEKEYSET
#define PP_USE_HARDWARE_RNG
#define CRYPT_USER_DEFAULT
#define CRYPT_DELETE_DEFAULT
#define NTE_PROV_DLL_NOT_FOUND
#define NTE_BAD_PROV_TYPE
#define NTE_PROVIDER_DLL_FAIL
#define NTE_KEYSET_NOT_DEF
#define NTE_PROV_TYPE_ENTRY_BAD
#define NTE_PROV_TYPE_NO_MATCH
#define NTE_PROV_TYPE_NOT_DEF
#define HKEY_LOCAL_MACHINE
#define HKEY_CURRENT_USER