📄 crypt.c
字号:
return FALSE;
}
/******************************************************************************
* CryptAcquireContextW (ADVAPI32.@)
*
* see CryptAcquireContextA
*/
BOOL WINAPI CryptAcquireContextW (HCRYPTPROV *phProv, LPCWSTR pszContainer,
LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
{
PSTR pProvider = NULL, pContainer = NULL;
BOOL ret = FALSE;
DPRINT("(%p, %S, %S, %ld, %08lx)\n", phProv, pszContainer,
pszProvider, dwProvType, dwFlags);
if (!CRYPT_UnicodeToANSI(pszContainer, &pContainer, -1))
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
if (!CRYPT_UnicodeToANSI(pszProvider, &pProvider, -1))
{
CRYPT_Free(pContainer);
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
}
ret = CryptAcquireContextA(phProv, pContainer, pProvider, dwProvType, dwFlags);
if (pContainer)
CRYPT_Free(pContainer);
if (pProvider)
CRYPT_Free(pProvider);
return ret;
}
/******************************************************************************
* CryptContextAddRef (ADVAPI32.@)
*
* Increases reference count of a cryptographic service provider handle
* by one.
*
* PARAMS
* hProv [I] Handle to the CSP whose reference is being incremented.
* pdwReserved [IN] Reserved for future use and must be NULL.
* dwFlags [I] Reserved for future use and must be NULL.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptContextAddRef (HCRYPTPROV hProv, DWORD *pdwReserved, DWORD dwFlags)
{
PCRYPTPROV pProv = (PCRYPTPROV)hProv;
DPRINT("(0x%lx, %p, %08lx)\n", hProv, pdwReserved, dwFlags);
if (!pProv)
{
SetLastError(NTE_BAD_UID);
return FALSE;
}
pProv->refcount++;
return TRUE;
}
/******************************************************************************
* CryptReleaseContext (ADVAPI32.@)
*
* Releases the handle of a CSP. Reference count is decreased.
*
* PARAMS
* hProv [I] Handle of a CSP.
* dwFlags [I] Reserved for future use and must be NULL.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptReleaseContext (HCRYPTPROV hProv, DWORD dwFlags)
{
PCRYPTPROV pProv = (PCRYPTPROV)hProv;
BOOL ret = TRUE;
DPRINT("(0x%lx, %08ld)\n", hProv, dwFlags);
if (!pProv)
{
SetLastError(NTE_BAD_UID);
return FALSE;
}
pProv->refcount--;
if (pProv->refcount <= 0)
{
ret = pProv->pFuncs->pCPReleaseContext(pProv->hPrivate, dwFlags);
FreeLibrary(pProv->hModule);
#if 0
CRYPT_Free(pProv->pVTable->pContextInfo);
#endif
CRYPT_Free(pProv->pVTable->pszProvName);
CRYPT_Free(pProv->pVTable);
CRYPT_Free(pProv->pFuncs);
CRYPT_Free(pProv);
}
return ret;
}
/******************************************************************************
* CryptGenRandom (ADVAPI32.@)
*
* Fills a buffer with cryptographically random bytes.
*
* PARAMS
* hProv [I] Handle of a CSP.
* dwLen [I] Number of bytes to generate.
* pbBuffer [I/O] Buffer to contain random bytes.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*
* NOTES
* pdBuffer must be at least dwLen bytes long.
*/
BOOL WINAPI CryptGenRandom (HCRYPTPROV hProv, DWORD dwLen, BYTE *pbBuffer)
{
PCRYPTPROV prov = (PCRYPTPROV)hProv;
DPRINT("(0x%lx, %ld, %p)\n", hProv, dwLen, pbBuffer);
if (!hProv)
CRYPT_ReturnLastError(ERROR_INVALID_HANDLE);
return prov->pFuncs->pCPGenRandom(prov->hPrivate, dwLen, pbBuffer);
}
/******************************************************************************
* CryptCreateHash (ADVAPI32.@)
*
* Initiates the hashing of a stream of data.
*
* PARAMS
* hProv [I] Handle of a CSP.
* Algid [I] Identifies the hash algorithm to use.
* hKey [I] Key for the hash (if required).
* dwFlags [I] Reserved for future use and must be NULL.
* phHash [O] Address of the future handle to the new hash object.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*
* NOTES
* If the algorithm is a keyed hash, hKey is the key.
*/
BOOL WINAPI CryptCreateHash (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey,
DWORD dwFlags, HCRYPTHASH *phHash)
{
PCRYPTPROV prov = (PCRYPTPROV)hProv;
PCRYPTKEY key = (PCRYPTKEY)hKey;
PCRYPTHASH hash;
DPRINT("(0x%lx, 0x%x, 0x%lx, %08lx, %p)\n", hProv, Algid, hKey, dwFlags, phHash);
if (!prov)
CRYPT_ReturnLastError(ERROR_INVALID_HANDLE);
if (!phHash)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
if (dwFlags)
CRYPT_ReturnLastError(NTE_BAD_FLAGS);
if (!(hash = CRYPT_Alloc(sizeof(CRYPTHASH))))
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
hash->pProvider = prov;
if (prov->pFuncs->pCPCreateHash(prov->hPrivate, Algid,
key ? key->hPrivate : 0, 0, &hash->hPrivate))
{
*phHash = (HCRYPTHASH)hash;
return TRUE;
}
/* CSP error! */
CRYPT_Free(hash);
*phHash = 0;
return FALSE;
}
/******************************************************************************
* CryptDecrypt (ADVAPI32.@)
*
* Decrypts data encrypted by CryptEncrypt.
*
* PARAMS
* hKey [I] Handle to the decryption key.
* hHash [I] Handle to a hash object.
* Final [I] TRUE if this is the last section to be decrypted.
* dwFlags [I] Reserved for future use. Can be CRYPT_OAEP.
* pbData [I/O] Buffer that holds the encrypted data. Holds decrypted
* data on return
* pdwDataLen [I/O] Length of pbData before and after the call.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptDecrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final,
DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
{
PCRYPTPROV prov;
PCRYPTKEY key = (PCRYPTKEY)hKey;
PCRYPTHASH hash = (PCRYPTHASH)hHash;
DPRINT("(0x%lx, 0x%lx, %d, %08lx, %p, %p)\n", hKey, hHash, Final, dwFlags, pbData, pdwDataLen);
if (!key || !pbData || !pdwDataLen)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
prov = key->pProvider;
return prov->pFuncs->pCPDecrypt(prov->hPrivate, key->hPrivate, hash ? hash->hPrivate : 0,
Final, dwFlags, pbData, pdwDataLen);
}
/******************************************************************************
* CryptDeriveKey (ADVAPI32.@)
*
* Generates session keys derived from a base data value.
*
* PARAMS
* hProv [I] Handle to a CSP.
* Algid [I] Identifies the symmetric encryption algorithm to use.
* hBaseData [I] Handle to a hash object.
* dwFlags [I] Type of key to generate.
* phKey [I/O] Address of the newly generated key.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptDeriveKey (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData,
DWORD dwFlags, HCRYPTKEY *phKey)
{
PCRYPTPROV prov = (PCRYPTPROV)hProv;
PCRYPTHASH hash = (PCRYPTHASH)hBaseData;
PCRYPTKEY key;
DPRINT("(0x%lx, 0x%08x, 0x%lx, 0x%08lx, %p)\n", hProv, Algid, hBaseData, dwFlags, phKey);
if (!prov || !hash)
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->pCPDeriveKey(prov->hPrivate, Algid, hash->hPrivate, dwFlags, &key->hPrivate))
{
*phKey = (HCRYPTKEY)key;
return TRUE;
}
/* CSP error! */
CRYPT_Free(key);
*phKey = 0;
return FALSE;
}
/******************************************************************************
* CryptDestroyHash (ADVAPI32.@)
*
* Destroys the hash object referenced by hHash.
*
* PARAMS
* hHash [I] Handle of the hash object to be destroyed.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptDestroyHash (HCRYPTHASH hHash)
{
PCRYPTHASH hash = (PCRYPTHASH)hHash;
PCRYPTPROV prov;
BOOL ret;
DPRINT("(0x%lx)\n", hHash);
if (!hash)
CRYPT_ReturnLastError(ERROR_INVALID_HANDLE);
prov = hash->pProvider;
ret = prov->pFuncs->pCPDestroyHash(prov->hPrivate, hash->hPrivate);
CRYPT_Free(hash);
return ret;
}
/******************************************************************************
* CryptDestroyKey (ADVAPI32.@)
*
* Releases the handle referenced by hKey.
*
* PARAMS
* hKey [I] Handle of the key to be destroyed.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptDestroyKey (HCRYPTKEY hKey)
{
PCRYPTKEY key = (PCRYPTKEY)hKey;
PCRYPTPROV prov;
BOOL ret;
DPRINT("(0x%lx)\n", hKey);
if (!key)
CRYPT_ReturnLastError(ERROR_INVALID_HANDLE);
prov = key->pProvider;
ret = prov->pFuncs->pCPDestroyKey(prov->hPrivate, key->hPrivate);
CRYPT_Free(key);
return ret;
}
/******************************************************************************
* CryptDuplicateHash (ADVAPI32.@)
*
* Duplicates a hash.
*
* PARAMS
* hHash [I] Handle to the hash to be copied.
* pdwReserved [I] Reserved for future use and must be zero.
* dwFlags [I] Reserved for future use and must be zero.
* phHash [O] Address of the handle to receive the copy.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptDuplicateHash (HCRYPTHASH hHash, DWORD *pdwReserved,
DWORD dwFlags, HCRYPTHASH *phHash)
{
PCRYPTPROV prov;
PCRYPTHASH orghash, newhash;
DPRINT("(0x%lx, %p, %08ld, %p)\n", hHash, pdwReserved, dwFlags, phHash);
orghash = (PCRYPTHASH)hHash;
if (!orghash || pdwReserved || !phHash)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
prov = orghash->pProvider;
if (!prov->pFuncs->pCPDuplicateHash)
CRYPT_ReturnLastError(ERROR_CALL_NOT_IMPLEMENTED);
if (!(newhash = CRYPT_Alloc(sizeof(CRYPTHASH))))
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
newhash->pProvider = prov;
if (prov->pFuncs->pCPDuplicateHash(prov->hPrivate, orghash->hPrivate, pdwReserved, dwFlags, &newhash->hPrivate))
{
*phHash = (HCRYPTHASH)newhash;
return TRUE;
}
CRYPT_Free(newhash);
return FALSE;
}
/******************************************************************************
* CryptDuplicateKey (ADVAPI32.@)
*
* Duplicate a key and the key's state.
*
* PARAMS
* hKey [I] Handle of the key to copy.
* pdwReserved [I] Reserved for future use and must be NULL.
* dwFlags [I] Reserved for future use and must be zero.
* phKey [I] Address of the handle to the duplicated key.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptDuplicateKey (HCRYPTKEY hKey, DWORD *pdwReserved, DWORD dwFlags, HCRYPTKEY *phKey)
{
PCRYPTPROV prov;
PCRYPTKEY orgkey, newkey;
DPRINT("(0x%lx, %p, %08ld, %p)\n", hKey, pdwReserved, dwFlags, phKey);
orgkey = (PCRYPTKEY)hKey;
if (!orgkey || pdwReserved || !phKey)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
prov = orgkey->pProvider;
if (!prov->pFuncs->pCPDuplicateKey)
CRYPT_ReturnLastError(ERROR_CALL_NOT_IMPLEMENTED);
if (!(newkey = CRYPT_Alloc(sizeof(CRYPTKEY))))
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
newkey->pProvider = prov;
if (prov->pFuncs->pCPDuplicateKey(prov->hPrivate, orgkey->hPrivate, pdwReserved, dwFlags, &newkey->hPrivate))
{
*phKey = (HCRYPTKEY)newkey;
return TRUE;
}
CRYPT_Free(newkey);
return FALSE;
}
/******************************************************************************
* CryptEncrypt (ADVAPI32.@)
*
* Encrypts data.
*
* PARAMS
* hKey [I] Handle to the enryption key.
* hHash [I] Handle to a hash object.
* Final [I] TRUE if this is the last section to encrypt.
* dwFlags [I] Can be CRYPT_OAEP.
* pbData [I/O] Data to be encrypted. Contains encrypted data after call.
* pdwDataLen [I/O] Length of the data to encrypt. Contains the length of the
* encrypted data after call.
* dwBufLen [I] Length of the input pbData buffer.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*
* NOTES
* If pbData is NULL, CryptEncrypt determines stores the number of bytes
* required for the returned data in pdwDataLen.
*/
BOOL WINAPI CryptEncrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final,
DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen, DWORD dwBufLen)
{
PCRYPTPROV prov;
PCRYPTKEY key = (PCRYPTKEY)hKey;
PCRYPTHASH hash = (PCRYPTHASH)hHash;
DPRINT("(0x%lx, 0x%lx, %d, %08ld, %p, %p, %ld)\n", hKey, hHash, Final, dwFlags, pbData, pdwDataLen, dwBufLen);
if (!key || !pdwDataLen)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
prov = key->pProvider;
return prov->pFuncs->pCPEncrypt(prov->hPrivate, key->hPrivate, hash ? hash->hPrivate : 0,
Final, dwFlags, pbData, pdwDataLen, dwBufLen);
}
/******************************************************************************
* CryptEnumProvidersW (ADVAPI32.@)
*
* Returns the next availabe CSP.
*
* 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.
* pszProvName [O] Buffer that receives data from the provider.
* pcbProvName [I/O] Specifies the size of pszProvName. Contains the number
* of bytes stored in the buffer on return.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*
* NOTES
* If pszProvName is NULL, CryptEnumProvidersW sets the size of the name
* for memory allocation purposes.
*/
BOOL WINAPI CryptEnumProvidersW (DWORD dwIndex, DWORD *pdwReserved,
DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszProvName, DWORD *pcbProvName)
{
HKEY hKey;
DPRINT("(%ld, %p, %ld, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
pdwProvType, pszProvName, pcbProvName);
if (pdwReserved || !pcbProvName)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
if (dwFlags)
CRYPT_ReturnLastError(NTE_BAD_FLAGS);
if (RegOpenKeyW(HKEY_LOCAL_MACHINE,
L"Software\\Microsoft\\Cryptography\\Defaults\\Provider",
&hKey))
CRYPT_ReturnLastError(NTE_FAIL);
if (!pszProvName)
{
DWORD numkeys;
WCHAR *provNameW;
RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &numkeys, pcbProvName,
NULL, NULL, NULL, NULL, NULL, NULL);
if (!(provNameW = CRYPT_Alloc(*pcbProvName * sizeof(WCHAR))))
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
RegEnumKeyExW(hKey, dwIndex, provNameW, pcbProvName, NULL, NULL, NULL, NULL);
(*pcbProvName)++;
*pcbProvName *= sizeof(WCHAR);
CRYPT_Free(provNameW);
if (dwIndex >= numkeys)
CRYPT_ReturnLastError(ERROR_NO_MORE_ITEMS);
}
else
{
DWORD size = sizeof(DWORD);
DWORD result;
HKEY subkey;
result = RegEnumKeyW(hKey, dwIndex, pszProvName, *pcbProvName / sizeof(WCHAR));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -