0

Так я следующий код: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 устанавливается в , И если он выполнен на Windows Server 2012 R2, input_buffers[1].BufferType остается 0 (SECBUFFER_MISSING) и я заканчиваю ошибкой. Кто-нибудь знает, почему InitializeSecurityContext (Schannel) function не меняет тип input_buffers[1] на Windows Server?

Я очень ценю любую помощь, которую вы можете предоставить.

Редактировать 1 статус возвращается такое же на обеих платформах (-2146893032), только на Win 8.1/10 функция изменяет input_buffers[1].BufferType до 4.

Edit 2 На Win 8.1/10 он идет в еще ветвь этого варианта корпуса, и в Win Server, 2012 R2 переходит в ветвь, если .. на всех платформах устанавливается состояние 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); 
         } 
        } 
       } 
+0

Эта проблема приводит к этому один http://stackoverflow.com/questions/40133998/amqp-stuck-waiting-for-ack?noredirect=1#comment67537898_40133998 – user7042812

+0

это может быть сервер вашего реферирование не имеет связанных субпроектов? а именно эти проекты: 'azure-uamqp-c' и' azure-c-shared-utility' – user3629249

+0

Я ссылаюсь на ** Azure Event Hub ** на другой стороне, и поскольку они сделали [library] (https: // github .com/Azure/azure-event-hubs/tree/master/c) для Клиентов, я предполагаю, что у них есть это. В любом случае, одно и то же приложение и тот же код, только когда он выполняется в Windows 8.1/10, его отправляющие сообщения на Событие Hub, но когда он выполняется в Windows Server 2012 R2, он терпит неудачу и закрывает сокет **. – user7042812

ответ

0

Ok так я связался с создателями и Appe ars, поскольку это было ошибкой в ​​коде библиотеки служебных программ, они исправили его в ветке разработчика utility library, и они тестируют его. Спасибо всем за ответы!