Отправка данных с помощью OpenSSL - PullRequest
0 голосов
/ 08 октября 2018

Для тестирования я хочу создать 2 экземпляра SSL * и позволить им отправлять данные друг другу.

После завершения рукопожатия я могу без проблем отправлять данные с клиента на сервер.Отправка данных с сервера на клиент завершается с ошибкой: 'ошибка: 1408F119: процедуры SSL: ssl3_get_record: сбой расшифровки или неверная запись mac'

Следующий код используется дляпри отправке данных в обоих случаях экземпляры SSL * основаны на BIO памяти, проверки на ошибки были удалены для удобства чтения.

SSL* source;
SSL* destination;
BIO *r_bio;
BIO *w_bio;
int sRc;

//....    

r_bio = SSL_get_rbio(destination);
w_bio = SSL_get_wbio(source);

//Encrypt message 

printf("Buffer before encryption: %d Bytes -> 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x...\n", _g_buffer_lenght, _g_buffer[0], _g_buffer[1], _g_buffer[2], _g_buffer[3], _g_buffer[4]);

ERR_clear_error();
sRc = SSL_write(source, _g_buffer, _g_buffer_lenght);
if (sRc <= 0) {
    _log_openssl_error_queue();
    return -1;
}

_g_buffer_lenght = BIO_ctrl_pending(w_bio);
BIO_read(w_bio, _g_buffer, _g_buffer_lenght);

printf("Buffer after encryption: %d Bytes -> 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x...\n", _g_buffer_lenght, _g_buffer[0], _g_buffer[1], _g_buffer[2], _g_buffer[3], _g_buffer[4]);

//Decrypt message 

BIO_flush(r_bio);
BIO_write(r_bio, _g_buffer, _g_buffer_lenght);
ERR_clear_error();
sRc = SSL_read(destination, _g_buffer, _g_buffer_lenght);
if (sRc <= 0) {
    _log_openssl_error_queue();
    return -1;
}

_g_buffer_lenght = sRc;
printf("Buffer after decryption: %d Bytes -> 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x...\n", _g_buffer_lenght, _g_buffer[0], _g_buffer[1], _g_buffer[2],    _g_buffer[3], _g_buffer[4]);

Запись, которая создается после шифрования, выглядит правильно (правильный тип, версия и длина).

Требуется ли дополнительный шаг при отправке данных с сервера на клиент, я ожидаю, что 2 пира будут равны после завершения рукопожатия?

1 Ответ

0 голосов
/ 10 октября 2018

Мне удалось решить проблему.

Мой тестовый код позволил экземплярам обмениваться данными, пока оба не вернут 1 для SSL_is_init_finished , проблема заключалась в том, что экземпляр клиента возвращает 1 после того, какотправил свой TLS_FINISHED, но ему все еще нужно сообщение TLS_FINISHED серверов, чтобы иметь возможность общаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...