【问题标题】:How to deal with application when SSL_write write partial dataSSL_write写入部分数据时如何处理应用程序
【发布时间】:2018-07-13 03:34:06
【问题描述】:

下面的场景我真的不知道该怎么做:

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

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

3:在openssl中,对输入进行加密后,调用BIO_write/send(tcp层接口)发送116字节,但只发送了10字节(可能是socket缓冲区不够,send()返回10)`。 OpenSSL 是否将 100 个密文缓存在它自己的缓冲区中?

当 1 2 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左侧数据中的剩余数据?

【问题讨论】:

    标签: openssl


    【解决方案1】:

    好吧,我发现了 OpenSSL 的作用。
    即使真正发送了 10 个字节,SSL_write 也会再次返回,并且 106 个字节将被缓存在不是缓冲区中。 OpenSSL 将记录当前输入的大小(100)并保持大小(106)。第二次调用 SSL_write 时,会先发送剩余数据(106),然后删除当前输入数据的前 100 字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-02
      • 2012-05-28
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2011-07-30
      • 2012-11-08
      相关资源
      最近更新 更多