Функция
DecryptMessage() расшифровывает сообщение, проверяет его целостность и уведомляет о получении запроса на переустановку связи или разрыв соединения.
SECURITY_STATUS DecryptMessage(
PCtxtHandle phContext,
PSecBufferDesc pMessage,
ULONG MessageSeqNo,
PULONG pfQOP
);
Примечания
Функция не может быть вызвана асинхронно (одновременно из разных нитей) над одним и тем же контекстом. Последовательность пакетов существенна для TLS.
Аргументы
- phContext
- [in] Дескриптор контекста соединения, установленного с отправителем сообщения.
- pMessage
- [in/out] Указатель на структуру SecBufferDesc, содержащую 4 буфера SecBuffer. Ровно один из них должен иметь тип SECBUFFER_DATA, и содержать зашифрованные данные, которые будут расшифрованы на месте. Остальные буферы должны иметь тип SECBUFFER_EMPTY.
- MessageSeqNo
- [in] Параметр зарезервирован для будущего использования и должен быть 0.
- pfQOP
- [in] Параметр зарезервирован для будущего использования и должен быть NULL.
Возвращаемые значения
Если функция завершается успешно, и другая сторона не запросила изменения состояния соединения (renegotiation или shutdown), то возвращается SEC_E_OK. Иначе функция возвращает одно из следующих значений:
Коды возврата | Описание |
---|
SEC_E_INVALID_HANDLE | Параметр phContext содержит недействительный дескриптор контекста. |
SEC_E_INVALID_TOKEN | Параметр pInput содержит неправильные входные данные. |
SEC_E_INCOMPLETE_MESSAGE | Данные во входном буфере неполны. Приложение должно прочитать остальные данные, и повторить вызов. При этом буфер с данными (SECBUFFER_DATA) и первый пустой буфер (SECBUFFER_EMPTY) будут содержать длину недостающих данных и иметь тип SECBUFFER_EMPTY. |
SEC_I_RENEGOTIATE | Другая сторона запросила renegotiate. См. заметки. |
SEC_I_CONTEXT_EXPIRED | Другая сторона закрыла соединение. См. заметки. |
Примечания
Функция возвращает SEC_I_CONTEXT_EXPIRED, когда отправитель завершил соединение. После получения этого сообщения нужно:
Вызвать ApplyControlToken с параметром SCHANNEL_SHUTDOWN.
После получения SEC_E_OK вызвать InitializeSecurityContext или AcceptSecurityContext c пустыми входными буферами.
Отправить полученный вывод.
Удалить контекст вызовом DeleteSecurityContext.
Код возврата SEC_I_RENEGOTIATE означает, что отправитель хочет переустановить соединение. В этом случае необходимо вызвать
AcceptSecurityContext (для сервера) или
InitializeSecurityContext (для клиента), передав пустой входной буфер. После этого первого вызова, повторяется та же цепочка действий, что и при первоначальном создании контекста.
Требования:
AIX: 5.3 или выше.
FreeBSD: 7 или выше.
Linux: LSB 3.1 (RHEL 4, SuSE 10) или выше.
Solaris: 10 или выше.
Windows 2000 или выше: Необходимо Windows 2000 SP4 или старше с Internet Explorer 6.0 или старше.
Файл описания: Прототип описан в файле sspi.h для Windows и CSP_Sspi.h, CSP_SChannel.h, CpSSP.h для Unix.
См. также
AcceptSecurityContext() ,InitializeSecurityContext() ,DeleteSecurityContext() ,EncryptMessage() ,SecBuffer ,SecBufferDesc