Я пытаюсь создать «соединение» DTLS с помощью Schannel под Windows (я тестирую в последней версии Windows 10, поэтому должны быть доступны все версии DTLS, поддерживаемые Schannel)
Я попытался начать с рабочего кода, чтобы установить обычное соединение TLS, следуя документации:
- InitializeSecurityContext с нулевым вводом на первом проходе, SECBUFFER_TOKEN и SECBUFFER_ALERT на выходе
- AcceptSecurityContext с SECBUFFER_TOKEN и SECBUFFER_EMPTY на входе, SECBUFFER_TOKEN и SECBUFFER_ALERT на выходе.
- Повторяйте два шага до тех пор, пока они не увенчаются успехом, а затем переходите к использованию Encrypt / DecryptMessage.
Это отлично работает в потоковом режиме (ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM)
Если я попытаюсь заменить STREAM на ISC / ASC_REQ_DATAGRAM, мой InitializeSecurityContext преуспеет с SEC_I_CONTINUE_NEEDED, как и ожидалось, но мой самый первый AcceptSecurityContext затем выйдет из строя с SEC_E_INVALID_PARAMETER.
Я попытался установить для grbitEnabledProtocols моего SCHANNEL_CRED значение 0, чтобы использовать значения по умолчанию, задокументированные с обеих сторон, я также попытался установить его на SP_PROT_DTLS1_X, и я все еще получаю возврат неверного параметра из моего первого ASC. Еще на всякий случай пробовал константы DTLS_1_0.
Кроме того, все протоколы безопасности по умолчанию включены в настройках моего реестра.
Насколько я понимаю DTLS RFC, мой код не работает на этапе HelloVerifyRequest, и, опять же, исходя из моего понимания RFC, эта часть требует, чтобы провайдер безопасности генерировал cookie из нескольких частей сообщения ClientHello, а также из исходных файлов. Айпи адрес. Однако я не смог найти какой-либо задокументированный способ передать эту информацию функции ASC.
(Думаю? :)) Я безуспешно искал во всем Интернете любой рабочий пример использования DTLS под Schannel. В stackoverflow я нашел этот вопрос, в котором просто упоминается, что он поддерживается: Поддерживается ли DTLS Schannel в Windows 7?, а связанная статья MSDN представляет собой лишь общий обзор.
Я искал любое использование констант, связанных с этой функцией ... Я искал любое использование констант, связанных с этим (ISC_REQ_DATAGRAM, SP_PROT_DTLS *, SECBUFFER_DTLS_MTU, ...), и единственное, что я смог найти на все поисковые системы, о которых я мог думать, были либо копиями sspi.h, либо сайтами, индексирующими константы в Windows API ...
Я знаю, что DTLS хорошо поддерживается другими реализациями (OpenSSL и т. Д.), Но я бы предпочел остаться с Schannel, поскольку другие части моего кода в настоящее время отлично работают с Schannel в режиме TLS.