>       From: owner-openssl-us...@openssl.org On Behalf Of Akanksha Shukla
>       Sent: Thursday, 03 November, 2011 11:25

>       I want to summarize <snip>
>       I am using the SSL API's for client application to get connect 
> to server and that worked fine over IPv4. Now my requirement is to 
> have the same client-server communication over IPv6. And this time 
> I also used the same SSL API's to get connected to server using 
> IPv6 address, but faced issue in that. <snip>

Just to be clear: you are using OpenSSL APIs, but not SSL ones.
BIO_s_connect, and BIO_s_socket, and BIO_s_accept, don't do SSL. 
BIO_f_SSL does, and so do SSL_*.

>       Approach 1:

>       int main()
>       {
>         Bio *conn;  
>         SSL_library_init();
>         SSL_load_error_strings();
>         ERR_load_crypto_strings();
>         OpenSSL_add_all_algorithms();

Aside: SSL_load_error_strings includes ERR_load_crypto_strings, 
and SSL_library_init loads all algorithms needed for SSL.
         
>         conn = BIO_new_connect("250::56ff:feab:20:80");
>         if(!conn) <snip error>
>         /* Configure the BIO as a non-blocking one */
>     BIO_set_nbio(conn, 1);
             
>     int retryCounter = 0;
>     while(retryCounter < CONNECT_MAX_TRY)   // <snip> is 10
>     {
>         int retVal = BIO_do_connect(conn);
>         if(retVal <= 0) 
>         {
>             if(BIO_should_retry(conn)) <sleep and continue>
>             else <error>
>    }
>    else <success>

> [BIO_do_connect fails] 02003000:system library:getservbyname:system
library

>       Approach 2: ... same except "[250::56ff:feab:20]:80"). 
> [BIO_do_connect fails] 2006A066:BIO routines:BIO_get_host_ip:bad hostname
lookup

As expected. I thought you were told BIO_s_connect does not handle 
IPv6 addresses, and you can easily verify by looking at the code; 
it has AF_INET and gethostbyname not v6-capable getaddrinfo etc.
Although, BIO_s_accept does have code for v6 that looks reasonable 
at least in 1.0.0e (I can't conveniently test).
 
>       Approach 3:

>       I followed the way suggested in forum and tried with IPv4 address. 
> This time, I am not able to make connection on IPV4 and biggest issue 
> is that nothing is coming in the error logs of SSL as well.

>  int socket_desc = socket (AF_INET, SOCK_STREAM, 0);
>  if (socket_desc == INVALID_SOCKET)
>  {
>      cout << "The error retuned by socket is" << errno << endl;
>  }
If this condition occurs, which it almost never will, you should 
not proceed to the following code which uses socket_desc. 

>   cout << "The socket is created successfully." << endl;
         
>   struct sockaddr_in addrinfo; <and fill in>

Aside: this name may become confusing. sockets-6 has a 
struct addrinfo which is different from sockaddr_in{,6}.

>   int retval = connect(socket_desc, (struct sockaddr *)&addrinfo, sizeof
(addrinfo));
>   if (retval != 0)
>   {
>      cout << " The error returned by socket connect is" << errno << endl;
>   }
>   cout << "The socket is connected successfully." << endl;
> 
>   conn = BIO_new_socket(socket_desc,0);
>   if(!conn) <snip error>
>  /* Configure the BIO as a non-blocking one */
>     BIO_set_nbio(conn, 1);
> 
>     int retryCounter = 0;
>     while(retryCounter < CONNECT_MAX_TRY)   // whose value is 10.
>     {
>         int retVal = BIO_do_connect(conn);
>         if(retVal <= 0) <snip: _should_retry sleep&continue else error>
>         else <success>

> After executing program, the outcome came:

> [Bio_do_connect() fails] 00000000:lib(0):func(0):reason(0)

BIO_do_connect is documented only for BIO_s_connect, not BIO_s_socket.
(Although it uses the same BIO_ctrl number as some other operations.)
And in fact it is unsupported and meaningless on BIO_s_socket, 
which wraps (only) a socket that is already connected.

It is somewhat unhelpful that unsupported BIO_ctrl's 
(at least here) return 0 with no ERR_ entry.

>       So, my main queries or doubt are:

>       1)      I wanted to have SSL API's which could have been used 
> for both IPv4 and IPv6 (client side application). Is there support 
> for IPv6 in any of the client side OpenSSl API or not? This has been 
> my question from the first day when I posted my query in forum but 
> till now I haven't got any concrete response on this.

The SSL_ routines (both client and server) work fine with any socket, 
either v4 and v6. BIO_f_SSL/BIO_s_socket ditto. 
BIO_s_connect, and (thus) BIO_f_SSL/BIO_s_connect no.
 
>       2)      Since I am getting error in the IPv4 only when I followed 
> the way suggested in forum and nothing is coming in error logs. 
> So, I don't know how to proceed further and my work is struck here.

I don't think anyone suggested do_connect on BIO_s_socket.

>       3)      I am also not clear why the error log is coming as 0 
> in approach 3 while in case 1 and case 2, I can see some error thrown 
> by SSL API's. I don't think in case 3, I am missing something which 
> could cause error as 0.

Because it's an unsupported operation on this BIO, see above.

<snip>

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

Reply via email to