【发布时间】:2018-04-20 00:19:30
【问题描述】:
我有一个读取和写入数据的套接字应用程序。我正在使用 OpenSSL 进行加密/解密。我的问题是“BIO_write”方法是否可以在内部缓冲数据,或者当我从套接字读取更多内容时我是否必须附加到不断增长的缓冲区。这就是我正在做的事情。
我从套接字读取,并使用下面的类方法将所有读入的字节写入 BIO:
int CSslConnectionContext::Store(BYTE* pbData, DWORD dwDataLength)
{
int bytes = 0;
if (dwDataLength > 0)
{
bytes = BIO_write(bio[BIO_RECV], pbData, dwDataLength);
}
return bytes;
}
然后我立即调用 SSL_read 方法获取解密数据:
int CSslConnectionContext::Read(BYTE* pbBuffer, DWORD dwBufferSize)
{
int bytes = SSL_read(ssl, pbBuffer, dwBufferSize);
return bytes;
}
如果 SSL_read 返回一个正数,那么我的应用程序就有可用的解密数据。
我不确定的是,当我的套接字读取没有在一次读取中捕获解密所需的所有数据时会发生什么。
所以如果我需要 100 字节才能解密数据并且第一次读取只有 80,我可以用那些 80 调用 BIO_write(),再进行一次套接字读取以获取下一个 20,然后调用 BIO_write()只有这 20 个字节?
或者我是否需要编写代码,所以当我阅读 80 时,我会执行以下操作:
- 使用 80 字节调用 BIO_write()。
- 如果返回失败指示符 - 保留这 80 个字节。
- 从套接字读取接下来的 20 个字节并将其附加到缓冲的 80 个字节。
- 使用 100 字节调用 BIO_write()
【问题讨论】:
-
SSL_read() 的手册页似乎处理了在 SSL_read 可以返回任何数据之前在底层 bio 中需要更多数据的情况。在这种情况下,SSL_read() 将返回一个负数,然后 SSL_get_error() 将返回一个对应于 SSL_WANT_READ 或 SSL_WANT_WRITE 的值。
标签: sockets ssl encryption openssl