КриптоПро SSPI  

AcceptSecurityContext

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

Возвращает 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 World Wide Web link. При первом вызове, укажите NULL. При последующих - указатель на дескриптор, возвращенный в phNewContext после первого вызова к этой функции.
fContextReq
[in] Показывает, какой набор свойств должен поддерживать контекст. Допустимые флаги перечислены в следующей таблице:
ФлагОписание
ASC_REQ_REPLAY_DETECTЗащита от навязывания повторных пакетов
ASC_REQ_SEQUENCE_DETECTЗащита от навязывания перестановок пакетов
ASC_REQ_CONFIDENTIALITYКонфиденциальность (шифрование)
ASC_REQ_STREAMСоединение потокового типа
ASC_REQ_ALLOCATE_MEMORYSSP отводит память для буферов. Ее необходимо освободить вызовом FreeContextBuffer
ASC_REQ_EXTENDED_ERRORУведомлять другую сторону об ошибках (SSL alerts)
ASC_REQ_CONNECTIONНеформатированные сообщения
ASC_REQ_MUTUAL_AUTHВзаимная аутентификация
Может оказаться так, что сервер поддерживает не все из запрошенных параметров. Дальнейшие детали смотрите в описании параметра pfContextAttr
Reserved1
[in] Зарезервирован. Должен быть 0.
TargetDataRep
[in] Параметр зарезервирован для будущего использования и должен быть 0.
pInput
[in] указатель на структуру SecBufferDesc World Wide Web link. При первом вызове может содержать структуру SecBuffer World Wide Web link типа SECBUFFER_APPLICATION_PROTOCOLS с протоколами уровня приложений, используемых для согласования Application-Layer Protocol Negotiation Protocol Negotiation; данные в буфере должны содержать упакованную структуру SEC_APPLICATION_PROTOCOLS. При последующих вызовах pInput должен состоять из двух структур SecBuffer World Wide Web link. Первый буфер должен иметь тип SECBUFFER_TOKEN, и содержать пакет, полученный от клиента. Второй буфер должен иметь тип SECBUFFER_EMPTY. В него в случае необходимости будут помещены оставшиеся необработанные входные данные с типом SECBUFFER_EXTRA, или, eсли полученное сообщение неполно (SEC_E_INCOMPLETE_MESSAGE), во втором буфере типа SECBUFFER_MISSING будет возвращен ожидаемый размер входных данных.
Reserved2
[in] Зарезервирован. Должен быть 0.
phNewContext
[in/out] Указатель на CtxtHandle World Wide Web link. При первом вызове сюда будет помещен дескриптор нового контекста. При последующих вызовах полученный дескриптор следует передавать через параметр phContext, а в phNewContext передавать NULL
pOutput
[in] Указатель на структуру SecBufferDesc World Wide Web link, содержащую SecBuffer World Wide Web link с типом SECBUFFER_TOKEN. На выходе в этот буфер будет помещен пакет, который нужно переслать серверу. При наличии флага ASC_REQ_ALLOCATE_MEMORY этот буфер будет выделен SSPI и должен быть освобожден с помощью функции FreeContextBuffer.
pfContextAttr
[out] Указатель на ULONG, куда будут записаны флаги, описывающие свойства устанавливаемого контекста. Список возможных значений приведен в описании параметра fContextReq. pfContextAttr получает тот же набор флагов, с заменой префикса ASC_REQ на ASC_RET.
Warning Атрибуты безопасности не следует проверять до последнего вызова функции, возвращающего SEC_E_OK. Остальные атрибуты, такие как ASC_RET_ALLOCATED_MEMORY можно использовать после первого же вызова.
ptsExpiry
[out] Опционален. Указатель на структуру TimeStamp World Wide Web link. Время жизни контекста в UTC.

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

При успешном завершении функция возвращает одно из следующих значений:
Коды возвратаОписание
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_NO_CREDENTIALSПредоставленное удостоверение недостоверно.
SEC_E_UNSUPPORTED_FUNCTIONПараметр fContextReq содержит неподдерживаемый набор флагов.
SEC_E_INSUFFICIENT_MEMORYОдин из буферов оказался слишком мал. См. заметки.

Примечания

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

Требования:

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.

См. также

AcquireCredentialsHandle() ,CtxtHandle World Wide Web link ,DeleteSecurityContext() ,InitializeSecurityContext() ,SecBuffer World Wide Web link ,SecBufferDesc World Wide Web link ,FreeContextBuffer() ,TimeStamp World Wide Web link