2014-09-25 13 views
6

Ho esaminato il codice di esempio per l'utilizzo di OpenSSL e in ogni esempio che ho individuato, il creatore ha scelto di utilizzare BIO_printf() per scrivere cose su stdout anziché su printf().Quali sono i vantaggi dell'utilizzo di BIO_printf() anziché di printf()?

Ho preso il loro codice, rimosso la dichiarazione dell'intestazione openssl/bio.h e ho cambiato tutte le chiamate in BIO_printf() in normali istruzioni printf(). I programmi hanno funzionato con risultati identici.

Il problema con cui sto afferrando è il motivo per cui questi codificatori usano BIO_printf() quando ci vuole molto di più per l'installazione piuttosto che usare printf(). Devi includere un'altra intestazione (che aumenterà le dimensioni del programma), devi impostare il puntatore del file sul flusso su cui vuoi scrivere. Quindi puoi stampare il tuo messaggio su stdout. Sembra molto più complicato rispetto all'utilizzo di printf().

Quando eseguo una ricerca su BIO_printf() elenca le pagine man possibili per BIO_printf (3), ma nessuna delle pagine contiene effettivamente alcuna informazione!

Ho deciso di fare un test di riferimento su entrambi i metodi. Ho fatto il ciclo printf("Hey\n"); 1.000.000 di volte. Quindi l'ho fatto per BIO_printf(fp, "Hey\n");. Ho solo programmato l'istruzione BIO_printf() e non l'impostazione del puntatore del file (che avrebbe aumentato il tempo). La differenza è risultata in printf() di ~ 4,7 volte più veloce rispetto all'utilizzo di BIO_printf().

Perché lo usano? Qual è il vantaggio? Mi sembra di capire che nella programmazione vuoi che il codice sia semplice o efficiente, e nel caso di BIO_printf() non è né l'uno né l'altro.

+0

Nella mia esperienza le funzioni di OpenSSL ci sono per la sicurezza e l'astrazione. La funzione BIO_printf protegge le informazioni dalla perdita o semplifica il lavoro con le strutture BIO o forse entrambe. – Dan

+0

A causa di tutti i problemi con OpenSSL, c'è un progetto in esecuzione che semplifica moltissimo OpenSSL e la rimozione di elementi come BIO_printf() è stata tra le prime cose sulla lista. In altre parole, qualcuno ha pensato che BIO_printf fosse una buona idea, ma non lo è. – gnasher729

+0

Sono generalmente d'accordo con la sensazione che BIO sia al di fuori dell'ambito di ciò che una libreria SSL dovrebbe fare. Nel mio codice personale non li uso affatto, utilizzo i miei canali di comunicazione e uso solo le versioni non BIO delle funzioni OpenSSL. –

risposta

1

In generale, un BIO potrebbe non scrivere su stdout.

Si può avere un BIO che scrive su un file, o nullo, o di una presa di corrente, o un'unità di rete o un altro BIO, ecc

Utilizzando la famiglia BIO_printf, il codice può essere facilmente modificato per il suo output viene inviato in una posizione diversa o in un altro BIO che potrebbe eseguire ulteriori operazioni di filtro e quindi trasmettere l'output in qualsiasi altro luogo.

0

Come indicato da altri, BIO può essere impilato contrariamente a FILE. snprintf() e vnsprintf() sono stati aggiunti in C99. OpenSSL/SSLeay è più vecchio di questo. Quindi, gli sviluppatori di SSLeay hanno dovuto scrivere la loro implementazione. Sfortunatamente, avere un po 'di implementazione utilizzata porta ai problemi di prestazioni descritti dall'OP o allo CVE-2016-0799.

Problemi correlati