On Sun, Mar 15, 2009 at 11:14:04PM -0500, Galina Goncharov wrote:

> an other thought - I didn't notice your third SSL_set_bio(m_ssl, NULL,
> bioMem); so my suggestion wasn't quite correct.  and its always usfull to
> get error by calling SSL_get_error() - it can point to right direction.
> and below is from other thread:

Do read about the BIO_pair interface and find examples of the use of
bio_pairs with SSL.

> > I am in the process of converting an SMTP/TLS server to use Async IO.
> > (using IO Completion Ports on Windows)
> > As such, the previously working style of using SSL_accept, select, and
> > SSL_read / SSL_write is no longer sufficient.
> >
> > Now that I am using WSARecv to do the read, my app is notified when a
> > buffer is filled with (encrypted) data.
> > Somebody suggested I stuff that data into a BIO buffer and read it out of
> > that.
> > I attempted to use BIO_read but without success.
> > I seem to have that half working now, looking roughly like this:
> > (over-simplified for readability)
> >
> > // SMTP client requests STARTTLS, server takes these actions:
> > BIO* m_bioSckt = BIO_new_socket((int)scktUpstream, BIO_NOCLOSE);
> > SSL* m_ssl = SSL_new(ctx);
> > SSL_set_accept_state(m_ssl);
> > SSL_set_bio(m_ssl, m_bioSckt, m_bioSckt);
> >
> > // Server sends "220 go ahead" to client, and waits for Client/Server
> > to negotiate handshake
> > int nRetCode = SSL_accept(m_ssl);
> >
> > // This succeeds - client reports: "New, TLSv1/SSLv3, Cipher is
> > AES256-SHA, etc..."
> > // Now client sends command (e.g. "EHLO example.org") which needs to
> > be decrypted
> > BIO* m_bioMem = BIO_new_mem_buf(encryptedData, nEncDataSize);
> > SSL_set_bio(m_ssl, m_bioMem, NULL);
> > char decryptedData[4096];
> > int numBytesRead = SSL_read(m_ssl, decryptedData, sizeof(decryptedData));
> >
> > // SMTP server processes decryptedData and takes appropriate action -
> > e.g. sends a "250 OK" response
> > // That response needs to be encrypted before it is sent (WSASend)
> > BIO* bioMem = BIO_new(BIO_f_buffer());
> > SSL_set_bio(m_ssl, NULL, bioMem);
> > int numBytesWritten = SSL_write(m_ssl, responseData, nRespDataSize);   //
> > fails
> > BIO_flush(bioMem);
> >
> > I am testing using the openssl client:
> > openssl s_client -starttls smtp -connect localhost:25 -crlf -msg -debug
> >
> > The SSL_write seems to fail completely. :(
> > Am I on the right track here?
> > Is it the optimal way to go about it?
> > Also surprising, (at least to me) is that BIO_new_socket and
> > BIO_new_mem_buf return the identical address in memory,
> > which makes me think I am really not understanding how this is supposed to
> > work.
> >
> > Any pointers are much appreciated.
> >
> > TIA,
> > n8
> > ______________________________________________________________________
> > OpenSSL Project                                 http://www.openssl.org
> > User Support Mailing List                    openssl-users@openssl.org
> > Automated List Manager                           majord...@openssl.org
> >

-- 
        Viktor.
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to