📄 crypt.c
字号:
if (result)
CRYPT_ReturnLastError(result);
if (RegOpenKeyW(hKey, pszProvName, &subkey))
return FALSE;
if (RegQueryValueExW(subkey, L"Type", NULL, NULL, (BYTE*)pdwProvType, &size))
return FALSE;
RegCloseKey(subkey);
}
RegCloseKey(hKey);
return TRUE;
}
/******************************************************************************
* CryptEnumProvidersA (ADVAPI32.@)
*
* see CryptEnumProvidersW
*/
BOOL WINAPI CryptEnumProvidersA (DWORD dwIndex, DWORD *pdwReserved,
DWORD dwFlags, DWORD *pdwProvType, LPSTR pszProvName, DWORD *pcbProvName)
{
PWSTR str = NULL;
DWORD strlen;
BOOL ret; /* = FALSE; */
DPRINT("(%ld, %p, %08ld, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
pdwProvType, pszProvName, pcbProvName);
strlen = *pcbProvName * sizeof(WCHAR);
if (pszProvName && !(str = CRYPT_Alloc(strlen)))
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
ret = CryptEnumProvidersW(dwIndex, pdwReserved, dwFlags, pdwProvType, str, &strlen);
if (str)
{
CRYPT_UnicodeToANSI(str, &pszProvName, *pcbProvName);
CRYPT_Free(str);
}
*pcbProvName = strlen / sizeof(WCHAR); /* FIXME: not correct */
return ret;
}
/******************************************************************************
* CryptEnumProviderTypesA (ADVAPI32i.@)
*
* Retrieves the next type of CSP supported.
*
* PARAMS
* dwIndex [I] Index of the next provider to be enumerated.
* pdwReserved [I] Reserved for future use and must be NULL.
* dwFlags [I] Reserved for future use and must be zero.
* pdwProvType [O] DWORD designating the type of the provider.
* pszTypeName [O] Buffer that receives data from the provider type.
* pcbTypeName [I/O] Specifies the size of pszTypeName. Contains the number
* of bytes stored in the buffer on return.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*
* NOTES
* If pszTypeName is NULL, CryptEnumProviderTypesA sets the size of the name
* for memory allocation purposes.
*/
BOOL WINAPI CryptEnumProviderTypesA (DWORD dwIndex, DWORD *pdwReserved,
DWORD dwFlags, DWORD *pdwProvType, LPSTR pszTypeName, DWORD *pcbTypeName)
{
HKEY hKey, hSubkey;
DWORD keylen, numkeys, dwType;
PSTR keyname, ch;
DWORD result;
DPRINT("(%ld, %p, %08ld, %p, %p, %p)\n", dwIndex, pdwReserved,
dwFlags, pdwProvType, pszTypeName, pcbTypeName);
if (pdwReserved || !pdwProvType || !pcbTypeName)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
if (dwFlags)
CRYPT_ReturnLastError(NTE_BAD_FLAGS);
if (RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\Defaults\\Provider Types", &hKey))
return FALSE;
RegQueryInfoKeyA(hKey, NULL, NULL, NULL, &numkeys, &keylen, NULL, NULL, NULL, NULL, NULL, NULL);
if (dwIndex >= numkeys)
CRYPT_ReturnLastError(ERROR_NO_MORE_ITEMS);
keylen++;
if ( !(keyname = CRYPT_Alloc(keylen)) )
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
if ( RegEnumKeyA(hKey, dwIndex, keyname, keylen) )
{
CRYPT_Free(keyname);
return FALSE;
}
RegOpenKeyA(hKey, keyname, &hSubkey);
ch = keyname + strlen(keyname);
/* Convert "Type 000" to 0, etc/ */
*pdwProvType = *(--ch) - '0';
*pdwProvType += (*(--ch) - '0') * 10;
*pdwProvType += (*(--ch) - '0') * 100;
CRYPT_Free(keyname);
result = RegQueryValueExA(hSubkey, "TypeName", NULL, &dwType, (LPBYTE)pszTypeName, pcbTypeName);
if (result)
CRYPT_ReturnLastError(result);
RegCloseKey(hSubkey);
RegCloseKey(hKey);
return TRUE;
}
/******************************************************************************
* CryptEnumProviderTypesW (ADVAPI32.@)
*
* see CryptEnumProviderTypesA
*/
BOOL WINAPI CryptEnumProviderTypesW (DWORD dwIndex, DWORD *pdwReserved,
DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszTypeName, DWORD *pcbTypeName)
{
PSTR str = NULL;
DWORD strlen;
BOOL ret;
DPRINT("(%ld, %p, %08ld, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
pdwProvType, pszTypeName, pcbTypeName);
strlen = *pcbTypeName / sizeof(WCHAR);
if (pszTypeName && !(str = CRYPT_Alloc(strlen)))
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
ret = CryptEnumProviderTypesA(dwIndex, pdwReserved, dwFlags, pdwProvType, str, &strlen);
if (str)
{
CRYPT_ANSIToUnicode(str, &pszTypeName, *pcbTypeName);
CRYPT_Free(str);
}
*pcbTypeName = strlen * sizeof(WCHAR);
return ret;
}
/******************************************************************************
* CryptExportKey (ADVAPI32.@)
*
* Exports a cryptographic key from a CSP.
*
* PARAMS
* hKey [I] Handle to the key to export.
* hExpKey [I] Handle to a cryptographic key of the end user.
* dwBlobType [I] Type of BLOB to be exported.
* dwFlags [I] CRYPT_DESTROYKEY/SSL2_FALLBACK/OAEP.
* pbData [O] Buffer to receive BLOB data.
* pdwDataLen [I/O] Specifies the size of pbData.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*
* NOTES
* if pbData is NULL, CryptExportKey sets pdwDataLen as the size of the
* buffer needed to hold the BLOB.
*/
BOOL WINAPI CryptExportKey (HCRYPTKEY hKey, HCRYPTKEY hExpKey, DWORD dwBlobType,
DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
{
PCRYPTPROV prov;
PCRYPTKEY key = (PCRYPTKEY)hKey, expkey = (PCRYPTKEY)hExpKey;
DPRINT("(0x%lx, 0x%lx, %ld, %08ld, %p, %p)\n", hKey, hExpKey, dwBlobType, dwFlags, pbData, pdwDataLen);
if (!key || !pdwDataLen)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
prov = key->pProvider;
return prov->pFuncs->pCPExportKey(prov->hPrivate, key->hPrivate, expkey ? expkey->hPrivate : 0,
dwBlobType, dwFlags, pbData, pdwDataLen);
}
/******************************************************************************
* CryptGenKey (ADVAPI32.@)
*
* Generates a random cryptographic session key or a pub/priv key pair.
*
* PARAMS
* hProv [I] Handle to a CSP.
* Algid [I] Algorithm to use to make key.
* dwFlags [I] Specifies type of key to make.
* phKey [I] Address of the handle to which the new key is copied.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptGenKey (HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, HCRYPTKEY *phKey)
{
PCRYPTPROV prov = (PCRYPTPROV)hProv;
PCRYPTKEY key;
DPRINT("(0x%lx, %d, %08ld, %p)\n", hProv, Algid, dwFlags, phKey);
if (!prov)
CRYPT_ReturnLastError(ERROR_INVALID_HANDLE);
if (!phKey)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
if (!(key = CRYPT_Alloc(sizeof(CRYPTKEY))))
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
key->pProvider = prov;
if (prov->pFuncs->pCPGenKey(prov->hPrivate, Algid, dwFlags, &key->hPrivate))
{
*phKey = (HCRYPTKEY)key;
return TRUE;
}
/* CSP error! */
CRYPT_Free(key);
return FALSE;
}
/******************************************************************************
* CryptGetDefaultProviderA (ADVAPI32.@)
*
* Finds the default CSP of a certain provider type.
*
* PARAMS
* dwProvType [I] Provider type to look for.
* pdwReserved [I] Reserved for future use and must be NULL.
* dwFlags [I] CRYPT_MACHINE_DEFAULT/USER_DEFAULT
* pszProvName [O] Name of the default CSP.
* pcbProvName [I/O] Size of pszProvName
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*
* NOTES
* If pszProvName is NULL, pcbProvName will hold the size of the buffer for
* memory allocation purposes on return.
*/
BOOL WINAPI CryptGetDefaultProviderA (DWORD dwProvType, DWORD *pdwReserved,
DWORD dwFlags, LPSTR pszProvName, DWORD *pcbProvName)
{
HKEY hKey;
PSTR keyname;
DWORD result;
if (pdwReserved || !pcbProvName)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
if (dwFlags & ~(CRYPT_USER_DEFAULT | CRYPT_MACHINE_DEFAULT))
CRYPT_ReturnLastError(NTE_BAD_FLAGS);
if (dwProvType > 999)
CRYPT_ReturnLastError(NTE_BAD_PROV_TYPE);
if (!(keyname = CRYPT_GetTypeKeyName(dwProvType, dwFlags & CRYPT_USER_DEFAULT)))
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
if (RegOpenKeyA((dwFlags & CRYPT_USER_DEFAULT) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE ,keyname, &hKey))
{
CRYPT_Free(keyname);
CRYPT_ReturnLastError(NTE_PROV_TYPE_NOT_DEF);
}
CRYPT_Free(keyname);
result = RegQueryValueExA(hKey, "Name", NULL, NULL, (LPBYTE)pszProvName, pcbProvName);
if (result)
{
if (result != ERROR_MORE_DATA)
SetLastError(NTE_PROV_TYPE_ENTRY_BAD);
else
SetLastError(result);
return FALSE;
}
RegCloseKey(hKey);
return TRUE;
}
/******************************************************************************
* CryptGetDefaultProviderW (ADVAPI32.@)
*
* see CryptGetDefaultProviderA
*/
BOOL WINAPI CryptGetDefaultProviderW (DWORD dwProvType, DWORD *pdwReserved,
DWORD dwFlags, LPWSTR pszProvName, DWORD *pcbProvName)
{
PSTR str = NULL;
DWORD strlen;
BOOL ret = FALSE;
DPRINT("(%ld, %p, %08ld, %p, %p)\n", dwProvType, pdwReserved, dwFlags, pszProvName, pcbProvName);
strlen = *pcbProvName / sizeof(WCHAR);
if (pszProvName && !(str = CRYPT_Alloc(strlen)))
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
ret = CryptGetDefaultProviderA(dwProvType, pdwReserved, dwFlags, str, &strlen);
if (str)
{
CRYPT_ANSIToUnicode(str, &pszProvName, *pcbProvName);
CRYPT_Free(str);
}
*pcbProvName = strlen * sizeof(WCHAR);
return ret;
}
/******************************************************************************
* CryptGetHashParam (ADVAPI32.@)
*
* Retrieves data that controls the operations of a hash object.
*
* PARAMS
* hHash [I] Handle of the hash object to question.
* dwParam [I] Query type.
* pbData [O] Buffer that receives the value data.
* pdwDataLen [I/O] Size of the pbData buffer.
* dwFlags [I] Reserved for future use and must be zero.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*
* NOTES
* If pbData is NULL, pdwDataLen will contain the length required.
*/
BOOL WINAPI CryptGetHashParam (HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData,
DWORD *pdwDataLen, DWORD dwFlags)
{
PCRYPTPROV prov;
PCRYPTHASH hash = (PCRYPTHASH)hHash;
DPRINT("(0x%lx, %ld, %p, %p, %08ld)\n", hHash, dwParam, pbData, pdwDataLen, dwFlags);
if (!hash || !pdwDataLen)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
prov = hash->pProvider;
return prov->pFuncs->pCPGetHashParam(prov->hPrivate, hash->hPrivate, dwParam,
pbData, pdwDataLen, dwFlags);
}
/******************************************************************************
* CryptGetKeyParam (ADVAPI32.@)
*
* Retrieves data that controls the operations of a key.
*
* PARAMS
* hKey [I] Handle to they key in question.
* dwParam [I] Specifies query type.
* pbData [O] Sequence of bytes to receive data.
* pdwDataLen [I/O] Size of pbData.
* dwFlags [I] Reserved for future use and must be zero.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*
* NOTES
* If pbData is NULL, pdwDataLen is set to the needed length of the buffer.
*/
BOOL WINAPI CryptGetKeyParam (HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData,
DWORD *pdwDataLen, DWORD dwFlags)
{
PCRYPTPROV prov;
PCRYPTKEY key = (PCRYPTKEY)hKey;
DPRINT("(0x%lx, %ld, %p, %p, %08ld)\n", hKey, dwParam, pbData, pdwDataLen, dwFlags);
if (!key || !pdwDataLen)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
prov = key->pProvider;
return prov->pFuncs->pCPGetKeyParam(prov->hPrivate, key->hPrivate, dwParam,
pbData, pdwDataLen, dwFlags);
}
/******************************************************************************
* CryptGetProvParam (ADVAPI32.@)
*
* Retrieves parameters that control the operations of a CSP.
*
* PARAMS
* hProv [I] Handle of the CSP in question.
* dwParam [I] Specifies query type.
* pbData [O] Buffer to receive the data.
* pdwDataLen [I/O] Size of pbData.
* dwFlags [I] see MSDN Docs.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*
* NOTES
* If pbData is NULL, pdwDataLen is set to the needed buffer length.
*/
BOOL WINAPI CryptGetProvParam (HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData,
DWORD *pdwDataLen, DWORD dwFlags)
{
PCRYPTPROV prov = (PCRYPTPROV)hProv;
DPRINT("(0x%lx, %ld, %p, %p, %08ld)\n", hProv, dwParam, pbData, pdwDataLen, dwFlags);
return prov->pFuncs->pCPGetProvParam(prov->hPrivate, dwParam, pbData, pdwDataLen, dwFlags);
}
/******************************************************************************
* CryptGetUserKey (ADVAPI32.@)
*
* Gets a handle of one of a user's two public/private key pairs.
*
* PARAMS
* hProv [I] Handle of a CSP.
* dwKeySpec [I] Private key to use.
* phUserKey [O] Pointer to the handle of the retrieved keys.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptGetUserKey (HCRYPTPROV hProv, DWORD dwKeySpec, HCRYPTKEY *phUserKey)
{
PCRYPTPROV prov = (PCRYPTPROV)hProv;
PCRYPTKEY key;
DPRINT("(0x%lx, %ld, %p)\n", hProv, dwKeySpec, phUserKey);
if (!prov)
CRYPT_ReturnLastError(ERROR_INVALID_HANDLE);
if (!phUserKey)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
if (!(key = CRYPT_Alloc(sizeof(CRYPTKEY))))
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
key->pProvider = prov;
if (prov->pFuncs->pCPGetUserKey(prov->hPrivate, dwKeySpec, &key->hPrivate))
{
*phUserKey = (HCRYPTKEY)key;
return TRUE;
}
/* CSP Error */
CRYPT_Free(key);
*phUserKey = 0;
return FALSE;
}
/******************************************************************************
* CryptHashData (ADVAPI32.@)
*
* Adds data to a hash object.
*
* PARAMS
* hHash [I] Handle of the hash object.
* pbData [I] Buffer of data to be hashed.
* dwDataLen [I] Number of bytes to add.
* dwFlags [I] Can be CRYPT_USERDATA
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptHashData (HCRYPTHASH hHash, const BYTE *pbData, DWORD dwDataLen, DWORD dwFlags)
{
PCRYPTHASH hash = (PCRYPTHASH)hHash;
PCRYPTPROV prov;
DPRINT("(0x%lx, %p, %ld, %08ld)\n", hHash, pbData, dwDataLen, dwFlags);
if (!hash)
CRYPT_ReturnLastError(ERROR_INVALID_HANDLE);
if (!pbData || !dwDataLen)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
prov = hash->pProvider;
return prov->pFuncs->pCPHashData(prov->hPrivate, hash->hPrivate, pbData, dwDataLen, dwFlags);
}
/******************************************************************************
* CryptHashSessionKey (ADVAPI32.@)
*
* PARAMS
* hHash [I] Handle to the hash object.
* hKey [I] Handle to the key to be hashed.
* dwFlags [I] Can be CRYPT_LITTLE_ENDIAN.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptHashSessionKey (HCRYPTHASH hHash, HCRYPTKEY hKey, DWORD dwFlags)
{
PCRYPTHASH hash = (PCRYPTHASH)hHash;
PCRYPTKEY key = (PCRYPTKEY)hKey;
PCRYPTPROV prov;
DPRINT("(0x%lx, 0x%lx, %08ld)\n", hHash, hKey, dwFlags);
if (!hash || !key)
CRYPT_ReturnLastError(ERROR_INVALID_HANDLE);
prov = hash->pProvider;
return prov->pFuncs->pCPHashSessionKey(prov->hPrivate, hash->hPrivate, key->hPrivate, dwFlags);
}
/******************************************************************************
* CryptImportKey (ADVAPI32.@)
*
* PARAMS
* hProv [I] Handle of a CSP.
* pbData [I] Contains the key to be imported.
* dwDataLen [I] Length of the key.
* hPubKey [I] Cryptographic key that decrypts pdData
* dwFlags [I] Used only with a public/private key pair.
* phKey [O] Imported key.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptImportKey (HCRYPTPROV hProv, BYTE *pbData, DWORD dwDataLen,
HCRYPTKEY hPubKey, DWORD dwFlags, HCRYPTKEY *phKey)
{
PCRYPTPROV prov = (PCRYPTPROV)hProv;
PCRYPTKEY pubkey = (PCRYPTKEY)hPubKey, importkey;
DPRINT("(0x%lx, %p, %ld, 0x%lx, %08ld, %p)\n", hProv, pbData, dwDataLen, hPubKey, dwFlags, phKey);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -