Да, вариант 2 - правильный путь. Создайте пару BIO с BIO_make_bio_pair()
и назначьте их объекту SSL с помощью SSL_set_bio()
.
Затем вы читаете данные SSL зашифрованной стороны с помощью BIO_read()
и записываете их в туннель libssh, читаете из туннеля libssh и пишете их с BIO_write()
.
Добавление:
Когда вы используете этот метод, ваш объект SSL не имеет собственный дескриптор файла - BIO заменяют дескриптор / сокет файла. Вместо чтения и записи из файлового дескриптора, OpenSSL будет читать и писать из предоставленных вами BIO.
BIO - это просто интерфейс, который находится между библиотекой OpenSSL и вашим собственным кодом. Это способ для вас реализовать фактическую доставку данных SSL зашифрованной стороны на другую сторону и обратно (вместо OpenSSL напрямую с использованием сокета).
Когда вы делаете BIO_read()
в BIO, который вы указали как wbio
- SSL_set_bio()
, вы будете читать данные SSL с зашифрованной стороны, а затем должны будете отправить их на другую сторону самостоятельно (предположительно, используя некоторые libssh2
функция). Точно так же, когда вы получаете данные SSL зашифрованной стороны с другой стороны (опять же, из какой-то функции libssh2
), вы закачиваете их в SSL, используя BIO_write()
в BIO, который вы указали как rbio
.
Возможно, эта иллюстрация поможет. Когда вы читаете и пишете из объекта SSL, OpenSSL будет просто читать и записывать из базового BIO, оставляя данные для дальнейшего использования:
+------+ +-----+ +-----+
| Your | SSL_write() | SSL | BIO_read() | BIO |
| code | ------------> | | <------------ | |
| | | | | |
| | | | BIO_write() | |
| | | | ------------> | |
+------+ +-----+ +-----+
+------+ +-----+ +-----+
| Your | SSL_read() | SSL | BIO_read() | BIO |
| code | <----------- | | <------------ | |
| | | | | |
| | | | BIO_write() | |
| | | | ------------> | |
+------+ +-----+ +-----+
(Обратите внимание, что SSL_write()
может вызвать чтение из базового BIO и наоборот).
Когда в wbio
есть данные, вы должны прочитать их и отправить на другую сторону:
+------+ +-----+
| Your | BIO_read() | BIO |
| code | <----------- | |
| | +-----+
| | +---------+
| | libssh2_channel_write() | libssh2 |
| | ------------------------> | | -> (... to other side)
| | +---------+
+------+
И наоборот, когда есть данные, доступные с другой стороны, вы должны прочитать их и передать в rbio
:
+------+
| Your | +---------+
| code | libssh2_channel_read() | libssh2 |
| | <----------------------- | | -> (... from other side)
| | +---------+
| | +-----+
| | BIO_write() | BIO |
| | -----------> | |
| | +-----+
+------+