OpenSSL:在没有SSL_read()/ SSL_write()的情况下执行en// decryption

Phi*_*lip 5 c openssl network-programming

我用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)会很棒.

caf*_*caf 10

正是你所要求的是不可能的,因为在TLS中,在应用层发送内容和在网络套接字上发送内容之间没有一对一的对应关系.重新协商等事件意味着有时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传递给你的东西之外你什么也做不了,所以你也可以让它做读书和写作) .