Точно то, что вы просили, невозможно, потому что в TLS нет соответствия «1: 1» между отправкой чего-либо на уровне приложения и отправкой чего-либо в сетевой сокет.Такие события, как повторное согласование, означают, что иногда SSL должен считывать данные из сети, чтобы выполнить отправку данных, и наоборот.
Однако вы все равно можете использовать OpenSSL для выполнения SSL, но позаботиться о чтении ипишу из сети сам.Вы делаете это, вызывая SSL_set_bio()
на указателе SSL
вместо SSL_set_fd()
:
Используйте BIO_new_bio_pair()
для создания подключенной пары BIO.Один BIO будет считываться и записываться с помощью подпрограмм SSL, а другой BIO будет считываться и записываться вашим приложением (что позволяет ему передавать данные на другой конец любым способом, который он пожелает).
Используйте SSL_set_bio()
на новом объекте SSL, чтобы установить чтение и запись BIO для одного из BIO в сгенерированной паре.
Используйте BIO_read()
и BIO_write()
на другом BIO в паре для чтения и записи данных протокола SSL.
Использование SSL_accept()
, SSL_connect()
, SSL_read()
и SSL_write()
как обычно для объекта SSL.
(хотя неясно, какое преимущество это даст в вашем приложении: в этом случае вы не можете сделать что-либо другоечем читать и писать именно то, что OpenSSL передает вам, так что вы можете также позволить ему выполнять чтение и запись).