DecryptMessage расшифровывает только один байт - PullRequest
0 голосов
/ 24 мая 2019

Я тестирую некоторый код канала безопасного уровня сокетов, который я написал.Это проверяется через HTTP GET, запрашивая большой (9 МБ) текстовый файл из IIS и небольшой текстовый файл (19 байт).IIS настроен с использованием самозаверяющего сертификата.

Я использую DecryptMessage согласно документации MSDN SSPI.

https://docs.microsoft.com/en-us/windows/desktop/api/sspi/nf-sspi-decryptmessage

В документации указано:

"По крайней мере один из них должен иметь тип SECBUFFER_DATA. Этот буфер содержит зашифрованное сообщение. Зашифрованное сообщение дешифруется на месте, перезаписывая исходное содержимое его буфера."

Однако это не похоже набыть так.Два буфера «возвращаются» с BufferType, равным SECBUFFER_DATA и SECBUFFER_EXTRA.Данные, которые я поместил в структуру, остаются нетронутыми.

           SecBufferDesc message;
           SecBuffer sec_buffers[ 4 ];

           // Decrypt the received data. 
           sec_buffers[ 0 ].pvBuffer = p_Decrypt_Buffer;
           sec_buffers[ 0 ].cbBuffer = v_Decrypt_Buffer_Used;
           sec_buffers[ 0 ].BufferType = SECBUFFER_DATA;
           sec_buffers[ 1 ].BufferType = SECBUFFER_EMPTY;
           sec_buffers[ 2 ].BufferType = SECBUFFER_EMPTY;
           sec_buffers[ 3 ].BufferType = SECBUFFER_EMPTY;

           message.ulVersion = SECBUFFER_VERSION;
           message.cBuffers = ARRAYSIZE( sec_buffers );
           message.pBuffers = sec_buffers;

           status = v_SSPI_Function_Table->DecryptMessage( &v_Context_Handle, &message, 0, 0 );

           if( status == SEC_I_CONTEXT_EXPIRED )
              break;

           // Locate data and (optional) extra buffers.
           for( int i = 1; i < 4; ++i )
           {
              if( !p_data_buffer && sec_buffers[ i ].BufferType == SECBUFFER_DATA )
                 p_data_buffer = &sec_buffers[ i ];

              if( !p_extra_buffer && sec_buffers[ i ].BufferType == SECBUFFER_EXTRA )
                 p_extra_buffer = &sec_buffers[ i ];
           }

Когда я выполняю recv для сокета 65536 байт, я получаю одинаковый результат для обоих файлов выше.Первый расшифровывает 1 байт в SECBUFFER_DATA и часть данных, оставшихся в SECBUFFER_EXTRA - который я затем возвращаюсь к DecryptMessage и \ или recv из сокета, если он считается неполным.Чтобы быть более точным, буфер данных имеет значение cbBuffer, равное 1, и преобразованный текст буфера (pvBuffer) представляет собой букву 'H'.Буква «H» - это первая строка ответа HTTPS «HTTP / 1.1 200 OK \ n»

То, что я написал, работает и успешно получает оба txt-файла, однако почему дешифруется только 1 байт?Я где-то допустил ошибку или это именно то, что случилось?Последующие вызовы DecryptMessage работают и дешифруют оставшуюся часть, кстати!

...