CryptVerifyMessageSignature 函数 (wincrypt.h)
CryptVerifyMessageSignature 函数验证已签名消息的签名。
不应使用此函数来验证分离消息的签名。 应使用 CryptVerifyDetachedMessageSignature 函数来验证分离消息的签名。
语法
BOOL CryptVerifyMessageSignature(
[in] PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
[in] DWORD dwSignerIndex,
[in] const BYTE *pbSignedBlob,
[in] DWORD cbSignedBlob,
[out] BYTE *pbDecoded,
[in, out] DWORD *pcbDecoded,
[out, optional] PCCERT_CONTEXT *ppSignerCert
);
参数
[in] pVerifyPara
指向包含验证参数 的CRYPT_VERIFY_MESSAGE_PARA 结构的指针。
[in] dwSignerIndex
所需签名的索引。 可以有多个签名。 CryptVerifyMessageSignature 可以重复调用,每次递增 dwSignerIndex 。 如果第一个签名者只有一个签名者,请将此参数设置为零。 如果函数返回 FALSE,并且 GetLastError 返回CRYPT_E_NO_SIGNER,则前面的调用处理了消息的最后一个签名者。
[in] pbSignedBlob
指向包含已签名消息的缓冲区的指针。
[in] cbSignedBlob
已签名消息缓冲区的大小(以字节为单位)。
[out] pbDecoded
指向用于接收解码消息的缓冲区的指针。
如果不需要解码的消息进行其他处理或为内存分配设置消息大小,则此参数可以为 NULL 。 有关详细信息,请参阅 检索长度未知的数据。
[in, out] pcbDecoded
指向 DWORD 值的指针,该值指定 pbDecoded 缓冲区的大小(以字节为单位)。 函数返回时,此 DWORD 包含解码消息的大小(以字节为单位)。 如果此参数为 NULL,则不会返回解码的消息。
[out, optional] ppSignerCert
接收签名者证书 的CERT_CONTEXT 结构指针的地址。 使用此结构后,请通过将此指针传递到 CertFreeCertificateContext 函数来释放它。 如果不需要签名者的证书,此参数可以为 NULL 。
返回值
如果函数成功,该函数将返回非零值。 这不一定意味着签名已验证。 对于分离消息, 由板Decoded 指向的变量将包含零。 在这种情况下,此函数将返回非零值,但签名未验证。 若要验证分离消息的签名,请使用 CryptVerifyDetachedMessageSignature 函数。
如果函数失败,则返回零。 有关扩展的错误信息,请调用 GetLastError。
下表显示了 GetLastError 函数最常返回的错误代码。
返回代码 | 说明 |
---|---|
|
如果 pbDecoded 参数指定的缓冲区不够大,无法容纳返回的数据,则函数将设置ERROR_MORE_DATA代码,并将所需的缓冲区大小(以字节为单位)存储在 由ERROR_MORE_DATA decoded 指向的变量中。 |
|
无效的消息和证书编码类型。 目前仅支持PKCS_7_ASN_ENCODING和X509_ASN_ENCODING_TYPE。 *pVerifyPara 中的 cbSize 无效。 |
|
不是签名的加密消息。 |
|
该消息没有任何签名者或指定 dwSignerIndex 的签名者。 |
|
消息已使用未知或不受支持的算法进行哈希处理和签名。 |
|
消息的签名未验证。 |
如果函数失败, GetLastError 可能会返回 抽象语法表示法 One (ASN.1) 编码/解码错误。 有关这些错误的信息,请参阅 ASN.1 编码/解码返回值。
注解
对于已验证的签名者和消息, ppSignerCert 将更新为签名者的 CERT_CONTEXT 。 必须通过调用 CertFreeCertificateContext 来释放它。 否则, ppSignerCert 设置为 NULL。
对于仅包含证书和 CRL 的消息, 将“印刷机” 设置为 NULL。
示例
有关使用此函数的示例,请参阅 示例 C 程序:对消息进行签名和验证消息签名。
要求
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | wincrypt.h |
Library | Crypt32.lib |
DLL | Crypt32.dll |