我真的不知道下面的场景该怎么做:
1:在应用程序中,我们调用SSL_write(s,data,100)想要向对等体发送100字节的明文。
2:在openssl中,数据将被加密并扩展到116字节(可能是其他大小,我不在乎)
3:在openssl中,加密输入后,它调用BIO_write/ send (tcp层接口)发送116个字节,但只发送10个字节(可能是由于套接字缓冲区不足和send()返回10)` .Does OpenSSL在自己的缓冲区中缓存100个密文?
当12-3发生时,SSL_write的返回值是多少?
1:如果SSL_write返回10 (或再次),应用程序将缓存90 (或100)字节的明文,并在fd可写时再次调用SSL_write写入90(或100)字节的明文,但这将导致加密状态错误,因为SSL_write已经加密了所有明文。
2:如果SSL_write返回100,则应用程序认为它已经发送了所有数据/明文,并且可能不会调用select/epoll_add来轮询fd的可写事件。(我发现Nginx确实喜欢这样,也许我错了),那么应用程序如何才能刷新openssl遗留数据中的剩余数据?
发布于 2018-07-13 16:44:42
好吧,我已经知道OpenSSL是怎么做的了。
即使实际只发送了10个字节,并且缓存在不是缓冲区中的106个字节,SSL_write也会再次返回。并且OpenSSL将记录当前输入大小(100)和保留大小(106)。第二次调用SSL_write时,它将首先发送剩余数据(106),然后删除当前输入数据的前100个字节。
https://stackoverflow.com/questions/51320232
复制相似问题