2014-09-25 12 views
6

Przeglądałem przykładowy kod do korzystania z OpenSSL iw każdym przykładzie, który zlokalizowałem, twórca wybrał użycie BIO_printf(), aby pisać rzeczy na stdout zamiast printf().Jakie są zalety korzystania z BIO_printf() zamiast printf()?

Pobrałem ich kod, usunięto deklarację nagłówka openssl/bio.h i zmieniono wszystkie wywołania na BIO_printf() na zwykłe instrukcje printf(). Programy działały z identycznymi rezultatami.

Problem, z którym się borykam, polega na tym, że ci koderowie używają BIO_printf(), gdy konfiguracja wymaga dużo więcej niż samego printf(). Musisz dołączyć inny nagłówek (który zwiększy rozmiar programu), musisz ustawić wskaźnik pliku na strumień, do którego chcesz pisać. Następnie możesz wydrukować wiadomość na standardowe wyjście. Wydaje się to o wiele bardziej skomplikowane niż użycie printf().

Kiedy wykonuję wyszukiwanie w BIO_printf(), wyszczególnia możliwe strony podręcznika dla BIO_printf (3), ale żadna ze stron nie zawiera żadnych informacji!

Postanowiłem zrobić test porównawczy na obu metodach. Zapętlałem printf("Hey\n"); 1 000 000 razy. Potem zrobiłem to dla BIO_printf(fp, "Hey\n");. Zmieniłem tylko ustawienie BIO_printf(), a nie konfigurację wskaźnika pliku (co spowodowałoby zwiększenie czasu). Różnica wynikała z faktu, że printf() był ~ 4.7x szybszy niż BIO_printf().

Dlaczego go używają? Jakie są korzyści? Rozumiem, że w programowaniu chcesz, aby kod był prosty lub efektywny, a w przypadku BIO_printf() to nie jest ani.

+0

Z mojego doświadczenia wynika, że ​​funkcje OpenSSL są dla bezpieczeństwa i abstrakcji. Funkcja BIO_printf albo chroni informacje przed wyciekiem, albo upraszcza pracę ze strukturami BIO, a może obie. – Dan

+0

Z powodu wszystkich problemów z OpenSSL, istnieje projekt, który bardzo upraszcza OpenSSL, a usuwanie takich rzeczy, jak BIO_printf() było jedną z pierwszych rzeczy na liście. Innymi słowy, ktoś pomyślał, że BIO_printf był dobrym pomysłem, ale tak nie jest. – gnasher729

+0

Generalnie zgadzam się z sentymentem, że BIO wykracza poza zakres tego, co powinna robić biblioteka SSL. W moim własnym kodzie nie używam ich wcale, używam własnych kanałów komunikacyjnych i po prostu używam wersji OpenSSL innych niż BIO. –

Odpowiedz

1

Ogólnie BIO może nie zapisywać na standardowe wyjście.

Można mieć BIO, który zapisuje do pliku, lub null lub gniazda lub na dysku sieciowym lub innym BIO itp

za pomocą rodzinę BIO_printf, kod może być łatwo zmieniona mieć wyjście wysyłane do innej lokalizacji lub innego BIO, które może wykonać dalsze filtrowanie, a następnie przekazać dane wyjściowe gdziekolwiek indziej.

0

Jak wskazano przez innych, BIO może być układany w przeciwieństwie do FILE. snprintf() i vnsprintf() zostały dodane w C99. OpenSSL/SSLeay jest starsze niż to. W związku z tym developerzy SSLeay musieli napisać własną implementację. Niestety, posiadanie mało używanej implementacji prowadzi do problemów z wydajnością opisanych przez OP lub do CVE-2016-0799.

Powiązane problemy