SSLEngine не расшифровывает все данные

Я пытаюсь использовать SSLengine с SocketChannels в неблокирующем режиме.

Рукопожатие выполняется правильно, но когда я пытаюсь прочитать и расшифровать http-сообщения из ChannelSocket, расшифровываются только заголовки, а тело исчезает:

<code>
int num=0;

            while(num==0){
                num=socketChannel.read(peerNetData);
                if(num==-1)
                    break;
            }

            if (num == -1) {
                System.out.println("channel closed");
            } else if (num == 0) {
                System.out.println("no bytes to read");
            } else {
                // Process incoming data

                peerNetData.flip();

                SSLEngineResult res = engine.unwrap(peerNetData, peerAppData);
               //return a ok status 

peerNetData.flip();
            peerAppData.flip();
            System.out.println(new String(peerNetData.array()));  
            System.out.println(new String(peerAppData.array()));  


</code>

при печати зашифрованных данных в peerNetData я получаю:

?>.//POST test HTTP/1.1 Cache-Control: no-cache Content-Length: 20 Content-Type: application/octet-stream Хост: 192.168.X.X

?>.//?>.//?>.//?>.//?>.//?>.//?>.//?>.//?>.//?>.// ?>.// ‹--- здесь зашифрованные символы

но когда я печатаю расшифрованные данные в peerAppData, я получаю

POST test HTTP/1.1/ Cache-Control: no-cache Content-Length: 20 Content-Type: application/octet-stream Host: 192.168.X.X // и затем здесь три пустые строки.

это проблема расшифровки с SSlengine??

Спасибо

Также я хотел бы добавить, что метод unwrap возвращает статус OK.


person user3791570    schedule 06.10.2014    source источник
comment
while(num==0) ? Извините, а что не так со всеми остальными номерами?   -  person Maarten Bodewes    schedule 07.10.2014
comment
while(num==0) гарантирует мне, что цикл while будет завершен тогда и только тогда, когда сокет что-то получил. (в моем случае сокет может прочитать все вместе, так как сообщение маленькое)   -  person user3791570    schedule 07.10.2014
comment
Да, но есть ли гарантия, что он прочитает все данные?   -  person Maarten Bodewes    schedule 07.10.2014
comment
в общих случаях, конечно, мы должны обрабатывать случай потери значимости. Но в моем случае все данные считываются, и SSLengine возвращает статус «ОК».   -  person user3791570    schedule 07.10.2014
comment
Хорошо, в таком случае я восстановлю свой ответ, но имейте в виду, что у меня не было большого опыта работы с конкретным каналом и классами SSLEngine. По сути, это описание того, что может произойти на уровне SSL. Обратите внимание, что было бы интересно узнать, какой набор шифров используется.   -  person Maarten Bodewes    schedule 07.10.2014


Ответы (1)


Вполне может быть, что фактическое содержимое POST было пустым, за исключением двух пустых строк (одна строка является стандартной после заголовка, если я не ошибаюсь). Из-за заполнения PKCS#7 не менее 16 байт данных (один блок , 16 байт для AES) будут зашифрованы как минимум.

Кроме того, данные также будут содержать MAC, так как SSL обычно использует MAC-затем-шифрование (также известный как неправильный способ согласно большинству).

Таким образом, может показаться, что данные есть, даже если это просто накладные расходы.

person Maarten Bodewes    schedule 06.10.2014