КриптоПро TLS

AcceptSecurityContext

Функция AcceptSecurityContext().

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

Она обрабатывает входящие handshake-сообщения, и возвращает ответные handshake-сообщения, которые сервер должен передать клиенту.

SECURITY_STATUS AcceptSecurityContext (
  PCredHandle phCredential, 
  PCtxtHandle phContext, 
  PSecBufferDesc pInput, 
  ULONG fContextReq, 
  ULONG TargetDataRep, 
  PCtxtHandle phNewContext, 
  PSecBufferDesc pOutput, 
  PULONG pfContextAttr, 
  PTimeStamp ptsExpiry
);

Параметры:

phCredential
[in] Указатель на дескриптор удостоверения сервера. Указанный дескриптор получается через запрос к функции AcquireCredentialsHandle().
phContext
[in] Указатель на CtxtHandle. При первом вызове, укажите NULL. При последующих - указатель на дескриптор, возвращенный в phNewContext после первого вызова к этой функции.
pInput
[in] указатель на структуру SecBufferDesc, содержащую две структуры SecBuffer. Первый буфер должен иметь тип SECBUFFER_TOKEN, и содержать пакет, полученый от клиента. Второй буфер должен иметь тип SECBUFFER_EMPTY
fContextReq
[in] Показывает, какой набор свойств должен поддерживать контекст. Допустимые флаги перечислены в следующей таблице:
Флаг Описание
ASC_REQ_REPLAY_DETECT Защита от навязывания повторных пакетов
ASC_REQ_SEQUENCE_DETECT Защита от навязывания перестановок пакетов
ASC_REQ_CONFIDENTIALITY Конциденциальность (шифрование)
ASC_REQ_STREAM Соединение потокового типа
ASC_REQ_ALLOCATE_MEMORY SSP отводит память для буферов. Ее необходимо освободить вызовом FreeContextBuffer()
ASC_REQ_EXTENDED_ERROR Уведомлять другую сторону об ошибках (SSL alerts)
ASC_REQ_CONNECTION Неформатированные сообщения
ASC_REQ_MUTUAL_AUTH Взаимная аутентификация
ASC_REQ_USE_SUPPLIED_CREDS SSP не будет пытаться искать удостоверение, если оно не предоставлено приложением
ASC_REQ_MANUAL_CRED_VALIDATION SSP не будет проверять удостоверение другой стороны
Может оказаться так, что клиент поддерживает не все из запрошенных параметров. Дальнейшие детали смотрите в описании параметра pfContextAttr
TargetDataRep
[in] Параметр зарезервирован для будущего использования и должен быть 0.
phNewContext
[in/out] Указатель на CtxtHandle. При первом вызове сюда будет помещен дескриптор нового контекста. При последующих вызовах полученный дескриптор следует передавать через параметр phContext, а в phNewContext передавать NULL
pOutput
[in] Указатель на структуру SecBufferDesc, содержащую SecBuffer с типом SECBUFFER_TOKEN. На выходе в этот буфер будет помещен пакет, который нужно переслать клиенту. Функция может дополнительно вернуть буфер с типом SECBUFFER_EXTRA.
pfContextAttr
[out] Указатель на ULONG, куда будут записаны флаги, описывающие свойства устанавливаемого контекста. Список возможных значений приведен в описании параметра fContextReq. pfContextAttr получает тот же набор флагов, с заменой префикса ASC_REQ на ASC_RET.
Warning Атрибуты безопасности не следует проверять до последнего вызова функции, возвращающего SEC_E_OK. Остальные атрибуты, такие как ASC_RET_ALLOCATED_MEMORY можно использовать после первого же вызова.
ptsExpiry
[out] Опционален. Указатель на структуру TimeStamp. Gри наличии сертификата клиента, этот параметр получает время истечения этого сертификата. Иначе возвращается максимальное возможное значение времени.

Возвращает:

При успешном завершении функция возвращает одно из следующих значений:

Возвращаемые значения Описание
SEC_E_OK Контекст безопасности был успешно установлен. Дальнейших вызовов к этой функции не требуется. Если функция вернула данные в pOutput, их следует переслать клиенту.
SEC_E_INCOMPLETE_MESSAGE Данные во входном буфере неполны. Приложение должно прочитать остальные данные, и снова вызвать AcceptSecurityContext.
SEC_I_CONTINUE_NEEDED Сервер должен послать выходные данные клиенту и ждать ответа от клиента. Полученный ответ полжен быть передан при следующем вызове в AcceptSecurityContext через параметр pInput.

Возвращает:

В случае ошибки функция возвращает одно из следующих значений:

Возвращаемые значения Описание
SEC_E_INVALID_TOKEN Параметр pInput содержит неправильные входные данные.
SEC_E_INVALID_HANDLE Параметр phContext содержит недействительный дескриптор контекста.
SEC_E_UNSUPPORTED_FUNCTION Параметр fContextReq содержит неподдерживаемый набор флагов.
SEC_E_INSUFFICIENT_MEMORY Один из буферов оказался слишком мал. См. заметки.

Примечание:

На стороне клиента для создания контекста используется парная функция InitializeSecurityContext().
При получении кода ошибки SEC_E_INSUFFICIENT_MEMORY, укажите атрибут ASC_REQ_ALLOCATE_MEMORY в fContextReq.
Вызывающее приложение должно определить допустимость атрибутов установленного контекста. Например, если конфиденциальность соединения была запрошена, но не была достигнута, некоторые приложения должны принять решение немедленно прекратить соединение. Если контекст не смог быть установлен, сервер должен удалить частично созданный контекст вызовом DeleteSecurityContext().
После установления контекста, серверное приложение может с помощью функции QuerySecurityContextToken получить дескриптор пользователя, которому сопоставлен сертификат клиента, и использовать его для имперсонализации пользователя.

Требования:

Windows NT/2000/XP: Необходимо Windows NT 4.0 SP5 или старше с Internet Explorer 5.0 или старше.
Windows 98/ME: Необходимо Windows 95 OSR2 или старше с Internet Explorer 5.0 или старше.
Файл описания: Прототип описан в файле Sspi.h.

См. также:

AcquireCredentialsHandle() , CtxtHandle() , DeleteSecurityContext() , InitializeSecurityContext() , SecBuffer() , SecBufferDesc() , FreeContextBuffer() , TimeStamp()