Nei titoli e nei testi troverete qualche rimando cinematografico (ebbene si, sono un cinefilo). Se non vi interessano fate finta di non vederli, già che non sono fondamentali per la comprensione dei post...

Di questo blog ho mandato avanti, fino a Settembre 2018, anche una versione in Spagnolo. Potete trovarla su El arte de la programación en C. Buona lettura.

giovedì 8 agosto 2019

Lo chiamavano Jeeg OpenSSL
come scrivere TCP Server e Client con OpenSSL in C - pt.3

Enzo/Jeeg: T'è annata male, Zingaro! Si vòi diventà famoso te conviene torna' a fa' l'imitazione der Grande Fratello! 
Fabio/Zingaro: Era Buona Domenica, cojone!
E ci risiamo un'altra volta: anche per questa terza puntata di Lo chiamavano Jeeg Robot (oops: Lo chiamavano Jeeg OpenSSL) abbiamo due notizie, una buona e una cattiva. La buona è che questo post completa (finalmente) il discorso della libreria MySSL. La cattiva notizia è che ho, finalmente, scoperto che diventare ricchi e famosi col Software è veramente molto complicato... Un consiglio: iscrivetevi, invece, al casting del Grande Fratello, quello è il futuro! (no, è mejo Buona Domenica, cojone!).
...e usa sta' MySSL cojone!...
(...si lo so, lo so: nell'ultimo articolo avevo promesso che avremmo proseguito e approfondito il discorso errno/strerror disquisendo di reentrant/thread-safe: ma siamo ad agosto, e l'articolo promesso potrebbe risultare troppo pesante per chi ha già la testa (e anche il corpo, spero) in vacanza... Vi/mi faccio un favore: ne riparleremo a Settembre, così oltre alla depressione post-vacanze vi beccherete anche un articolo pesantone in grado di schiantarvi del tutto...

Allora: perché una terza puntata di Lo chiamavano Jeeg OpenSSL? Se ben ricordate (e se non vi ricordate questa è una occasione imperdibile per rileggere la parte 1 e la parte 2 della serie) abbiamo lasciato la saga con la proposta di una semplice libreria per scrivere in maniera user-friendly applicazioni che usano OpenSSL (che è in effetti un po' ostica da usare così com'è). Era una piccola libreria di smart-wrapper per alcune delle funzioni OpenSSL e l'avevo scritta ad-hoc per il blog, usando una struttura ultra-semplificata: era composta solo da due file, myssl.c e myssl.h, e doveva essere compilata e linkata direttamente con la applicazione che la usava (ad esempio un SSL Server).

Per questa terza parte del post ho deciso di rendere la libreria un po' più professionale, come struttura e come distribuzione, quindi l'ho rivoluzionata (abbastanza) e l'ho trasformata in un repository GitHub. La potete trovare qui (...in realtà già ai tempi della seconda parte del post il mio ottimo collega Andrea Simone Costa mi aveva suggerito di farlo, ma avevo rimandato la cosa a tempi più propizi, tipo ora...). Vi riporto subito il file README.md del repository GitHub così non ci perdiamo in chiacchiere (per l'occasione tradotto in Italiano, ma su GitHub lo trovate in Inglese): 
MySSL 
Un'interfaccia user-friendly per la libreria OpenSSL

Panoramica
----------
La libreria MySSL è una semplice interfaccia per la libreria OpenSSL che 
consente una scrittura user-friendly (in C o C++) di SSL Server e SSL Client.

Note
----
- Licenza GNU MySSL (omissis)
- Licenza OpenSSL (omissis)
- La libreria "OpenSSL" di riferimento è la ver.1.0.2g
- Attualmente la libreria MySSL supporta solo sistemi Linux

Installazione
-------------
Questa è attualmente una versione beta e utilizza un Makefile molto semplice: 
quindi per generare e testare la libreria MySSL è necessario eseguire alcuni 
passaggi manuali:

1. Posizionarsi nella directory src e generare la libreria con 
   "make clean && make". Questo genera una libreria condivisa (libmyssl.so) e 
   la copia nella directory tests/lib. Il header-file myssl.h viene copiato 
   nella directory tests/include.
2. Posizionarsi nella directory tests e generare i due programmi di test
   (sslserver e sslclient) con "make clean && make".
3. Leggere il paragrafo "Testing" di questo file per vedere come eseguire un 
   semplice test della libreria MySSL utilizzando due terminali.
4. Notare che in questa versione beta la libreria non viene installata 
   automaticamente, quindi per eseguire il test è necessario installare 
   libmyssl.so nel sistema oppure è possibile eseguire un'installazione 
   temporanea in entrambi i due terminali in questo modo:

   export LD_LIBRARY_PATH = "~/path-di-myssl-package/tests/lib"

La prossima versione della libreria MySSL utilizzerà Autotools per generare e 
installare automaticamente e per rendere il pacchetto portatile su molti sistemi
Unix-like.

Testing
-------
Due test sono forniti nelle directory tests/server e tests/client e si può 
modificare liberamente il codice sorgente in base alle proprie esigenze (è Free
Software :).

I due programmi di test sono un SSL Server e un SSL Client che utilizzano la 
libreria MySSL e, oltre a testare la libreria, possono servire da esempio su 
come scrivere codice usando la libreria MySSL.

Le due directory di test forniscono esempi di base (e funzionanti) dei 
certificati SSL utilizzati dalla libreria MySSL per funzionare.

Per un rapido test della libreria MySSL, è possibile eseguire i seguenti 
programmi in due shell aperte nelle directory tests/server e tests/client:

1. ./sslserver 8888
2. ./sslclient 127.0.0.1 8888

TODO list
---------
- Generazione e installazione della libreria con Autotools
- Documentazione
- Supporto Windows
Ecco, penso che il README.md sia più che sufficiente a descrivere la nuova MySSL (l'ho scritto apposta!), quindi approfitto dell'occasione per descrivere, invece, i passi che ho eseguito per trasformare una libreria con struttura semplice in una più complessa per GitHub: questa guida è generica ed è, ovviamente, molto soggettiva, ma secondo me potrebbe essere un buon spunto per tutti quelli che si accingono a fare una operazione del genere. Vediamo i passi che ho eseguito:
  1. Ho diviso il "sorgentone" originale myssl.c in più sorgenti, uno per ogni funzione della libreria (sslread.c, sslwrite.c, ecc.).
  2. Ho diviso il "headerone" originale myssl.h in due header, myssl.h (pubblico) e myssl-private.h (privato): i sorgenti della libreria MySSL includono entrambi i file, mentre gli applicativi che usano MySSL includeranno solo l'header pubblico.
  3. Ho aggiunto opportuni header in testa a tutti i file con varie informazioni descrittive (seguendo un po' lo stile dei manuali Unix/Linux e lo standard POSIX).
  4. Ho aggiunto opportuni header in testa a tutte le funzioni della libreria (seguendo un po' lo stile dei manuali Unix/Linux e lo standard POSIX).
  5. Ho tradotto tutto (header e commenti nei sorgenti) in inglese: sono tutt'altro che un esterofilo però, visto che GitHub è un sito di uso globale, bisogna dare una opportunità di lettura diretta a tutto il pubblico potenziale.
  6. Ho creato una struttura di directory semplice e funzionale: src (sorgenti della libreria) e tests (applicazioni di test): per entrambe ho scritto un Makefile. Il Makefile in src genera la libreria, mentre quello in tests genera le due applicazioni di test (un SSL Server e un SSL Client).
  7. Ho scritto i "canonici" file GitHub (README.md, LICENSE e .gitignore) e li ho copiati nella root-directory della libreria.
  8. E, finalmente, ho copiato tutto nel repository GitHub. Missione compiuta!
That's all folks! E buone vacanze!

Ciao e al prossimo post!