InitializeSecurityContext (Schannel) не изменяет BufferType
Итак, у меня есть следующий код:
SecBuffer input_buffers[2];
SecBuffer output_buffers[2];
ULONG context_attributes;
/* we need to try and perform the second (next) step of the init */
input_buffers[0].cbBuffer = tls_io_instance->received_byte_count;
input_buffers[0].BufferType = SECBUFFER_TOKEN;
input_buffers[0].pvBuffer = (void*)tls_io_instance->received_bytes;
input_buffers[1].cbBuffer = 0;
input_buffers[1].BufferType = SECBUFFER_EMPTY;
input_buffers[1].pvBuffer = 0;
SecBufferDesc input_buffers_desc;
input_buffers_desc.cBuffers = 2;
input_buffers_desc.pBuffers = input_buffers;
input_buffers_desc.ulVersion = SECBUFFER_VERSION;
output_buffers[0].cbBuffer = 0;
output_buffers[0].BufferType = SECBUFFER_TOKEN;
output_buffers[0].pvBuffer = NULL;
output_buffers[1].cbBuffer = 0;
output_buffers[1].BufferType = SECBUFFER_EMPTY;
output_buffers[1].pvBuffer = 0;
SecBufferDesc output_buffers_desc;
output_buffers_desc.cBuffers = 2;
output_buffers_desc.pBuffers = output_buffers;
output_buffers_desc.ulVersion = SECBUFFER_VERSION;
unsigned long flags = ISC_REQ_EXTENDED_ERROR | ISC_REQ_STREAM | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_USE_SUPPLIED_CREDS;
SECURITY_STATUS status = InitializeSecurityContext(&tls_io_instance->credential_handle,
&tls_io_instance->security_context, (SEC_CHAR*)tls_io_instance->host_name, flags, 0, 0,
&input_buffers_desc, 0,
&tls_io_instance->security_context, &output_buffers_desc, &context_attributes, NULL);
Проблема в том, что после того, как этот код выполняется на платформе Windows 8.1 или Windows 10, input_buffers[1].BufferType
установлено на 4. И если он выполняется на Windows Server 2012 R2, input_buffers[1].BufferType
остается 0 (SECBUFFER_MISSING), и я в конечном итоге с ошибкой. Кто-нибудь знает, почему функция InitializeSecurityContext (Schannel) не меняет тип input_buffers[1]
на Windows Server?
Я действительно ценю любую помощь, которую вы можете оказать.
СтатусEdit 1 возвращается одинаково на обеих платформах (-2146893032), только на Win 8.1/10 изменения функции input_buffers[1].BufferType
до 4.
Edit 2 В Win 8.1/10 он переходит в другую ветвь этого варианта, а в Win Server 2012 R2 он переходит в ветвь if. На всех платформах статус установлен в SEC_E_INCOMPLETE_MESSAGE (-2146893032)
switch (status)
{
case SEC_E_INCOMPLETE_MESSAGE:
if (input_buffers[1].BufferType != SECBUFFER_MISSING)
{
tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
if (tls_io_instance->on_io_open_complete != NULL)
{
tls_io_instance->on_io_open_complete(tls_io_instance->open_callback_context, IO_OPEN_ERROR);
}
}
else
{
tls_io_instance->needed_bytes = input_buffers[1].cbBuffer;
tls_io_instance->consumed_bytes += tls_io_instance->needed_bytes;
if (resize_receive_buffer(tls_io_instance, tls_io_instance->received_byte_count + tls_io_instance->needed_bytes) != 0)
{
tls_io_instance->tlsio_state = TLSIO_STATE_ERROR;
if (tls_io_instance->on_io_open_complete != NULL)
{
tls_io_instance->on_io_open_complete(tls_io_instance->open_callback_context, IO_OPEN_ERROR);
}
}
}
1 ответ
Итак, я связался с создателями, и это похоже на ошибку в коде их библиотеки утилит, они исправили ее в ветке Developer библиотеки утилит и тестируют ее. Спасибо всем за ответы!