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


Функция DecryptMessage (Schannel)

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

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

Примечание

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 [вход, выход]

Указатель на структуру 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), передайте SECBUFFER_EXTRA, возвращенные из DecryptMessage().

Комментарии

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

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

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

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

Требования

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

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