Асинхронная проблема OpenSSL с BIO_ctrl_pending () - PullRequest
0 голосов
/ 05 января 2011

У меня есть асинхронное клиентское и серверное приложение, которое упаковывает OpenSSL.После создания они вызывают SSL_set_connect_state () / SSL_set_accept_state () соответственно для инициализации своего внутреннего состояния.До этого момента все работает как надо.Я предполагаю, что как только эти вышеупомянутые состояния будут установлены, рукопожатие может начаться.Я делаю следующее, чтобы инициализировать указанное дрожание рук (фрагмент):

if (BIO_ctrl_pending(m_pOutBio))
{
    size_t iNumBytes = BIO_ctrl_pending(m_pOutBio);
    if (iNumBytes > 0)
    {
        CAutoPtr<byte> tTempBuf(new byte[iNumBytes]);

        // Transfer bytes from the Write BIO into the temporary buffer
        int iRet = BIO_read(m_pOutBio, tTempBuf, iNumBytes);
    }
}

Вот где это становится интересным.Вызов BIO_ctrl_pending () завершается неудачно, и когда я выполняю SSL_get_error () для него, он возвращается с SSL_ERROR_WANT_READ.Тогда он, очевидно, не выполняет мой код чтения.Я добавил следующую строку над моим фрагментом кода:

SSL_peek(m_pSSLCon, NULL, 0);

Теперь, когда я запускаю код, BIO_ctrl_pending () возвращает правильное количество (210), и мой код может затем продолжить чтение из BIO и инициировать рукувстряхивание.

Мой вопрос, это какая-то ошибка в OpenSSL, когда состояние не устанавливается должным образом ??Или я что-то упустил ??

1 Ответ

2 голосов
/ 20 февраля 2012

Старый вопрос, но он постоянно всплывает, когда гуглится с openssl, поэтому для справки:

Просто инициируйте рукопожатие вместо того, чтобы полагаться на просмотр / чтение, выполняя это внутренне: Если это не биография сокета, рукопожатие завершится неудачно с ssl_error_want_read, а затем вы используете ctrl_pending, чтобы получить размер для чтения.

Примерно так:

    ret = SSL_do_handshake(client_side);
      if (ret < 0)
        if (SSL_ERROR_WANT_READ !=  SSL_get_error(client_side,ret))
            cout << "ERROR";


    ret = BIO_ctrl_pending(network_side); 
...