2014-09-25 13 views
6

Ich habe Beispielcode für die Verwendung von OpenSSL überprüft und in jedem Beispiel, das ich finde, hat der Schöpfer gewählt, BIO_printf() zu verwenden, um Sachen zu stdout anstelle von printf() zu schreiben.Welche Vorteile bietet die Verwendung von BIO_printf() anstelle von printf()?

Ich habe ihren Code genommen, die openssl/bio.h-Header-Deklaration entfernt und alle Aufrufe von BIO_printf() in reguläre printf() -Anweisungen geändert. Die Programme liefen mit identischen Ergebnissen.

Das Problem, mit dem ich mich beschäftige, ist, warum diese Programmierer BIO_printf() verwenden, wenn es viel mehr zum Einrichten braucht als nur printf() zu verwenden. Sie müssen eine andere Kopfzeile einfügen (die die Programmgröße erhöht), Sie müssen den Dateizeiger auf den Stream setzen, in den Sie schreiben möchten. Dann können Sie Ihre Nachricht auf stdout drucken. Es scheint viel komplizierter als die Verwendung von printf().

Wenn ich auf BIO_printf() suche, listet es mögliche man-Seiten für BIO_printf (3) auf, aber keine der Seiten enthält tatsächlich irgendwelche Informationen!

Ich entschied mich, einen Benchmark-Test für beide Methoden durchzuführen. Ich schlingelte printf("Hey\n"); 1,000,000 mal. Dann habe ich es für BIO_printf(fp, "Hey\n"); getan. Ich habe nur die BIO_printf() - Anweisung und nicht die Einrichtung des Dateizeigers (die die Zeit erhöht hätte). Der Unterschied bestand darin, dass printf() ~ 4,7x schneller war als BIO_printf().

Warum verwenden sie es? Was ist der Vorteil? Es ist mein Verständnis, dass Sie bei der Programmierung entweder Code einfach oder effizient sein wollen, und im Fall von BIO_printf() ist es auch nicht.

+0

Nach meiner Erfahrung sind die OpenSSL Funktionen für Sicherheit und Abstraktion. Die BIO_printf-Funktion schützt Informationen vor Undicht oder vereinfacht das Arbeiten mit BIO-Strukturen oder beides. – Dan

+0

Wegen all der Probleme mit OpenSSL gibt es ein laufendes Projekt, das OpenSSL sehr vereinfacht, und das Entfernen von Dingen wie BIO_printf() gehörte zu den ersten Dingen auf der Liste. Mit anderen Worten, jemand dachte BIO_printf war eine gute Idee, aber es ist nicht. – gnasher729

+0

Ich stimme generell mit dem Gefühl überein, dass BIO außerhalb des Rahmens dessen liegt, was eine SSL-Bibliothek tun sollte. In meinem eigenen Code verwende ich sie überhaupt nicht, ich benutze meine eigenen Kommunikationskanäle und benutze nur die Nicht-BIO-Versionen der OpenSSL-Funktionen. –

Antwort

1

Im Allgemeinen schreibt ein BIO möglicherweise nicht in stdout.

Sie können eine BIO haben, die in eine Datei schreibt oder null oder eine Steckdose oder einem Netzlaufwerk oder einem anderen BIO usw.

Durch die BIO_printf Familie verwenden, kann der Code leicht geändert werden Die Ausgabe muss an einen anderen Ort oder an ein anderes BIO gesendet werden, das eventuell weitere Filterungen durchführt und die Ausgabe dann an einen anderen Ort weiterleitet.

0

Wie von anderen hingewiesen, kann BIO im Gegensatz zu FILE gestapelt werden. snprintf() und vnsprintf() wurden in C99 hinzugefügt. OpenSSL/SSLeay ist älter als das. Daher mussten die SSLeay-Entwickler ihre eigene Implementierung schreiben. Leider führt eine wenig genutzte Implementierung zu den vom OP oder CVE-2016-0799 beschriebenen Leistungsproblemen.

Verwandte Themen