Функция CryptDecodeMessage (wincrypt.h)

Функция CryptDecodeMessage декодирует, расшифровывает и проверяет криптографическое сообщение.

Эту функцию можно использовать, если тип криптографического сообщения неизвестен. Константы dwMsgTypeFlags можно объединить с побитовой операцией OR , чтобы функция попыталась найти один из типов. При обнаружении одного из типов функция сообщает об обнаружении типа и возвращает данные, соответствующие такому типу.

В каждом проходе функция щелкает только один уровень шифрования или кодирования. Для дополнительного взлома эта функция или одна из других упрощенных функций сообщений должна быть вызвана еще раз.

Синтаксис

BOOL CryptDecodeMessage(
  [in]                DWORD                       dwMsgTypeFlags,
  [in]                PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
  [in]                PCRYPT_VERIFY_MESSAGE_PARA  pVerifyPara,
  [in]                DWORD                       dwSignerIndex,
  [in]                const BYTE                  *pbEncodedBlob,
  [in]                DWORD                       cbEncodedBlob,
  [in]                DWORD                       dwPrevInnerContentType,
  [out, optional]     DWORD                       *pdwMsgType,
  [out, optional]     DWORD                       *pdwInnerContentType,
  [out, optional]     BYTE                        *pbDecoded,
  [in, out, optional] DWORD                       *pcbDecoded,
  [out, optional]     PCCERT_CONTEXT              *ppXchgCert,
  [out, optional]     PCCERT_CONTEXT              *ppSignerCert
);

Параметры

[in] dwMsgTypeFlags

Указывает тип сообщения. Типы сообщений можно объединить с оператором bitwise-OR . Этот параметр может быть одним из следующих типов сообщений:

  • CMSG_DATA_FLAG
  • CMSG_SIGNED_FLAG
  • CMSG_ENVELOPED_FLAG
  • CMSG_SIGNED_AND_ENVELOPED_FLAG
  • CMSG_HASHED_FLAG
Примечание После возврата параметр DWORD , на который указывает pdwMsgType , задается с типом сообщения.
 

[in] pDecryptPara

Указатель на структуру CRYPT_DECRYPT_MESSAGE_PARA , содержащую параметры расшифровки.

[in] pVerifyPara

Указатель на структуру CRYPT_VERIFY_MESSAGE_PARA , содержащую параметры проверки.

[in] dwSignerIndex

Указывает, какой подписыватель, среди возможных многих подписчиков сообщения, должен быть проверен. Этот индекс можно изменить в нескольких вызовах функции, чтобы проверить дополнительные подписыватели.

Значение dwSignerIndex равно нулю для первого подписывающего. Если функция возвращает значение FALSE, а GetLastError возвращает CRYPT_E_NO_SIGNER, предыдущий вызов вернул последний подписыватель сообщения. Этот параметр используется только с сообщениями типов CMSG_SIGNED_AND_ENVELOPED или CMSG_SIGNED. Для всех других типов сообщений оно должно быть равно нулю.

[in] pbEncodedBlob

Указатель на закодированный БОЛЬШОЙ ДВОИЧНЫй объект , который необходимо декодировать.

[in] cbEncodedBlob

Размер закодированного большого двоичного объекта в байтах.

[in] dwPrevInnerContentType

Применимо только при обработке вложенных криптографических сообщений. При обработке внешнего криптографического сообщения его необходимо задать равным нулю. При декодировании вложенного криптографического сообщения устанавливается значение, возвращаемое в pdwInnerContentType предыдущим вызовом CryptDecodeMessage для внешнего сообщения. Это может быть любой из типов CMSG, перечисленных в pdwMsgType. Для обеспечения обратной совместимости задайте для dwPrevInnerContentType нулевое значение.

[out, optional] pdwMsgType

Указатель на DWORD , указывающий возвращаемый тип сообщения. Этот параметр может быть одним из следующих типов сообщений:

  • CMSG_DATA
  • CMSG_SIGNED
  • CMSG_ENVELOPED
  • CMSG_SIGNED_AND_ENVELOPED
  • CMSG_HASHED

[out, optional] pdwInnerContentType

Указатель на DWORD , указывающий тип внутреннего сообщения. Коды типов сообщений, используемые для pdwMsgType , также используются здесь.

Если криптографическое вложение отсутствует, возвращается CMSG_DATA.

[out, optional] pbDecoded

Указатель на буфер для получения декодированного сообщения.

Этот параметр может иметь значение NULL , если декодированное сообщение не требуется или задать размер декодированного сообщения для целей выделения памяти. Декодированные сообщения не возвращаются, если этот параметр имеет значение NULL. Дополнительные сведения см. в разделе "Получение данных неизвестной длины".

[in, out, optional] pcbDecoded

Указатель на переменную, указывающую размер буфера в байтах, на который указывает параметр pbDecoded . При возвращении функции эта переменная содержит размер декодированного сообщения.

Примечание При обработке данных, возвращаемых в буфере, приложения должны использовать фактический размер возвращаемых данных. Фактический размер может быть немного меньше размера буфера, указанного во входных данных. (При входных данных размеры буферов обычно указываются достаточно большими, чтобы обеспечить, чтобы максимально возможные выходные данные помещались в буфер.) В выходных данных переменная, на которую указывает этот параметр, обновляется с учетом фактического размера данных, скопированных в буфер.
 

[out, optional] ppXchgCert

Указатель на указатель на структуру CERT_CONTEXT с сертификатом, соответствующим закрытому ключу обмена, необходимому для декодирования сообщения. Этот параметр задается только для типов сообщений CMSG_ENVELOPED и CMSG_SIGNED_AND_ENVELOPED.

[out, optional] ppSignerCert

Указатель на указатель на структуру CERT_CONTEXTконтекста сертификата подписыватель. Этот параметр задается только для типов сообщений CMSG_SIGNED и CMSG_SIGNED_AND_ENVELOPED.

Возвращаемое значение

Если функция завершается успешно, функция возвращает ненулевое значение (TRUE).

Если функция завершается ошибкой, она возвращает ноль (FALSE). Для получения дополнительных сведений об ошибке вызовите Метод GetLastError.

Функции CryptDecryptMessage, CryptVerifyMessageSignature или CryptVerifyMessageHash можно распространить на эту функцию.

Следующий код ошибки чаще всего возвращается функцией GetLastError .

Код возврата Описание
ERROR_MORE_DATA
Если буфер, указанный параметром pbDecoded , недостаточно велик для хранения возвращаемых данных, функция задает код ERROR_MORE_DATA и сохраняет требуемый размер буфера в байтах в переменной, на которую указывает pcbDecoded.

Комментарии

Параметр dwMsgTypeFlags указывает набор допустимых сообщений. Например, чтобы декодировать сообщения SIGNED или ENVELOPED, задайте для dwMsgTypeFlags значение CMSG_SIGNED_FLAG | CMSG_ENVELOPED_FLAG. Необходимо указать оба параметра pDecryptPara или pVerifyPara .

Для успешно декодированного или проверенного сообщения обновляются указатели контекста сертификата , на которые указывает ppXchgCert и ppSignerCert . Их необходимо освободить, вызвав CertFreeCertificateContext. Если функция завершается ошибкой, для них задано значение NULL.

Параметры ppXchgCert или ppSignerCert можно задать в значение NULL перед вызовом функции, которая указывает, что вызывающий объект не заинтересован в получении сертификата exchange или контекста сертификата подписывающего.

Требования

   
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Целевая платформа Windows
Header wincrypt.h
Библиотека Crypt32.lib
DLL Crypt32.dll

См. также раздел

CryptDecryptMessage

CryptVerifyMessageHash

CryptVerifyMessageSignature

Упрощенные функции сообщений