On Sun, Mar 06, 2022 at 02:39:55AM +0000, loic nicolas wrote:
> Hello,
> 
> I can't figure out how OpenSSL connections work.
> 
> I would like to use 2 bios (rbio, wbio) which will be shared for all my 
> connections.

I'm not sure why you would want to do this.  Why would you allocate one
BIO and share it between connections?

> The problem is that I really don't understand the error messages.
> I never get an SSL_ERROR_WANT_WRITE error code, I only get 
> SSL_ERROR_WANT_READ.

Your example doesn't show this.  It has several issues, in fact.  Can
you give an example where you are actually handling the want write
error?

I haven't announced this here, but I guess I should have.  I have a
library that has stackable stream and packet I/O modules, and it has an
SSL module.  If all you want is a simple SSL connection, it's probably
easier to use than the raw openssl library.  It's at
https://github.com/cminyard/gensio

-corey

> 
> For example, for the handshake, whether I have to send or receive data, I 
> only receive the error SSL_ERROR_WANT_READ.
> (calls are blocking for simplicity)
> 
> int main()
> {
>        struct addrinfo hints, *result;
>        memset(&hints, 0, sizeof(struct addrinfo));
>        hints.ai_family = AF_UNSPEC;
>        hints.ai_socktype = SOCK_STREAM;
> 
>        if (getaddrinfo("google.com", "443", &hints, &result) != 0) {
>               printf("getaddrinfo error");
>               exit(1);
>        }
> 
>        int fd = -1;
>        for (; result != nullptr; result = result->ai_next) {
>               fd = socket(result->ai_family, result->ai_socktype, 
> result->ai_protocol);
>               if (fd < 0)
>                      continue;
>               int res = connect(fd, result->ai_addr, result->ai_addrlen);
>               if (res == -1) {
>                      continue;
>               } break;
>        }
>        if (fd < 0) {
>               printf("Connection error");
>               exit(1);
>        }
>        freeaddrinfo(result);
> 
>        SSL_library_init();
>        OpenSSL_add_all_algorithms();
>        SSL_load_error_strings();
>        ERR_load_BIO_strings();
>        ERR_load_crypto_strings();
>        SSL_CTX *ctx = SSL_CTX_new(SSLv23_method());
> 
>        BIO *rbio = BIO_new(BIO_s_mem());
>        BIO *wbio = BIO_new(BIO_s_mem());
>        SSL *ssl = SSL_new(ctx);
>        SSL_set_bio(ssl, rbio, wbio);
>        SSL_set_connect_state(ssl);
> 
>        int n;
>        do {
>               n = SSL_do_handshake(ssl);
>               n = SSL_get_error(ssl, n);
>               if (n == SSL_ERROR_WANT_READ) {
>                      char buffer[4096];
>                      int r = BIO_read(wbio, buffer, sizeof(buffer));
>                      int error = SSL_get_error(ssl, r);
>                      if (error == SSL_ERROR_WANT_READ) {
>                             r = read(fd, buffer, sizeof(buffer));
>                             BIO_write(rbio, buffer, r);
>                      } else {
>                             send(fd, buffer, r, 0);
>                      }
>               }
>        } while (n != SSL_ERROR_NONE);
>        printf("Connected");
> }
> 
> 
> 
> How to manage the connection (with several sockets on the same bios) if I 
> don't know if I have to send data or receive it according to the error 
> message?
> 
> Thank you

Reply via email to