On Wed, Jan 29, 2020 at 5:10 AM Ray Satiro <raysat...@yahoo.com> wrote: > > On 1/28/2020 8:09 PM, Pawel Veselov wrote: > > On Wed, Jan 29, 2020 at 1:09 AM Ray Satiro <raysat...@yahoo.com> wrote: > > On 1/28/2020 5:13 PM, Pawel Veselov wrote: > > On Tue, Jan 28, 2020 at 10:24 PM Ray Satiro via curl-library > <curl-library@cool.haxx.se> wrote: > > On 1/28/2020 1:17 PM, Pawel Veselov via curl-library wrote: > > I have a simple prologue code in my program to select SSL backend. It > works on relatively > recent versions (e.g. 7.65), but specifically on 7.58 ("latest" for > Ubuntu 18), > curl_global_sslset() returns CURLSSLSET_TOO_LATE. > I thought somebody else may be calling init function, but I can see > from the source code > that it simply returns TOO_LATE if there are no multiple SSL backends, > and if ID > doesn't match the ID of the backend that was actually compiled in. > > Could you please save me some investigative time and let me know in > which version > was this changed so that calling this with without IDs returns list of > available backends even > in case of single backend? > > sslset also returns too late if it has been called after global init. > > global init hasn't been called. > > How are you calling it, with name or id? > > I just want the list, so I pass id of -1 and name of 0. > > There was an issue when id was > set to -1 that was fixed [1] a year ago. Also there was an improvement > in 7.60 to return the backends even if too late [2]. The change is > documented you could test for it like this: > > if(rc != CURLSSLSET_OK) { > curl_version_info_data *verinfo = curl_version_info(CURLVERSION_NOW); > if(verinfo->version_num >= CURL_VERSION_BITS(7,60,0)) { > /* backend list available even if CURLSSLSET_TOO_LATE */ > } > } > > Ah, I see. The bone that I have to pick with this is that return of > TOO_LATE can happen because either global init was called, or > because there is only one backend (and I didn't guess right), and > I can't really tell the difference. > > The whole deal here is that I want to prevent getting libcurl with one > backend in particular. I guess my logic should be: > * call sslset with -1/NULL. If that gives me a list of backends, > pick the one that I want, and call sslset again, and see if it worked > * If there was no list of backends, try to call with the bad > backend ID, and see if then it succeeds. If it does, then I have > a backend I don't want > > > To be clear it is supposed to work as it is documented [1]. > If it does not work that way (aside from that known bug in early versions) > please let us know. > I don't know why you would try to set the backend you don't want. > > I was trying to figure out a good way to workaround #3346 > for versions that still have it. > > Do you mean you need to know if a particular backend is in use? > > Yes. If a particular backend is in use, I want to not let my > application continue, > and if I have a choice - pick any other backend except for that one I dislike > and NONE :) > > We don't have a curl_global_sslget [2]. > > That's a pity. But even if it was added now, I would still need to make the > logic work for earlier versions (reasonably, but I need, for example, > to support Ubuntu 16 that uses 7.47). > > [1]: https://curl.haxx.se/libcurl/c/curl_global_sslset.html > [2]: https://github.com/curl/curl/pull/2063 > > Thank you for your help! > > > Well the workaround I mentioned in that bug does work, you can see how we > used it [1] in the curl tool. Basically after curl has initialized you can > call curl_easy_init [2] to create an easy handle (note if you do this before > initializing curl, it will call initialization for you) and then get the > backend of that handle. Currently the backend is set globally and can't be > changed but it could be improved at some point to allow it per handle, which > I think is part of why I got a lukewarm reception to add a global way to get > the backend. > > In your case you would use CURLINFO_TLS_SESSION [4] the predecessor to > CURLINFO_TLS_SSL_PTR [3]. Although it is not documented (I will change this) > only since 7.45.0 it will always return the backend in use [5]. So you could > do it like this: > > /* initialize curl before calling curl_version_info */ > if(!(verinfo->features & CURL_VERSION_SSL)) { > problem = true; /* may happen */ > } > else if(verinfo->version_num < CURL_VERSION_BITS(7,45,0)) { > /* no multiple ssl backends and no ssl backend constants */ > sslver = duplowercase(verinfo->ssl_version); > if(!sslver) /* shouldn't happen */ > abort(); > if(strstr(sslver, "openssl")) /* may happen */ > problem = true; > free(sslver); > else { > CURL *curltls = curl_easy_init(); > struct curl_tlssessioninfo *tbi = NULL; > CURLcode rc = curl_easy_getinfo(curltls, CURLINFO_TLS_SESSION, &tbi); > if(rc || tbi->backend == CURLSSLBACKEND_NONE) { /* shouldn't happen */ > curl_easy_cleanup(curltls); > abort(); > } > if(tbi->backend == CURLSSLBACKEND_OPENSSL) /* may happen */ > problem = true; > curl_easy_cleanup(curltls); > } > > > Working with the string compare has some caveats because like in the case of > openssl it doesn't the forks. For example you may have libressl or boringssl > which are forks of openssl. Or how wolfssl was formerly known as cyassl. Or > how mbedtls was formerly known as polarssl. There are probably others, so you > may find it hard to do accurately in old versions of curl without some > research.
Thank you for your help, advice and insights! That would definitely give me a good path to solve the issue I need to solve. > [1]: > https://github.com/curl/curl/blob/curl-7_68_0/src/tool_operate.c#L2273-L2290 > [2]: https://curl.haxx.se/libcurl/c/curl_easy_init.html > [3]: https://curl.haxx.se/libcurl/c/CURLINFO_TLS_SESSION.html > [4]: https://curl.haxx.se/libcurl/c/CURLINFO_TLS_SSL_PTR.html > [5]: https://github.com/curl/curl/commit/7362008 > -- With best of best regards Pawel S. Veselov ------------------------------------------------------------------- Unsubscribe: https://cool.haxx.se/list/listinfo/curl-library Etiquette: https://curl.haxx.se/mail/etiquette.html