Функция CryptMsgControl (wincrypt.h)
Функция CryptMsgControl выполняет операцию управления после того, как сообщение было декодировано окончательным вызовом функции CryptMsgUpdate . Операции управления, предоставляемые этой функцией, используются для расшифровки, проверки подписи и хэша, а также для добавления и удаления сертификатов, списков отзыва сертификатов (CRL), подписывателей и атрибутов без проверки подлинности.
Важные изменения, влияющие на обработку конвертированных сообщений, были внесены в CryptoAPI для поддержки взаимодействия с электронной почтой S /MIME. Дополнительные сведения см. в разделе Примечания для функции CryptMsgOpenToEncode .
Синтаксис
BOOL CryptMsgControl(
[in] HCRYPTMSG hCryptMsg,
[in] DWORD dwFlags,
[in] DWORD dwCtrlType,
[in] void const *pvCtrlPara
);
Параметры
[in] hCryptMsg
Дескриптор криптографического сообщения, к которому применяется элемент управления.
[in] dwFlags
Следующее значение определяется, если параметр dwCtrlType имеет одно из следующих значений:
- CMSG_CTRL_DECRYPT
- CMSG_CTRL_KEY_TRANS_DECRYPT
- CMSG_CTRL_KEY_AGREE_DECRYPT
- CMSG_CTRL_MAIL_LIST_DECRYPT
Значение | Значение |
---|---|
|
Дескриптор поставщика шифрования освобождается при последнем вызове функции CryptMsgClose . Этот дескриптор не освобождается при сбое функции CryptMsgControl . |
Если параметр dwCtrlType не указывает операцию расшифровки, присвойте этому значению нулевое значение.
[in] dwCtrlType
Тип выполняемой операции. В следующей таблице показаны текущие типы элементов управления сообщениями и тип структуры, который должен передаваться параметру pvCtrlPara .
Значение | Значение |
---|---|
|
Большой двоичный объект, содержащий закодированные байты сертификата атрибута. |
|
Структура CRYPT_INTEGER_BLOB , содержащая закодированные байты сертификата, добавляемого в сообщение. |
|
Структура CMSG_CMS_SIGNER_INFO , содержащая сведения о подписывшем. Эта операция отличается от CMSG_CTRL_ADD_SIGNER тем, что сведения подписывателя содержат сигнатуру. |
|
Большой двоичный объект, содержащий закодированные байты списка отзыва сертификатов, добавляемого в сообщение. |
|
Структура CMSG_SIGNER_ENCODE_INFO , содержащая сведения о подписывшем, добавляемом в сообщение. |
|
Структура CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA , содержащая индекс подписывающего и большой двоичный объект, содержащий сведения об атрибутах без проверки подлинности, добавляемые в сообщение. |
|
Структура CMSG_CTRL_DECRYPT_PARA , используемая для расшифровки сообщения для указанного получателя транспорта ключа. Это значение применимо к получателям RSA. Эта операция указывает, что функция CryptMsgControl выполняет поиск по индексу получателя для получения сведений о получателе передачи ключа. В случае сбоя функции GetLastError вернет CRYPT_E_INVALID_INDEX , если получатель транспорта ключа не найден. |
|
Индекс удаляемого сертификата атрибута. |
|
Индекс сертификата, удаляемого из сообщения. |
|
Индекс списка отзыва сертификатов, удаляемого из сообщения. |
|
Индекс удаляемого подписывателя. |
|
Структура CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA , содержащая индекс, указывающий подписывающего, и индекс, указывающий удаляемые атрибуты подписывателя без проверки подлинности. |
|
Структура CERT_STRONG_SIGN_PARA , используемая для проверки строгой сигнатуры.
Чтобы проверка для строгой сигнатуры, укажите этот тип элемента управления перед вызовом CryptMsgGetAndVerifySigner или перед вызовом CryptMsgControl со следующими заданными типами элементов управления:
|
|
Структура CMSG_CTRL_KEY_AGREE_DECRYPT_PARA , используемая для расшифровки сообщения для указанного ключа сеанса соглашения ключа. Соглашение о ключе используется с Diffie-Hellman шифрования и расшифровки. |
|
Структура CMSG_CTRL_KEY_TRANS_DECRYPT_PARA , используемая для расшифровки сообщения для указанного получателя транспорта ключа. Передача ключей используется с шифрованием и расшифровкой RSA. |
|
Структура CMSG_CTRL_MAIL_LIST_DECRYPT_PARA , используемая для расшифровки сообщения для указанного получателя с помощью ранее распределенного ключа шифрования ключей (KEK). |
|
Это значение не используется. |
|
Структура CERT_INFO , которая идентифицирует подписывателя сообщения, подпись которого требуется проверить. |
|
Структура CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA , указывающая индекс подписывающего и открытый ключ для проверки подписи сообщения. Открытый ключ подписывающего может быть CERT_PUBLIC_KEY_INFO структурой, контекстом сертификата или контекстом цепочки сертификатов. |
[in] pvCtrlPara
Указатель на структуру, определяемую значением dwCtrlType.
Значение dwCtrlType | Значение |
---|---|
|
Декодирование будет выполняться так, как будто расшифровывается потоковая передача содержимого. Если какое-либо зашифрованное потоковое содержимое накопилось до этого вызова, то часть или весь открытый текст , полученный в результате расшифровки зашифрованного текста, передается приложению через функцию обратного вызова, указанную в вызове функции CryptMsgOpenToDecode .
Примечание При потоковой передаче конвертированного сообщения функция CryptMsgControl не вызывается до успешного опроса доступности CMSG_ENVELOPE_ALGORITHM_PARAM. Если опрос не выполнен, возникает ошибка. Описание этого опроса см. в разделе Функция CryptMsgOpenToDecode .
|
|
Хэш, вычисленный на основе содержимого сообщения, сравнивается с хэшом, содержащимся в сообщении. |
|
pvCtrlPara указывает на структуру CMSG_SIGNER_ENCODE_INFO , содержащую сведения о подписывшем, добавляемые в сообщение. |
|
После удаления все остальные индексы подписывающей стороны, используемые для этого сообщения, становятся недействительными, и их необходимо повторно запрашивать путем вызова функции CryptMsgGetParam . |
|
После удаления все остальные индексы атрибутов без проверки подлинности, используемые для этого подписывающей стороны, становятся недействительными, и их необходимо повторно запрашивать, вызвав функцию CryptMsgGetParam . |
|
После удаления все остальные индексы сертификатов, используемые для этого сообщения, становятся недействительными, и их необходимо повторно запрашивать путем вызова функции CryptMsgGetParam . |
|
После удаления все остальные индексы списка отзыва сертификатов, используемые для этого сообщения, становятся недействительными, и их потребуется повторно получить, вызвав функцию CryptMsgGetParam . |
Возвращаемое значение
Если функция выполняется успешно, возвращается ненулевое значение.
Если функция завершается сбоем, возвращаемое значение равно нулю, а функция GetLastError возвращает ошибку кодирования и декодирования абстрактной синтаксической нотации 1 (ASN.1). Сведения об этих ошибках см. в разделе Кодирование и декодирование возвращаемых значений ASN.1.
При декодировании потокового конвертированного сообщения возникают ошибки в функции обратного вызова, определяемой приложением, заданной параметром pStreamInfo
Функция CryptMsgOpenToDecode может быть распространена на функцию CryptMsgControl. В этом случае функция SetLastError не вызывается функцией CryptMsgControl после возврата функции обратного вызова. При этом все ошибки, возникающие под контролем приложения, сохраняются. Функция обратного вызова (или один из вызываемых API) отвечает за вызов функции SetLastError , если во время обработки потоковых данных приложением возникает ошибка.
В следующих функциях могут возникать распространенные ошибки:
- CryptCreateHash
- CryptDecrypt
- CryptGetHashParam
- CryptGetUserKey
- CryptHashData
- CryptImportKey
- CryptSignHash
- CryptVerifySignature
Чаще всего возвращаются следующие коды ошибок.
Код возврата | Описание |
---|---|
|
Содержимое сообщения уже расшифровано. Эта ошибка может быть возвращена, если параметру dwCtrlType присвоено значение CMSG_CTRL_DECRYPT. |
|
Сообщение не содержит ожидаемого атрибута, прошедшего проверку подлинности. Эта ошибка может быть возвращена, если параметру dwCtrlType присвоено значение CMSG_CTRL_VERIFY_SIGNATURE. |
|
При кодировании или декодировании произошла ошибка. Эта ошибка может быть возвращена, если параметру dwCtrlType присвоено значение CMSG_CTRL_VERIFY_SIGNATURE. |
|
Недопустимый тип элемента управления. |
|
Неверное значение хэша. |
|
Недопустимое значение индекса. |
|
Недопустимый тип сообщения. |
|
Идентификатор объекта имеет неправильный формат. Эта ошибка может быть возвращена, если параметру dwCtrlType присвоено значение CMSG_CTRL_ADD_SIGNER. |
|
Сообщение с запечатанными данными не содержит указанного получателя. Эта ошибка может быть возвращена, если параметру dwCtrlType присвоено значение CMSG_CTRL_DECRYPT. |
|
Указанный подписыватель для сообщения не найден. Эта ошибка может быть возвращена, если параметру dwCtrlType присвоено значение CMSG_CTRL_VERIFY_SIGNATURE. |
|
Алгоритм шифрования неизвестен. |
|
Сообщение не закодировано должным образом. Эта ошибка может быть возвращена, если параметру dwCtrlType присвоено значение CMSG_CTRL_VERIFY_SIGNATURE. |
|
Один или несколько аргументов недопустимы. Эта ошибка может быть возвращена, если параметру dwCtrlType присвоено значение CMSG_CTRL_DECRYPT. |
|
Недостаточно памяти для завершения операции. |
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows XP [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2003 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | wincrypt.h |
Библиотека | Crypt32.lib |
DLL | Crypt32.dll |