SSL_write写入部分数据时如何处理应用程序

时间:2018-07-13 03:34:07

标签: openssl

我真的不知道在以下场景中怎么做:

1:在应用程序中,我们称SSL_write(s,data,100)要向对等方发送100字节的明文。

2:在openssl中,数据将被加密并扩展为116个字节(也许是其他大小,我不在乎)

3:在openssl中,对输入进行加密之后,它将调用BIO_write / send(tcp层接口)发送116个字节,但仅发送10个字节(可能是由于套接字缓冲区不足,并且send()返回10)所致。 OpenSSL是否将100个密文缓存在自己的缓冲区中?

发生1 2 3时,SSL_write的返回值是多少?

1:如果SSL_write返回10(或再次返回),则当fd为时,应用程序将缓存90(或100)个字节的纯文本,并再次调用SSL_write以写入90(或100)个字节的纯文本。可写的,但这将导致加密状态错误,因为SSL_write已经对所有明文进行了加密。

2:如果SSL_write返回100,则应用程序认为它已发送了所有数据/纯文本,并且可能未调用select / epoll_add来轮询fd的可写事件。 (我发现Nginx确实是这样的,也许我是错的),那么应用程序该如何清除openssl左侧数据中的剩余数据?

1 个答案:

答案 0 :(得分:0)

嗯,我发现了OpenSSL的工作方式。
SSL_write将再次返回,即使仅实际发送了10个字节,并且106个字节将被缓存在非缓冲区中。并且OpenSSL将记录当前输入大小(100)并保持大小(106)。第二次调用SSL_write时,它将首先发送剩余数据(106),然后删除当前输入数据的前100个字节。