CryptMsgGetParam 函数 (wincrypt.h)

加密消息编码或解码后 ,CryptMsgGetParam 函数获取消息参数。 此函数在最终 的 CryptMsgUpdate 调用之后调用。

语法

BOOL CryptMsgGetParam(
  [in]      HCRYPTMSG hCryptMsg,
  [in]      DWORD     dwParamType,
  [in]      DWORD     dwIndex,
  [out]     void      *pvData,
  [in, out] DWORD     *pcbData
);

参数

[in] hCryptMsg

加密消息的句柄。

[in] dwParamType

指示要检索的数据的参数类型。 要检索的数据类型决定了要用于 pvData 的结构类型。

对于编码消息,只有CMSG_BARE_CONTENT、CMSG_ENCODE_SIGNER、CMSG_CONTENT_PARAM和CMSG_COMPUTED_HASH_PARAM dwParamType有效。

含义
CMSG_ATTR_CERT_COUNT_PARAM
pvData 数据类型:指向 DWORD 的指针

返回 SIGNED 或 ENVELOPED 消息中属性证书的计数。

CMSG_ATTR_CERT_PARAM
pvData 数据类型:指向 BYTE 数组的指针

检索属性证书。 若要获取所有属性证书,请将 CryptMsgGetParamdwIndex 设置为 0(属性数减 1)。

CMSG_BARE_CONTENT_PARAM
pvData 数据类型:指向 BYTE 数组的指针

检索编码加密消息的编码内容,而不检索CONTENT_INFO结构的外层。 也就是说,仅返回 PKCS #7 定义的 ContentInfo.content 字段的编码。

CMSG_CERT_COUNT_PARAM
pvData 数据类型:指向 DWORD 的指针

返回收到的 SIGNED 或 ENVELOPED 消息中的证书数。

CMSG_CERT_PARAM
pvData 数据类型:指向 BYTE 数组的指针

返回签名者的证书。 若要获取签名者的所有证书,请调用 CryptMsgGetParam,将 dwIndex 从 0 更改为可用证书数减 1。

CMSG_COMPUTED_HASH_PARAM
pvData 数据类型:指向 BYTE 数组的指针

返回消息中数据计算得出的哈希。 此类型适用于编码和解码。

CMSG_CONTENT_PARAM
pvData 数据类型:指向 BYTE 数组的指针

从打开进行编码的消息返回整个 PKCS #7 消息。 检索打开以解码的消息的内部内容。 如果邮件是信封的,内部类型是数据,并且已调用 CryptMsgControl 来解密消息,则返回解密的内容。 如果内部类型不是数据,则返回需要进一步解码的编码 BLOB。 如果消息未采用信封且内部内容为 DATA,则返回的数据是内部内容的八进制数。 此类型适用于编码和解码。

对于解码,如果类型为CMSG_DATA,则返回内容的八进制数;否则,返回编码的内部内容。

CMSG_CRL_COUNT_PARAM
pvData 数据类型:指向 DWORD 的指针

返回接收、已签名或 ENVELOPED 消息中的 CRL 计数。

CMSG_CRL_PARAM
pvData 数据类型:指向 BYTE 数组的指针

返回 CRL。 若要获取所有 CRL,请调用 CryptMsgGetParam,将 dwIndex 从 0 更改为可用 CRL 数减 1。

CMSG_ENCODED_MESSAGE
pvData 数据类型:指向 BYTE 数组的指针

更改已编码的消息的内容。 必须先通过调用 CryptMsgOpenToDecode 来解码消息。 然后,通过调用 CryptMsgControlCryptMsgCountersignCryptMsgCountersignEncoded 来更改消息。 然后,通过调用 CryptMsgGetParam 再次对消息进行编码,指定CMSG_ENCODED_MESSAGE以获取反映所做更改的新编码。 例如,这可用于向消息添加时间戳属性。

CMSG_ENCODED_SIGNER
pvData 数据类型:指向 BYTE 数组的指针

返回消息签名者的编码CMSG_SIGNER_INFO签名者信息。

CMSG_ENCRYPTED_DIGEST
pvData 数据类型:指向 BYTE 数组的指针

返回签名的加密哈希。 通常用于执行时间戳。

CMSG_ENCRYPT_PARAM
pvData 数据类型:指向CRYPT_ALGORITHM_IDENTIFIER结构的 BYTE 数组的指针。

返回用于加密消息的加密算法。

CMSG_ENVELOPE_ALGORITHM_PARAM
pvData 数据类型:指向CRYPT_ALGORITHM_IDENTIFIER结构的 BYTE 数组的指针。

返回用于加密 ENVELOPED 消息的加密算法。

CMSG_HASH_ALGORITHM_PARAM
pvData 数据类型:指向CRYPT_ALGORITHM_IDENTIFIER结构的 BYTE 数组的指针。

返回创建消息时用于对消息进行哈希运算的哈希算法。

CMSG_HASH_DATA_PARAM
pvData 数据类型:指向 BYTE 数组的指针

返回创建消息时存储在消息中的哈希值。

CMSG_INNER_CONTENT_TYPE_PARAM
pvData 数据类型:指向 BYTE 数组的指针,用于接收以 null 结尾 的对象标识符 (OID) 字符串。

返回收到的消息的内部内容类型。 此类型不适用于 DATA 类型的消息。

CMSG_RECIPIENT_COUNT_PARAM
pvData 数据类型:指向 DWORD 的指针

返回信封D 接收邮件的密钥传输收件人数。

CMSG_CMS_RECIPIENT_COUNT_PARAM
pvData 数据类型:指向 DWORD 的指针

返回所有邮件收件人(包括密钥协议和邮件列表收件人)的总计数。

CMSG_RECIPIENT_INDEX_PARAM
pvData 数据类型:指向 DWORD 的指针

返回用于解密 ENVELOPED 邮件的密钥传输收件人的索引。 只有在解密消息后,此值才可用。

CMSG_CMS_RECIPIENT_INDEX_PARAM
pvData 数据类型:指向 DWORD 的指针

返回用于解密 ENVELOPED 邮件的密钥传输、密钥协议或邮件列表收件人的索引。

CMSG_CMS_RECIPIENT_ENCRYPTED_KEY_INDEX_PARAM
pvData 数据类型:指向 DWORD 的指针

返回用于解密 ENVELOPED 邮件的密钥协议收件人的加密密钥的索引。

CMSG_RECIPIENT_INFO_PARAM
pvData 数据类型:指向 BYTE 数组的指针,用于接收 CERT_INFO 结构。

返回有关密钥传输邮件收件人的证书信息。 若要获取有关所有密钥传输邮件收件人的证书信息,请重复调用 CryptMsgGetParam,将 dwIndex 从 0 更改为收件人数减 1。 只有返回的 CERT_INFO 结构的 Issuer、SerialNumber 和 PublicKeyAlgorithm 成员可用且有效。

CMSG_CMS_RECIPIENT_INFO_PARAM
pvData 数据类型:指向要接收CMSG_CMS_RECIPIENT_INFO结构的 BYTE 数组的指针。

返回有关密钥传输、密钥协议或邮件列表收件人的信息。 它不限于密钥传输邮件收件人。 若要获取有关所有邮件收件人的信息,请重复调用 CryptMsgGetParam,将 dwIndex 从 0 更改为收件人数减 1。

CMSG_SIGNER_AUTH_ATTR_PARAM
pvData 数据类型:指向要接收CRYPT_ATTRIBUTES结构的 BYTE 数组 指针。

返回消息签名者的经过身份验证的属性。 若要检索指定签名者的经过身份验证的属性,请调用 dwIndex 等于该签名者的索引的 CryptMsgGetParam

CMSG_SIGNER_CERT_INFO_PARAM
pvData 数据类型:指向要接收CERT_INFO结构的 BYTE 数组的指针。

返回标识签名者证书所需的消息签名者的信息。 证书的颁发者和 SerialNumber 可用于唯一标识要检索的证书。 若要检索所有签名者的信息,请重复调用 CryptMsgGetParam ,将 dwIndex 从 0 更改为签名者数减 1。 只有返回 的 CERT_INFO 结构中的“颁发者”和“SerialNumber”字段包含可用的有效数据。

CMSG_SIGNER_CERT_ID_PARAM
pvData 数据类型:指向 BYTE 数组的指针,用于接收 CERT_ID 结构。

返回有关标识签名者公钥所需的消息签名者的信息。 这可以是证书的颁发者和 SerialNumber、KeyID 或 HashId。 若要检索所有签名者的信息,请调用 CryptMsgGetParamdwIndex 从 0 更改为签名者数减 1。

CMSG_SIGNER_COUNT_PARAM
pvData 数据类型:指向 DWORD 的指针

返回收到的已签名消息的签名者数。

CMSG_SIGNER_HASH_ALGORITHM_PARAM
pvData 数据类型:指向 BYTE 数组的指针,用于接收 CRYPT_ALGORITHM_IDENTIFIER 结构。

返回消息的签名者使用的哈希算法。 若要获取指定签名者的哈希算法,请调用 dwIndex 等于该签名者的索引的 CryptMsgGetParam

CMSG_SIGNER_INFO_PARAM
pvData 数据类型:指向要接收CMSG_SIGNER_INFO结构的 BYTE 数组的指针。

返回有关消息签名者的信息。 这包括签名者证书的颁发者和序列号,以及签名者证书的经过身份验证和未经身份验证的属性。 若要检索消息所有签名者的签名者信息,请调用 CryptMsgGetParam ,将 dwIndex 从 0 更改为签名者数减 1。

CMSG_CMS_SIGNER_INFO_PARAM
pvData 数据类型:指向要接收CMSG_CMS_SIGNER_INFO结构的 BYTE 数组的指针。

返回有关消息签名者的信息。 这包括 signerId 以及经过身份验证和未经身份验证的属性。 若要检索消息所有签名者的签名者信息,请调用 CryptMsgGetParam ,将 dwIndex 从 0 更改为签名者数减 1。

CMSG_SIGNER_UNAUTH_ATTR_PARAM
pvData 数据类型:指向要接收CRYPT_ATTRIBUTES结构的 BYTE 数组 指针。

返回消息签名者的未经身份验证的属性。 若要检索指定签名者的未经身份验证的属性,请调用 dwIndex 等于该签名者的索引的 CryptMsgGetParam

CMSG_TYPE_PARAM
pvData 数据类型:指向 DWORD 的指针

返回未知类型的解码消息的消息类型。 检索到的消息类型可以与支持的类型进行比较,以确定处理是否可以继续。 有关支持的消息类型,请参阅 CryptMsgOpenToDecodedwMessageType 参数。

CMSG_UNPROTECTED_ATTR_PARAM
pvData 数据类型:指向要接收CMSG_ATTR结构的 BYTE 数组的指针。

返回信封邮件中的不受保护的属性。

CMSG_VERSION_PARAM
pvData 数据类型:指向 DWORD 的指针

返回已解码消息的版本。 有关详细信息,请参阅“备注”部分中的表。

[in] dwIndex

要检索的参数的索引(如果适用)。 未检索参数时,将忽略此参数并将其设置为零。

[out] pvData

指向接收检索到的数据的缓冲区的指针。 此数据的形式将因 dwParamType 参数的值而异。

此参数可以为 NULL ,用于设置此信息的大小,以便进行内存分配。 有关详细信息,请参阅 检索长度未知的数据

处理此缓冲区中返回的数据时,应用程序需要使用返回的数据的实际大小。 实际大小可以略小于输入时指定的缓冲区的大小。 (输入时,缓冲区大小通常指定得足够大,以确保缓冲区中容纳可能的最大输出数据。) 输出时,此参数指向的变量将更新为反映复制到缓冲区的数据的实际大小。

[in, out] pcbData

指向变量的指针,该变量指定 pvData 参数指向的缓冲区的大小(以字节为单位)。 当函数返回时, 由印刷板Data 参数指向的变量包含缓冲区中存储的字节数。

返回值

如果函数成功,则返回值为非零 (TRUE) 。

如果函数失败,则返回值为零, (FALSE) 。 有关扩展的错误信息,请调用 GetLastError

下表列出了 GetLastError 函数最常返回的错误代码。

返回代码 说明
CRYPT_E_ATTRIBUTES_MISSING
消息不包含请求的属性。
CRYPT_E_INVALID_INDEX
索引值无效。
CRYPT_E_INVALID_MSG_TYPE
消息类型无效。
CRYPT_E_NOT_DECRYPTED
消息内容尚未解密。
CRYPT_E_OID_FORMAT
对象标识符的格式不正确。
CRYPT_E_UNEXPECTED_ENCODING
消息未按预期进行编码。
E_INVALIDARG
一个或多个参数无效。
ERROR_MORE_DATA
指定的缓冲区不够大,无法保存返回的数据。
 

对于 dwParamType CMSG_COMPUTED_HASH_PARAM,可以从 CryptGetHashParam 传播错误。

如果函数失败, GetLastError 可能会返回 抽象语法表示法 One (ASN.1) 编码/解码错误。 有关这些错误的信息,请参阅 ASN.1 编码/解码返回值

注解

以下版本号通过调用 CryptMsgGetParam 返回,其中 dwParamType 设置为定义CMSG_VERSION_PARAM:

  • CMSG_SIGNED_DATA_V1
  • CMSG_SIGNED_DATA_V3
  • CMSG_SIGNED_DATA_PKCS_1_5_VERSION
  • CMSG_SIGNED_DATA_CMS_VERSION
  • CMSG_SIGNER_INFO_V1
  • CMSG_SIGNER_INFO_V3
  • CMSG_SIGNER_INFO_PKCS_1_5_VERSION
  • CMSG_SIGNER_INFO_CMS_VERSION
  • CMSG_HASHED_DATA_V0
  • CMSG_HASHED_DATA_V2
  • CMSG_HASHED_DATA_PKCS_1_5_VERSION
  • CMSG_HASHED_DATA_CMS_VERSION
  • CMSG_ENVELOPED_DATA_V0
  • CMSG_ENVELOPED_DATA_V2
  • CMSG_ENVELOPED_DATA_PKCS_1_5_VERSION
  • CMSG_ENVELOPED_DATA_CMS_VERSION

示例

有关使用此函数的示例,请参阅 示例 C 程序:签名、编码、解码和验证消息用于编码信封消息的备用代码示例 C 程序:编码信封、签名消息示例 C 程序:编码和解码哈希消息

要求

   
最低受支持的客户端 Windows XP [桌面应用 | UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用 | UWP 应用]
目标平台 Windows
标头 wincrypt.h
Library Crypt32.lib
DLL Crypt32.dll

另请参阅

CryptMsgOpenToDecode

CryptMsgOpenToEncode

CryptMsgUpdate

低级别消息函数

简化的消息函数