📄 crypt.c
字号:
if (!prov || !pbData || !dwDataLen || !phKey)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
if (!(importkey = CRYPT_Alloc(sizeof(CRYPTKEY))))
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
importkey->pProvider = prov;
if (prov->pFuncs->pCPImportKey(prov->hPrivate, pbData, dwDataLen,
pubkey ? pubkey->hPrivate : 0, dwFlags, &importkey->hPrivate))
{
*phKey = (HCRYPTKEY)importkey;
return TRUE;
}
CRYPT_Free(importkey);
return FALSE;
}
/******************************************************************************
* CryptSignHashA
*
* Note: Since the sDesciption (string) is supposed to be NULL and
* is only retained for compatibility no string conversions are required
* and only one implementation is required for both ANSI and Unicode.
* We still need to export both:
*
* CryptSignHashA (ADVAPI32.@)
* CryptSignHashW (ADVAPI32.@)
*
* Signs data.
*
* PARAMS
* hHash [I] Handle of the hash object to be signed.
* dwKeySpec [I] Private key to use.
* sDescription [I] Must be NULL.
* dwFlags [I] CRYPT_NOHASHOID/X931_FORMAT.
* pbSignature [O] Buffer of the signature data.
* pdwSigLen [I/O] Size of the pbSignature buffer.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptSignHashA (HCRYPTHASH hHash, DWORD dwKeySpec, LPCSTR sDescription,
DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen)
{
/* Since sDescription is ignored we dont need to convert it, we just pass null */
return CryptSignHashW(hHash, dwKeySpec, NULL, dwFlags, pbSignature, pdwSigLen);
}
BOOL WINAPI CryptSignHashW (HCRYPTHASH hHash, DWORD dwKeySpec, LPCWSTR sDescription,
DWORD dwFlags, BYTE *pbSignature, DWORD *pdwSigLen)
{
PCRYPTHASH hash = (PCRYPTHASH)hHash;
PCRYPTPROV prov;
DPRINT("(0x%lx, %ld, %08ld, %p, %p)\n", hHash, dwKeySpec, dwFlags, pbSignature, pdwSigLen);
if (sDescription)
{
/* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/seccrypto/security/cryptsignhash.asp */
DPRINT("The sDescription parameter is not supported (and no longer used). Ignoring.\n");
}
if (!hash)
CRYPT_ReturnLastError(ERROR_INVALID_HANDLE);
if (!pdwSigLen || !hash->pProvider)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
prov = hash->pProvider;
return prov->pFuncs->pCPSignHash(prov->hPrivate, hash->hPrivate, dwKeySpec, NULL,
dwFlags, pbSignature, pdwSigLen);
}
/******************************************************************************
* CryptSetHashParam (ADVAPI32.@)
*
* Customizes the operations of a hash object.
*
* PARAMS
* hHash [I] Handle of the hash object to set parameters.
* dwParam [I] HP_HMAC_INFO/HASHVAL.
* pbData [I] Value data buffer.
* dwFlags [I] Reserved for future use and must be zero.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptSetHashParam (HCRYPTHASH hHash, DWORD dwParam, BYTE *pbData, DWORD dwFlags)
{
PCRYPTPROV prov;
PCRYPTHASH hash = (PCRYPTHASH)hHash;
DPRINT("(0x%lx, %ld, %p, %08ld)\n", hHash, dwParam, pbData, dwFlags);
if (!hash || !pbData)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
prov = hash->pProvider;
return prov->pFuncs->pCPSetHashParam(prov->hPrivate, hash->hPrivate,
dwParam, pbData, dwFlags);
}
/******************************************************************************
* CryptSetKeyParam (ADVAPI32.@)
*
* Customizes a session key's operations.
*
* PARAMS
* hKey [I] Handle to the key to set values.
* dwParam [I] See MSDN Doc.
* pbData [I] Buffer of values to set.
* dwFlags [I] Only used when dwParam == KP_ALGID.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptSetKeyParam (HCRYPTKEY hKey, DWORD dwParam, BYTE *pbData, DWORD dwFlags)
{
PCRYPTPROV prov;
PCRYPTKEY key = (PCRYPTKEY)hKey;
DPRINT("(0x%lx, %ld, %p, %08ld)\n", hKey, dwParam, pbData, dwFlags);
if (!key || !pbData)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
prov = key->pProvider;
return prov->pFuncs->pCPSetKeyParam(prov->hPrivate, key->hPrivate,
dwParam, pbData, dwFlags);
}
/******************************************************************************
* CryptSetProviderA (ADVAPI32.@)
*
* Specifies the current user's default CSP.
*
* PARAMS
* pszProvName [I] Name of the new default CSP.
* dwProvType [I] Provider type of the CSP.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptSetProviderA (LPCSTR pszProvName, DWORD dwProvType)
{
DPRINT("(%s, %ld)\n", pszProvName, dwProvType);
return CryptSetProviderExA(pszProvName, dwProvType, NULL, CRYPT_USER_DEFAULT);
}
/******************************************************************************
* CryptSetProviderW (ADVAPI32.@)
*
* See CryptSetProviderA
*/
BOOL WINAPI CryptSetProviderW (LPCWSTR pszProvName, DWORD dwProvType)
{
DPRINT("(%S, %ld)\n", pszProvName, dwProvType);
return CryptSetProviderExW(pszProvName, dwProvType, NULL, CRYPT_USER_DEFAULT);
}
/******************************************************************************
* CryptSetProviderExA (ADVAPI32.@)
*
* Specifies the default CSP.
*
* PARAMS
* pszProvName [I] Name of the new default CSP.
* dwProvType [I] Provider type of the CSP.
* pdwReserved [I] Reserved for future use and must be NULL.
* dwFlags [I] See MSDN Doc.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptSetProviderExA (LPCSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags)
{
HKEY hProvKey, hTypeKey;
PSTR keyname;
DPRINT("(%s, %ld, %p, %08ld)\n", pszProvName, dwProvType, pdwReserved, dwFlags);
if (!pszProvName || pdwReserved)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
if (dwProvType > MAXPROVTYPES)
CRYPT_ReturnLastError(NTE_BAD_PROV_TYPE);
if (dwFlags & ~(CRYPT_MACHINE_DEFAULT | CRYPT_USER_DEFAULT | CRYPT_DELETE_DEFAULT)
|| dwFlags == CRYPT_DELETE_DEFAULT)
CRYPT_ReturnLastError(NTE_BAD_FLAGS);
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, &hTypeKey))
{
CRYPT_Free(keyname);
CRYPT_ReturnLastError(NTE_BAD_PROVIDER);
}
CRYPT_Free(keyname);
if (dwFlags & CRYPT_DELETE_DEFAULT)
{
RegDeleteValueA(hTypeKey, "Name");
}
else
{
if (!(keyname = CRYPT_GetProvKeyName(pszProvName)))
{
RegCloseKey(hTypeKey);
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
}
if (RegOpenKeyA((dwFlags & CRYPT_USER_DEFAULT) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
keyname, &hProvKey))
{
CRYPT_Free(keyname);
RegCloseKey(hTypeKey);
CRYPT_ReturnLastError(NTE_BAD_PROVIDER);
}
CRYPT_Free(keyname);
if (RegSetValueExA(hTypeKey, "Name", 0, REG_SZ, (LPBYTE)pszProvName, strlen(pszProvName) + 1))
{
RegCloseKey(hTypeKey);
RegCloseKey(hProvKey);
return FALSE;
}
RegCloseKey(hProvKey);
}
RegCloseKey(hTypeKey);
return TRUE;
}
/******************************************************************************
* CryptSetProviderExW (ADVAPI32.@)
*
* See CryptSetProviderExA
*/
BOOL WINAPI CryptSetProviderExW (LPCWSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags)
{
BOOL ret = FALSE;
PSTR str = NULL;
DPRINT("(%S, %ld, %p, %08ld)\n", pszProvName, dwProvType, pdwReserved, dwFlags);
if (CRYPT_UnicodeToANSI(pszProvName, &str, -1))
{
ret = CryptSetProviderExA(str, dwProvType, pdwReserved, dwFlags);
CRYPT_Free(str);
}
return ret;
}
/******************************************************************************
* CryptSetProvParam (ADVAPI32.@)
*
* Customizes the operations of a CSP.
*
* PARAMS
* hProv [I] Handle of a CSP.
* dwParam [I] See MSDN Doc.
* pbData [I] Buffer that contains a value to set as a parameter.
* dwFlags [I] if dwParam is PP_USE_HARDWARE_RNG, dwFlags must be zero.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptSetProvParam (HCRYPTPROV hProv, DWORD dwParam, BYTE *pbData, DWORD dwFlags)
{
PCRYPTPROV prov = (PCRYPTPROV)hProv;
DPRINT("(0x%lx, %ld, %p, %08ld)\n", hProv, dwParam, pbData, dwFlags);
if (!prov)
CRYPT_ReturnLastError(ERROR_INVALID_HANDLE);
if (dwFlags & PP_USE_HARDWARE_RNG)
{
DPRINT1("PP_USE_HARDWARE_RNG: What do I do with this?\n");
DPRINT1("\tLetting the CSP decide.\n");
}
if (dwFlags & PP_CLIENT_HWND)
{
/* FIXME: Should verify the parameter */
if (pbData /* && IsWindow((HWND)pbData) */)
{
crypt_hWindow = (HWND)(pbData);
return TRUE;
} else {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
}
/* All other flags go to the CSP */
return prov->pFuncs->pCPSetProvParam(prov->hPrivate, dwParam, pbData, dwFlags);
}
/******************************************************************************
* CryptVerifySignatureA
*
* Note: Since the sDesciption (string) is supposed to be NULL and
* is only retained for compatibility no string conversions are required
* and only one implementation is required for both ANSI and Unicode.
* We still need to export both:
*
* CryptVerifySignatureA (ADVAPI32.@)
* CryptVerifySignatureW (ADVAPI32.@)
*
* Verifies the signature of a hash object.
*
* PARAMS
* hHash [I] Handle of the hash object to verify.
* pbSignature [I] Signature data to verify.
* dwSigLen [I] Size of pbSignature.
* hPubKey [I] Handle to the public key to authenticate signature.
* sDescription [I] Must be set to NULL.
* dwFlags [I] See MSDN doc.
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*/
BOOL WINAPI CryptVerifySignatureA (HCRYPTHASH hHash, BYTE *pbSignature, DWORD dwSigLen,
HCRYPTKEY hPubKey, LPCSTR sDescription, DWORD dwFlags)
{
PCRYPTHASH hash = (PCRYPTHASH)hHash;
PCRYPTKEY key = (PCRYPTKEY)hPubKey;
PCRYPTPROV prov;
DPRINT("(0x%lx, %p, %ld, 0x%lx, %08ld)\n", hHash, pbSignature,
dwSigLen, hPubKey, dwFlags);
if (sDescription)
{
DPRINT("The sDescription parameter is not supported (and no longer used). Ignoring.\n");
}
if (!hash || !key)
CRYPT_ReturnLastError(ERROR_INVALID_HANDLE);
if (!pbSignature || !dwSigLen)
CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
prov = hash->pProvider;
return prov->pFuncs->pCPVerifySignature(prov->hPrivate, hash->hPrivate, pbSignature, dwSigLen,
key->hPrivate, NULL, dwFlags);
}
BOOL WINAPI
CryptVerifySignatureW (HCRYPTHASH hHash,
BYTE *pbSignature,
DWORD dwSigLen,
HCRYPTKEY hPubKey,
LPCWSTR sDescription,
DWORD dwFlags)
{
OutputDebugStringA ("ADVAPI32!CryptVerifySignatureW not implemented!");
return FALSE;
}
/*
These functions have nearly identical prototypes to CryptProtectMemory and CryptUnprotectMemory,
in crypt32.dll.
*/
/******************************************************************************
* SystemFunction040 (ADVAPI32.@)
*
* PARAMS:
* memory : pointer to memory to encrypt
* length : length of region to encrypt, in bytes. must be multiple of RTL_ENCRYPT_MEMORY_SIZE
* flags : RTL_ENCRYPT_OPTION_SAME_PROCESS | RTL_ENCRYPT_OPTION_CROSS_PROCESS, | RTL_ENCRYPT_OPTION_SAME_LOGON
* control whether other processes are able to decrypt the memory. The same value must be given
* when decrypting the memory.
*/
NTSTATUS WINAPI SystemFunction040(PVOID memory, ULONG length, ULONG flags) /* RtlEncryptMemory */
{
DPRINT1("(%p, %lx, %lx): stub [RtlEncryptMemory]\n", memory, length, flags);
return STATUS_SUCCESS;
}
/******************************************************************************
* SystemFunction041 (ADVAPI32.@)
*
* PARAMS:
* memory : pointer to memory to decrypt
* length : length of region to decrypt, in bytes. must be multiple of RTL_ENCRYPT_MEMORY_SIZE
* flags : RTL_ENCRYPT_OPTION_SAME_PROCESS | RTL_ENCRYPT_OPTION_CROSS_PROCESS, | RTL_ENCRYPT_OPTION_SAME_LOGON
* control whether other processes are able to decrypt the memory. The same value must be given
* when encrypting the memory.
*/
NTSTATUS WINAPI SystemFunction041(PVOID memory, ULONG length, ULONG flags) /* RtlDecryptMemory */
{
DPRINT1("(%p, %lx, %lx): stub [RtlDecryptMemory]\n", memory, length, flags);
return STATUS_SUCCESS;
}
/*
* @unimplemented
*/
DWORD WINAPI AddUsersToEncryptedFile (
LPCWSTR lpcwstr,
PENCRYPTION_CERTIFICATE_LIST pencryption_certificate_list
)
{
DPRINT1("%s() not implemented!\n", __FUNCTION__);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/*
* @unimplemented
*/
DWORD WINAPI RemoveUsersFromEncryptedFile (
LPCWSTR lpcwstr,
PENCRYPTION_CERTIFICATE_HASH_LIST pencryption_certificate_hash_list
)
{
DPRINT1("%s() not implemented!\n", __FUNCTION__);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/*
* @unimplemented
*/
BOOL WINAPI FileEncryptionStatusW (
LPCWSTR lpFileName,
LPDWORD lpStatus
)
{
DPRINT1("%s(%S) not implemented!\n", __FUNCTION__, lpFileName);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
/*
* @implemented
*/
BOOL WINAPI FileEncryptionStatusA (
LPCSTR lpFileName,
LPDWORD lpStatus
)
{
UNICODE_STRING FileName;
NTSTATUS Status;
BOOL ret = FALSE;
FileName.Buffer = NULL;
Status = RtlCreateUnicodeStringFromAsciiz(&FileName, lpFileName);
if (!NT_SUCCESS(Status))
{
SetLastError(RtlNtStatusToDosError(Status));
goto cleanup;
}
ret = FileEncryptionStatusW(FileName.Buffer, lpStatus);
cleanup:
if (FileName.Buffer != NULL)
RtlFreeUnicodeString(&FileName);
return ret;
}
/*
* @unimplemented
*/
DWORD WINAPI QueryUsersOnEncryptedFile (
LPCWSTR lpctstr,
PENCRYPTION_CERTIFICATE_HASH_LIST* pencryption_certificate_hash_list
)
{
DPRINT1("%s() not implemented!\n", __FUNCTION__);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/*
* @unimplemented
*/
void WINAPI FreeEncryptionCertificateHashList (
PENCRYPTION_CERTIFICATE_HASH_LIST pencryption_certificate_hash_list
)
{
DPRINT1("%s() not implemented!\n", __FUNCTION__);
return;
}
/*
* @unimplemented
*/
DWORD WINAPI QueryRecoveryAgentsOnEncryptedFile (
LPCWSTR lpctstr,
PENCRYPTION_CERTIFICATE_HASH_LIST* pencryption_certificate_hash_list
)
{
DPRINT1("%s() not implemented!\n", __FUNCTION__);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/*
* @unimplemented
*/
BOOL WINAPI EncryptionDisable(
LPCWSTR DirPath,
BOOL Disable
)
{
DPRINT1("%s() not implemented!\n", __FUNCTION__);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -