[New - Windows NT]
[New - Windows 95, OEM Service Release 2]
CryptGetHashParam功能允许应用程序检索管理散列对象操作的数据。也可以使用此函数检索实际的哈希值。
BOOL CRYPTFUNC CryptGetHashParam(
HCRYPTHASH【马】, | |
DWORD【dwParam】, | |
BYTE *【pbData】, | |
DWORD *【pdwDataLen】, | |
DWORD【dwFlags中】 | |
); |
参数
【马】
[in]查询参数的哈希对象的句柄。
【dwParam】
[in]参数号。有关参数的列表,请参阅“备注”部分。
【pbData】
[out]参数数据缓冲区。该函数将指定的参数数据复制到此缓冲区。此数据的形式将根据参数编号而有所不同。
如果您正在做的是确定返回的参数数据所需的字节数,则此参数可以为NULL。
【pdwDataLen】
[in/out]参数数据长度的地址。在调用此函数之前,调用者应将此参数设置为【pbData】缓冲区的长度(以字节为单位)。返回时,该地址将包含复制到缓冲区的参数数据的字节数。
如果由【pbData】指定的缓冲区不足以容纳数据,则该函数返回ERROR_MORE_DATA错误代码(通过GetLastError),并将所需的缓冲区大小(以字节为单位)存储在【pdwDataLen】中指向的变量中。
如果【pbData】为NULL,则不会返回错误,并且该函数将以【pdwDataLen】指向的变量存储数据的大小(以字节为单位)。
【dwFlags中】
[in]标志值。此参数保留供将来使用,并且应始终为零。
备注
【dwParam】值可以设置为以下哈希参数类型之一:
HP_ALGID
哈希算法。【pbData】缓冲区将包含一个ALG_ID值,表示在创建哈希对象时指定的算法。有关哈希算法的列表,请参阅CryptCreateHash函数。
HP_HASHSIZE
散列值大小。【pbData】缓冲区将包含一个DWORD值,表示哈希值中的字节数。该值通常为16或20,这取决于哈希算法。
应用程序应该在HP_HASHVAL参数之前检索此参数,以便可以分配正确的内存量。
HP_HASHVAL
散列值。【pbData】缓冲区将包含由【马】指定的散列对象的哈希值或消息摘要。该值是通过CryptHashData和CryptHashSessionKey函数基于较早提供给散列对象的数据生成的。
一旦检索到此参数,则哈希对象将被标记为“已完成”,并且不会再添加更多的数据。
请注意,一些CSP可以添加可以通过此函数查询的其他参数。
返回值
如果函数成功,返回值不为零。
如果函数失败,返回值为零。要检索扩展错误信息,请使用GetLastError功能。
下表列出了GetLastError函数最常返回的错误代码。由“NTE”开头的错误代码由您使用的特定CSP生成。
错误 | 描述 |
ERROR_INVALID_HANDLE | 其中一个参数指定一个无效句柄。 |
ERROR_INVALID_PARAMETER | 其中一个参数包含无效值。这通常是一个非法的指针。 |
NTE_BAD_FLAGS | 【dwFlags中】参数为非零。 |
NTE_BAD_HASH | 由【马】参数指定的散列对象无效。 |
NTE_BAD_TYPE | 【dwParam】参数指定未知参数号。 |
NTE_BAD_UID | 创建哈希时指定的CSP上下文无法找到。 |
例
#include < wincrypt.h >
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
BYTE *pbHash = NULL;
DWORD dwHashLen;
#define BUFFER_SIZE 256
BYTE pbBuffer[BUFFER_SIZE];
DWORD dwCount;
DWORD i;
//获取默认提供程序的句柄。
if(!CryptAcquireContext(& hProv,NULL,NULL,PROV_RSA_FULL,0)){
printf("Error %x during CryptAcquireContext!\n", GetLastError());
goto done;
}
//创建哈希对象。
IF(!CryptCreateHash(hProv,CALG_MD5,0,0,{} hHash 989796005)){
printf("Error %x during CryptBeginHash!\n", GetLastError());
goto done;
}
//将缓冲区填入测试数据。
for(i = 0 ; i < BUFFER_SIZE ; i++) {
pbBuffer[i] = (BYTE)i;
}
//缓冲区中的哈希。
if(!CryptHashData(hHash,pbBuffer,BUFFER_SIZE,0)){
printf("Error %x during CryptHashData!\n", GetLastError());
goto done;
}
//读取哈希值大小并分配内存。
dwCount = sizeof(DWORD);
如果(!CryptGetHashParam(hHash,HP_HASHSIZE,(BYTE *)& dwHashLen,
& dwCount,0)){
printf("Error %x during reading hash size!\n", GetLastError());
goto done;
}
if((pbHash = malloc(dwHashLen)) == NULL) {
printf("Out of memory!\n");
goto done;
}
//读取哈希值。
if(!CryptGetHashParam(hHash,HP_HASHVAL,pbHash,& dwHashLen,0)){
printf("Error %x during reading hash value!\n", GetLastError());
goto done;
}
//打印哈希值。
for(i = 0 ; i < dwHashLen ; i++) {
printf("%2.2x ",pbHash[i]);
}
printf("\n");
完成:
//空闲内存
if(pbHash !=NULL) free(pbHash);
//销毁哈希对象。
if(hHash) CryptDestroyHash(hHash);
//发布CSP句柄。
if(hProv) CryptReleaseContext(hProv,0);
也可以看看
CryptCreateHash, CryptGetKeyParam, CryptHashData, CryptHashSessionKey, CryptSetHashParam