CryptMsgUpdate 函数 (wincrypt.h)

CryptMsgUpdate 函数将内容添加到加密消息。 使用此函数,可以通过重复调用 CryptMsgUpdate 来逐个构造消息。 添加的消息内容经过编码或解码,具体取决于消息是使用 CryptMsgOpenToEncode 还是 CryptMsgOpenToDecode 打开的。

语法

BOOL CryptMsgUpdate(
  [in] HCRYPTMSG  hCryptMsg,
  [in] const BYTE *pbData,
  [in] DWORD      cbData,
  [in] BOOL       fFinal
);

参数

[in] hCryptMsg

要更新的消息的加密消息句柄。

[in] pbData

指向包含要编码或解码的数据的缓冲区的指针。

[in] cbData

pbData 缓冲区中的数据字节数。

[in] fFinal

指示正在处理用于编码或解码的最后一个数据块。 此标志的正确用法取决于正在处理的消息是否具有分离数据。 在调用打开消息的函数时,通过将 dwFlags 设置为 CMSG_DETACHED_FLAG 来指示消息中包含分离数据。

如果未设置CMSG_DETACHED_FLAG,并且已使用 CryptMsgOpenToDecodeCryptMsgOpenToEncode 打开消息, 则 fFinal 设置为 TRUE,并且 仅调用一次 CryptMsgUpdate

如果已设置CMSG_DETACHED_FLAG标志并使用 CryptMsgOpenToEncode 打开消息,则 fFinal 仅在上次调用 CryptMsgUpdate 时设置为 TRUE

如果设置了CMSG_DETACHED_FLAG标志并使用 CryptMsgOpenToDecode 打开消息,则通过对 CryptMsgUpdate 的单个调用处理标头时,fFinal 将设置为 TRUE。 在对 CryptMsgUpdate 的后续调用中处理分离数据时,它设置为 FALSE,直到处理最后一个分离的数据块。 上次调用 CryptMsgUpdate 时,它设置为 TRUE

解码分离数据时,消息的标头和内容将包含在不同的 BLOB 中。 每个 BLOB 要求在对该 BLOB 进行函数的最后一次调用时将 fFinal 设置为 TRUE

返回值

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

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

如果使用流式处理,在 CryptMsgOpenToDecodeCryptMsgOpenToEncode 中由 pStreamInfo 指定的应用程序定义的回调函数中遇到的错误可能会传播到 CryptMsgUpdate。 如果发生这种情况,在回调函数返回后,CryptMsgUpdate 不会调用 SetLastError,这将保留应用程序控制下遇到的任何错误。 回调函数 (或调用的 API 之一负责,) 在应用程序处理流数据时出错时调用 SetLastError

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

返回代码 说明
CRYPT_E_INVALID_MSG_TYPE
消息类型无效。
CRYPT_E_MSG_ERROR
执行加密操作时遇到错误。
CRYPT_E_OID_FORMAT
对象标识符的格式不正确。
CRYPT_E_UNEXPECTED_ENCODING
消息未按预期进行编码。
CRYPT_E_UNKNOWN_ALGO
加密算法未知。
E_INVALIDARG
一个或多个参数无效。
E_OUTOFMEMORY
内存不足。
 

以下任一函数都可能会遇到传播错误:

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

要求

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

另请参阅

CryptMsgGetParam

CryptMsgOpenToDecode

CryptMsgOpenToEncode

低级别消息函数

简化的消息函数