CryptVerifySignatureA 函数 (wincrypt.h)
在调用此函数之前,必须调用 CryptCreateHash 来创建哈希对象的句柄。 然后使用 CryptHashData 或 CryptHashSessionKey 向哈希对象添加数据或会话键。
CryptVerifySignature 完成后,只能使用 hHash 句柄调用 CryptDestroyHash。
语法
BOOL CryptVerifySignatureA(
[in] HCRYPTHASH hHash,
[in] const BYTE *pbSignature,
[in] DWORD dwSigLen,
[in] HCRYPTKEY hPubKey,
[in] LPCSTR szDescription,
[in] DWORD dwFlags
);
参数
[in] hHash
要验证的哈希对象的句柄。
[in] pbSignature
要验证的签名数据的地址。
[in] dwSigLen
pbSignature 签名数据中的字节数。
[in] hPubKey
用于对签名进行身份验证的 公钥 的句柄。 此公钥必须属于最初用于创建数字签名的密钥对。
[in] szDescription
此参数不应再使用,并且必须设置为 NULL 以防止安全漏洞。 但是,在 Microsoft 基本加密提供程序中仍支持它实现向后兼容性。
[in] dwFlags
定义了以下标志值。
值 | 含义 |
---|---|
|
此标志与 RSA 提供程序一起使用。 验证签名时,不应存在或检查 OID) (哈希 对象标识符 。 如果未设置此标志,则会按照 PKCS #7 中 DigestInfo 的定义中的指定验证默认签名中的哈希 OID。 |
|
未使用此标志。 |
|
对符合 FIPS 186-2 的 RSA (rDSA) 使用 X.931 支持。 |
返回值
如果函数成功,则返回值为 TRUE。
如果函数失败,则返回值为 FALSE。 有关扩展的错误信息,请调用 GetLastError。
“NTE”开头的错误代码由你使用的特定 CSP 生成。 一些可能的错误代码随之而来。
返回代码 | 说明 |
---|---|
|
其中一个参数指定无效的句柄。 |
|
其中一个参数包含无效的值。 这通常是无效的指针。 |
|
dwFlags 参数为非零。 |
|
hHash 参数指定的哈希对象无效。 |
|
hPubKey 参数不包含有效公钥的句柄。 |
|
签名无效。 这可能是因为数据本身已更改、说明字符串不匹配,或者 hPubKey 指定了错误的公钥。
如果哈希算法或签名算法与用于创建签名的算法不匹配,则也可能返回此错误。 |
|
无法找到在创建哈希对象时指定的 CSP (加密服务提供程序) 上下文。 |
|
CSP 在操作期间内存不足。 |
注解
CryptVerifySignature 函数完成哈希。 此调用后,不能将更多数据添加到哈希中。 对 CryptHashData 或 CryptHashSessionKey 的其他调用失败。 使用哈希完成应用程序后,应调用 CryptDestroyHash 来销毁哈希对象。
如果使用 .NET Framework API 生成签名,并尝试使用 CryptVerifySignature 函数对其进行验证,则函数将失败,GetLastError 将返回NTE_BAD_SIGNATURE。 这是因为本机 Win32 API 和 .NET Framework API 之间的字节顺序不同。
本机加密 API 使用 little-endian 字节顺序,而 .NET Framework API 使用 big-endian 字节顺序。 如果要验证使用 .NET Framework API 生成的签名,则必须在调用 CryptVerifySignature 函数之前交换签名字节的顺序来验证签名。
示例
有关使用 CryptVerifySignature 函数的示例,请参阅 示例 C 程序:对哈希进行签名和验证哈希签名。
注意
wincrypt.h 标头将 CryptVerifySignature 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名的使用与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | wincrypt.h |
Library | Advapi32.lib |
DLL | Advapi32.dll |