Поделиться через


Функция DecryptMessage (Schannel)

Функция DecryptMessage (Schannel) расшифровывает сообщение. Некоторые пакеты не шифруют и расшифровывают сообщения, а выполняют и проверяют хэш целостности.

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

Примечание.

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

Синтаксис

SECURITY_STATUS SEC_Entry DecryptMessage(
  _In_    PCtxtHandle    phContext,
  _Inout_ PSecBufferDesc pMessage,
  _In_    ULONG          MessageSeqNo,
  _Out_   PULONG         pfQOP
);

Параметры

phContext [in]

Дескриптор контекста безопасности , используемый для расшифровки сообщения.

pMessage [in, out]

Указатель на структуру SecBufferDesc . По входным данным структура ссылается на одну или несколько структур SecBuffer . Один из этих буферов может быть типом SECBUFFER_DATA. Этот буфер содержит зашифрованное сообщение. Функция расшифровывает зашифрованное сообщение, перезаписав исходное содержимое буфера.

При использовании Schannel SSP с контекстами, которые не ориентированы на подключение, структура должна содержать четыре структуры SecBuffer для входных данных. Именно один буфер должен быть типом SECBUFFER_DATA и содержать зашифрованное сообщение, которое функция расшифровывает. Остальные буферы используются для выходных данных и должны иметь тип SECBUFFER_EMPTY. Для контекстов, ориентированных на подключение, необходимо указать буфер типа SECBUFFER_DATA, как отмечалось для контекстов, не связанных с подключением. Кроме того, необходимо указать второй буфер типа SECBUFFER_TOKEN, содержащий маркер безопасности.

MessageSeqNo [in]

Порядковый номер, ожидаемый приложением транспорта, если он есть. Если приложение транспорта не поддерживает номера последовательности, задайте для этого параметра значение нулю.

При использовании Schannel SSP задайте для этого параметра значение нулю. Schannel SSP не использует порядковые номера.

pfQOP [out]

Указатель на переменную типа ULONG , которая получает флаги, относящиеся к пакету, которые указывают на качество защиты.

При использовании Schannel SSP не используйте этот параметр. Задайте для него значение NULL.

Этот параметр может быть следующим флагом.

Ценность Значение
SECQOP_WRAP_NO_ENCRYPT Сообщение не было зашифровано, но функция произвела заголовок или трейлер.
Заметка: KERB_WRAP_NO_ENCRYPT имеет то же значение и то же значение.

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

Если функция проверяет, получено ли сообщение в правильной последовательности, оно возвращает SEC_E_OK.

Если функция не расшифровывает сообщение, он возвращает один из следующих кодов ошибок.

Код возврата Описание
SEC_E_INVALID_HANDLE Параметр phContext указывает недопустимый дескриптор контекста. Используется с Schannel SSP.
SEC_E_INVALID_TOKEN Буферы имеют неправильный тип или нет буфера типа SECBUFFER_DATA найден. Используется с Schannel SSP.
SEC_E_MESSAGE_ALTERED Сообщение изменено. Используется с Schannel SSP.
SEC_E_OUT_OF_SEQUENCE Сообщение не получено в правильной последовательности.
SEC_I_CONTEXT_EXPIRED Отправитель сообщения завершает работу с помощью подключения и инициирует завершение работы. Сведения об инициировании или распознавании завершения работы см. в разделе Завершение работыподключения Schannel. Используется с Schannel SSP.
SEC_I_RENEGOTIATE Для удаленной стороны требуется новая последовательность подтверждения или приложение инициирует завершение работы. Вернитесь к циклу переговоров и вызовите AcceptSecurityContext (Schannel) или InitializeSecurityContext (Schannel), передав тот же буфер, что и измененный DecryptMessage, гарантируя, что тип SecBuffer имеет значение SECBUFFER_TOKEN.

Замечания

Иногда приложение считывает данные из удаленной стороны, пытается расшифровать его с помощью DecryptMessage (Schannel) и обнаруживает, что decryptMessage (Schannel) успешно завершается, но выходные буферы пусты. Это нормальное поведение, и приложения должны иметь возможность обрабатывать его.

При использовании Schannel SSP функция DecryptMessage (General) возвращает SEC_I_CONTEXT_EXPIRED при завершении подключения отправителем сообщения. Сведения об инициировании или распознавании завершения работы см. в разделе Завершение работыподключения Schannel.

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

Функция DecryptMessage (Schannel) возвращает SEC_I_RENEGOTIATE при получении сообщения протокола TLS после подтверждения TLS, отличного от данных приложения. После того как DecryptMessage (Schannel) возвращает SEC_I_RENEGOTIATE, все последующие вызовы EncryptMessage() и DecryptMessage() завершаются сбоем с SEC_E_CONTEXT_EXPIRED. Приложение обрабатывает эту ситуацию, вызывая AcceptSecurityContext (Schannel) (на стороне сервера) или InitializeSecurityContext (Schannel) (на стороне клиента) и передав тот же буфер, что и измененный DecryptMessage, гарантируя, что SecBuffer тип задан.SECBUFFER_TOKEN Обратите внимание, что DecryptMessage не всегда возвращает SECBUFFER_EXTRA буфер при SEC_I_RENEGOTIATE возврате. После этого первоначального вызова возвращается значение, будто приложение создает новое подключение. Затем приложение может продолжать вызывать EncryptMessage() и DecryptMessage(). Дополнительные сведения см. в разделе "Создание контекста безопасности Schannel".

Требования

Требование Ценность
Минимальный поддерживаемый клиент Windows XP [только классические приложения]
Минимальный поддерживаемый сервер Windows Server 2003 [только классические приложения]
Заголовок Sspi.h (include Security.h)
Библиотека Secur32.lib
DLL Secur32.dll