Question

J'ai un client asynchrone et l'application de serveur qui OpenSSL wrap. Une fois créé, ils appellent SSL_set_connect_state () / SSL_set_accept_state () respectivement pour initialiser leur état interne. Jusqu'à ce point de tout fonctionne comme il devrait être. Je suppose que lorsque les États susmentionnés sont fixés, main tremblante peut commencer. Je ne la suivante pour initialiser ladite poignée de main (extrait):

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);
    }
}

Voici où il devient intéressant. Le BIO_ctrl_pending () appel échoue et quand je fais un SSL_get_error () sur elle, elle revient avec SSL_ERROR_WANT_READ. Il ne signifie évidemment pas alors ne pas exécuter mon code de lecture. J'ai ajouté la ligne suivante au-dessus de mon extrait de code:

SSL_peek(m_pSSLCon, NULL, 0);

Maintenant, quand je lance le code, BIO_ctrl_pending () renvoie la quantité appropriée (210) et mon code peut alors passer à lire de la BIO et d'initier une main tremblante.

Ma question est, est-ce une sorte de bug dans OpenSSL où l'Etat ne soit pas réglé correctement ?? Ou suis-je manque quelque chose ??

Était-ce utile?

La solution

question Old mais cesse d'apparaître quand googler trucs OpenSSL, donc pour référence:

Il suffit de lancer poignée de main au lieu de compter sur coup d'oeil / lire le faire en interne: Si ce n'est pas une prise bio la poignée de main échoue avec ssl_error_want_read et vous utilisez ctrl_pending pour obtenir la taille à lire.

Quelque chose comme ceci:

    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); 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top