Функция 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
[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 .
Код возврата | Описание |
---|---|
|
Если буфер, заданный параметром 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 |