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

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

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

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

Синтаксис

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

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

  • 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

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