OpenSSL: выполнить расшифровку / расшифровку без SSL_read () / SSL_write () - PullRequest
5 голосов
/ 27 января 2012

Я написал сетевую библиотеку на основе событий в C и теперь хочу добавить поддержку SSL / TLS через OpenSSL. Вместо использования SSL_read() и SSL_write() я бы предпочел, чтобы OpenSSL выполнял только шифрование / дешифрование исходящих / входящих данных, позволяя мне передавать / получать данные самостоятельно.

Я новичок в SSL / TLS и OpenSSL, поэтому:

Есть ли способ заставить OpenSSL только выполнять шифрование / дешифрование char массивов?

Что-то вроде size_t SSL_encrypt(const char *buf_in, size_t size_in, char *buf_out) было бы замечательно.

1 Ответ

10 голосов
/ 27 января 2012

Точно то, что вы просили, невозможно, потому что в TLS нет соответствия «1: 1» между отправкой чего-либо на уровне приложения и отправкой чего-либо в сетевой сокет.Такие события, как повторное согласование, означают, что иногда SSL должен считывать данные из сети, чтобы выполнить отправку данных, и наоборот.

Однако вы все равно можете использовать OpenSSL для выполнения SSL, но позаботиться о чтении ипишу из сети сам.Вы делаете это, вызывая SSL_set_bio() на указателе SSL вместо SSL_set_fd():

  1. Используйте BIO_new_bio_pair() для создания подключенной пары BIO.Один BIO будет считываться и записываться с помощью подпрограмм SSL, а другой BIO будет считываться и записываться вашим приложением (что позволяет ему передавать данные на другой конец любым способом, который он пожелает).

  2. Используйте SSL_set_bio() на новом объекте SSL, чтобы установить чтение и запись BIO для одного из BIO в сгенерированной паре.

  3. Используйте BIO_read() и BIO_write() на другом BIO в паре для чтения и записи данных протокола SSL.

  4. Использование SSL_accept(), SSL_connect(), SSL_read() и SSL_write() как обычно для объекта SSL.

(хотя неясно, какое преимущество это даст в вашем приложении: в этом случае вы не можете сделать что-либо другоечем читать и писать именно то, что OpenSSL передает вам, так что вы можете также позволить ему выполнять чтение и запись).

...