我在C中编写了一个基于事件的网络库,现在我想通过OpenSSL添加SSL / TLS支持。我不想使用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)
这样的东西会很棒。
答案 0 :(得分:10)
正是你所要求的是不可能的,因为在TLS中,在应用层发送内容和在网络套接字上发送内容之间没有一对一的对应关系。像重新谈判这样的事件意味着有时SSL需要从网络中读取数据以便在发送数据方面取得进展,反之亦然。
但是,您仍然可以使用OpenSSL执行SSL,但要自己负责网络的读写操作。您可以通过SSL_set_bio()
指针而不是SSL
调用SSL_set_fd()
来执行此操作:
使用BIO_new_bio_pair()
创建连接的BIO对。一个BIO将由SSL例程读取和写入,另一个BIO将由您的应用程序读取和写入(允许它通过任何方法将数据传递到另一端)。
在新的SSL对象上使用SSL_set_bio()
将读取和写入BIO设置为生成的对中的一个BIO。
在对中的另一个BIO上使用BIO_read()
和BIO_write()
来读取和写入SSL协议数据。
在SSL对象上正常使用SSL_accept()
,SSL_connect()
,SSL_read()
和SSL_write()
。
(目前尚不清楚这会给你的应用带来什么好处:在这种情况下你除了读写OpenSSL传递给你的东西之外你什么也做不了,所以你不妨让它做读书和写作也是。)